1: Frühes Wissen zur Zahlung von WeChat -Zahlungskompetenz
Die Voraussetzung ist, dass es bereits ein offizielles Konto gibt, das die WeChat -Zahlungsfunktion beantragt hat, und dann müssen wir das offizielle Account Appid und das WeChat -Händlerkonto erhalten. Dies finden Sie auf der WeChat Official Account und der WeChat Payment Merchant Platform. Nachdem Sie die Zahlungsfunktion erfolgreich beantragt haben, leitet WeChat die E -Mail per E -Mail an Sie weiter. Mit diesen Informationen können wir auf die Seite "WeChat Zahlungsdienst Support" wechseln: https://pay.weixin.qq.com/service_provider/index.shtml
Öffnen Sie diese Seite und klicken Sie in der oberen rechten Ecke auf den Link [Entwicklungsdokument], um die Seite Beschreibung der API -Dokument einzugeben, die wie die folgenden Aussehen aussieht
Wählen Sie den roten Kreis, um den Code zu bezahlen, was bedeutet, dass wir die Zugriffsmethode durchführen müssen. Bewegen Sie die Maus nach oben und fordern Sie auf, das Entwicklungsdokument anzusehen. Wenn Sie nicht wissen, wie Sie dies sehen sollen, können Sie duschen und ins Bett gehen. Sie sind wirklich nicht für einen Programmierer geeignet. Die Adresse lautet wie folgt:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 Sie sehen nach dem Öffnen in Ihrem Browser
Der Inhalt, auf den wir uns konzentrieren und lesen, ist bereits mit einer roten Ellipse gekennzeichnet. Lesen Sie zunächst die Protokollspezifikationen in [Schnittstellenregeln]. Nur ein Scherz, wenn Sie dies nicht lesen, möchten Sie die WeChat -Zahlung leisten. Das ist, als ob du Mädchen abholen willst. Sie müssen zuerst einige grundlegende Hintergrundinformationen sammeln und die Merkmale der anderen Partei verstehen. Andernfalls können Sie unten kommunizieren? Es stellt sich heraus, dass nur Programmierer, die Mädchen abholen können, gute Verkäufer sind. Nach dem Ausgang des Themas werden wir uns die Fälle und Spezifikationen in [Szeneeinführung] ansehen. Schauen Sie sich einfach das Logo von Wechat Pay an. Dies soll es endlich auf unsere eigene QR -Code -Zahlungswebseite setzen, die professioneller aussieht. Konzentrieren Sie sich anschließend auf [Modus 2]
Hier werden wir die Methode der Modus 2 verwenden, um die Funktion der PC -Seite Scanning -Code zu realisieren.
Die offizielle Erklärung von Modus 2 von WeChat lautet wie folgt: "Das Händler -Backend -System ruft zuerst die einheitliche einzelne Schnittstelle von WeChat Pay auf, das WeChat -Backend -System gibt den Link Parameter code_url zurück, das Händler -Backend -System generiert ein QR -Code -Bild mit dem Code_url -Wert, und das Code -Code -Code -Client. Zahlung." Wenn Sie verstehen, müssen wir zuerst WeChat anrufen, um eine einheitliche einzelne Schnittstelle bereitzustellen und einen wichtigen Informationscode_url zu erhalten (was zum Teufel ist dieser Code_url, ich weiß nicht), und dann generieren wir einen QR -Code über unser eigenes Programm. Ich verwende hier die Zxing -Bibliothek von Google. Zeigen Sie dann einfach den QR -Code auf Ihrer PC -Webseite an. Auf diese Weise zahlt der Terminalbenutzer durch Scannen des Codes und die Zahlung wird abgeschlossen. Sie müssen sehr aufgeregt sein, dies zu sehen. Sie finden, dass die WeChat -Zahlung so einfach ist. Es gibt noch etwas, was wir noch nicht wissen. Die Kunden wissen, dass sie bezahlt haben, aber unsere Serverseite weiß es noch nicht. Mit dem IQ von WeChat -Entwicklern haben sie schon lange an dieses Problem gedacht. Wenn Sie also die einheitliche einzelne Schnittstelle aufrufen, gibt es einen erforderlichen Parameter, der die Rückruf -URL ist. Das heißt, wenn der Client erfolgreich bezahlt, wird WeChat einige Daten über diese URL an unseren eigenen Server übermitteln, und dann analysieren wir die Daten im Hintergrund, um unsere eigenen Vorgänge auszuführen. Nur dann können wir wissen, ob der Kunde wirklich über WeChat bezahlt hat. Auf diese Weise ist der gesamte Prozess vorbei, und dies ist Muster 2. WeChat verwendet ein Timing -Diagramm, um diesen Prozess darzustellen.
Es ist kompliziert, auszudrücken und scheint schwierig zu sein. Zusammenfassend sollte unser Server wie folgt tun:
1. Übergeben Sie die korrekten Parameter (natürlich unsere Rückruf -URL) und die Signaturüberprüfung über einheitliche einzelne Schnittstelle und erhalten Sie die entsprechenden Daten von code_url aus den Rückgabedaten.
2. Basierend auf den Daten code_url generieren wir ein QR -Codebild und zeigen es auf der Browser -Webseite an.
3. Fügen Sie in der URL des Rückrufs unsere eigene Geschäftslogikverarbeitung hinzu.
Die Alphabetisierung ist jetzt vorbei, und Sie wissen endlich, welche Art von Prozess durch Scannen des Codes zu bezahlen ist. Schauen wir uns die relevante API -Nutzung an und machen Sie jeden Schritt gute Arbeit.
Zwei: Entwicklungsprozess
Bevor Sie den Code entwickeln, bereiten Sie bitte zuerst ein paar Dinge vor.
1. Fügen Sie Zxings Maven -Abhängigkeit hinzu
2. Fügen Sie die Abhängigkeit von Jdoms Maven hinzu
3. Laden Sie das SDK -Demo -Programm der Java -Version herunter, die Adresse ist hier
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
Wir brauchen md5util.java und xmlutil.java zwei Dateien
4. Wir verwenden HTTPClient Version 4.5.1. Denken Sie daran, Maven -Abhängigkeiten hinzuzufügen
Nachdem die obigen Vorbereitungen vorgenommen wurden, lesen Sie weiter:
Zunächst müssen wir die einheitliche einzelne Schnittstelle von Wechat anrufen. Wenn wir auf die einheitliche Single in [API -Liste] klicken, sehen wir eine solche Seite:
Wenn Sie die tatsächliche Situation meines Aufrufs als Beispiel nehmen, sind die folgenden Parameter erforderlich. Für die Bequemlichkeit aller habe ich es in ein Pojo -Objekt verwandelt. Der Code ist wie folgt:
öffentliche Klasse UnifiedOrderDto implementiert wexinconstants {private String appid; private String body; private String device_info; private String mch_id; private String nonce_str; private String notify_url; private String openID; private String -out -_trade_no; private String spbill_create, private int tothory, private tothal_fee; private tothal_fee; private tothal_fee; private montage; {this.appid = appid; this.mch_id = wxPaymentAccount; appid;} public String getBody () {return body;} public void setbody (String body) {this.body = body;} public String getDevice_info () {return devely_info;} public void setDevice_info (String Device_info) {this.device_info = retypo = retypo = retypo = retypo = retype_info; mch_id;} public void setMch_id (String mch_id) {this.mch_id = mch_id;} public String getnonce_str () {return nonce_str;} public void void setnonce_str (String nonce_str) {this.nonce_str = nunce_str; setNotify_url(String notify_url) {this.notify_url = notify_url;}public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public String getOut_trade_no() {return out_trade_no;}public void setOut_trade_no(String OUT_TRADE_NO) {this.out_trade_no = out_trade_no;} public String GetSpbill_create_ip () {return spbill_create_ip;} public void void setSpbill_create_ip (String spbill_create) {this.spbill_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create_create GetTotal_fee () {return Total_fee;} public void setotal_fee (int total_fee) {this.total_fee = total_fee;} public String getTrade_type () {return Trade_type;} public void setRade_type_tyttype () {this.the. this. this. this.the.the.the.the.the.the.torytReDe_type {this.the. this.the.the.the.the.the.the.the.the {this.the.the.the.the.the.the.torytReDe_tytttype) {this.the.the.the. {return sign;}public void setSign(String sign) {this.sign = sign;}public String getProduct_id() {return product_id;}public void setProduct_id(String product_id) {this.product_id = product_id;}public String generateXMLContent() {String xml = "<xml>" +"" + this.appid + "</appid>" + "" + this.body + "" + "<Device_Info> Web </device_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nonce_str>" "</notify_url>" + "<out_trade_no>" + this.out_trade_no + "</out_trade_no>" + "<product_id>" + this.Product_id + "</product_id>" + "<spbill_create_ip>" this.spbill_creat_create_Ip + "" </spbill_ip> " + "<Tothas_fee>" + String.ValueOf (this.total_fee) + "</total_fee>" + "<fracing_type>" + this.trade_type + "</Trade_type>" + "<Sign>" + this.Sign + "</sign>" + "</xml>"; this.appid + "& body =" + this.body + "& device_info = web" + "& mch_id =" + this.mch_id + "& nonce_str =" + this.nonce_str + "? ify_url =" + This "& spbill_create_ip =" + this.spbill_create_ip + "& total_fee =" + string.valueof (this.total_fee) + "& fracing_type =" + this.trade_type; content = content + "& key =" + wixinconstants.md5_api_key; "UTF-8"); Rückgabe signature.touppercase ();}}Die Erläuterung jeder Mitgliedsvariable finden Sie in der Beschreibung der [einheitlichen Einzelschnittstelle].
Danach müssen wir den von uns festgelegten Inhalt ausfüllen, die Schnittstelle aufrufen, um die Rückgabedaten zu erhalten, die Daten code_url zu erhalten und basierend darauf ein zweidimensionales Bild zu generieren, die Bildadresse an die PC-Webseite zurückzugeben und dann anzuzeigen. Hier werden wir einen besonderen Hinweis darauf vorstellen, dass wir beim Klicken auf die WeChat -Zahlung einen eigenen Backend SpringMVC -Controller über die AJAX -Methode anrufen und dann die einheitliche Einzelschnittstellenanalyse von WeChat über httpclient in der entsprechenden Methode des Controllers abschließen, um die von code_url zurückgegebenen XML -Daten zu erhalten, und dann die QR -Codes erzeugen und die QR -Code zurückgeben und auf die Titelseite zurückgeben. Der in Controller implementierte Code ist wie folgt:
Karte <String, Object> result = new HashMap <String, Object> (); UnifiedOrderDto dto = new UnifiedOrderDto (); if (Cash == null || "" .Equals (bash)) {result.put ("Fehler", "Cash könnte nicht null sein"); TotalFee); dto.setProduct_id (String.ValueOf (System.currentTimemillis ()); dto.setBody ("Reparatur"); Identifikationsflag dto.Setout_trade_no ("Ihre Bestellnummer + Schlüsselinformationen, es wird nach dem WeChat -Rückruf zurückgesendet. dto.makesign ()); logger.info ("XML -Inhalt:" + dto.generatexMlContent ()); try {httpclient httpclient = httpclientbuilder.create (). Build (); Httppost post = new httppost (wixinconstants.unifiedorder_url); post.addheader ("content-type", "text/xml; charset = utf-8"); Streichentität xmlentity = new strietentity (dto.generatexmlcontent (), ContentType.text_xml); post.setEntity (xmlentity); Code_url contentmap <string, string = ""> resultmap = (map <string, string = "">) xmlutil.doxmlParse (reActUnxml); logger.info ("Antwort code_url:" + resultMap.get ("code_url"); String codeurl = resultall = resultmap.get.get ("code_url"); ! ". Ergebnis; </string,> </string,> </string, Objekt> </string, Objekt>Der Code, der den QR -Code generiert, lautet wie folgt:
private String generateQrCode (String codeurl) {Dateiordner = neue Datei (Basepath + "qrCode"); if (! faltler.exists ()) {foldler.mkdirs ();} String f_Name = uUidutil.uuid () + ".png"; fio = new FileOutputStream (f); multiformatwriter multiformatwriter = new MultiformatWriter (); map Hints = new HashMap (); Hints.put (EncodeIntype.character_set, "utf-8"); // Setzen Sie den Zeichensatz Codierungstyp Bitmatrix bitmatrix = null; bitmatrix = multiformatwriter.encode (Codeurl, barcodeFormat.qr_code, 300, 300, Hinweise); bufferedImage Image = tobuffuledimage (bitmatrix); // qr code im Bild, qr codes imageio.Witch. ("qrCode/" + f_name);} catch (Ausnahme E1) {e1.printstacktrace (); return null;}}Zu diesem Zeitpunkt werden wir nach dem Scannen des WeChat QR -Code im Client den Rückruf verwenden, um die URL zu erstellen und die Daten an uns zurückzugeben. Wir werden unsere eigene Verarbeitung in der Rückrufmethode abschließen. Es ist wichtig zu beachten, dass Ihre Rückrufschnittstelle über die HTTP -Postmethode implementiert werden muss, andernfalls werden XML -Daten nicht akzeptiert. Der Code für die Rückrufverarbeitung lautet wie folgt:
@RequestMapping(value = "/your_callback_url", method = RequestMethod.POST)@ResponseBodypublic void finishPayment(HttpServletRequest request, HttpServletResponse response) {try { logger.info("start to callback from weixin server: " + request.getRemoteHost());Map<string, string=""> resultMap = new HashMap <String, String = ""> (); InputStream InputStream = Request.GetInputStream (); // Lesen Sie den Eingabestream Saxbuilder Saxbuilder = new Saxbuilder (); Dokument document = saxbuilder.builder (InputStream); // GET -NOTML -Wurzel -Element -LOLTES -LOLTES -LOLTEL -LOLTEL -LOLTED -LOLTERS -LOLTORE. root.getChildren (); iterator it = list.iterator (); while (it.hasNext ()) {Element e = (Element) iT.Next (); String k = e.getName (); String v = ""; list childhes = e.getChildren (); if (childhes. isEmpty ()) {v = e.GetNexize (); {v = e.s.GetNormal (); Xmlutil.getChildrentext (Kinder);} resultMap.put (k, v);} // Überprüfen Sie die Signatur! ! ! /*String [] keys = resultMap.keyset (). ToArray (neue String [0]); Arrays.sort (Schlüssel); String kvparams = ""; für (int i = 0; i <keys. if (i = "=" 0) = "" kvparams = "" + = "(keys [i]" "=" + resultmap.get (keys [i]);} else {kvparams + = ("&" = "" Schlüssel [i] = "& key =" + wixinconstants.md5_API_APY; WixInpaymentutil.md5Encode (Essign, "utf-8"); returnCode = "resultMap.get (" return_code "); Outtradeno); = "" logger.info ("total_fee =" "nfee); response.getWriter (). print (xmlutil.getResultxml (resultMap.get ("return_code"), = "resultMap.get (" return_code ")); (jdomexception = "" e1) = "" e1.printstacktrace (); = ""}Denken Sie daran, die beiden Klassen von XMLutil und Md5Util in der offiziellen Java -Version der Wechat -Demo zu verwenden. Der Demo -Code finden Sie auf seiner offiziellen Demo -Seite. Die relevanten Maven -Abhängigkeiten sind wie folgt:
<Dieldcy> <gruppe> Jdom </GroupId> Jdom </artifactId> <version> 1.1 </Version> </abhängig> <depeopcy> <gruppe> com.google.zxing </Groupid> Core </artifactid> <version> 3.3.0 </Version> </abhängig>
Schließlich sollte ich der Unterschrift besondere Aufmerksamkeit schenken. Ich habe die Java -Version des Demo -Programms direkt von der offiziellen WeChat -Website heruntergeladen, um die Signatur zu erhalten. Ich empfehle Ihnen, dasselbe zu tun, da dies die beste Wahl ist, um sicherzustellen, dass die MD5 -Signatur konsistent ist. Für den spezifischen Algorithmus zur Erzeugung von Signaturen können Sie das offizielle WeChat -Dokument anzeigen. Hier empfehlen wir dringend, dass Sie die offizielle API erklären müssen. 90% der verschiedenen Probleme, die Sie in der Entwicklung begegnen, sind, weil Sie die offiziellen Dokumente nicht lesen, sondern dem Blog von jemandem vertrauen! Dies ist der wahre Zweck und Zweck meines Schreibens dieses Artikels. Nach den offiziellen Dokumenten habe ich es mit meinem Java -Code implementiert. Scannen Sie den QR -Code auf WeChat -PC -Webseiten und bezahlen Sie die Zahlung auf jeden Fall in Ihrer Webanwendung.
Das obige ist die vom Editor eingeführte Java SpringMVC -Implementierung der PC -Webseite WeChat QR Code Payment (Vollversion). Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!