Esempio n. 1
0
 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: "数据接收失败"));
                }
            }
        }
Esempio n. 3
0
        /// <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())));
                }
            }
        }
Esempio n. 4
0
        /// <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);
            }
        }
Esempio n. 7
0
        /// <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, ""));
                }
            }
        }
Esempio n. 8
0
 /// <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())));
                }
            }
        }
Esempio n. 10
0
 /// <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)));
     }
 }
Esempio n. 11
0
 /// <summary>
 /// 生成签名
 /// </summary>
 /// <param name="apiSecret">API密钥</param>
 /// <returns></returns>
 public virtual void GenerateSign(string apiSecret)
 {
     this.sign = PaySignHelper.Generate(GetSignParams(), apiSecret);
 }