Exemplo n.º 1
0
        /// <summary>
        /// 退款单查询
        /// </summary>
        /// <param name="out_trade_no"></param>
        /// <param name="transaction_id"></param>
        /// <param name="out_refund_no"></param>
        /// <param name="refund_id"></param>
        /// <returns></returns>
        public static ParameterData RefundQuery(string out_trade_no, string transaction_id, string out_refund_no, string refund_id)
        {
            var reqData = SwiftPassCore.GetDefaultParameter();

            reqData.SetValue("service", "unified.trade.refundquery");    //接口类型 unified.trade.refundquery
            reqData.SetValue("out_trade_no", out_trade_no);              //商户订单号
            reqData.SetValue("transaction_id", transaction_id);          //平台订单号
            reqData.SetValue("out_refund_no", out_refund_no);            //商户退款单号
            reqData.SetValue("refund_id", refund_id);                    //平台退款单号
            reqData.SetValue("sign", SwiftPassCore.CreateSign(reqData)); //以上参数进行签名

            string data = reqData.ToXml();                               //生成XML报文
            Dictionary <string, string> reqContent = new Dictionary <string, string>();

            reqContent.Add("url", SwiftPassConfig.req_url);
            reqContent.Add("data", data);
            PayHttpClient pay = new PayHttpClient();

            pay.setReqContent(reqContent);
            if (!pay.call())
            {
                throw new BizException(string.Format("HTTP ERROR:Code[{0}] Message[{1}]", pay.getResponseCode(), pay.getErrInfo()));
            }

            var resData = new ParameterData();

            resData.FromXml(pay.getResContent());
            return(resData);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 解析支付结果
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="resultInfo">支付结果记录</param>
        /// <returns></returns>
        public override ExecuteResult <PayNotifyInfo> ResolveRequest(string data, PayResultInfo resultInfo)
        {
            var result = new ExecuteResult <PayNotifyInfo>();

            try
            {
                var notifyData = new ParameterData();
                notifyData.FromXml(data);

                resultInfo.OrderId    = notifyData.GetValue("out_trade_no");
                resultInfo.TradeNo    = notifyData.GetValue("transaction_id");
                resultInfo.PaymentAmt = Convert.ToDecimal(notifyData.GetValue("total_fee")) / 100;//微信支付金额的单位为“分”,所以要除以100
                resultInfo.ExtTradeNo = notifyData.GetValue("out_transaction_id");
                string tradeStatus = notifyData.GetValue("pay_result");
                var    tradeResult = ResultStatus.Success;//由于在校验支付结果请求时已经验证了是否支付成功,所以此处肯定是支付成功的
                resultInfo.ResultDesc    = tradeStatus;
                resultInfo.ExecuteResult = (int)tradeResult;

                result.Data   = this.GetPayNotifyInfo(resultInfo);
                result.Status = ResultStatus.Success;
            }
            catch
            {
                resultInfo.ResultDesc    = "解析支付结果参数失败";
                resultInfo.ExecuteResult = (int)ResultStatus.Error;
                PayResultDAL.Update(resultInfo);

                result.Message = resultInfo.ResultDesc;
                result.Status  = ResultStatus.Error;
            }
            return(result);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 校验支付结果请求
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="resultInfo">支付结果记录</param>
        /// <returns></returns>
        public override ExecuteResult CheckRequest(string data, PayResultInfo resultInfo)
        {
            var result    = new ExecuteResult();
            var errorData = new WxPayData();

            try
            {
                //校验请求报文
                var notifyData = new ParameterData();
                notifyData.FromXml(data);

                //检查支付结果中transaction_id是否存在
                resultInfo.OrderId = notifyData.GetValue("out_trade_no") as string;
                resultInfo.TradeNo = notifyData.GetValue("transaction_id") as string;
                if (string.IsNullOrEmpty(resultInfo.TradeNo))
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "支付结果中微信支付单号不存在";
                    PayResultDAL.Update(resultInfo);

                    errorData.SetValue("return_code", "FAIL");
                    errorData.SetValue("return_msg", resultInfo.ResultDesc);
                    result.Message = errorData.ToXml();
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }

                //查询支付单,判断支付单真实性
                var req = new WxPayData();
                req.SetValue("transaction_id", resultInfo.TradeNo);
                var queryData = WxPayApi.OrderQuery(req);
                if (queryData.GetValue("return_code").ToString() != "SUCCESS" || queryData.GetValue("result_code").ToString() != "SUCCESS")
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "微信支付单查询失败";
                    PayResultDAL.Update(resultInfo);

                    errorData.SetValue("return_code", "FAIL");
                    errorData.SetValue("return_msg", resultInfo.ResultDesc);
                    result.Message = errorData.ToXml();
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }
            }
            catch (WxPayException wex)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Error;
                resultInfo.ResultDesc    = wex.Message;
                PayResultDAL.Update(resultInfo);

                errorData.SetValue("return_code", "FAIL");
                errorData.SetValue("return_msg", resultInfo.ResultDesc);
                result.Message = errorData.ToXml();
                result.Status  = ResultStatus.Error;
                return(result);
            }
            result.Status = ResultStatus.Success;
            return(result);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 微信公众号支付
        /// </summary>
        /// <param name="out_trade_no"></param>
        /// <param name="total_fee"></param>
        /// <param name="notify_url"></param>
        /// <param name="time_expire"></param>
        /// <param name="openid"></param>
        /// <returns></returns>
        public static string WeChatJsApiPay(string out_trade_no, int total_fee, string notify_url, string time_expire, string openid)
        {
            var reqData = SwiftPassCore.GetDefaultParameter();

            reqData.SetValue("service", "pay.weixin.jspay");                                                    //接口类型:pay.weixin.jspay
            reqData.SetValue("out_trade_no", out_trade_no);                                                     //商户订单号
            reqData.SetValue("body", string.Format("{0}订单:{1}", AppConfig.Global.WebSiteName, out_trade_no));   //商品描述
            reqData.SetValue("attach", string.Format("{0}订单:{1}", AppConfig.Global.WebSiteName, out_trade_no)); //附加信息
            reqData.SetValue("total_fee", total_fee.ToString());                                                //总金额
            reqData.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));                            //订单生成时间
            reqData.SetValue("time_expire", time_expire);                                                       //订单超时时间
            reqData.SetValue("notify_url", notify_url);                                                         //通知地址,必填项,接收平台通知的URL,需给绝对路径,255字符内;此URL要保证外网能访问
            reqData.SetValue("is_raw", "1");                                                                    //是否原生态支付方式 1.是 0.否 默认0
            reqData.SetValue("sub_openid", openid);                                                             //微信用户关注商家公众号的openid
            reqData.SetValue("sub_appid", CQSS.Pay.BLL.WeChatPay.Api.WxPayConfig.APPID);                        //微信公众平台基本配置中的AppID
            reqData.SetValue("sign", SwiftPassCore.CreateSign(reqData));                                        //以上参数进行签名

            string data = reqData.ToXml();                                                                      //生成XML报文
            Dictionary <string, string> reqContent = new Dictionary <string, string>();

            reqContent.Add("url", SwiftPassConfig.req_url);
            reqContent.Add("data", data);
            PayHttpClient pay = new PayHttpClient();

            pay.setReqContent(reqContent);
            if (!pay.call())
            {
                throw new BizException(string.Format("HTTP ERROR:Code[{0}] Message[{1}]", pay.getResponseCode(), pay.getErrInfo()));
            }

            var resData = new ParameterData();

            resData.FromXml(pay.getResContent());
            if (resData.GetValue("status") != "0") //校验返回状态
            {
                throw new BizException("返回状态错误代码:" + resData.GetValue("status") + ",错误信息:" + resData.GetValue("message"));
            }

            if (!SwiftPassCore.CheckSign(resData)) //校验数据签名
            {
                throw new BizException("公众号支付签名校验未通过");
            }

            if (resData.GetValue("result_code") != "0") //校验业务结果
            {
                throw new BizException("业务结果错误代码:" + resData.GetValue("err_code") + ",错误信息:" + resData.GetValue("err_msg"));
            }

            return(resData.GetValue("pay_info"));//json格式的字符串,作用于原生态js支付时的参数
        }
