Processus commercial
Le site officiel de WeChat le décrit de manière très détaillée, avec des images. Je le répète.
L'utilisateur clique sur un bouton de paiement-->{Traitement push important en arrière-plan}-->L'utilisateur voit une interface pour saisir un mot de passe, y compris le montant et d'autres informations-->Après le l'utilisateur entre le mot de passe, a La page où le paiement est réussi (cette partie du processus est complétée par WeChat lui-même, nous n'avons rien à faire) --> Retourner à la propre page du système (vous ne pouvez pas laisser le l'utilisateur continue de regarder une page où le paiement est effectué. Après avoir dépensé de l'argent, c'est correct Ça fait mal, saute vite ~ Je le regrette au bout d'un moment, comment demander un remboursement, le pauvre ingénieur doit encore développer la fonction de remboursement)
Processus de développement
1) Obtenir l'autorisation de l'utilisateur (cela peu importe que je le fasse ou non, je ne l'ai pas encore fait de toute façon)
2) Appeler l'interface de commande unifiée pour obtenir l'ID de prépaiement
3) H5 appelle le JS intégré du paiement WeChat
4) Une fois le paiement terminé, le traitement de l'URL de rappel WeChat
En regardant le long texte, vous ne vous sentez pas très à l'aise ? J'ai oublié où j'ai vu cette phrase. Une image au lieu de milliers de mots. (La partie rouge sur l'image est ce que nous devons faire. Il ne semble pas y avoir grand-chose
La partie principale de cet article commence (Si vous voulez voir le code directement, même si vous collez le code, vous ne pourrez peut-être pas le comprendre. Cela ne veut pas dire que le code est difficile, diverses séparations et différentes classes ne sont pas simples. Si vous comprenez cela, vous ne pourrez peut-être pas déboguer la dernière erreur de signature, ou $get_brand_wcpay_request:fail.$. key0 (je dois toujours être obéissant concernant les paramètres.) Je suis un peu confus quant à l'apprentissage de l'anglais récemment. Si vous ne le faites pas. comprenez le sens, vous pouvez l'ignorer. Je vous en parlerai plus tard dans l'article
1. Générez une interface de commande unifiée et obtenez
Paramètres requis ==. name == Où les trouver :
Le responsable de WeChat a donné un paramètre Description détaillée de https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 Certains paramètres, si vous ne savez toujours pas où les trouver, continuez à lire
appid == Application ID == Connectez-vous au backend du compte officiel WeChat - développement - configuration de base
mch_id == Numéro du commerçant de paiement WeChat == Connectez-vous au backend de paiement WeChat et vous verrez
device_info ==Numéro d'équipement==Numéro de terminal (numéro de magasin ou identifiant de caisse enregistreuse), Remarque : veuillez envoyer "WEB" pour le paiement sur la page web du PC ou sur le compte officiel
body==Description du produit==Ordre de paiement ou produit brièvement Description (je ne sais pas ce que c'est, ce n'est pas grave, passe simplement une chaîne avec désinvolture, et passez une chaîne anglaise avec désinvolture. Vous obtiendrez tous les points pour votre sage décision à ce moment-là. S'il s'agit de chinois, vous ne rencontrerez peut-être aucun indice. L'erreur de signature est grave et la personne commence à douter de sa vie)
trade_type==Transaction type==Les valeurssont les suivantes : JSAPI, NATIVE, APP. Le titre de JSAPI que nous utilisons ici a déjà indiqué qu'il s'agit d'un paiement par compte officiel WeChat
. ps : JSAPI--paiement par compte public, NATIVE--paiement par scan code natif, APP--paiement par application, les paramètres de l'interface de commande unifiée trade_type peuvent être trouvés ici MICROPAY--paiement par carte, le paiement par carte est disponible. interface, n'appelle pas l'interface de commande unifiée
nonce_str==random string==chaîne aléatoire, pas plus de 32 chiffres
ps : les amis peuvent nommer le nonce , je suis très surpris, sont tous les membres de l'équipe WeChat Doubi ? J'ai vérifié l'encyclopédie et j'ai découvert que les nombres aléatoires sont également représentés par le nonce (les bébés curieux peuvent vérifier la signification du nonce dans le dictionnaire Cambridge). Grâce à mes efforts inlassables,
j'ai découvert cela. nonce ==numéro utilisé une fois. Soudain éclairé.
notify_url==adresse de notification==reçoit l'adresse de rappel de notification asynchrone du paiement WeChat L'URL de notification doit être une URL directement accessible et ne peut pas contenir de paramètres. (Ici, qu'est-ce qu'un bon nom ? Nommez-le simplement, vous n'en aurez pas besoin avant un moment de toute façon)
out_trade_no==Numéro de commande du marchand==Le numéro de commande dans le système marchand, dans les 32 caractères, peut be Contient des lettres (Chaque fois que je lis l'explication officielle sur WeChat, je suis de plus en plus confus. Y en a-t-il ? Ce n'est pas grave, j'en enverrai juste 1.)
total_fee==Montant total == Montant total de la commande, l'unité est en centimes (pour les tests de projet de l'entreprise, vous devez le payer vous-même, et 1 centime c'est de l'argent. ps : En ce moment, je penserai toujours à un camarade de classe qui a dit que les jambes volent sont aussi de la viande)
openid ==User ID==trade_type=JSAPI, ce paramètre doit être passé, l'identifiant unique de l'utilisateur sous l'appid du commerçant.
Le plus important est que les caractères importants apparaissent toujours à la fin.
sign==signature==algorithme de signature officiel. https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3. Je ne le comprends pas, je ne le comprends pas très bien. Pensez-vous que vous le comprenez ? Cela n'a pas d'importance si vous ne rencontrez pas quelques erreurs de signature, avez-vous le culot de dire que vous l'avez fait. Développement du paiement WeChat ?
a dit que ce signe a un paramètre plus important. Paramètres impliqués dans la signature. Quoi qu'il en soit, j'ai mis du temps à le trouver. (Le paiement WeChat demandé par l'exploitation de l'entreprise, quand je le lui ai demandé, son expression était comme ceci.
key==chemin de configuration de la clé : plateforme marchande WeChat (pay.weixin.qq.com)- -> Paramètres du compte-->Sécurité API-->Paramètres clés
Ici :
Il y a des instructions pour le trouver en ligne. Je suis trop paresseux pour le chercher. Je viens de penser moi-même à une chaîne, puis je l'ai chiffrée en une chaîne de 32 bits à l'aide de MD5 et je l'ai réinitialisée.
Cette valeur clé est utilisée lors de la génération d'une signature, elle doit donc être enregistrée.
J'ai vu que d'autres en utilisaient beaucoup pour générer des signatures. Quoi qu'il en soit, j'ai utilisé les paramètres donnés ci-dessus pour générer le signe (ceci ci-dessus fait référence à mon blog, pas à WeChat. Afin de réduire les malentendus, publiez les paramètres. J'avais l'habitude de générer la signature du signe)
Les paramètres que j'ai utilisés pour générer la signature du signe
Après avoir préparé les paramètres ci-dessus, Le format XML
est le suivant :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><xml> <appid>wxb1427ebebexxxxxx</appid> XXX费用 <device_info>WEB</device_info> <mch_id>132186xxxx</mch_id> <nonce_str>6AED000AF86A084F9CB0264161E29DD3</nonce_str> <notify_url>https://一个域名/api/wechatPay/jsapiPayNotify</notify_url> <openid>oo8WUt0taCqjt552htW1vw-xxxxx</openid> <out_trade_no>1</out_trade_no> <sign>各种排序+key生成的那个sign</sign> <total_fee>1</total_fee> <trade_type>JSAPI</trade_type></xml>
Appelez l'adresse de commande unifiée de WeChat : https://api.mch.weixin.qq.com/pay/unifiedorder
Soyez témoin du moment miraculeux. Si les paramètres ci-dessus sont comme par magie corrects, vous recevrez la chaîne XML renvoyée par WeChat au format suivant
<xml> <return_code></return_code> <return_msg></return_msg> <appid></appid> <mch_id></mch_id> <device_info></device_info> <nonce_str></nonce_str> <sign></sign> <result_code></result_code> <prepay_id></prepay_id> <trade_type></trade_type></xml>
Ce dont nous avons besoin, c'est de ce produit
prepay_id 获取到这货之后,第一步骤已经结束了,可以去喝个茶,吃个冰棍,小庆祝一下。 2、H5调起微信支付的内置JS
Les paramètres renvoyés de l'arrière-plan au premier plan doivent inclure les éléments suivants :
appId==Ceci est inchangé==Ne jamais changer
timeStamp==Timestamp ==Règles : https ://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2. Après l’avoir lu, j’ai toujours l’air confus. Ce n’est pas grave, nous avons la classe d’outils. Qui sait, appelez-le directement
nonceStr == Quoi qu'il en soit, j'ai utilisé la même chaîne aléatoire que la signature tout à l'heure. Théoriquement, cela ne devrait pas avoir d'importance si vous ne l'utilisez pas. Les amis diligents peuvent essayer
package==order details extend string==prepay_id valeur du paramètre renvoyée par l'interface de commande unifiée. : prepay_id=** *(Vous l'avez bien deviné. Le prepay_id que nous venons de consacrer tant d'efforts à obtenir est utilisé ici. Lorsque je l'ai utilisé pour la première fois, j'ai continué à utiliser l'ID de commande pour demander, puis les informations fournies par WeChat moi, c'est que les paramètres de la requête étaient erronés et manquants. Paramètre $key0$ Ne me dites pas, c'est juste moi )
signType==Signature method==Signature algorithm, MD5 est actuellement pris en charge
.paySign==Signature==Cette signature est requise Régénérer, en arrière-plan. Utilisez les 4 paramètres ci-dessus et une clé (ne changez jamais). (L'horodatage lorsque j'ai généré la signature et l'horodatage renvoyé à la réception sont les mêmes timeStamp. Est-ce que ça marche s'ils sont différents ? Il n'y a pas de vérification)
Code pour générer paySign
NB : Lors de la génération de prepay_id, l'appid est un i minuscule. Lors de la génération de paySign, l'appId est un I majuscule
Pour l'instant, si tout se passe bien, vous verrez. une page comme celle-ci.
Mais et si vous n’aviez pas vu ça. Au lieu de cela, il indique que le répertoire n'est pas autorisé ou que le compte de test n'est pas dans la liste blanche. Je pense que c'est la bonne façon d'ouvrir ce blog.
Historique du compte officiel WeChat, paiement WeChat, il y a un répertoire d'autorisation de paiement dans la configuration de développement, répertoire d'autorisation de test,
Répertoire d'autorisation de paiement : pendant le développement, mettez-le en premier. (Grand-père Deng Xiaoping a dit un jour que lorsqu'on traite des relations sino-japonaises, nous devrions mettre de côté les problèmes que nous ne pouvons pas résoudre.)
Répertoire des autorisations de test : c'est ce que nous devons remplir. Vous avez besoin d’une adresse accessible depuis le monde extérieur. L'IP peut également être utilisée (elle peut être testée personnellement). Si votre IP n'est pas accessible depuis le réseau externe, demandez à un camarade de classe d'exploitation et de maintenance de le résoudre. Il est recommandé de configurer un nom de domaine accessible depuis le réseau externe pour les tests.
Test de la liste blanche : cela n'explique pas
Entrez le mot de passe, et vous verrez ensuite le résultat comme celui-ci. (Cela ne nous oblige à rien faire)
Je suis tellement excitée Allons manger quelque chose rapidement pour supprimer l'excitation intérieure.
Pour le reste, il nous reste encore deux choses à faire. Parlons d’abord des plus simples.
3. Une fois le paiement réussi, revenez à une page de votre propre système
function onBridgeReady(){ WeixinJSBridge.invoke ( 'getBrandWCPayRequest', { "appId" : appId, //公众号名称,由商户传入 "timeStamp":timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : nonceStr, //随机串 "package" : Package, "signType" :signType, //微信签名方式: "paySign" : paySign //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) { window.location.replace("index.html"); } } ); }
Dans le code ci-dessus, la partie rouge peut être modifiée vers la page vers laquelle vous souhaitez accéder. à. Êtes-vous curieux de savoir ce qu'est un remplacement ? Déplacez-vous ici et jetez un œil : http://www.php.cn/
4, la dernière partie. combat
Cette partie comporte les 3 petites étapes suivantes
1) Analyser les informations de flux transmises et vérifier l'exactitude des informations contenues dans le flux en signant à nouveau. Il s'agit de déterminer si les informations ont été envoyées par WeChat
2) Si return_code et result_code sont tous deux SUCCÈS, gérez la propre logique métier du commerçant. Il s'agit simplement du statut de paiement de la commande et de quelques autres informations.
3)告诉微信,我收到你的返回值了。不用在发了。
关于以上三点的解释。微信官方是这么说的
//支付完成后,微信会把相关支付和用户信息发送到商户设定的通知URL, //验证签名,并回应微信。 //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败, //微信会通过一定的策略(如30分钟共8次)定期重新发起通知, //尽可能提高通知的成功率,但微信不保证通知最终能成功。 //商户自行增加处理流程, //例如:更新订单状态 //例如:数据库操作 //例如:推送支付完成信息
还记得我们在第一步生成预支付id(prepay_id时的那个notify_url吗。如果不记得了,请往上翻。如果当时只是随便写了一个,那么这会需要去改一改了。)
一个能访问的到的action.同样地址需要外网能访问的到。没有试ip好不好使。开发这部分功能的时候,运维同学已经配置了测试域名。好开心啊,终于不用在纠结于一些交互配置了。
和支付宝不同,微信返回的是流。和支付宝不同,微信返回的是流。和支付宝不同,微信返回的是流。重要的事情说三遍
解析之后,得到的格式是这样子的
<xml><appid><![CDATA[wxb1427ebebeeaxxxx]]></appid> <bank_type><![CDATA[CFT]]></bank_type> <cash_fee><![CDATA[1]]></cash_fee> <device_info><![CDATA[WEB]]></device_info> <fee_type><![CDATA[CNY]]></fee_type> <is_subscribe><![CDATA[Y]]></is_subscribe> <mch_id><![CDATA[132186xxxx]]></mch_id> <nonce_str><![CDATA[07FC15C9D169EE48573EDD749D25945D]]></nonce_str> <openid><![CDATA[oo8WUt0taCqjt552htW1vw-xxxxx]]></openid> <out_trade_no><![CDATA[你的订单编号]]></out_trade_no> <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code> <sign><![CDATA[E69940B3EDC437CB5A181210D523806E]]></sign> <time_end><![CDATA[20160621134204]]></time_end> <total_fee>1</total_fee> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[400386200120160621763973xxxx]]></transaction_id> </xml>
对以上第一点和第三点做个解释。
再次吐槽一下。微信真的很喜欢用签名啊。整个过程,3遍签名。也是醉了。
1)我们看到上述微信返回的xml中含有很多字段。使用上述xml中,处sign意外的值+key,进行签名。你没有看错。包含result_code和return_code。
微信的官方对于签名有解释。
原谅我真的好久不学语文了。真的没理解这句话,是用微信回调函数中传的参数,进行重新签名。傻傻的,还在想,用第二次签名是的参数进行签名,时间戳怎么办,要不要存在数据库里面。
将获得的签名与xml中的sign对比,如果相同,证明是微信返回的通知。如果不同,你的通知地址可能被黑客破解了。要不要告诉老板呢,告诉老板了,我怎么解决呢。
2)商户逻辑处理,不解释
3)告诉微信,我收到了你的通知,不需要在发送了。
怎么告诉微信呢。我翻遍了微信的文档,也没有找到回复微信通知这个url。
经人知道,再一次的刷新了认知观。用response.
我是这么写的
response.getWriter().write(xml);
这个xml就是微信给你的那个流转化的字符串。
xml中的return_code要是SUCCESS或者FAIL
别问我怎么知道的。官方的demo里面写的
if($notify->checkSign() == FALSE){ $notify->setReturnParameter("return_code","FAIL");//返回状态码 $notify->setReturnParameter("return_msg","签名失败");//返回信息 }else{ $notify->setReturnParameter("return_code","SUCCESS");//设置返回码 } $returnXml = $notify->returnXml();
按照这个写法,返回的数据。在没有收到微信的通知。
之前在测试的时候,返回字符串之后,在没有收到微信的通知,这两天偶然查日志,发现,微信在一直的,通知,不一定是8次。从打印的日志看
有4次,6次。突然,好晕啊。有明白的朋友,还请多多指教
--------------------------------------------------------------
微信公众号支付--JSAPI的开发思路和一下参数的具体解释,全部完成了。具体代码。等我从公司项目里面抽出来。在整理。
还有一个坑:我们在第一步的时候,body传的是英文,如果传中文,直接能用的赶紧感谢一下上苍,返回参数错误的,应该是正常吧。
我的对象和xml转化是用的Java的JAXBContext。很好用的赶脚。赶脚比XMLStream好用。
更多Lensemble du processus de développement des paiements du compte public WeChat相关文章请关注PHP中文网!