Geschäftsprozess
Die offizielle WeChat-Website beschreibt ihn ausführlich und mit Bildern. Ich sage es noch einmal.
Der Benutzer klickt auf eine Zahlungsschaltfläche-->{Big-Push-Verarbeitung im Hintergrund}-->Der Benutzer sieht eine Schnittstelle zur Eingabe eines Passworts, einschließlich des Betrags und anderer Informationen-->Nach dem Der Benutzer gibt das Passwort ein, a Die Seite, auf der die Zahlung erfolgreich ist (dieser Teil des Prozesses wird von WeChat selbst abgeschlossen, wir müssen nichts tun) -> Rückkehr zur eigenen Seite des Systems (Sie können das nicht zulassen Der Benutzer schaut immer wieder auf eine Seite, auf der die Zahlung abgeschlossen ist. Es tut weh, springe schnell ~ Ich bereue es nach einer Weile, wie man eine Rückerstattung beantragt. Der arme Techniker muss die Rückerstattungsfunktion noch entwickeln 🎜>
Entwicklungsprozess1) Benutzerberechtigung einholen (dies ist egal, ob ich es mache oder nicht, ich habe es sowieso noch nicht gemacht)2) Anruf die einheitliche Bestellschnittstelle, um die Vorauszahlungs-ID zu erhalten3) H5 ruft das integrierte JS der WeChat-Zahlung auf4) Nach Abschluss der Zahlung erfolgt die Verarbeitung der WeChat-Rückruf-URL Wenn Sie sich den langen Text ansehen, fühlen Sie sich nicht sehr wohl? Ich habe vergessen, wo ich diesen Satz gesehen habe. Ein Bild statt tausend Wörter. (Der rote Teil im Bild ist das, was wir tun müssen. Da scheint nicht viel zu sein Der Hauptteil dieses Artikels beginnt (Wenn Sie den Code direkt sehen möchten, können Sie ihn möglicherweise nicht verstehen, selbst wenn Sie ihn einfügen. Dies bedeutet nicht, dass der Code schwierig ist, verschiedene Trennungen und verschiedene Klassen nicht einfach sind. Wenn Sie verstehen Möglicherweise können Sie den letzten Signaturfehler nicht beheben, oder $get_brand_wcpay_request:fail.$. Ich muss immer noch auf die Parameter achten.) Ich bin ein wenig verwirrt, was das Erlernen von Englisch angeht Verstehe die Bedeutung, ich werde es dir später im Artikel erzählen. Erforderliche Parameter Name == Wo sie zu finden sind: Der WeChat-Beamte hat einen Parameter angegeben. Detaillierte Beschreibung von https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1 Freunde, die noch Ich weiß nicht, wo ich es finden kann, lesen Sie bitte weiter untenappid == Anwendungs-ID == Melden Sie sich beim offiziellen WeChat-Konto-Backend an – Entwicklung – Grundkonfiguration
mch_id == WeChat Zahlungshändlernummer == Melden Sie sich beim WeChat-Zahlungs-Backend an und Sie sehen device_info ==Equipment number==Terminal-Gerätenummer (Geschäftsnummer oder Kassengeräte-ID), Hinweis: Bitte senden Sie „WEB“ für Zahlung auf PC-Webseite oder offiziellem Kontobody==Produktbeschreibung==Produkt- oder Zahlungsauftrag kurz Beschreibung (Ich weiß nicht, was zum Teufel es ist, es spielt keine Rolle, übergebe einfach beiläufig eine Zeichenfolge , und geben Sie beiläufig eine englische Zeichenfolge ab. Für Ihre kluge Entscheidung erhalten Sie zu diesem Zeitpunkt möglicherweise keine Ahnung. Der Signaturfehler ist schwerwiegend und die Person beginnt, an ihrem Leben zu zweifeln 🎜>trade_type==Transaktionstyp==Die Werte lauten wie folgt: JSAPI, NATIVE, APP Der Titel von JSAPI, den wir hier verwenden, besagt bereits, dass es sich um die offizielle WeChat-Kontozahlung handelt : JSAPI – öffentliche Kontozahlung, NATIVE – native Scancode-Zahlung, APP – App-Zahlung, die Parameter für die einheitliche Bestellschnittstelle trade_type finden Sie hier MICROPAY – Zahlung per Karte, Zahlung per Karte ist separat verfügbar , ruft nicht die einheitliche Bestellschnittstelle auf nonce_str==random string==zufällige Zeichenfolge, nicht länger als 32 Ziffern ps: Freunde dürfen die Nonce nennen, ich bin sehr überrascht, das sind alle Die Leute im WeChat-Team Doubi~ Nach dem Durchsuchen der Enzyklopädie werden Zufallszahlen auch durch Nonce dargestellt (neugierige Babys können die Bedeutung von Nonce im Cambridge-Wörterbuch überprüfen). Durch meine unermüdlichen Bemühungen habe ich das entdeckt. nonce ==Nummer einmal verwendet. notify_url==Benachrichtigungsadresse==Rückrufadresse für asynchrone WeChat-Zahlung erhalten Die Benachrichtigungs-URL muss eine direkt zugängliche URL sein und darf keine Parameter enthalten. (Hier, was ist ein guter Name? Nennen Sie ihn einfach beiläufig, Sie werden ihn sowieso eine Weile nicht brauchen) out_trade_no==Händler-Bestellnummer==Bestellnummer innerhalb des Händlersystems, maximal 32 Zeichen, kann be Enthält Buchstaben (Jedes Mal, wenn ich die offizielle Erklärung auf WeChat lese, werde ich noch verwirrter. Gibt es welche? Egal, ich sende nur 1.)
total_fee==Total Betrag==Gesamtbetrag der Bestellung, die Einheit ist Cent (für die Projekttests des Unternehmens müssen Sie es selbst bezahlen, und 1 Cent ist Geld. PS: Zu diesem Zeitpunkt denke ich immer an einen Klassenkameraden, der gesagt hat, dass Beine fliegen sind auch Fleisch)
openid ==User ID==trade_type=JSAPI, dieser Parameter muss übergeben werden, die eindeutige ID des Benutzers unter der App-ID des Händlers.
Das Wichtigste ist, dass wichtige Charaktere immer am Ende erscheinen.
Hier:
Eine Anleitung, wie Sie es online finden. Ich bin zu faul, danach zu suchen. Ich habe mir gerade selbst einen String ausgedacht, ihn dann mit MD5 in einen 32-Bit-String verschlüsselt und zurückgesetzt.
Dieser Schlüsselwert wird beim Generieren einer Signatur verwendet und muss daher gespeichert werden.
Ich habe gesehen, dass andere viel zum Generieren von Signaturen verwendet haben. Ich habe jedoch die oben angegebenen Parameter zum Generieren des Zeichens verwendet (Dies bezieht sich auf meinen Blog, nicht auf WeChat. Um Missverständnisse zu vermeiden, posten Sie die Parameter (Ich habe die Zeichensignatur generiert.)
Die Parameter, die ich zum Generieren der Zeichensignatur verwendet habe
Nachdem ich die oben genannten Parameter vorbereitet habe, Eingekapselt in das XML
-Format lautet es wie folgt:
<?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>
Rufen Sie die einheitliche Bestelladresse von WeChat auf: https://api.mch.weixin.qq.com/pay/unifiedorder
Werden Sie Zeuge des wundersamen Moments. Wenn die oben genannten Parameter auf magische Weise korrekt sind, erhalten Sie die von WeChat zurückgegebene XML-Zeichenfolge im folgenden Format
<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>
Was wir brauchen, ist dieses Produkt
prepay_id 获取到这货之后,第一步骤已经结束了,可以去喝个茶,吃个冰棍,小庆祝一下。 2、H5调起微信支付的内置JS
Die vom Hintergrund in den Vordergrund zurückgegebenen Parameter sollten die folgenden Elemente enthalten:
appId==Dies ist unverändert==Ändert sich nie
timeStamp==Timestamp ==Regeln: https ://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2. Nachdem ich es gelesen habe, sehe ich immer noch verwirrt aus. Es spielt keine Rolle, wir haben die Werkzeugklasse. Wer weiß, rufen Sie es einfach direkt auf
nonceStr == Wie auch immer, ich habe gerade dieselbe zufällige Zeichenfolge wie die Signatur verwendet. Theoretisch sollte es keine Rolle spielen, wenn Sie es nicht verwenden. Fleißige Freunde können es versuchen : prepay_id=** *(Sie haben es richtig erraten. Hier wurde die prepay_id verwendet, die wir nach so viel Aufwand erhalten haben. Als ich sie zum ersten Mal verwendete, verwendete ich weiterhin die Bestell-ID zur Anfrage und dann die Informationen, die WeChat mir gab dass die Anforderungsparameter falsch waren und fehlten. Sagen Sie mir nicht, es liegt nur an mir >paySign==Signatur==Diese Signatur muss im Hintergrund neu generiert werden. Verwenden Sie die oben genannten 4 Parameter + einen Schlüssel (niemals ändern). (Der Zeitstempel, als ich die Signatur erstellt habe, und der Zeitstempel, der an die Rezeption zurückgesendet wurde, sind derselbe Zeitstempel. Funktioniert es, wenn sie unterschiedlich sind? Es erfolgt keine Überprüfung.)
Code zum Generieren von paySign
🎜 eine Seite wie diese. Aber was wäre, wenn Sie das nicht gesehen hätten. Stattdessen wird angezeigt, dass das Verzeichnis nicht autorisiert ist oder dass das Testkonto nicht auf der Whitelist steht. Dies ist meiner Meinung nach der richtige Weg, diesen Blog zu öffnen. Hintergrund des offiziellen WeChat-Kontos, WeChat-Zahlung, es gibt ein Zahlungsautorisierungsverzeichnis in der Entwicklungskonfiguration, Testautorisierungsverzeichnis,Zahlungsautorisierungsverzeichnis: Während der Entwicklung an die erste Stelle setzen. (Opa Deng Xiaoping sagte einmal, wenn es um die chinesisch-japanischen Beziehungen geht, sollten wir Probleme beiseite legen, die wir nicht lösen können.)
Testautorisierungsverzeichnis: Das müssen wir ausfüllen. Sie benötigen eine Adresse, auf die von außen zugegriffen werden kann. Auch IP kann genutzt werden (kann persönlich getestet werden). Wenn über das externe Netzwerk nicht auf Ihre IP zugegriffen werden kann, bitten Sie einen Klassenkameraden für Betrieb und Wartung, das Problem zu lösen. Es wird empfohlen, zu Testzwecken einen Domänennamen zu konfigurieren, auf den über das externe Netzwerk zugegriffen werden kann.
Whitelist testen: Das erklärt nicht
Geben Sie das Passwort ein, dann sehen Sie das Ergebnis so. (Dafür müssen wir nichts tun)
Ich bin so aufgeregt, schnell etwas zu essen, um die innere Aufregung zu unterdrücken.
Im Übrigen haben wir noch zwei Dinge zu tun. Beginnen wir mit den einfachen. 3. Springen Sie nach erfolgreicher Zahlung zurück zu einer Seite in Ihrem eigenen System Im obigen Code kann der rote Teil auf die Seite geändert werden, zu der Sie gehen möchten Zu. Sind Sie neugierig, was Ersatz ist? Gehen Sie hierher und werfen Sie einen Blick darauf: //m.sbmmt.com/4, der letzte Teil. kämpfenDieser Teil besteht aus den folgenden 3 kleinen Schritten 1) Analysieren Sie die übergebenen Flussinformationen und überprüfen Sie die Richtigkeit der im Fluss enthaltenen Informationen durch erneutes Signieren. Es soll festgestellt werden, ob die Informationen von WeChat gesendet wurden 2) Wenn return_code und result_code beide ERFOLGREICH sind, verarbeiten Sie die eigene Geschäftslogik des Händlers. Es handelt sich lediglich um den Zahlungsstatus der Bestellung und einige andere Informationen.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"); } } ); }
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好用。
更多Der gesamte Prozess der WeChat-Zahlungsentwicklung für öffentliche Konten相关文章请关注PHP中文网!