public override object Query(RefundQueryRequest reqModel) { try { var canObj = CanAccess(); if (!canObj.Successed) { return(canObj); } var sxfReq = new SxfRefundQueryRequest(reqModel, MerchStoreModel); //sxf签名并请求 var sxfResult = PayHelper.SendPost(MerchStoreModel.ApiUrl, PaySignHelper.ToDicAndSign(sxfReq, MerchModel.SecretKey3, "signature")); if (sxfResult.Successed) { //处理返回结果 var sxfResultObj = JsonConvert.DeserializeObject <SxfRefundQueryResponse>(sxfResult.Data.ToString()); var result = sxfResultObj.ToRefundQueryResponse(MerchStoreModel); //Qct签名 var rstRsp = PaySignHelper.ToDicAndSign(result, MerchModel.SecretKey, "sign"); return(rstRsp); } else { return(sxfResult); } } catch (Exception ex) { LogEngine.WriteError(string.Format("退款订单查询请求异常:{0},请求参数:{1}", ex.Message, reqModel.ToJson()), null, LogModule.支付交易); return(QctPayReturn.Fail()); } }
/// <summary> /// 创建生成支付通知 /// </summary> /// <param name="reqModel"></param> /// <returns></returns> public override SxfPayReturn Build(SxfPayNotifyRequest reqModel) { TradeOrder tradeOrder = null; var tradeResult = new TradeResult(reqModel); //保存通知结果并更改TradeOrder状态 var isSucc = PaySvc.SaveMchTradeResult(tradeResult, out tradeOrder); if (!isSucc) { return(SxfPayReturn.Fail(msg: "数据接收失败")); } else { try { var payNotify = new NotifyPayRequest(tradeOrder, tradeResult); var payNotifyDic = PaySignHelper.ToASCIIDictionary(payNotify); return(SendPost(PayConst.QCTTRADE_NOTIFY_PAY, payNotifyDic, tradeOrder.CID, tradeOrder.PayNotifyUrl)); } catch (Exception ex) { LogEngine.WriteError(string.Format("发起支付后台通知请求异常:商户ID:{0},门店ID:{1},返回参数:{2}", reqModel.MerchantId, reqModel.ShopId, reqModel.ToJson()), null, LogModule.支付交易); return(SxfPayReturn.Fail(msg: "数据接收失败")); } } }
/// <summary> /// 创建生产退款订单 /// </summary> /// <param name="reqModel"></param> /// <returns></returns> public override QctPayReturn Build(RefundApplyRequest reqModel) { WithReqModel(reqModel); WithOutTradeNo(reqModel.Out_Refund_No); var canObj = CanBuilder(); if (!canObj.Successed) { return(canObj); } else { ReqModel.ResetRfdNotifyUrl(MerchModel.RfdNotifyUrl); var tradeOrder = new TradeOrder(ReqModel, MerchStoreModel) { TradeNo = OrderHelper.GetMaxTradeNo(), OutTradeNo = ReqModel.Out_Refund_No, OldOutTradeNo = ReqModel.Out_Trade_No, TotalAmount = ReqModel.Refund_Amount, SourceType = MerchModel.SourceType, ApiNo = MerchModel.ApiNo, State = (short)RefundState.RefundIng, RfdNotifyUrl = ReqModel.Refund_Notify_Url, OrderType3 = ((short)SxfOrderType.CommonOrder), TradeType = (short)QctTradeType.Expense, FeeType = (short)PayFeeType.RMB, BuyerMobile = "" }; var result = PaySvc.SaveTradeOrder(tradeOrder); if (result) { //构建Sxf请求参数,签名,发起请求 var sxfReqModel = new SxfRefundApplyRequest(tradeOrder, PayConfig.SxfRefundNotifyUrl); var rstObj = SendPost <SxfRefundApplyRequest, SxfRefundApplyResponse>(MerchStoreModel.ApiUrl, sxfReqModel); if (rstObj.Successed) { //处理返回成功结果,保存退款结果,后进行Qct签名并返回结果回发给商户,fishtodo:暂忽略验证Sxf返回的响应结果签名 var sxfRspModel = (SxfRefundApplyResponse)rstObj.Data; //保存退款结果 var rfdApplyRsp = new RefundApplyResponse(tradeOrder, sxfRspModel) { Out_Trade_No = sxfReqModel.OldOutTradeNo }; return(QctPayReturn.Success(data: PaySignHelper.ToDicAndSign(rfdApplyRsp, MerchModel.SecretKey, "sign"))); } else { return(rstObj); } } else { return(ResultFail(msg: "订单提交失败", logMsg: string.Format("退款请求失败:{0},异常信息:{1}", reqModel.ToJson(), tradeOrder.ToJson()))); } } }
/// <summary> /// 签名验证(支持Qct、Sxf) /// </summary> /// <param name="signDic"></param> /// <param name="signField"></param> /// <returns></returns> public bool VerifySign(Dictionary <string, object> signDic, string signField) { var secretKey = string.Empty; if (signField == PayConst.SXF_SIGNATUREFIELD) { secretKey = GetMerchSecretKey3ByMerchID(signDic["merchantId"].ToString()); } else { secretKey = GetMerchSecretKeyByCID(signDic["mch_id"].ToType <int>()); } var result = PaySignHelper.VerifySign(signDic, secretKey, signField); return(result); }
/// <summary> /// 创建生成退款通知 /// </summary> /// <param name="reqModel"></param> /// <returns></returns> public override SxfPayReturn Build(SxfRefundNotifyRequest reqModel) { TradeOrder tradeOrder = null; var rfdTradeResult = new TradeResult(reqModel); //保存通知结果并更改TradeOrder状态 var success = PaySvc.SaveMchTradeResult(rfdTradeResult, out tradeOrder); if (!success) { return(SxfPayReturn.Fail(msg: "数据接收失败")); } else { var rfdNotify = new NotifyRefundRequest(tradeOrder, rfdTradeResult); var rfdNotifyDic = PaySignHelper.ToASCIIDictionary(rfdNotify); return(SendPost(PayConst.QCTTRADE_NOTIFY_REFUND, rfdNotifyDic, tradeOrder.CID, tradeOrder.RfdNotifyUrl)); } }
/// <summary> /// 支付订单分页查询 /// </summary> /// <param name="reqModel"></param> /// <returns></returns> public override object Query(PayBatchQueryRequest reqModel) { try { var canObj = CanAccess(); if (!canObj.Successed) { return(canObj); } var sxfReq = new SxfPayBatchQueryRequest(reqModel, MerchStoreModel); //sxf签名并请求 var sxfResult = PayHelper.SendPost(MerchStoreModel.ApiUrl, PaySignHelper.ToDicAndSign(sxfReq, MerchModel.SecretKey3, "signature")); if (sxfResult.Successed) { //处理返回结果 var sxfJObj = JObject.Parse(HttpUtility.UrlDecode(sxfResult.Data.ToString())); var sxfResultRsp = sxfJObj.ToObject <SxfPayBatchQueryResponse>(); if (sxfResultRsp.IsSuccess()) { var result = sxfResultRsp.ToPayBatchQueryRsp(MerchStoreModel); //Qct签名 var resultDic = PaySignHelper.ToDicAndSign(result, MerchModel.SecretKey, "sign"); return(resultDic); } else { LogEngine.WriteError(string.Format("支付订单分页查询请求错误:请求参数:{0},返回参数:{1}", sxfResultRsp.ToJson(), sxfResult.ToJson()), null, LogModule.支付交易); var rst = QctPayReturn.Fail(PayConst.FAIL_CODE_40004, sxfResultRsp.RspMsg); return(rst); } } else { return(sxfResult); } } catch (Exception ex) { LogEngine.WriteError(string.Format("支付订单分页查询请求异常:{0},请求参数:{1}", ex.Message, reqModel.ToJson()), null, LogModule.支付交易); var rst = QctPayReturn.Fail(); return(rst); } }
/// <summary> /// 回发通知给商家 /// </summary> /// <param name="method"></param> /// <param name="dic"></param> /// <param name="cid"></param> /// <param name="notifyUrl"></param> /// <returns></returns> public SxfPayReturn SendPost(string method, Dictionary <string, object> dic, int cid, string notifyUrl) { var secretKey = (new PaySignService()).GetMerchSecretKeyByCID(cid); if (secretKey.IsNullOrEmpty()) { LogEngine.WriteError(string.Format("发起后台通知请求错误:找不到SecretKey,接口参数名:{0},通知URL:{1},发送参数:{2}", method, notifyUrl, dic.ToJson()), null, LogModule.支付交易); return(SxfPayReturn.Fail(msg: "数据接收失败")); } else { //Qct签名 dic = PaySignHelper.SetSign(dic, secretKey, "sign"); try { //给商家发送结果通知 var postResult = PayHelper.SendPost(notifyUrl, dic); if (postResult.Successed) { var resultObj = JsonConvert.DeserializeObject <JObject>(postResult.Data.ToString()); if (resultObj.Property("return_code", true) == PayConst.SUCCESS_CODE) { return(SxfPayReturn.Success()); } else { return(SxfPayReturn.Fail(msg: "数据接收失败")); } } else { return(SxfPayReturn.Fail(msg: postResult.ReturnMsg)); } } catch (Exception ex) { LogEngine.WriteError(string.Format("发起后台通知请求异常:商户通知Url无响应,接口参数名:{0},通知URL:{1}]", method, notifyUrl), ex, LogModule.支付交易); return(SxfPayReturn.Fail(PayConst.FAIL_CODE_40004, "")); } } }
/// <summary> /// 创建生成支付订单,购买者付款扫码,(对应融合支付:主扫支付动态二维码) /// </summary> /// <param name="reqModel"></param> /// <returns></returns> public override QctPayReturn Build(PayBuyerScanDynaRequest reqModel) { try { WithReqModel(reqModel); WithOutTradeNo(reqModel.Out_Trade_No); var canObj = CanBuilder(); if (!canObj.Successed) { return(canObj); } else { var tradeOrder = new TradeOrder(ReqModel, MerchStoreModel, OrderHelper.GetMaxTradeNo()); var result = PaySvc.SaveTradeOrder(tradeOrder); if (result) { //构建Sxf请求参数,签名,发起请求 var sxfBuildReq = new SxfBuildPayTokenRequest(tradeOrder, PayConfig.SxfPayNotifyUrl); sxfBuildReq.OrderType = "1"; var rstObj = SendPost <SxfBuildPayTokenRequest, SxfBuildPayTokenResponse>(MerchStoreModel.ApiUrl, sxfBuildReq); if (rstObj.Successed) { //处理返回成功结果,将返回结果进行Qct签名并返回给商户,fishtodo:暂忽略验证Sxf返回的响应结果签名 var resultObj = new PayBuyerScanDynaResponse(tradeOrder, (SxfBuildPayTokenResponse)rstObj.Data); WithRspModel(resultObj); return(QctPayReturn.Success(data: PaySignHelper.ToDicAndSign(resultObj, MerchModel.SecretKey, "sign"))); } return(rstObj); } else { return(ResultFail(msg: "订单提交失败", logMsg: string.Format("购买者付款扫码请求失败:{0},异常信息:{1}", ReqModel.ToJson(), tradeOrder.ToJson()))); } } } catch (Exception ex) { return(ResultFail(msg: "订单提交失败", logMsg: string.Format("购买者付款扫码请求异常:{0},异常信息:{1}", ex.Message, ReqModel.ToJson()))); } }
/// <summary> /// 创建生成支付订单,商家收款扫码,(对应融合支付:被扫支付) /// </summary> /// <param name="reqModel"></param> /// <returns></returns> public override QctPayReturn Build(PayMerchScanRequest reqModel) { WithReqModel(reqModel); WithOutTradeNo(reqModel.Out_Trade_No); var canObj = CanBuilder(); if (!canObj.Successed) { return(canObj); } else { var tradeOrder = new TradeOrder(ReqModel, MerchStoreModel, OrderHelper.GetMaxTradeNo()); tradeOrder.BuyerPayToken = ReqModel.Buyer_Pay_Token; var result = PaySvc.SaveTradeOrder(tradeOrder); if (result) { //构建Sxf请求参数,签名,发起请求 var sxfReqModel = new SxfScanPayRequest(tradeOrder, PayConfig.SxfPayNotifyUrl); var rstObj = SendPost <SxfScanPayRequest, SxfScanPayResponse>(MerchStoreModel.ApiUrl, sxfReqModel); if (rstObj.Successed) { //处理返回成功结果,保存商家收款扫码结果,后进行Qct签名并返回结果回发给商户,fishtodo:暂忽略验证Sxf返回的响应结果签名 var sxfRspModel = (SxfScanPayResponse)rstObj.Data; PaySvc.SaveMerchScanResult(sxfRspModel, out tradeOrder); var merchScanRsp = new PayMerchScanResponse(tradeOrder, sxfRspModel); return(QctPayReturn.Success(data: PaySignHelper.ToDicAndSign(merchScanRsp, MerchModel.SecretKey, "sign"))); } else { return(rstObj); } } else { return(ResultFail(msg: "订单提交失败", logMsg: string.Format("商家收款扫码请求失败:{0},异常信息:{1}", reqModel.ToJson(), tradeOrder.ToJson()))); } } }
/// <summary> /// 发送请求 /// </summary> /// <returns></returns> public QctPayReturn SendPost <TSxfReqModel, TSxfRspModel>(string url, TSxfReqModel sxfReqModel) where TSxfReqModel : SxfBaseTradeRequest where TSxfRspModel : SxfBaseTradeResponse { //var resultStr = string.Empty; try { var postResult = PayHelper.SendPost(url, PaySignHelper.ToDicAndSign(sxfReqModel, MerchModel.SecretKey3, "signature")); if (postResult.Successed) { var resultObj = JsonConvert.DeserializeObject <TSxfRspModel>(postResult.Data.ToString()); if (resultObj.IsSuccess()) { return(QctPayReturn.Success(data: resultObj)); } else { //处理返回失败结果 LogEngine.WriteError(string.Format("发送交易请求成功但返回交易错误信息:请求参数:{0},返回参数:{1}]", sxfReqModel.ToJson(), postResult), null, LogModule.支付交易); if (string.IsNullOrWhiteSpace(resultObj.RspMsg)) { resultObj.RspMsg = "服务器请求失败"; } return(QctPayReturn.Fail(PayTradeHelper.TransCodeBySxf(resultObj.RspCod), resultObj.RspMsg)); } } else { return(postResult); } } catch (Exception ex) { return(ResultFail(msg: "订单请求失败", logMsg: string.Format("发送交易请求异常:服务器异常,请求参数:{0},异常信息:{1}]", sxfReqModel.ToJson(), ex.Message))); } }
/// <summary> /// 生成签名 /// </summary> /// <param name="apiSecret">API密钥</param> /// <returns></returns> public virtual void GenerateSign(string apiSecret) { this.sign = PaySignHelper.Generate(GetSignParams(), apiSecret); }