Exemplo n.º 5
0
        /// <summary>
        /// 微信扫码支付
        /// </summary>
        /// <param name="out_trade_no">商户订单号</param>
        /// <param name="total_fee">支付金额</param>
        /// <param name="notify_url">通知地址</param>
        /// <param name="time_expire">订单超时时间</param>
        /// <returns></returns>
        public static string WeChatNativePay(string out_trade_no, int total_fee, string notify_url, string time_expire)
        {
            var reqData = SwiftPassCore.GetDefaultParameter();

            reqData.SetValue("service", "pay.weixin.native");                                                   //接口类型:pay.weixin.native
            reqData.SetValue("out_trade_no", out_trade_no);                                                     //商户订单号
            reqData.SetValue("body", string.Format("{0}订单:{1}", AppConfig.Global.WebSiteName, out_trade_no));   //商品描述
            reqData.SetValue("attach", string.Format("{0}订单:{1}", AppConfig.Global.WebSiteName, out_trade_no)); //附加信息
            reqData.SetValue("total_fee", total_fee.ToString());                                                //总金额
            reqData.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));                            //订单生成时间
            reqData.SetValue("time_expire", time_expire);                                                       //订单超时时间
            reqData.SetValue("notify_url", notify_url);                                                         //通知地址,必填项,接收平台通知的URL,需给绝对路径,255字符内;此URL要保证外网能访问
            reqData.SetValue("sign", SwiftPassCore.CreateSign(reqData));                                        //以上参数进行签名

            string data = reqData.ToXml();                                                                      //生成XML报文
            Dictionary <string, string> reqContent = new Dictionary <string, string>();

            reqContent.Add("url", SwiftPassConfig.req_url);
            reqContent.Add("data", data);
            PayHttpClient pay = new PayHttpClient();

            pay.setReqContent(reqContent);
            if (!pay.call())
            {
                throw new BizException(string.Format("HTTP ERROR:Code[{0}] Message[{1}]", pay.getResponseCode(), pay.getErrInfo()));
            }

            var resData = new ParameterData();

            resData.FromXml(pay.getResContent());
            if (resData.GetValue("status") != "0") //校验返回状态
            {
                throw new BizException("返回状态错误代码:" + resData.GetValue("status") + ",错误信息:" + resData.GetValue("message"));
            }

            if (!SwiftPassCore.CheckSign(resData)) //校验数据签名
            {
                throw new BizException("扫码支付签名校验未通过");
            }

            if (resData.GetValue("result_code") != "0") //校验业务结果
            {
                throw new BizException("业务结果错误代码:" + resData.GetValue("err_code") + ",错误信息:" + resData.GetValue("err_msg"));
            }

            return(resData.GetValue("code_url"));//支付链接,用于生成二维码
        }
