En raison de l'utilisation généralisée de WeChat, une série de produits développés sur la base de WeChat ont vu le jour. Cet article présente principalement la méthode de mise en œuvre de l'analyse du paiement WeChat (version .NET). Ceux qui sont intéressés peuvent en apprendre davantage.
J'ai créé une version Web du paiement WeChat il y a quelque temps et j'ai rencontré de nombreux problèmes, mais ils ont finalement été résolus. Je vais maintenant enregistrer le processus de développement et les instructions ici pour donner aux autres quelques références.
1. Préparation
Tout d'abord, vous devez activer la fonction de paiement WeChat. Dans le passé, l'activation du paiement WeChat nécessitait un dépôt de 30 000, mais c'est maintenant le cas. n'est plus nécessaire, alors... Création de cette fonctionnalité.
Pour développer le paiement WeChat, vous devez effectuer les réglages appropriés dans le backend du compte officiel et le backend du marchand WeChat.
1. Configuration du répertoire de développement
Le paiement WeChat doit configurer le répertoire d'autorisation de paiement en arrière-plan du compte officiel (paiement WeChat = "Configuration de développement"). Le répertoire autorisé ici doit être une adresse en ligne, c'est-à-dire une adresse accessible via Internet. Le système de paiement WeChat doit pouvoir accéder à votre adresse via Internet.
Le répertoire autorisé WeChat doit être précis par rapport au répertoire de deuxième ou troisième niveau. Exemple : Si le lien pour lancer le paiement est http://www.hxfspace.net/weixin/WeXinPay/WeXinPayChoose, alors le répertoire configuré. devrait être http://www.hxfspace.net/weixin/WeXinPay/ où http://www.hxfspace.net est le nom de domaine et weixin est le répertoire virtuel WeXinPay, qui est le contrôleur. Les demandes de paiement associées sont toutes présentes. l'action dans WeXinPay.
Effectuez un rappel de la demande de paiement pour obtenir le code d'autorisation (code), vous devez donc définir ici le nom de domaine d'autorisation. Bien entendu, le nom de domaine doit ici être le même que celui figurant dans le répertoire d'autorisation de paiement. N'oubliez pas de configurer ça. J'ai juste oublié de le configurer et j'ai longtemps cherché la raison, en pleurant à mort.
3. Préparation des paramètres pertinents
Pour appeler le paiement WeChat, vous devez lancer une demande de paiement auprès du système de paiement WeChat via un script. Pour la description des paramètres, voir
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
La génération du package et paySign nécessite la clé de développeur AppSecret (clé d'application), le compte marchand WeChat et la clé de paiement WeChat
Sans plus tarder, parlons du processus après le tri :
1 Obtenez le code d'autorisation via le rappel d'autorisation WeChat
2. Via le code d'autorisation En échange de l'autorisation de la page Web access_token et openid
3. Appelez l'interface de commande unifiée pour obtenir le prepayId
4. Configurez les paramètres de demande de paiement jsapi WeChat et lancez le paiement
5. Recevez un rappel de paiement WeChat pour les opérations ultérieures
Tout d'abord, transmettez l'adresse de paiement d'initiation et les paramètres associés à l'interface de paiement WeChat. reçu et vérifié, demandez votre adresse de paiement et apportez le code d'autorisation.
Par exemple, me voici
Méthode d'URL d'autorisation de page Web Stitching WeChat
//判断是否网页授权,获取授权code,没有代表没有授权,构造网页授权获取code,并重新请求 if (string.IsNullOrEmpty(Request.QueryString["code"])) { string redirectUrl = _weChatPaySerivce.GetAuthorizeUrl(account.AppId, account.RedquestUrl, "STATE" + "#wechat_redirect", "snsapi_base"); return Redirect(redirectUrl); }
2. Échangez le code d'autorisation pour l'autorisation de la page Web access_token et openid
Après avoir obtenu le code d'autorisation dès la première étape, combinez l'URL de demande d'autorisation de la page Web pour obtenir access_token et openid
public string GetAuthorizeUrl(string appId, string redirectUrl, string state, string scope) { string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}", appId, HttpUtility.UrlEncode(redirectUrl), scope, state); /* 这一步发送之后,客户会得到授权页面,无论同意或拒绝,都会返回redirectUrl页面。 * 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。这里的code用于换取access_token(和通用接口的access_token不通用) * 若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE */ AppLog.Write("获取到授权url:", AppLog.LogMessageType.Debug); return url; }
3. Appelez l'interface de commande unifiée pour obtenir le prépaiement prepayId
Le RequestHandler ici est une dll packagée par d'autres en ligne, qui vous aide à packager la génération de signature et certaines demandes de vérification. La dll peut être téléchargée depuis leur site officiel http://weixin.senparc.com/
public Tuple<string, string> GetOpenidAndAccessTokenFromCode(string appId, string code, string appSecret) { Tuple<string, string> tuple = null; try { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appId, appSecret, code); string result = WeChatPayHelper.Get(url); AppLog.Write("微信支付-获取openid和access_token 请求Url:" + url + "result:" + result, AppLog.LogMessageType.Debug); if (!string.IsNullOrEmpty(result)) { var jd=Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(result); tuple = new Tuple<string, string>(jd["openid"],jd["access_token"]); AppLog.Write("微信支付-获取openid和access_token成功", AppLog.LogMessageType.Debug); } } catch (Exception ex) { AppLog.Write("微信支付:获取openid和access_tokenu异常", AppLog.LogMessageType.Debug,ex); } return tuple; }
4 . Configurez les paramètres de demande de paiement jsapi WeChat, lancez le paiement
.
我这里是首先组装好微信支付所需要的参数,然后再创建调用js脚本
//生成JsAPI支付参数 RequestHandler paySignReqHandler = new RequestHandler(null); paySignReqHandler.SetParameter("appId", account.AppId); paySignReqHandler.SetParameter("timeStamp", timeStamp); paySignReqHandler.SetParameter("nonceStr", nonceStr); paySignReqHandler.SetParameter("package", string.Format("prepay_id={0}", prepayId)); paySignReqHandler.SetParameter("signType", "MD5"); string paySign = paySignReqHandler.CreateMd5Sign("key", account.PaySignKey); WeChatJsPayRequestModel resultModel = new WeChatJsPayRequestModel { AppId = account.AppId, NonceStr = nonceStr, TimeStamp = timeStamp, Package = string.Format("prepay_id={0}", prepayId), PaySign = paySign, SignType = "MD5" };
创建调用脚本
private string CreateWeixinJs(WeChatJsPayRequestModel model) { string js = @"<script type='text/javascript'> callpay(); function jsApiCall(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { requestParam }, function (res) { if(res.err_msg == 'get_brand_wcpay_request:ok' ){ window.location.href = 'successUrl'; }else{ window.location.href = 'failUrl'; } } ); } function callpay() { if (typeof WeixinJSBridge == 'undefined'){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } </script>"; string requestParam = string.Format(@"'appId': '{0}','timeStamp': '{1}','nonceStr': '{2}','package': '{3}','signType': '{4}','paySign': '{5}'", model.AppId, model.TimeStamp, model.NonceStr, model.Package, model.SignType, model.PaySign); js = js.Replace("requestParam", requestParam) .Replace("successUrl", model.JumpUrl + "&result=1") .Replace("failUrl", model.JumpUrl + "&result=0"); AppLog.Write("生成可执行脚本成功", AppLog.LogMessageType.Debug); return js; }
5、接收微信支付回调进行后续操作
回调的时候首先需要验证签名是否正确,保证安全性,签名验证通过之后再进行后续的操作,订单状态、通知啥的。
ResponseHandler resHandler = new ResponseHandler(System.Web.HttpContext.Current); bool isSuccess = _weChatPaySerivce.ProcessNotify(resHandler); if (isSuccess) { string result = @"<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[支付成功]]></return_msg> </xml>"; HttpContext.Response.Write(result); HttpContext.Response.End(); } return new EmptyResult();
这里有一点需要注意,就是微信支付回调的时候微信会通知八次,好像是这个数吧,所以你需要在第一次收到通知之后,把收到请求这个状态以xml的格式响应给微信支付接口。当然你不进行这个操作也是可以的,再回调的时候 每次去判断该订单是否已经回调成功,回调成功则不进行处理就可以了。
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!