Cette fois, je vais vous présenter le développement de la fonction de remboursement de WeChat Pay. Quelles sont les précautions pour le développement de la fonction de remboursement de WeChat Pay. Ce qui suit est un cas pratique, jetons un coup d'œil. .
Tout d’abord, plaignons-nous de la documentation et de la démo de WeChat. Les informations sur les étapes importantes ne sont pas clairement soulignées et la démo .net n’a jamais été exécutée avec succès.
1. Scannez le code QR WeChat pour vous connecter
2. Paiement WeChat PC
Il a fallu plusieurs tentatives pour passer par cette fonction de remboursement. Ce qui suit est une introduction aux étapes de développement de la fonction de remboursement des paiements WeChat :
1. Téléchargez le certificat et importez-le dans le système
Le remboursement WeChat nécessite un certificat. certificat dans la démo officielle, mais il s'agit d'un certificat que vous devez télécharger à partir de la colonne de sécurité de l'API de la plateforme marchande WeChat. Dans un document Word de l'exemple d'utilisation du certificat officiel, vous pouvez voir les mots suivants : C# Là. est une chose à noter, en plus d'utiliser apiclient_cert.p12, le certificat doit être importé dans le système d'exploitation avant de pouvoir être utilisé 1. Utilisé dans le code ; 2. Importer dans le système d'exploitation, les deux étant indispensables. La version .NET doit être supérieure à 2.0 Je ne connaissais pas ces deux étapes auparavant et j'ai perdu trop de temps. Téléchargez donc d'abord le certificat :
La vérification du téléphone portable et le mot de passe de connexion sont requis lors du téléchargement. Après le téléchargement, recherchez le certificatapiclient_cert.p12 et double-cliquez pour l'importer. Lors de l'importation, vous serez invité à saisir un mot de passe. Ce mot de passe est l'identifiant du commerçant, et il doit s'agir du certificat téléchargé. votre propre plateforme marchande. Sinon, une invite pour un mot de passe incorrect apparaîtra :
Importez l'invite correcte : 2. Remboursement du code Vous pouvez directement utiliser le code dans la démo officielle ici. Téléchargez la démo Vous devez modifier plusieurs paramètres dans 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; }
Comment utiliser le dégradé de ss3
Explication détaillée de Promise dans jQuery, Angular et node
Bibliothèque de lecture vidéo H5 video.js explication détaillée
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!