1. Vorbereitung
Unzählige Menschen haben nach der Entwicklung von Modell 1 gefragt, deshalb habe ich es hier nur als Referenz gepostet. Ich habe den Unterschied zwischen Modus eins und Modus zwei Male erklärt. Es ist nichts weiter als der QR -Code von Modus One für das Produkt und der QR -Code von Modus 2 für die Bestellung. Ich muss nicht über andere spezifische Details sprechen. Sie können zum offiziellen Dokument gehen, um das Dokument selbst anzuzeigen, und dann den Modus eins oder den Modus zwei auswählen. Dies hängt von Ihrem Unternehmen ab.
1.1. Verwandte Konfigurationsparameter
Die vier Dinge, die zuvor, app_id und app_secret, finden Sie auf der öffentlichen Plattform, während MCH_ID und API_KEY auf der Händlerplattform gefunden werden, insbesondere API_Key auf der Händlerplattform. Dieses Ding hängt mit der Richtigkeit der Parameterüberprüfung zusammen, daher muss es korrekt eingestellt werden. Das QR -Code -Zahlungsmodell 1 ähnelt tatsächlich dem QR -Code -Zahlungsmodell 2. Tatsächlich wird nur App_ID, MCH_ID und API_KEY verwendet und verwendet nichts anderes. Die offizielle Dokumentadresse von Modus One ist hier: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4
1.2. Verwandte Konzepte
Hier möchte ich zuerst ein Konzept korrigieren. Während der Entwicklung des zweiten Modells erwähnte ich ein Konzept wie "Zahlungsrückrufadresse". Seine Funktion ist, dass der WeChat -Server nach dem Scans und Abschluss der Zahlung auf die von uns bereitgestellte Adresse zugreifen und uns die Zahlungsergebnisse senden muss, damit wir die Reihenfolge für die Lieferung überprüfen können. Dies ist ein relativ häufiges Konzept und ein relativ häufiges Namen für andere Zahlungsinstrumente. Später habe ich jedoch die Dokumente auf der offiziellen Website von Wechat durchgesehen und festgestellt, dass sie in der ersten Entwicklung des Modells diese "asynchrone Benachrichtigungs -URL" anstelle einer "Zahlungsrückrufadresse" bezeichneten, aber dies bezieht sich im Wesentlichen auf dieselbe Bedeutung. Aber warum erwähne ich dieses Ding hier? Dies liegt daran, dass es im ersten Modus tatsächlich einen weiteren sogenannten "Zahlungsrückruf" genannt "Scan-Code-Zahlungsrückruf-URL" gibt. Dieses Ding unterscheidet sich von der obigen "asynchronen Benachrichtigungs -URL". Es kann einfach verstanden werden, dass es sich um eine Schnittstelle auf unserem Server handelt, um Bestellungen abzuschließen. Die Entwicklung von Modus One erfordert die Zusammenarbeit der beiden Schnittstellen von "scannen Sie den QR -Code, um eine Callback -URL zu zahlen" und "asynchrone Benachrichtigungs -URL", sodass jeder hier unterscheiden sollte.
"Async -Benachrichtigungs -URL" wird festgelegt, wenn Sie eine einheitliche einzelne Schnittstelle aufrufen. Es kann dynamisch festgelegt werden, solange diese Schnittstelle Parameterantwortparameter gemäß den relevanten Regeln empfängt. Der "scannen Sie den QR -Code, um eine Callback -URL zu bezahlen" ist relativ behoben. Es befindet sich auf der Wechat Public Platform. Nach dem Einstellen dauert es ungefähr 10 Minuten, um wirksam zu werden. Wählen Sie nach der Anmeldung bei der WeChat Public Platform WeChat Pay aus und finden Sie es unter der Registerkarte "Entwicklungskonfiguration":
Hier müssen wir die Adresse unseres eigenen Servers einrichten (und die öffentliche Netzwerkadresse erneut sagen, damit der WeChat -Server Sie finden kann).
1.3. Entwicklungsumfeld
Ich verwende hier das grundlegendste Servlet 3.0 als Beispielumgebung. In Bezug auf die Referenz von JAR-Paketen von Drittanbietern im Vergleich zur Entwicklung von Modell 2 gibt es zusätzlich zur Verwendung der XML-Operation JDOM ein Google ZXing QR-Codepaket und ein Log4J-Paket. Wie in der Abbildung unten gezeigt:
Um das Debuggen zu erleichtern, wird empfohlen, die Anpassung in dieser Umgebung zuerst zu senken, bevor Sie es in das reale Projekt umgestiegen sind.
2. Entwicklung und praktischer Kampf
Bevor ich anfing, schlage ich vor, dass Sie zum offiziellen Dokument gehen, um sich das Zeitplan genau anzutragen. Nach dem Verständnis des Timing -Diagramms ist das Schreiben von Code keine schwierige Aufgabe. Wenn Sie das Bild nicht verstehen können, können Sie es natürlich auch in Kombination mit meinem folgenden Code versuchen, es zu verstehen.
2.1. QR -Codegenerierung
Zunächst gibt es einen QR -Code. Der Inhalt im QR -Code ist ein Link, und das Formular lautet:
weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXX&time_stamp=XXXXX&nonce_str=XXXXXXXXX&nonce_str=XXXXXXXXXXXX
Details finden Sie im offiziellen Dokumentmodus, um QR -Coderegeln zu generieren. Als nächstes müssen wir einen QR -Code für diesen Link generieren. Ich habe Google Zxing hier verwendet, um einen QR -Code zu generieren.
Paket com.wqy; importieren java.io.ioException; importieren java.io.outputstream; import Java.util.hashMap; Import Java.util.iterator; import Java.util.map; Java.util.set importieren; Import Java.util.SorteedMap; Import Java.util.Treemap; importieren javax.servlet.servletException; import javax.servlet.annotation.webservlet; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import org.apache.log4j.logger; import com.google.zxing.barcodeFormat; import com.google.zxing.codeHintType; import com.google.zxing.multiformatwriter; import com.google.zxing.writerexception; import com.google.zxing.client.j2se.matrixtoimageWriter; import com.google.zxing.common.bitmatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.wqy.util.paycommonutil; import com.wqy.util.payconfigutil; /** * Servlet Implementierungsklasse Pay1 */@webservlet ("/pay1") öffentliche Klasse Pay1 erweitert HttpServlet {private statische endgültige lange Serialversionuid = 1L; privater statischer Logger logger = logger.getLogger (pay1.class); public static int default widandHandheight = 200; / ** * @see httpServlet#httpServlet () */ public pay1 () {Super (); // todo automatisch generierter Konstruktor Stub}/ ** * @see httpServlet#dagget (httpServletRequest Request, httpServletResponse * Antwort) */ Protected void dodget (httpServletRequest Request, httpServletresponseds-Starke-Starke-Starke-Starke-Starke-Starke-Starke, IOOException {/ // bis zu strocknega. nonce_str = paycommonutil.getnonce_str (); long time_stamp = system.currentTimemillis () / 1000; String product_id = "hd_goodssss_10"; String key = payconfigutil.api_key; // Schlüssel sortedMap <Objekt, Objekt> packageParams = new Treemap <Objekt, Objekt> (); packageParams.put ("appid", payconfigutil.app_id); packageParams.put ("mch_id", payconfigutil.mch_id); packageParams.put ("time_stamp", string.valueof (time_stamp)); packageParams.put ("nonce_str", nonce_str); packageParams.put ("product_id", product_id); String Sign = PayCommonUtil.CreateSign ("UTF-8", PackageParams, Key); // Md5 Hash PackagePuts.put ("Sign", Sign); // Parameter erzeugen String str = tourlparams (packageParams); String payurl = "wixin: // wxpay/bizpayurl?" + str; logger.info ("payurl:"+payurl); // QR -Code -Karte generieren <CodesHintType, Object> Hints = new HashMap <encodeHintType, Object> (); // QR -Code -Karte erzeugen <encodeHintType, Object> (); // Geben Sie die Fehlerkorrekturstufe an. // Geben Sie das Codierungsformat an. Hints.put (Encodehintype.Margin, 1); try {bitmatrix bitmatrix = new multiformatwriter (). codode (payurl, barcodeFormat.qr_code, defaultWidHandHeight, defaultWidHandHeight, Tipps); OutputStream out = response.getOutputStream (); MatrixtoimageWriter.writetostream (bitmatrix, "png", out); // qr code out.flush (); out.close (); } catch (writeRexception e) {// Todo automatisch generierter Fangblock E. printstacktrace (); }} public string tourlparams (sortEdMap <Objekt, Objekt> packageParams) {// Tatsächlich können Sie StringBuffer SB = New StringBuffer () nicht sortieren; Set ES = packageParams.EntrySet (); Iterator it = es.Iderator (); while (it.hasNext ()) {map.Entry -Eintrag = (Map.Entry) it.next (); String k = (String) Eintrag.getKey (); String v = (String) Eintrag.getValue (); if (null! }} sb.deletecharat (sb.length ()-1); // LETSE & RETUCT SB.TOStrING () löschen; } / ** * @see httpServlet#Dopost (httpServletRequest-Anforderung, httpServletResponse * Antwort) * / Protected void dopost (httpServletRequest-Anforderung, HttpServletRetReple-Antwort) verurteilt ServletException, IOException {// // toDo-gento-gentresed-method-storn ({// toDo-auto-gentrearated method stub doget }} 2.2. Scannen Sie die Zahlungsrückruf -URL -Schnittstelle
Wenn der Kunde den oben genannten zweistelligen Code mit WeChat durchsucht, greift der WeChat-Server auf diese Schnittstelle zu. Hier müssen wir die einheitliche Reihenfolge abschließen, um die Identifikatorin der Transaktionssitzung zu erhalten. Der Hauptverarbeitungsprozess ist wie folgt:
1) Empfangen Sie vom WeChat -Server gesendete Parameter und führen Sie die Signaturüberprüfung der Parameter durch.
2) Nehmen Sie den Parameter product_id heraus, der der einzige Parameter ist, der über den QR -Code übertragen werden kann. Andere Parameter können gemäß dem offiziellen Dokumentmodus 1.1 eingegeben werden.
3) Verarbeiten Sie Ihr eigenes Geschäft gemäß Product_ID, z. B. Berechnung des Zahlungsbetrags, Generierung von Bestellnummern usw.;
4) Rufen Sie die einheitliche einzelne Schnittstelle an, um die Transaktionssitzungskennung Prepay_ID zu erhalten.
4.1) Bereiten Sie die entsprechenden Parameter (z. B. Appid, MCH_ID, Zahlungsbetrag, Bestellnummer, Produktbeschreibung usw.) vor, rufen Sie WeChat auf, um die einzelne Schnittstelle zu vereinheitlichen (ähnlich wie die einheitliche einzelne Schnittstelle des Aufrufs des Modus 2). Achten Sie auf die oben genannte "asynchrone Benachrichtigungs-URL", die die asynchrone Benachrichtigungs-URL-Schnittstelle ist, die später erwähnt wird. Für bestimmte Parameter finden Sie im offiziellen Dokument, um die einzelnen Anforderungsparameter zu vereinen.
4.2) Empfangen Sie die von der einheitlichen Einzelschnittstelle zurückgegebenen Parameter und überprüfen Sie die Parameter.
4.3) Nehmen Sie den Parameter prepay_id heraus, der die Identifikatorin der Transaktionssitzung ist, was äußerst wichtig ist. Andere Parameter können an das offizielle Dokument verwiesen werden, um das Ergebnis zurückzugeben.
5) Bereiten Sie die relevanten Parameter (z. B. Appid, mch_id, return_code, prepay_id usw.) vor und antworten Sie auf den ersten Zahlungsrückruf (wenn die obigen Schritte falsch sind, können Sie die Fehlerparameter an den WeChat-Server zurückgeben). Für bestimmte Parameter finden Sie in den offiziellen Dokumentmodus 1.2 Ausgabeparametern.
Paket com.wqy; importieren java.io.bufferedOutputStream; Import Java.io.BufferedReader; importieren java.io.ioException; importieren java.io.inputStreamReader; importieren java.io.inputStreamReader; Import Java.util.SorteedMap; Import Java.util.Treemap; importieren javax.servlet.servletException; import javax.servlet.annotation.webservlet; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import org.apache.log4j.logger; import com.wqy.util.httputil; import com.wqy.util.paycommonutil; import com.wqy.util.payconfigutil; /** * Servlet -Implementierungsklasse Notify1 */@WebServlet ("/notify1") öffentliche Klasse Notify1 erweitert HttpServlet {private statische endgültige long serialversionuid = 1l; privater statischer Logger logger = logger.getLogger (notify1.class); / ** * @see httpServlet#httpServlet () */ public benoachify1 () {Super (); // todo automatisch generierter Konstruktor Stub}/ ** * @see httpServlet#dagget (httpServletRequest Request, httpServletResponse * Antwort) */ Protected void dodget (httpServletRequest Request, HttpServletRetrectectected-Verderbs-Methode) -Methode, Ladererdiens-Strohbodus-Strohboner-Methode, IOOException, IOOException, IOOException, IOOException, IOOException {// bis zum Ausleger: XML InputStream InputStream; StringBuffer sb = new StringBuffer (); inputStream = request.getInputStream (); String S; BufferedReader in = neuer BufferedReader (neuer InputStreamReader (InputStream, "UTF-8")); while ((s = in.readline ())! = null) {sb.Append (s); } in.close (); inputStream.close (); SortEdMap <Objekt, Objekt> packageParams = paycommonutil.xmlconverttomap (sb.toString ()); logger.info (packageParams); // Kontoinformationsstring KEY = PAYCONFIGUTIL.API_KEY; // Key String resxml = ""; // Feedback an WeChat Server // Sign-in-Verifizierung if (paycommonutil.istenpaysign ("utf-8", packageParams, keys) {// Appid OpenID mch_id is_subscribing nonce_str-sign // unification einzelner String open = (String) package (String) ("OpenID"); String product_id = (string) packageParams.get ("product_id"); // Product_id analysieren, den Preis berechnen usw. string out_trade_no = string.valueof (System.currentTimemillis ()); // Bestellnummer String order_price = "1"; // Preis Hinweis: Die Preiseinheit ist in String body = product_id unterteilt; // Der Produktname wird auf product_id String angewandt = "xxx Store"; // zusätzliche Datenstring nonce_str0 = paycommonutil.getnonce_str (); // Erhalten Sie den initiierenden Computer IP String SPBILL_CREATE_IP = PAYCONFIGUTIL.CREATE_IP; String Trade_type = "nativ"; SortEdMap <Objekt, Objekt> UnifiedParams = New Treemap <Objekt, Objekt> (); UnifiedParams.put ("Appid", payConfigutil.app_id); // UnifiedParams.put ("mch_id", payconfigil.mch_id); // UnifiedParams.put ("out_trade_no", out_trade_no); // UnifiedParams.put ("product_id", product_id); UnifiedParams.put ("Körper", Körper); // UnifiedParams.put ("Attach", anhängen); UnifiedParams.put ("Total_fee", order_price); // muss UnifiedParams.put ("nonce_str", nonce_str0) sein; // MUSS UNIFYPARAMS.PUT ("SPBILL_CREATE_IP", SPBILL_CREATE_IP) sein; // muss UnifiedParams.put ("Trade_Type", Trade_Type) sein; // muss UnifiedParams.put ("OpenID", OpenID) sein; UnifiedParams.put ("notify_url", payconfigil.notify_url); // Asynchronen Benachrichtigung URL String Sign0 = PayCommonUtil.CreateSign ("UTF-8", UnifiedParams, Key); UnifiedParams.put ("Zeichen", Sign0); // Signature String RequestXml = PayCommonUtil.getRequestXML (UnifiedParams); logger.info (requestXml); // Unified Single Interface String rxml = httputil.postdata (payconfigutil.ufdoder_url, requestXml); // Unified Single -Antwort sortEdMap <Objekt, Objekt> reparams = paycommonutil.xmlconverttomap (rxml); logger.info (reparams); // Überprüfen Sie, ob (paycommonutil.istenpaysign ("utf-8", reparams, taste)) {// die von der einzelnen String prepay_id = (string) reparams.get ("prepay_id" zurückgegebenen Parameter ("prepay_id"); // Transaktionssitzungsidentifikation innerhalb von 2 Stunden String nonce_str1 = paycommonutil.getNonce_str (); SortEdMap <Objekt, Objekt> resparams = new Treemap <Objekt, Objekt> (); resparams.put ("return_code", "Erfolg"); // resparams.put ("return_msg", "ok"); resparams.put ("appid", payconfigutil.app_id); // resparams.put ("mch_id", payconfigil.mch_id); resparams.put ("nonce_str", nonce_str1); // resparams.put ("prepay_id", prepay_id); // resparams.put ("result_code", "Erfolg"); // muss resparams.put sein ("err_code_des", "ok"); String Sign1 = PayCommonUtil.CreateSign ("UTF-8", Resparams, Key); resparams.put ("Zeichen", Zeichen1); // Signature ResxML = PayCommonUtil.getRequestXML (EPHRAUMS); logger.info (ResxML); } else {logger.info ("Signaturüberprüfungsfehler"); resxml = "<xml>" + "<return_code> <! [cdata [fail]]> </return_code>" + "<return_msg> <! [cdata [Signaturverifizierungsfehler]]> </return_msg>" + "</xml>"; }} else {logger.info ("Signaturüberprüfungsfehler"); resxml = "<xml>" + "<return_code> <! [cdata [fail]]> </return_code>" + "<return_msg> <! [cdata [Signaturverifizierungsfehler]]> </return_msg>" + "</xml>"; } //. out.write (resxml.getBytes ()); out.flush (); out.close (); } / ** * @see httpServlet#Dopost (httpServletRequest-Anforderung, httpServletResponse * Antwort) * / Protected void dopost (httpServletRequest-Anforderung, HttpServletRetReple-Antwort) verurteilt ServletException, IOException {// // toDo-gento-gentresed-method-storn ({// toDo-auto-gentrearated method stub doget }}Zu diesem Zeitpunkt zeigt die WeChat -Bestellung des Benutzers den zu zahlenden Betrag und die Produktbeschreibung an und wartet dann darauf, dass der Kunde die Zahlung abschließt.
2.3. Asynchrone Benachrichtigung der URL -Schnittstelle
Wenn der Benutzer den Zahlungsvorgang bei WeChat abschließt, benachrichtigt der WeChat -Server asynchron die Schnittstelle und sendet uns das endgültige Zahlungsergebnis, damit wir die Reihenfolge für die Lieferung und andere Vorgänge überprüfen können. Beachten Sie, dass diese Schnittstelle genau der Entwicklung von Modell 2 entspricht. Der allgemeine Prozess lautet wie folgt:
1) Empfangen Sie vom WeChat -Server gesendete Parameter und führen Sie die Signaturüberprüfung der Parameter durch.
2) Nehmen Sie die Parameter result_code, bestellennummer out_trade_no, bestellenmenge Total_fee und andere geschäftsbezogene Parameter heraus. Die spezifischen Parameter können auf die Benachrichtigungsparameter der allgemeinen Benachrichtigung der Zahlungsergebnisse im offiziellen Dokument verwiesen werden.
3) Verarbeitungsgeschäft wie Überprüfung der Bestellnummer und Bestellbetrag, Änderung des Bestellstatus usw.;
4) Bereiten Sie die entsprechenden Parameter (return_code und return_msg) vor und beantworten Sie den WeChat -Server.
Beachten Sie, dass wenn WeChat die Antworten des Händlers erhält, die nicht erfolgreich oder zeitlich abgestimmt sind, und WeChat der Ansicht ist, dass die Benachrichtigung gescheitert ist, wird WeChat regelmäßig Benachrichtigungen durch bestimmte Strategien zur Erhöhung der Erfolgsrate von Benachrichtigungen wie möglich wieder initiieren, aber WeChat garantiert nicht, dass die Benachrichtigung am Ende erfolgreich ist. (Die Benachrichtigungsfrequenz ist 15/15/30/1800/1800/1800/1800/1800/1800/3600, Einheit: Sekunden)
Paket com.wqy; importieren java.io.bufferedOutputStream; Import Java.io.BufferedReader; importieren java.io.ioException; importieren java.io.inputStreamReader; importieren java.io.inputStreamReader; Import Java.util.SorteedMap; importieren javax.servlet.servletException; import javax.servlet.annotation.webservlet; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import org.apache.log4j.logger; import com.wqy.util.paycommonutil; import com.wqy.util.payconfigutil; /** * Servlet -Implementierungsklasse Re_notify */@webservlet ("/re_notify") öffentliche Klasse Re_notify erweitert httpServlet {private statische endgültige long serialversionuid = 1l; private static logger logger = logger.getLogger (re_notify.class); / ** * @see httpServlet#httpServlet () */ public re_notify () {Super (); // todo automatisch generierter Konstruktor Stub}/ ** * @see httpServlet#dagget (httpServletRequest Request, httpServletResponse * Antwort) */ Protected void dodget (httpServletRequest Request, HttpServletRetrectectected-Verderbs-Methode) -Methode, Ladererdiens-Strohbodus-Strohboner-Methode, IOOException, IOOException, IOOException, IOOException, IOOException {// bis zum Ausleger: Parameter InputStream InputStream; StringBuffer sb = new StringBuffer (); inputStream = request.getInputStream (); String S; BufferedReader in = neuer BufferedReader (neuer InputStreamReader (InputStream, "UTF-8")); while ((s = in.readline ())! = null) {sb.Append (s); } in.close (); inputStream.close (); SortEdMap <Objekt, Objekt> packageParams = paycommonutil.xmlconverttomap (sb.toString ()); logger.info (packageParams); // Kontoinformationsstring KEY = PAYCONFIGUTIL.API_KEY; // Key String resxml = ""; // Feedback an WeChat Server // Bestimmen Sie, ob die Signatur korrekt ist, wenn (paycommonutil.istenpaysign ("utf-8", packageParams, Schlüssel) {// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ out_trade_no = (string) packageParams.get ("out_trade_no"); String Total_fee = (String) packageParams.get ("total_fee"); logger.info ("mch_id:" + mch_id); logger.info ("openID:" + openID); logger.info ("is_subscribe:" + is_subscribe); logger.info ("out_trade_no:" + out_trade_no); logger.info ("Total_fee:" + Total_fee); ///////////////////////////////////////////////// Logger.info ("Zahlung erfolgreich"); // WeChat benachrichtigen. Asynchrone Bestätigung ist erfolgreich. Muss es schreiben. Andernfalls wird der Hintergrund ständig benachrichtigt. Nach acht Mal werden Sie denken, dass die Transaktion fehlgeschlagen ist. resxml = "<xml>" + "<return_code> <! [CDATA [Erfolg]]> </return_code>" + "<return_msg> <! [CDATA [OK]]> </return_msg>" + "</xml>"; } else {logger.info ("Pay fehlgeschlagen, Fehlermeldung:" + packageParams.get ("err_code")); resxml = "<xml>" + "<return_code> <! [cdata [fail]]> </return_code>" + "<return_msg> <! [cdata [meldung ist leer]]> </return_msg>" + "</xml>"; }} else {logger.info ("Signaturüberprüfungsfehler"); resxml = "<xml>" + "<return_code> <! [cdata [fail]]> </return_code>" + "<return_msg> <! [cdata [Signaturverifizierungsfehler]]> </return_msg>" + "</xml>"; } //. BufferedOutputStream (response.getOutputStream ()); out.write (resxml.getBytes ()); out.flush (); out.close (); } / ** * @see httpServlet#Dopost (httpServletRequest-Anforderung, httpServletResponse * Antwort) * / Protected void dopost (httpServletRequest-Anforderung, HttpServletRetReple-Antwort) verurteilt ServletException, IOException {// // toDo-gento-gentresed-method-storn ({// toDo-auto-gentrearated method stub doget }} 3. Testergebnisse
3.1. Der generierte Zahlungslink QR -Code -Link
3.2. Parameter, die von der Payment Callback -URL -Schnittstelle empfangen werden
3.3. Initiieren Sie einheitliche Einzelanforderungsparameter
3.4. Einzelrückgabeparameter vereinen
3.5. Endgültige Antwortparameter der Zahlungsrückruf -URL -Schnittstelle
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.