Exemplo n.º 6
0
        /// <summary>
        /// 申请退款
        /// </summary>
        /// <param name="transaction_id"></param>
        /// <param name="out_trade_no"></param>
        /// <param name="total_fee"></param>
        /// <param name="refund_fee"></param>
        /// <param name="out_refund_no"></param>
        /// <returns></returns>
        public static ParameterData Refund(string transaction_id, string out_trade_no, int total_fee, int refund_fee, string out_refund_no)
        {
            var reqData = SwiftPassCore.GetDefaultParameter();

            reqData.SetValue("service", "unified.trade.refund");         //接口类型:unified.trade.refund
            reqData.SetValue("out_trade_no", out_trade_no);              //商户订单号
            reqData.SetValue("transaction_id", transaction_id);          //平台订单号
            reqData.SetValue("out_refund_no", out_refund_no);            //商户退款单号
            reqData.SetValue("total_fee", total_fee.ToString());         //总金额
            reqData.SetValue("refund_fee", refund_fee.ToString());       //退款金额
            reqData.SetValue("sign", SwiftPassCore.CreateSign(reqData)); //以上参数进行签名

            string data = reqData.ToXml();                               //生成XML报文
            Dictionary <string, string> reqContent = new Dictionary <string, string>();

            reqContent.Add("url", SwiftPassConfig.req_url);
            reqContent.Add("data", data);
            PayHttpClient pay = new PayHttpClient();

            pay.setReqContent(reqContent);
            if (!pay.call())
            {
                throw new BizException(string.Format("HTTP ERROR:Code[{0}] Message[{1}]", pay.getResponseCode(), pay.getErrInfo()));
            }

            var resData = new ParameterData();

            resData.FromXml(pay.getResContent());
            if (resData.GetValue("status") != "0") //校验返回状态
            {
                throw new BizException("返回状态错误代码:" + resData.GetValue("status") + ",错误信息:" + resData.GetValue("message"));
            }

            if (!SwiftPassCore.CheckSign(resData)) //校验数据签名
            {
                throw new BizException("申请退款签名校验未通过");
            }

            if (resData.GetValue("result_code") != "0") //校验业务结果
            {
                throw new BizException("业务结果错误代码:" + resData.GetValue("err_code") + ",错误信息:" + resData.GetValue("err_msg"));
            }

            return(resData);
        }
