Ich habe vor einiger Zeit die QR -Code -Zahlung von Alipay studiert. Ich muss sagen, dass das Alipay -Dokument wirklich schlecht ist (zumindest stammte es von Mengbi, als ich es zum ersten Mal gelesen habe). Die Beispiele über dem Dokument sehen sich vollständig von den Beispielen in der Demo unterscheidet. Oft sind die obigen Beispiele des Dokuments sehr einfach, während der Demo -Code sehr kompliziert ist, sodass ich nicht wusste, welchen Code ich zu Beginn verwenden soll. Später betrachtete ich den Code im Demo -Paket sorgfältig und stellte fest, dass auch die Schnittstellen der Dokumentbeispiele aufgerufen wurden. Erst dann wurde mir klar, dass sie dasselbe waren, aber die Demo wickelte nur die Schnittstellen des Dokuments ein.
Beantragen Sie zunächst ein Alipay -Konto eines Unternehmens. Dieses Konto hat eine PID, und Sie müssen diesem Konto eine Bewerbung hinzufügen. Jede Bewerbung verfügt über eine Anhschnahme sowie einen öffentlichen und privaten Schlüssel. Öffentliche und private Schlüssel können durch Tools von Alipay generiert werden. Darüber hinaus müssen Java -Entwickler private Schlüssel im PKCS6 -Format verwenden. Wenn die Anwendung die Scanfunktion verwenden muss, müssen die Möglichkeit der persönlichen Zahlung in den Antrag hinzugefügt werden, wodurch ein Vertrag unterzeichnet werden muss. Nach der Unterzeichnung der persönlichen Zahlungsfunktion kann sie nicht direkt verwendet werden, da die Anwendung online sein muss, bevor sie verwendet werden kann. Daher können Sie die Sandbox -Version der Anwendung während der Entwicklung verwenden. Alipay bietet die Sandbox -Version des Gateways, des Alipay Public Key, der PID und des Appids, die während der Konfiguration geändert werden müssen.
Der Code kann den Code direkt in der Demo verwenden, zuerst die von Alipay im Projekt bereitgestellte API importieren (Beachten Sie, dass es sich nicht um den Demo -Code handelt), und dann den Demo -Code importieren, wie in der Abbildung gezeigt:
Diese com.alipay.demo.trade.main -Datei kann direkt ausgeführt werden, aber eine Ressourcendatei muss konfiguriert werden:
# Alipay gateway name, partnerId and appId# This is the gateway for the sandbox environment open_api_domain = https://openapi.alipaydev.com/gateway.domcloud_api_domain = http://mcloudmonitor.com/gateway.do# This is the merchant UIDpid for the sandbox environment = 2088102172329883# Please fill In der AppidAppid für Ihre Sandbox -Umgebung persönlich hier Miiceqibadanbgkqhkig9w0baqefaascammwggjfageaaogbamkxzrfr+rnvygbs9qz2ce1mcsiseibreAqan+5PF5+02HYJ4HZCNTTWQHFM91IH 3WYPYHPM7XLBGJ5YWJTGC4G1LZ75R8A+UCYUXP8BY1LV/44GI/TIFLSGATFQ73OCM9IMXOCRYZ2ZCWQI1GV+B3UDOY/DA5W07GRWIZFZS6VQ 1RagmbaaecgyeAQHHC4GRBSRCKEYNTK1VHQCJ0YG11LVY85Z3SI0FNY26DVS8R5GFYDZC/MX5F8RNPUUYUHQN+4CQOR3D/C291X1ITOV2NEV Lhejroudknp4oqriqt2w9pz8rZwzp2jcwvrvuf4ztpeImppmorp6sprfx6dlzg29sfi6gzwu6TKCQQDP3MIM1BHUS3YONEZGQC69ZN0/DGOFK EIX0S18QAU1X4I1FEJVTKY4HPDWIHPGYAJM0UFG1LK8MTIUNHPZRCNAKEA1QF6U1AKJM6ZSVDENRXEDTCC75UVJGSYFJWHHX9PJYD9VX8NSZV 0Z0U4V0ZG0N0YVHJ5LRO6U5FCQFRW1WIXNQJBALMCKZ8SVF/H9N6LIWMSPY6W5Q82KNRLRC7WSCENSPQT0WQL5+SACG98M0XXY5J1HMILHXHXG CtvyrixowObivqccqqctnanb4uz3q/86R/kukbvd3dirwlfryaho6YXP8OY+JE/BV/359+VR3CXZYLDHZOR9/TVSPWR/Y9Q4JLEM Q1TaKealbu7+4edzfap7e/fmgykd5dml8H2iaeumrrcpl84GHFFK/7PSQ/40NGKXPTGY44NLELHXCRPW5CZU6GQDINJOA ==##bitte Füllen Sie hier Ihren Händler Public_key aus = aus = Migfma0gcsqgsibdqebaquaa4gnadcbiqkbgqdcl2axufq572IABPAS9NBNZGKIAUXMQMP/UT3+FTNH8O+B83DU01QHXZVDSB98GD8OATO15W4 Ceclibyauinzc ++ a/gvlasrst/g8ts1f+obov0yhy0oae30o9zndpypl6hexwm9mqskotyffm91a6mvw2ucno4evosxc0ulatawidaqab#this ist der öffentliche Schlüssel der Sandbox -Umgebung alipay_public_key = Migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdighnon7llillketd6bfrj0gqgs2y3mn1wmqmyh9zeywlz5p1zrahrahbxafcfsqshsnfq OMAQZSHRVJCQJSAW1JYQRXAPDKBMR90DIPIXMIYKXV4GHGAKPYJ/6ftFY99UHPIQ0QADD/UNZQSEFWO0ATVP/65ZI3EOF7TCZ32OWPWIDAQAB# Maximale Anzahl von Abfragen und Abfragenintervall (Millisekunden) max_query_retry = 5Query_duration = 5000# Maximale Anzahl von Rückgängigungen und Rückgängigungen (MS) persönlich max_cancel_retry = 3cancel_duration = 2000# Transaktionsgarantie -Gewinne Erstes Scheduling Dely- und Scheduling -Diagramm- und Scheduling -Intervalle (Sekunden) (Seconds).
Führen Sie dann die Main.java -Datei aus. Wie für den Zahlungscode für das Scannencode in unserer tatsächlichen Anwendung können wir die Funktion test_trade_precreate () in der Main.java -Datei direkt kopieren und eine Funktion im Controller erstellen:
@RequestMapping (value = "/pay/alipay", method = requestMethod.post) public map <String, String> Alipay (@RequestParam String -Betrag, @RequestParam int userID) {Map <String, String> map = new Hashmap <String, String> (); // (erforderlich) Die eindeutige Bestellnummer im Händler -Website -Auftragssystem mit nur 64 Zeichen kann nur Buchstaben, Zahlen und Unterstriche enthalten. // Es ist notwendig, sicherzustellen, dass das Händlersystem nicht wiederholt werden kann. Es wird empfohlen, sie über die Datenbanksequenz zu generieren, String outtradeno = "xxxxx" + system // (Erforderlicher) Bestelltitel, beschreibt grob den Zahlungszweck des Benutzers. Zum Beispiel "XXX Brand XXX Store zahlt sich persönlich aus und scannt den Code, um" String Subjekt = "Pay" zu konsumieren. // (erforderlich) Der Gesamtbetrag der Bestellung beträgt 100 Mio. RMB und darf RMB 100 Mio. RMB nicht überschreiten // Wenn [ermäßigter Betrag], [nicht ermäßigter Betrag] und [Gesamtauftragsbetrag] gleichzeitig übertragen werden, müssen die folgenden Bedingungen erfüllt sein: [Gesamtauftragsbetrag] = [Rabatt] + [nicht ermäßigt] String -Gesamtbetrag = Gesamtbetrag = Gesamtbetrag] // (optional) Die Bestellung kann nicht reduziert werden und kann mit der Händlerplattform konfiguriert werden, um Rabattaktivitäten zu konfigurieren. Wenn der Alkohol nicht am Rabatt beteiligt ist, wird der entsprechende Betrag in diesem Feld gefüllt // Wenn der Wert nicht übertragen wird, aber [Gesamtauftragsbetrag] und [ermäßigter Betrag] übertragen werden, wird der Wert aus Verzug auf [Gesamtauftragsbetrag]-[ermäßigter Betrag] String undcountableAmount = "0"; // Die Alipay -Konto -ID des Verkäufers wird verwendet, um die Zahlung auf unterschiedliche Zahlungskonten gemäß einem Vertragskonto zu unterstützen (das Alipay -Konto entspricht, das dem Verkäufer entspricht) // Wenn dieses Feld leer ist, wird es an die PID des Händlers, die mit Alipay, dh der PID unterzeichnet, den Anhang String SellerID = "20881021729883"; // Bestellbeschreibung können die Transaktion oder das Produkt detailliert beschreiben, wie z. // Händlerbetreibernummer, fügen Sie diesen Parameter hinzu, um Verkaufsstatistiken für den Händler -Bediener -String -Operator = "test_operator_id" durchzuführen; // (Erforderliche) Händlerspeichernummer über die Store -Nummer und das Händler -Backend können Sie die Rabattinformationen genau konfigurieren. Weitere Informationen finden Sie unter Alipay Technical Support String String StoreID = "2088102172329883". // Unternehmenserweiterungsparameter, derzeit können Sie die von Alipay zugewiesene Systemanbieternummer hinzufügen (über die SetSysServiceProviderid -Methode). Weitere Informationen erhalten Sie von Alipay Technical Support ExtendParams ExtendParams = New ExtendParams (). extendParams.setsSysServiceProviderId ("2088100200300400500"); // Payment timeout, defined as 120 minutes String timeoutExpress = TIMEOUT;// // Product details list, you need to fill in the details of the purchase product, // List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();// // Create a product information, the parameters are the product id (using national standard), name, unit price (unit in points), and quantity. Wenn Sie Produktkategorien hinzufügen müssen, lesen Sie bitte Warendetail // GoodsDetail Goods1 = GoodsDetail.NewInstance ("Goods_ID001", "XXX Small Bread", 1000, 1); // // Hinzufügen zur Produktdetailsliste, die ein Produkt // Warendetaillist.add (Goods1); Das vom Benutzer gekaufte Produkt ist "Schwarzzahnbürste" mit einem Einheitspreis von 5,00 Yuan. Ich habe zwei Stücke gekauft // GoodsDetail Goods2 = GoodsDetail.NewInstance ("Goods_id002", "XXX Tooth Bresh", 500, 2); // Goodsdetaillist.Add (Goods2); // Erstellen Sie einen Scan -Code, um den Anforderungsbauer zu bezahlen, die Anforderungsparameter AlipaytradePrecreeRequestBuilder Builder = New AlipayTredePrecreeRequestBuilder () .SETSUbject (Subjekt) .SettotAlAmount (TotalAmount) .Setouttradeno (OuttraDeno). .SetoperatorID (OperatorID) .SetStorId (storeId) .setExtendParams (ExtendParams) .SettimeExpress (TimeOutExpress) .setNotifyUrl ("http://xxx.xx.xxx.xxx:8080/baobiao.pay.xx.xxx.xxx. Händlerserver. Nach Bedarf einstellen. Hier setzen wir eine Schnittstelle, die wir selbst geschrieben haben. Wir werden es später vorstellen. // .SetGoodsdetaillist (Warendetaillist); Alipayf2fprecreeateresult result = tradeservice.tradePrecreate (Bauherr); Switch (result.GetTraderStatus ()) {Fall Erfolg: log.info ("Alipay erfolgreich vorgeordnet :)"); System.out.println ("Alipay erfolgreich vorbestellt :)"); AlipaytradePrecreesponse response = result.getResponse (); // DumPesponse (Antwort); // system.out.println (response.getBody (); // // // Es muss auf den Pfad auf der laufenden Maschine // String filepath = String.format ("/useroangkly/qr-%S.Png" ("/liuyangkly/qr-%S.) geändert werden. log.info ("filepath:" + filepath); // zxingutils.getQrCodeImge (response.getQrcode (), 256, filepath); // system.out.println (response.getQrcode ()); // eine Bestellung generieren und die Datenbank Baobiaoorder order = neuer Baobiaoorder (userId, Outtradeno, "", double.Parsedouble (Betrag), neues Datum (), 1) einfügen; baobiaoorderservice.insertorder (Ordnung); map.put ("Status", "wahr"); map.put ("qrcode", response.getQrcode ()); // kehren Sie zum Client QR Code Map.put ("Outtradeno", Outtradeno) zurück; Rückgabekarte; Fall fehlgeschlagen: log.Error ("Alipay-Vorbestellung fehlgeschlagen !!!"); System.out.println ("Alipay-Vorbestellung fehlgeschlagen !!!"); System.out.println (result.getResponse (). GetBody ()); brechen; Fall Unbekannt: log.Error ("Systemausnahme, Vorbestellstatus unbekannt !!!"); System.out.println ("Systemausnahme, vorbestellter Status unbekannt !!!"); brechen; Standard: log.Error ("Nicht unterstützter Transaktionsstatus, Transaktion gibt Ausnahme zurück !!!"); System.out.println ("nicht unterstützter Transaktionsstatus, Transaktionsrücknahme ausnahmslos !!!"); brechen; } map.put ("Status", "false"); map.put ("msg", "das System hat eine Ausnahme, bitte versuchen Sie es später erneut!"); Rückgabekarte; }Die Logik ist, dass der Benutzer den Code auf seinem Mobiltelefon für die Zahlung von Alipay scannt. Nachdem Alipay ihn erhalten hat, sendet er eine Meldung der erfolgreichen Zahlung an uns, um notify_url festzulegen, wie unten gezeigt:
@RequestMapping (value = "/pay/meldify", method = requestMethod.post) public String meldenResult (httpServletRequest Request, httpServletResponse -Antwort) {log.info ("Empfangen alipay asynchroner Benachrichtigung!"); Map <string, string> params = new HashMap <String, String> (); // Alle Parameter abrufen, um die Signaturerumeration <string> parameTernames = request.getParameternames () zu überprüfen; while (parameTernames.hasmoreElements ()) {String parameTername = parameTernames.NextElement (); params.put (parameTername, request.getParameter (parameTername)); } boolean Signverified; try {signverified = alipaySignature.rsacheckv1 (params, configs.getalipaypublickey (), "utf-8"); } catch (alipayapiexception e) {e.printstacktrace (); zurück "fehlgeschlagen"; } if (signverified) {String outtradeno = params.get ("out_trade_no"); log.info (OuttraDeno + "Rufnotizierung bestellen"); // system.out.println ("Signatur erfolgreich überprüfen!"); log.info ("Signatur erfolgreich überprüfen!"); // Wenn sich der Anhang im Parameter von der in Anlage ausgefüllten Anhänger unterscheidet, handelt es sich um eine Ausnahmeregelung, wenn (! Configs.getAppid (). Equals (params.get ("app_id")))) {log.warn ("anders als der Anhang zum Zeitpunkt der Zahlung ist eine Ausnahmebenachrichtigung und sollte ignoriert werden!"). zurück "fehlgeschlagen"; } // Ermitteln Sie die Bestellung, die der Bestellnummer in der Datenbank entspricht, und vergleichen Sie den Betrag mit dem Betrag in der Datenbank. Wenn es nicht übereinstimmt, wird auch die Ausnahme von Baobiaoorder Order = Baobiaoorderservice.FindOrdByouttradeno (Outtradeno) informiert. if (order == null) {log.warn (Outtradeno + "Überprüfen Sie diese Bestellung ohne Überprüfung!"); zurück "fehlgeschlagen"; } if (order.getAmount ()! = double.ParSeDoUble (params.get ("Total_Amount"))) {log.warn ("anders als der Betrag zum Zeitpunkt der Zahlung, dies ist eine Ausnahmemacherklärung und sollte ignoriert werden!"); zurück "fehlgeschlagen"; } if (order.getStatus () == baobiaoorder.trade_success) return "Erfolg"; // Wenn die Bestellung erfolgreich bezahlt wurde, ignorieren Sie diesen Benachrichtigungszeichenfolge Status = params.get ("Trade_Status"); if (status.equals ("wait_buyer_pay")) {// Wenn der Status auf Benutzerzahlung wartet if (order.getStatus ()! } else if (status.equals ("Trade_closed") {// Wenn der Status nicht bezahlte Transaktionszeitüberschreitung geschlossen ist oder die Zahlung vollständig zurückerstattet wird, wenn (order.getStatus ()! } else if (status.equals ("Trade_Success") || Status.equals ("Trade_Finished") {// Wenn der Status erfolgreich bezahlt wird, wenn (order.getStatus ()! } else {baobiaoorderService.ModifyTraderStatus (Baobiaoorder.UnNOWN_STATE, Outtradeno); } log.info (Outtradeno + "Der Status der Reihenfolge wurde an" + Status) geändert; } else {// Wenn die Überprüfungssignatur nicht "fehlgeschlagen" übergeht; } return "Erfolg"; }Dies ist wahrscheinlich der Fall, aber es gibt weniger Benachrichtigungen über eine erfolgreiche Zahlung an den Kunden, und es gibt auch einige Sicherheitsprobleme.
Schließlich fassen wir die in diesem Prozess aufgetretenen Probleme zusammen:
1. Der von Alipay zurückgegebene QR -Code kann nicht direkt im Browser geöffnet werden, sondern muss verwendet werden, um QR -Codes zu konvertieren, um QR -Codes zu generieren, oder Sie können sie über die CLI.IM -Website anzeigen.
2. Der von der Alipay Sandbox -Umgebung generierte QR -Code kann nur mit der Sandbox -Version des Alipay -Mobiltelefons gescannt werden. Wenn die normale Version von Alipay Scans abgelaufen ist, wird der QR -Code abgelaufen und andere Fehler werden auftreten.
3. Wenn Sie die von Alipay nach der Zahlung gesendete asynchrone Benachrichtigung nicht erhalten können, können Sie nach dem Postman und anderen Tools prüfen, ob auf die von Ihnen ausgefüllte Benachrichtigung, die Sie ausgefüllt haben, mit der öffentlichen IP zugegriffen werden kann.
V. Sie können während der Entwicklung eine Sandbox -Anwendung auswählen.
5. Bei der Registrierung der Sandbox -Version von Alipay Mobiltelefon können Sie sich an den Kundendienst wenden, um ein Konto zu fragen
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.