우선, WeChat의 문서와 데모에 대해 불만을 토로합시다. 중요한 단계 정보가 명확하게 강조되지 않았고, .net 데모가 성공적으로 실행되지 않았습니다.
1. WeChat QR 코드를 스캔하여 로그인하세요
2. WeChat PC 결제
이 환불 기능을 통과하는 데 여러 번 시도했습니다. 다음은 WeChat 결제 환불 기능의 개발 단계를 소개합니다.
1. 인증서를 다운로드하여 시스템으로 가져옵니다.
WeChat 환불에는 인증서가 필요하지 않습니다. 공식 데모에는 인증서가 있지만, 위챗 가맹점 플랫폼의 api 보안 칼럼에서 다운받아야 하는 인증서입니다. 공식 인증서 사용 예를 워드 문서로 보면 C#이라는 문구가 있습니다. 코드에서 apiclient_cert.p12 외에도 인증서를 사용하려면 운영 체제로 가져와야 합니다. 1. 코드에 사용됩니다. 2. 운영 체제로 가져옵니다. 두 가지 모두 필수입니다. .NET 버전은 2.0 이상이어야 합니다. 이전에는 이 두 단계를 모르고 너무 많은 시간을 낭비했습니다. 따라서 인증서를 먼저 다운로드하세요.
다운로드 시 휴대폰 인증과 로그인 비밀번호가 필요합니다. 다운로드 후 인증서apiclient_cert.p12를 찾아 두 번 클릭하여 가져올 때 비밀번호를 입력하라는 메시지가 표시됩니다. 이 비밀번호는 가맹점 ID이며 다운로드한 인증서여야 합니다. 나만의 판매자 플랫폼. 그렇지 않으면 비밀번호 오류 메시지가 나타납니다.
올바른 메시지 가져오기: 2. 코드 환불 여기에서 공식 데모의 코드를 직접 사용할 수 있습니다. 데모를 다운로드하세요 WxPayConfig에서 여러 매개변수를 수정해야 합니다:public const string APPID = "wxf6dd794bcexxxx"; public const string MCHID = "xxxx"; public const string KEY = "xxxxx849ba56abbe56e05xxxxx"; public const string APPSECRET = "---"; //=======【证书路径设置】===================================== /* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要) */ public const string SSLCERT_PATH = "/WxPayAPI/cert/apiclient_cert.p12"; public const string SSLCERT_PASSWORD = "131xxxx";
public ActionResult DoRefund() { string result = Refund.Run("","131667780120trade_no", "1", "1"); return Content(result); }
/*** * 申请退款完整业务流程逻辑 * @param transaction_id 微信订单号(优先使用) * @param out_trade_no 商户订单号 * @param total_fee 订单总金额 * @param refund_fee 退款金额 * @return 退款结果(xml格式) */ public static string Run(string transaction_id, string out_trade_no, string total_fee, string refund_fee) { Logger.Info("Refund is processing..."); WxPayData data = new WxPayData(); if (!string.IsNullOrEmpty(transaction_id))//微信订单号存在的条件下,则已微信订单号为准 { data.SetValue("transaction_id", transaction_id); } else//微信订单号不存在,才根据商户订单号去退款 { data.SetValue("out_trade_no", out_trade_no); } data.SetValue("total_fee", int.Parse(total_fee));//订单总金额 data.SetValue("refund_fee", int.Parse(refund_fee));//退款金额 data.SetValue("out_refund_no", out_trade_no);//随机生成商户退款单号 data.SetValue("op_user_id", WxPayConfig.MCHID);//操作员,默认为商户号 WxPayData result = WxPayApi.Refund(data);//提交退款申请给API,接收返回数据 Logger.Info("Refund process complete, result : " + result.ToXml()); return result.ToPrintStr(); }
/** * * 申请退款 * @param WxPayData inputObj 提交给申请退款API的参数 * @param int timeOut 超时时间 * @throws WxPayException * @return 成功时返回接口调用结果,其他抛异常 */ public static WxPayData Refund(WxPayData inputObj, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //检测必填参数 if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id")) { throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!"); } else if (!inputObj.IsSet("out_refund_no")) { throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!"); } else if (!inputObj.IsSet("total_fee")) { throw new WxPayException("退款申请接口中,缺少必填参数total_fee!"); } else if (!inputObj.IsSet("refund_fee")) { throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!"); } else if (!inputObj.IsSet("op_user_id")) { throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!"); } inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号 inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串 inputObj.SetValue("sign", inputObj.MakeSign());//签名 string xml = inputObj.ToXml(); var start = DateTime.Now; Log.Debug("WxPayApi", "Refund request : " + xml); string response = HttpService.Post(xml, url, true, timeOut);//调用HTTP通信接口提交数据到API Log.Debug("WxPayApi", "Refund response : " + response); var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的结果转换为对象以返回 WxPayData result = new WxPayData(); result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return result; }
위 내용은 WeChat Pay 환불 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!