/// <summary> /// 删除错误的绑卡记录 /// </summary> private void DeleteFailedBankCardInfo(String service, String callMethod, AgreePayBankCardInfo bankCardInfo) { if (bankCardInfo != null) { _bankCardInfoRepository.Remove(bankCardInfo); var deleteResult = _bankCardBindInfoRepository.SaveChanges(); if (!deleteResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_bankCardBindInfoRepository)}.SaveChanges()", "无法删除申请绑卡失败的记录", deleteResult.FirstException, bankCardInfo); } else { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, callMethod, LogPhase.ACTION, $"成功删除申请绑卡失败的记录", bankCardInfo); } } }
public XResult <YeePayAgreePayApplyResponse> Apply(YeePayAgreePayApplyRequest request) { if (request == null) { return(new XResult <YeePayAgreePayApplyResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } if (!request.IsValid) { return(new XResult <YeePayAgreePayApplyResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } String service = $"{this.GetType().FullName}.{nameof(Apply)}(...)"; var requestHash = $"{nameof(Apply)}:{request.PayerId}.{request.BankCardNo}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <YeePayAgreePayApplyResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <YeePayAgreePayApplyResponse>(null, ErrorCode.SUBMIT_REPEAT)); } DateTime applyTime = DateTime.Now; // 如果未保存绑卡信息则添加到数据库 var existedBankCard = _bankCardInfoRepository.QueryProvider.FirstOrDefault(x => x.IDCardNo == request.IDCardNo && x.BankCardNo == request.BankCardNo); if (existedBankCard == null) { // 先将绑卡的银行卡数据入库 var bankCardInfo = new AgreePayBankCardInfo() { Id = IDGenerator.GenerateID(), AppId = request.AppId, RealName = request.RealName, IDCardNo = request.IDCardNo, BankCardNo = request.BankCardNo, Mobile = request.Mobile, BankCode = request.BankCode, UpdateTime = applyTime }; _bankCardInfoRepository.Add(bankCardInfo); var saveResult = _bankCardInfoRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_bankCardInfoRepository)}.SaveChanges()", "快钱协议支付:保存绑卡信息失败", saveResult.FirstException, bankCardInfo); return(new XResult <YeePayAgreePayApplyResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } } var execResult = YeePayAgreePayUtil.Execute <RawYeePayApplyBindCardRequest, RawYeePayApplyBindCardResponse>("/rest/v1.0/paperorder/unified/auth/request", new RawYeePayApplyBindCardRequest() { merchantno = GlobalConfig.YeePay_AgreePay_MerchantNo, requestno = request.OutTradeNo, identityid = request.PayerId, identitytype = "USER_ID", idcardno = request.IDCardNo, cardno = request.BankCardNo, idcardtype = "ID", username = request.RealName, phone = request.Mobile, issms = "true", requesttime = applyTime.ToString("yyyy/MM/dd HH:mm:ss"), authtype = "COMMON_FOUR" }); String traceMethod = $"{nameof(YeePayAgreePayUtil)}.{nameof(YeePayAgreePayUtil.Execute)}(...)"; if (!execResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, traceMethod, "协议支付失败", execResult.FirstException, execResult); return(new XResult <YeePayAgreePayApplyResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RequestException(execResult.ErrorMessage))); } var respResult = execResult.Value; if (respResult.status != "TO_VALIDATE") { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, "respResult", $"{respResult.errorcode}:{respResult.errormsg}", null, respResult); _bankCardInfoRepository.Remove(existedBankCard); var removeResult = _bankCardInfoRepository.SaveChanges(); if (!removeResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, "removeResult", "无法删除申请绑卡失败的记录", removeResult.FirstException, existedBankCard); } else { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, "removeResult", LogPhase.ACTION, "成功删除申请绑卡失败的记录", existedBankCard); } return(new XResult <YeePayAgreePayApplyResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException(respResult.errormsg))); } var resp = new YeePayAgreePayApplyResponse() { OutTradeNo = respResult.requestno, ApplyTime = applyTime.ToString("yyyy-MM-dd HH:mm:ss"), PayerId = request.PayerId, Status = CommonStatus.SUCCESS.ToString(), Msg = $"申请{CommonStatus.SUCCESS.GetDescription()}" }; return(new XResult <YeePayAgreePayApplyResponse>(resp)); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <CPIEntrustPayPaymentResponse> Pay(CPIEntrustPayPaymentRequest request) { if (request == null) { return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } if (!request.IsValid) { return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } if (request.Amount < GlobalConfig.X99bill_EntrustPay_PayMinAmount) { return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException($"支付金额至少为{GlobalConfig.X99bill_EntrustPay_PayMinAmount.ToString()}元"))); } var parseSharingInfoResult = JsonUtil.DeserializeObject <SharingInfo>(request.SharingInfo); if (!parseSharingInfoResult.Success) { return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.DESERIALIZE_FAILED, new ArgumentException("解析SharingInfo参数失败"))); } var sharingInfo = parseSharingInfoResult.Value; String service = $"{this.GetType().FullName}.{nameof(Pay)}(...)"; var requestHash = $"{request.OutTradeNo}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.SUBMIT_REPEAT)); } var existsOutTradeNo = _payOrderRepository.Exists(x => x.OutTradeNo == request.OutTradeNo); if (existsOutTradeNo) { return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.OUT_TRADE_NO_EXISTED)); } //生成全局唯一的ID号 String tradeNo = IDGenerator.GenerateID().ToString(); // 1. 添加交易记录 var newOrder = new PayOrder() { Id = IDGenerator.GenerateID(), AppId = request.AppId, OutTradeNo = request.OutTradeNo, TradeNo = tradeNo, PayAmount = request.Amount, BankCardNo = request.BankCardNo, PayerId = request.PayerId, PayChannelCode = GlobalConfig.X99BILL_PAYCHANNEL_CODE, PayStatus = PayStatus.APPLY.ToString(), PayType = PayType.ENTRUSTPAY.ToString(), CreateTime = DateTime.Now }; _payOrderRepository.Add(newOrder); var saveResult = _payOrderRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), nameof(CallResultStatus.ERROR), service, $"{nameof(_payOrderRepository)}.SaveChanges()", "支付单保存失败", saveResult.FirstException, newOrder); return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } //添加分账记录 var allotAmountOrder = new AllotAmountOrder() { Id = IDGenerator.GenerateID(), AppId = request.AppId, PayeeId = request.PayerId, TradeNo = tradeNo, OutTradeNo = request.OutTradeNo, TotalAmount = request.Amount, FeePayerId = sharingInfo.FeePayerId, SharingType = sharingInfo.SharingType == "0" ? AllotAmountType.Pay.ToString() : AllotAmountType.Refund.ToString(), SharingInfo = sharingInfo.SharingData, ApplyTime = DateTime.Now, Status = AllotAmountOrderStatus.APPLY.ToString() }; _allotAmountOrderRepository.Add(allotAmountOrder); saveResult = _allotAmountOrderRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), nameof(CallResultStatus.ERROR), service, $"{nameof(_allotAmountOrderRepository)}.SaveChanges()", "分账数据保存失败", saveResult.FirstException, allotAmountOrder); return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } //构造分账参数 ExtDate sharingExtDate = null; if (sharingInfo.SharingType == "0") { //构造消费分账数据 var sharingDic = new Dictionary <String, String>(5); sharingDic["sharingFlag"] = "1"; sharingDic["feeMode"] = sharingInfo.FeeMode; sharingDic["feePayer"] = sharingInfo.FeePayerId; sharingDic["sharingData"] = sharingInfo.SharingData; sharingExtDate = new ExtDate() { Key = "sharingInfo", Value = JsonUtil.SerializeObject(sharingDic).Value }; } else if (sharingInfo.SharingType == "1") { //构造退款分账数据 var sharingDic = new Dictionary <String, String>(5); sharingDic["sharingFlag"] = "1"; sharingDic["feeMode"] = sharingInfo.FeeMode; sharingDic["feePayer"] = sharingInfo.FeePayerId; sharingDic["sharingData"] = sharingInfo.SharingData; sharingExtDate = new ExtDate() { Key = "refundSharingInfo", Value = JsonUtil.SerializeObject(sharingDic).Value }; } var tradeTime = DateTime.Now; var payRequest = new EntrustPayRequest() { Version = "1.0", EntrustPayRequestContent = new EntrustPayRequestContent() { Amount = request.Amount.ToString(), CardHolderId = request.IDCardNo, CardHolderName = request.RealName, CardNo = request.BankCardNo, EntryTime = tradeTime.ToString("yyyyMMddHHmmss"), ExternalRefNumber = request.OutTradeNo, IdType = "0", InteractiveStatus = "TR1", TxnType = "PUR", ExtMap = new ExtMap() { ExtDates = new ExtDate[] { new ExtDate() { Key = "phone", Value = request.Mobile }, sharingExtDate } } } }; String callMethod = $"{_api.GetType().FullName}.{nameof(_api.EntrustPay)}(...)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, callMethod, LogPhase.BEGIN, $"开始调用{callMethod}", new Object[] { ApiConfig.Bill99_EntrustPay_Pay_RequestUrl, payRequest }); var result = _api.EntrustPay(ApiConfig.Bill99_EntrustPay_Pay_RequestUrl, payRequest); _logger.Trace(TraceType.BLL.ToString(), (result.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, callMethod, LogPhase.END, $"完成调用{callMethod}", result.Value); if (!result.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, callMethod, "支付失败", result.FirstException, payRequest); UpdateAllotAmountOrder(service, allotAmountOrder, AllotAmountOrderStatus.FAILURE); return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, result.FirstException)); } if (result.Value == null || result.Value.EntrustPayResponseContent == null) { _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, callMethod, LogPhase.ACTION, "快钱未返回任何数据"); UpdateAllotAmountOrder(service, allotAmountOrder, AllotAmountOrderStatus.FAILURE); return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.REMOTE_RETURN_NOTHING)); } var respContent = result.Value.EntrustPayResponseContent; if (respContent.ResponseCode != "00") { UpdateAllotAmountOrder(service, allotAmountOrder, AllotAmountOrderStatus.FAILURE); return(new XResult <CPIEntrustPayPaymentResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException(respContent.ResponseTextMessage))); } UpdateAllotAmountOrder(service, allotAmountOrder, AllotAmountOrderStatus.SUCCESS); //判断是否有该付款人的绑卡信息,如果没有则创建 var existesBankCardInfo = (from t0 in _agreePayBankCardInfoRepository.QueryProvider where t0.IDCardNo == request.IDCardNo && t0.BankCardNo == request.BankCardNo select t0).Count() > 0; if (!existesBankCardInfo) { var bankcardInfo = new AgreePayBankCardInfo() { Id = IDGenerator.GenerateID(), AppId = request.AppId, RealName = request.RealName, BankCardNo = request.BankCardNo, IDCardNo = request.IDCardNo, Mobile = request.Mobile, BankCode = "-", UpdateTime = DateTime.Now }; _agreePayBankCardInfoRepository.Add(bankcardInfo); saveResult = _agreePayBankCardInfoRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_agreePayBankCardInfoRepository)}.SaveChanges()", "保存付款人信息失败", saveResult.FirstException, bankcardInfo); } } var resp = new CPIEntrustPayPaymentResponse() { OutTradeNo = respContent.ExternalRefNumber, TradeNo = tradeNo, PayTime = tradeTime.ToString("yyyy-MM-dd HH:mm:ss"), Status = PayStatus.SUCCESS.ToString(), Msg = PayStatus.SUCCESS.GetDescription() }; //根据返回码计算对应的支付状态,并更新到数据库 var payStatus = Bill99Util.GetAgreepayPayStatus(respContent.ResponseCode); var payOrder = (from t0 in _payOrderRepository.QueryProvider where t0.TradeNo == tradeNo select t0).FirstOrDefault(); //如果支付单存在,并且状态不是最终状态,才更新状态 if (newOrder != null && newOrder.PayStatus != PayStatus.SUCCESS.ToString() && newOrder.PayStatus != PayStatus.FAILURE.ToString()) { newOrder.PayStatus = payStatus.ToString(); newOrder.UpdateTime = DateTime.Now; _payOrderRepository.Update(newOrder); saveResult = _payOrderRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_payOrderRepository)}.SaveChanges()", "更新支付结果失败", saveResult.FirstException, newOrder); } } return(new XResult <CPIEntrustPayPaymentResponse>(resp)); } finally { _lockProvider.UnLock(requestHash); } }
public XResult <CPIAgreePayApplyResponse> Apply(CPIAgreePayApplyRequest request) { if (request == null) { return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentNullException(nameof(request)))); } if (!request.IsValid) { return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.INVALID_ARGUMENT, new ArgumentException(request.ErrorMessage))); } String service = $"{this.GetType().FullName}.Apply(...)"; var requestHash = $"apply:{request.PayerId}.{request.BankCardNo}".GetHashCode(); if (_lockProvider.Exists(requestHash)) { return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.SUBMIT_REPEAT)); } try { if (!_lockProvider.Lock(requestHash)) { return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.SUBMIT_REPEAT)); } // 如果未保存绑卡信息则添加到数据库 var existsBankCard = _bankCardInfoRepository.Exists(x => x.BankCardNo == request.BankCardNo); AgreePayBankCardInfo bankCardInfo = null; if (!existsBankCard) { // 先将绑卡的银行卡数据入库 bankCardInfo = new AgreePayBankCardInfo() { Id = IDGenerator.GenerateID(), AppId = request.AppId, RealName = request.RealName, IDCardNo = request.IDCardNo, BankCardNo = request.BankCardNo, Mobile = request.Mobile, BankCode = request.BankCode, UpdateTime = DateTime.Now }; _bankCardInfoRepository.Add(bankCardInfo); var saveResult = _bankCardInfoRepository.SaveChanges(); if (!saveResult.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, $"{nameof(_bankCardInfoRepository)}.SaveChanges()", "快钱协议支付:保存绑卡信息失败", saveResult.FirstException, bankCardInfo); return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.DB_UPDATE_FAILED, saveResult.FirstException)); } } var tradeTime = DateTime.Now; // 入库成功之后才开始调第三方申请接口 var applyRequest = new AgreementApplyRequest() { Version = "1.0", IndAuthContent = new IndAuthRequestContent() { BindType = "0", CustomerId = request.PayerId, ExternalRefNumber = request.OutTradeNo, Pan = request.BankCardNo, CardHolderName = request.RealName, CardHolderId = request.IDCardNo, PhoneNO = request.Mobile } }; String callMethod = $"{nameof(_api)}.AgreementApply(...)"; _logger.Trace(TraceType.BLL.ToString(), CallResultStatus.OK.ToString(), service, callMethod, LogPhase.BEGIN, $"开始调用{callMethod}", new Object[] { ApiConfig.Bill99_AgreePay_ApplyBindCard_RequestUrl, applyRequest }); var result = _api.AgreementApply(ApiConfig.Bill99_AgreePay_ApplyBindCard_RequestUrl, applyRequest); _logger.Trace(TraceType.BLL.ToString(), (result.Success ? CallResultStatus.OK : CallResultStatus.ERROR).ToString(), service, callMethod, LogPhase.END, $"完成调用{callMethod}", result.Value); if (!result.Success) { _logger.Error(TraceType.BLL.ToString(), CallResultStatus.ERROR.ToString(), service, callMethod, "申请绑卡失败", result.FirstException, applyRequest); DeleteFailedBankCardInfo(service, callMethod, bankCardInfo); return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, result.FirstException)); } if (result.Value == null) { DeleteFailedBankCardInfo(service, callMethod, bankCardInfo); return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.REMOTE_RETURN_NOTHING)); } if (result.Value.IndAuthContent == null) { DeleteFailedBankCardInfo(service, callMethod, bankCardInfo); return(result.Value.ErrorMsgContent != null ? new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException(result.Value.ErrorMsgContent.ErrorMessage)) : new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.REMOTE_RETURN_NOTHING)); } var respContent = result.Value.IndAuthContent; if (respContent.ResponseCode != "00") { DeleteFailedBankCardInfo(service, callMethod, bankCardInfo); return(new XResult <CPIAgreePayApplyResponse>(null, ErrorCode.DEPENDENT_API_CALL_FAILED, new RemoteException(respContent.ResponseTextMessage))); } var resp = new CPIAgreePayApplyResponse() { PayerId = respContent.CustomerId, OutTradeNo = respContent.ExternalRefNumber, ApplyToken = respContent.Token, ApplyTime = tradeTime.ToString("yyyy-MM-dd HH:mm:ss"), Status = CommonStatus.SUCCESS.ToString(), Msg = CommonStatus.SUCCESS.GetDescription() }; return(new XResult <CPIAgreePayApplyResponse>(resp)); } finally { _lockProvider.UnLock(requestHash); } }