/// <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); }
/// <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.FromUrl(data); resultInfo.OrderId = notifyData.GetValue("orderNo"); resultInfo.TradeNo = notifyData.GetValue("paymentOrderId"); resultInfo.PaymentAmt = Convert.ToDecimal(notifyData.GetValue("payAmount")) / 100;//通联支付金额单位为“分”,所以除以100 string tradeStatus = notifyData.GetValue("payResult"); var tradeResult = tradeStatus == "1" ? ResultStatus.Success : ResultStatus.Failure; resultInfo.ResultDesc = tradeStatus; resultInfo.ExecuteResult = (int)tradeResult; result.Data = this.GetPayNotifyInfo(resultInfo); result.Status = ResultStatus.Success; } catch { result.Status = ResultStatus.Error; result.Message = "解析支付结果参数失败"; } return(result); }
/// <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 paramsData = new ParameterData(); paramsData.FromUrl(data); resultInfo.OrderId = paramsData.GetValue("out_trade_no"); resultInfo.TradeNo = paramsData.GetValue("trade_no"); resultInfo.PaymentAmt = Convert.ToDecimal(paramsData.GetValue("total_fee")); string tradeStatus = paramsData.GetValue("trade_status"); var tradeResult = (tradeStatus == "TRADE_FINISHED" || tradeStatus == "TRADE_SUCCESS") ? ResultStatus.Success : ResultStatus.Failure; resultInfo.ResultDesc = tradeStatus; resultInfo.ExecuteResult = (int)tradeResult; result.Data = this.GetPayNotifyInfo(resultInfo); result.Status = ResultStatus.Success; } catch { result.Status = ResultStatus.Error; resultInfo.ResultDesc = result.Message = "解析支付结果参数失败"; resultInfo.ExecuteResult = (int)ResultStatus.Error; PayResultDAL.Update(resultInfo); } return(result); }
/// <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 paramsData = new ParameterData(); paramsData.FromUrl(data); var paramsDict = paramsData.GetValues(); //判断是否有带返回参数 if (paramsDict.Count == 0) { result.Status = ResultStatus.Failure; result.Message = resultInfo.ResultDesc = "支付结果无通知参数"; resultInfo.ExecuteResult = (int)ResultStatus.Failure; PayResultDAL.Update(resultInfo); return(result); } //校验请求报文 resultInfo.OrderId = paramsData.GetValue("out_trade_no"); var aliNotify = new AlipayNotify(); bool verifyResult = aliNotify.Verify(paramsDict, paramsData.GetValue("notify_id"), paramsData.GetValue("sign")); if (!verifyResult) { result.Status = ResultStatus.Failure; result.Message = resultInfo.ResultDesc = "verify failed"; resultInfo.ExecuteResult = (int)ResultStatus.Failure; PayResultDAL.Update(resultInfo); return(result); } result.Status = ResultStatus.Success; return(result); }
/// <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); }
/// <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支付时的参数 }
/// <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"));//支付链接,用于生成二维码 }
/// <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); }
/// <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); }
/// <summary> /// 校验签名 /// </summary> /// <param name="data"></param> /// <returns></returns> public static bool CheckSign(ParameterData data) { string sign = CreateSign(data).ToUpper(); return(data.GetValue("sign").ToUpper().Equals(sign)); }