In diesem Abschnitt werden wir zunächst eine einfache Demo schreiben, um den Zahlungsprozess von Yibao zu testen. Nachdem wir uns mit diesem Prozess vertraut gemacht haben, werden wir die tatsächliche Entwicklung durchführen. Da es sich um eine Demo handelt, habe ich einige Entwurfsmuster nicht in Betracht gezogen, sondern die Zahlungsfunktion direkt implementieren. Um Zahlungsfunktionen umzusetzen, verlangt Yibao die API, die uns zur Verfügung gestellt wird. Die Frage ist also das Wichtigste bei der Verwendung einer Zahlungsplattform von Drittanbietern ist, die API der Plattform zu erhalten. Wir müssen zuerst ihre API- und Entwicklungsdokumente erhalten und dann können wir weiterentwickeln.
1. erhalten Sie die API von Yibao
Der erste Schritt, um die API zu erhalten, besteht darin, ein Konto auf Yibao zu registrieren. Dieses Konto ist das Konto des Händlers. Nachdem der Käufer bezahlt hat, zahlt er das Geld auf das Konto ein und der Händler wird es selbst auf die Bankkarte abheben. Yibao wird während des Auszahlungsprozesses eine bestimmte Handhabungsgebühr berechnen. Dies ist Yibaos Gewinnmodell. Die Voraussetzung für eine erfolgreiche Registrierung ist jedoch, dass Sie eine Website oder ein Unternehmen, Bara, Bara usw. haben müssen. Auf jeden Fall müssen Sie qualifiziert sein, sich zu bewerben. Yibao wird diesen Punkt überprüfen. Nur wenn Sie es treffen, können Sie sich registrieren und die Benutzeroberfläche zur Verfügung stellen. Nicht jeder kann sich registrieren. Ich habe es genauso gut benutzt und andere registriert, aber ich hatte selbst nichts ... Ich konnte mich nicht registrieren ... Ich weiß das, aber im Allgemeinen, wenn ich mich in einem Unternehmen entwickelte, würde es nicht dieses Problem geben. Es muss ein Konto geben. Das Wichtigste ist, den Entwicklungsprozess und die damit verbundenen Technologien zu beherrschen.
2. Testen Sie den Zahlungsvorgang
Mit der offiziellen API und der technischen Dokumente können Sie mit der Entwicklung beginnen. Hier schreiben wir hauptsächlich eine einfache Demo, um den Prozess der Yibao -Zahlung zu testen. Die Struktur der Demo ist sehr einfach, ein Servlet, ein Filter, zwei JSP -Seiten und eine verschlüsselte Werkzeugklasse. Servlet befasst sich mit der Yibao -Serverseite. Wir führen eine Verarbeitung im Zusammenhang mit der Yibao -Schnittstelle durch. Der Filter wird verwendet, um mit möglichen Problemen mit chinesischen verstümmelten Problemen umzugehen. Einer der beiden JSP ist die Front-End-Seite.
Lassen Sie uns zunächst den folgenden Zahlungsanforderungsprozess analysieren:
Ok, analysieren wir den relevanten Code in der Demo im Detail:
2.1 Testseite Rezeption
Schauen wir uns zunächst den spezifischen Code der Rezeption index index.jsp an.
<%@ page Language = "java" pageCoding = "utf-8"%> <! docType html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <titels> Front Office Home </title> </head> <body> <h1> Online-Zahlung. action = "$ {pageContext.request.contextPath}/Servlet/PayServlet" methode = "post"> Die Auftragsnummer für diesen Einkaufs-Typ <Eingabe-Typ = "Text" name = "p2_order"/> <br> Geld <Eingabe-Typ = "Text" Name "p3_amt" value = "0.01"/> <br> Industrial und Commercial Bank und Commercial Bank- und Commercial Bank und Commercial Bank ". name = "pd_frpid"> Konstruktionsbank <Eingabe type = "radio" value = "ccb-net" name = "pd_frpid"> <br> <Eingabe type = "value =" surenden "/> <Eingabe type =" Hidden "value =" pay "name =" status "/> </body> </body> </html>> </html>Auf der obigen JSP -Seite können wir sehen, dass die Namensattributwerte in diesen Eingabetags sehr seltsam sind, pi_function (i = 0,1,2,…, 9), und natürlich habe ich andere Werte. Dies erfordert sich auf Yibaos offizielles Dokument. Diese Namen stellen entsprechende Attribute dar und werden zur Verarbeitung an das Sevlet übergeben. In Bezug auf diese Attributwerte habe ich ein Bild wie folgt:
Einige dieser Parameternamen werden in den tatsächlichen Projekten von der Rezeption übertragen, z. B. die oben geschriebene Bestellnummer, wie viel es kostet, zu zahlen, und diese werden übernommen, wenn die Bestellung bestätigt wird. Wenn andere Parameter erforderlich sind, müssen sie im Servlet angegeben werden. Wenn die Felder nicht erforderlich sind, können sie leer sein. Das leere hier ist nicht null, sondern "", was später im Servlet erwähnt wird.
Schauen wir uns die entsprechenden Wertwerte in den beiden Banken an. Yibao liefert die Wertwerte aller von ihnen unterstützten Banken. Diese sind festgelegt und können nicht geändert werden. Hier sind zwei Banken, um den Effekt zu testen.
Das letzte versteckte Feld wird verwendet, um ein Urteil im Servlet zu fällen. Unabhängig davon, ob es sich um eine Zahlung oder eine Rückgabe nach erfolgreicher Zahlung handelt, wird sie im Sevlet unten erläutert.
2.2 Servlet behandelt Anfragen
Das Servlet behandelt hauptsächlich die damit verbundenen Anfragen nach Yibao. Es gibt zwei Teile des Inhalts. Ein Teil besteht darin, Klartext und Cipher -Text an Yibao zu senden, und der andere Teil besteht darin, den von Yibao gesendeten einfachen Text und Cipher -Text zu beurteilen. Schauen wir uns den spezifischen Implementierungscode in der Demo an:
public class payServlet erweitert HttpServlet (public void dodget (httpServletRequest request, httpServletResponse -Antwort). if (status.equals ("pay")) {// Das versteckte Feld in index.jsp wird bezahlt, so dass der Zahlungsteil verarbeitet wird // Der Verschlüsselungsschlüssel wird im Verschlüsselungsalgorithmus verwendet und vom Zahlungsversorgungsvermittler bereitgestellt. Jeder Händler hat ein einzigartiges String keyValue = "W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677"; // 1: Zuwenden Sie den Parametern Werte. Diese Parameter (d. H. Einfacher Text) sind in dem von Yibao bereitgestellten Dokument definiert. Wir können den Namenszeichenfolge nicht ändern p0_cmd = formatString ("buy"); String p1_merid = formatString ("10000940764"); String p2_order = formatString (request.getParameter ("p2_order")); String p3_amt = formatString (request.getParameter ("p3_AMT")); String p4_cur = formatString ("cny"); String p5_pid = ""; String p6_pcat = ""; String p7_pdesc = ""; String p8_url = "http://www.tongji.edu.cn"; // Dies ist die Seite, auf die Sie nach der Zahlung erfolgreich sind. Sie können es als Homepage des Einkaufszentrums einstellen. Diese Demo reicht aus, um die Homepage der Tongji University zu verwenden ... String p9_saf = "0"; String pa_mp = ""; String pd_frpid = formatString (request.getParameter ("pd_frpid")); pd_frpid = pd_frpid.touppercase (); String pr_needResponse = "0"; String hmac = formatString (""); // HMAC wird verwendet, um den Ciphertext/*alle oben genannten Klartext zu speichern. Die Methode ist unten und konvertiert hauptsächlich Null in "" *, da Null nicht in Ciphertext *// Datensicherheitsprobleme lösen kann: Verschlüsseln Sie den Klartext ---> Ciphertext und übergeben Sie dann sowohl den Klartext als auch den Ciphertext mit YiBao // Nach Yibao werden die Daten, die die Daten, mit der gleiche, vergleichbar. Beachten Sie, dass die Reihenfolge der Anhängerung nicht geändert werden kann, da der generierte Chiffretext unterschiedlich ist, wenn auch der Händler und Yibao beim Verschlüsselung den gleichen Schlüssel verwenden, wenn sie verschlüsseln können) // Klartextdaten anhängen. // Sie müssen ausschließlich nach dem Namen des offiziellen Dokuments von Yibao schreiben, da Yibao gemäß der Bestellung im Dokument hinzugefügt wird. Infobuffer = new StringBuffer (); Infobuffer.Append (p0_cmd); Infobuffer.Append (p1_merid); Infobuffer.Append (p2_order); InfoBuffer.Append (p3_amt); Infobuffer.Append (p4_cur); Infobuffer.Append (p5_pid); Infobuffer.Append (p6_pcat); Infobuffer.Append (p7_pdesc); Infobuffer.Append (p8_url); Infobuffer.Append (p9_saf); Infobuffer.Append (PA_MP); Infobuffer.Append (PD_FRPID); Infobuffer.Append (pr_needresponse); // Der verschlüsselte Chiffretext wird in HMAC gespeichert, und der Verschlüsselungsalgorithmus Yibao liefert es, da er auch denselben Algorithmus hmac = digestutil.hmacSign (Infobuffer.ToString (), KeyValue) verwenden muss; // sowohl Klartext als auch Cipher -Text in request.setattribute request.setattribute ("p0_cmd", p0_cmd) speichern. Request.SetatTribute ("p1_merid", p1_merid); request.setAttribute ("p2_order", p2_order); Request.SetatTribute ("p3_Amt", p3_Amt); request.setAttribute ("p4_cur", p4_cur); Request.SetAttribute ("p5_pid", p5_pid); Request.SetatTribute ("p6_pcat", p6_pcat); request.setattribute ("p7_pdesc", p7_pdesc); Request.SetAttribute ("p8_url", p8_url); Request.SetAttribute ("p9_saf", p9_saf); request.setAttribute ("pa_mp", pa_mp); request.setAttribute ("pd_frpid", pd_frpid); request.setAttribute ("pr_needResponse", pr_needResponse); Request.SetAttribute ("HMAC", HMAC); System.out.println ("HMAC->" + HMAC); // Überspringen Sie zu reqpay.jsp und senden Sie diese Informationen an yibao request.getRequestDispatcher ("/reqpay.jsp"). Weiterleiten (Anfrage, Antwort); } else if (status.equals ("Erfolg")) {// Was von Yibao kommt, ist Erfolg. Verarbeitungsrückgabe des Verifizierungsteils -Presses out = response.getWriter (); String keyValue = "W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677"; // Alle Klartext -String r0_cmd = formatString (request.getParameter ("r0_cmd")); String p1_merid = request.getParameter ("p1_merid"); String r1_code = formatString (request.getParameter ("r1_code")); String r2_trxid = formatString (request.getParameter ("r2_trxid")); String R3_AMT = formatString (Request.GetParameter ("R3_AMT")); String r4_cur = formatString (request.getParameter ("r4_cur")); String r5_pid = new String (formatString (request.getParameter ("r5_pid")). GetBytes ("ISO-8859-1"), "UTF-8"); String r6_order = formatString (request.getParameter ("r6_order")); String R7_UID = FormatString (Request.GetParameter ("R7_UID")); String r8_mp = new String (formatString (request.getParameter ("r8_mp")). GetBytes ("ISO-8859-1"), "UTF-8"); String r9_bType = formatString (request.getParameter ("r9_bType")); // Daten an PlainText String hmac = formatString (request.getParameter ("hmac")) anhängen; StringBuffer Infobuffer = new StringBuffer (); Infobuffer.Append (p1_merid); Infobuffer.Append (r0_cmd); Infobuffer.Append (r1_code); Infobuffer.Append (r2_trxid); InfoBuffer.Append (r3_am); Infobuffer.Append (r4_cur); Infobuffer.Append (r5_pid); Infobuffer.Append (r6_order); Infobuffer.Append (r7_UID); Infobuffer.Append (R8_MP); Infobuffer.Append (r9_bType); // Verschlüsseln Sie die zurückgegebene Klartext -String md5 = digestutil.hmacSign (Infobuffer.toString (), keyValue); // Bestimmen Sie, ob der verschlüsselte Chiffretext dem übertragenen Datensignature boolean isok = md5.Equals (HMAC) entspricht; if (isok && r1_code.equals ("1")) {// r1_code ist 1, um den Erfolg anzuzeigen // den erfolgreichen Bestellstatus in bezahltem Status ändern und die Zahlungserfolgsinformationen an den Benutzer angeben // Die E -Mail -Service -Schnittstelle, SMS -Senden -Service usw.//print hier ~ out.Println ("Bestellnummer Is:" R6_Order + ". } else {out.println ("fail !!!"); }}} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, ioException {doget (request, response); } String formatString (String text) {if (text == null) {return ""; } Texter zurückgeben; }}2.3 Verschlüsselungsalgorithmus
Der zur Umwandlung von einfache Text in Chiffertext verwendete Verschlüsselungsalgorithmus wird von Yibao bereitgestellt. Wir müssen es nur verwenden, um einfachen Text in Chiffretext umzuwandeln. Der Algorithmus lautet wie folgt:
public class digestutil {private static String codingCharset = "utf-8"; public static String hmacSign (String avalue, String akey) {byte k_ipad [] = new byte [64]; byte k_opad [] = neues byte [64]; Byte KeyB []; Bytewert []; try {keyb = akey.getBytes (codingCharSet); value = avalue.getBytes (CodingCharSet); } catch (unportedenCodingException e) {keyb = aKey.getBytes (); value = avalue.getBytes (); } Arrays.fill (k_ipad, keyb.length, 64, (byte) 54); Arrays.fill (k_opad, keyb.length, 64, (byte) 92); für (int i = 0; i <keyb.length; i ++) {k_ipad [i] = (byte) (keyB [i] ^ 0x36); k_opad [i] = (byte) (keyB [i] ^ 0x5c); } MessagedIGest MD = NULL; try {md = MessagedIGest.getInstance ("md5"); } catch (nosuchalgorithmException e) {return null; } md.update (k_ipad); Md.Update (Wert); byte dg [] = md.Digest (); md.reset (); md.update (k_opad); Md.Update (DG, 0, 16); dg = md.Digest (); return tohex (dg); } public static String tohex (byte input []) {if (input == null) return null; StringBuffer output = new StringBuffer (input.length * 2); für (int i = 0; i <input.length; i ++) {int current = input [i] & 0xff; if (Strom <16) output.Append ("0"); output.Append (Integer.ToString (Strom, 16)); } return output.toString (); } public static String gethmac (String [] args, String -Schlüssel) {if (args == null || args.length == 0) {return (null); } StringBuffer str = new StringBuffer (); für (int i = 0; i <args.length; i ++) {str.append (args [i]); } return (hmacSign (Str.ToString (), Schlüssel)); } / ** * @param avalue * @return * / public static String Digest (String avalue) {avalue = avalue.trim (); Bytewert []; try {value = avalue.getBytes (codingCharSet); } catch (unportedenCodingException e) {value = avalue.getBytes (); } MessagedIGest MD = NULL; try {md = MessagedIGest.getInstance ("sha"); } catch (nosuchalgorithmException e) {e.printstacktrace (); null zurückkehren; } return tohex (Md.Digest (Wert)); } // public static void main (string [] args) {// Parameter 1: plainText (zu verschlüsselt werden) Parameter 2: Schlüsselsystem.out.println (DigestUtil.hmacSign ("11111", "ABC"); System.out.println (DigestUtil.HMACSign ("11111", "ABD"); // Datensicherheitsprobleme lösen: Verschlüsseln Sie den Klartext ---> geheimer Text und der Klartext an Yibao // Nachdem Yibao die Daten erhalten, verschlüsseln Sie den übertragenen Klartext und vergleichen Sie ihn mit dem übertragenen Cipher-Text. Wenn die gleichen Daten nicht manipuliert wurden (der Händler und Yibao verwenden beide beim Verschlingen den gleichen Schlüssel)}}}Ich habe den Verschlüsselungsalgorithmus nicht zu sehr untersucht. Es scheint der MD5-Verschlüsselungsalgorithmus der zweiten Generation zu sein. Wie auch immer, werfen Sie einfach den einfachen Text hinein und er wird definitiv in einen Chiffrigtext verschlüsselt. Schauen wir uns die Seite reqpay.jsp an:
<%@page Language = "java" contentType = "text/html; charset = gbk"%> <html> <kopf> <titels> bis yepay Seite </title> </head> <body> <form name = "yeepay" action = 'https: //www.yeepay.com/App-Merchnoxy/noxy/noxy/node type = 'hidden' name = 'p0_cmd' value = '$ {requestScope.p0_cmd}'> <Eingabe type = 'hidden' name = 'p1_merid' value = '$ {{requestScope.p1_merid}'> <Eingabe type = 'Hidden' name = 'p2_Order' $ '$' $ '$' $ '$' type='hidden' name='p3_Amt' value='${requestScope.p3_Amt}'> <input type='hidden' name='p4_Cur' value='${requestScope.p4_Cur}'> <input type='hidden' name='p5_Pid' value='${requestScope.p5_Pid}'> <input type='hidden' name='p6_Pcat' value='${requestScope.p6_Pcat}'> <input type='hidden' name='p7_Pdesc' value='${requestScope.p7_Pdesc}'> <input type='hidden' name='p8_Url' value='${requestScope.p8_Url}'> <input type='hidden' name = 'p9_saf' value = '$ {requestScope.p9_saf}'> <Eingabe type = 'Hidden' name = 'pa_mp' value = '$ {requestScope.pa_mp}'> <Eingabe type = 'Hidden' name = 'pa_mp' value = '$ {{Anregung {Anregung, {{Anregung “. value = '$ {requestScope.pa_mp}'> <Eingabe type = 'Hidden' name = 'pd_frpid' value = '$ {requestScope.pd_frpid}'> <input type = "Hidden" name = "pr_needResponde" value = "$ {{RequestScope.pr_Need}"> <inponde ' value = '$ {requestScope.hmac}'> <Eingabe type = 'sureichen'/> </form> </body> </html> Tatsächlich ist diese Seite sehr einfach. Es soll den einfachen Text und den Cipher -Text durch die <form> Form an Yibao übergeben. Die Empfangs-URL von Yibao ist https://www.yeepay.com/app-merchant-proxy/node . Dies wird auch von Yibao -Beamter bereitgestellt, und wir können diesen schreiben. Tatsächlich gibt es nur einen submit -Taste. Klicken Sie auf die Schaltfläche submit , um den klaren Text und den Cipher -Text einzureichen. Schauen wir uns die Testergebnisse an:
3.. Testergebnissergebnisse
Einfacher Test Rezeption Index.jsp ~~~:
Nach dem Einreichen gehen Sie zu Reqpay und JSP. Der Effekt nach dem Klicken auf die Schaltfläche Senden ist wie folgt. Wir werden sowohl ICBC als auch CCB testen:
Es gibt kein Problem mit dem Zahlungsprozess. Ich hatte ursprünglich geplant, 1 Cent an ICBC zu zahlen, um die Ergebnisse nach Abschluss der Zahlung zu sehen, aber ich stellte fest, dass die U-Shield abgelaufen ist, weil es jetzt bequemer ist, Alipay zu verwenden ... Ich habe die U-Shield nicht aktualisiert, aber ich habe die E-Payment über ICBC geöffnet, sodass ich auch E-Payment in der obigen Grenzfläche verwenden kann.
Dann wird es zu der Seite springen, die wir zuvor angegeben haben, das heißt die Tongji University ... Okay, der Test ist abgeschlossen und der gesamte Zahlungsprozess ist vorbei!
In diesem Abschnitt wird hauptsächlich eine einfache Demo durchsucht, um festzustellen, ob er mit der Zahlungsschnittstelle der Bank verbunden werden kann. Jetzt ist der Test in Ordnung, er wurde angeschlossen und Sie können einfach wie gewohnt später bezahlen. Lasst uns die einfache Demo vorstellen. Anschließend werden wir das Online -Zahlungsmodul unseres vorherigen Online -Einkaufszentrums weiterentwickeln.
Originaladresse: http://blog.csdn.net/eson_15/article/details/51447492
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.