Exemplo n.º 7
0
        /// <summary>
        /// 校验支付结果请求
        /// </summary>
        /// <param name="data">业务数据报文</param>
        /// <param name="resultInfo">支付结果记录</param>
        /// <returns></returns>
        public override ExecuteResult CheckRequest(string data, PayResultInfo resultInfo)
        {
            var result = new ExecuteResult();

            try
            {
                //校验请求报文
                var notifyData = new ParameterData();
                notifyData.FromXml(data);
                resultInfo.OrderId = notifyData.GetValue("out_trade_no");
                if (notifyData.GetValue("status") != "0") //校验返回状态
                {
                    throw new BizException("返回状态错误代码:" + notifyData.GetValue("status") + ",错误信息:" + notifyData.GetValue("message"));
                }

                if (!SwiftPassCore.CheckSign(notifyData)) //校验数据签名
                {
                    throw new BizException("签名校验未通过");
                }

                if (notifyData.GetValue("result_code") != "0") //校验业务结果
                {
                    throw new BizException("业务结果错误代码:" + notifyData.GetValue("err_code") + ",错误信息:" + notifyData.GetValue("err_msg"));
                }

                if (notifyData.GetValue("pay_result") != "0") //校验支付结果
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "用户支付失败:" + notifyData.GetValue("pay_info");
                    PayResultDAL.Update(resultInfo);

                    result.Message = resultInfo.ResultDesc;
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }

                //检查支付结果中transaction_id是否存在
                resultInfo.TradeNo = notifyData.GetValue("transaction_id");
                if (string.IsNullOrEmpty(resultInfo.TradeNo))
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "支付结果中平台交易单号不存在";
                    PayResultDAL.Update(resultInfo);

                    result.Message = resultInfo.ResultDesc;
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }

                //查询支付单,判断支付单真实性
                var queryData = SwiftPassPayApi.OrderQuery(resultInfo.OrderId, resultInfo.TradeNo);
                if (queryData.GetValue("status") != "0" || //校验返回状态
                    queryData.GetValue("result_code") != "0" || //校验业务结果
                    !SwiftPassCore.CheckSign(queryData) || //校验数据签名
                    queryData.GetValue("trade_state") != "SUCCESS")    //校验交易状态
                {
                    resultInfo.ExecuteResult = (int)ResultStatus.Failure;
                    resultInfo.ResultDesc    = "平台交易单号查询失败";
                    PayResultDAL.Update(resultInfo);

                    result.Message = resultInfo.ResultDesc;
                    result.Status  = ResultStatus.Failure;
                    return(result);
                }
            }
            catch (BizException wex)
            {
                resultInfo.ExecuteResult = (int)ResultStatus.Error;
                resultInfo.ResultDesc    = wex.Message;
                PayResultDAL.Update(resultInfo);

                result.Message = resultInfo.ResultDesc;
                result.Status  = ResultStatus.Error;
                return(result);
            }
            result.Status = ResultStatus.Success;
            return(result);
        }