1. Online -Zahlungsübersicht
Was ist Online -Zahlung? Das stimmt, es gibt nur online Geld aus! Jeder muss eine solche Erfahrung gemacht haben. Aber Sie wissen vielleicht nicht viel über die "Insider -Geschichte" der Online -Zahlung, lassen Sie uns unten darüber erfahren!
Wenn Sie jetzt eine E-Commerce-Website ausführen, müssen Benutzer bezahlen, wenn sie etwas kaufen. Ihre Website muss in der Lage sein, eine Verbindung zu großen Banken herzustellen. Kehren Sie dann nach Abschluss der Zahlung zu Ihrer Website zurück, um "Zahlungserfolg" anzuzeigen!
Dies ist, was wir heute tun werden, eine Verbindung zum Online -Banking -System der Bank herzustellen, um Zahlungen abzuschließen. Um professioneller zu sein, nennen wir es "eine Gateway für Online -Zahlungen" zu entwickeln.
2. Zwei Möglichkeiten, online zu bezahlen
Es gibt zwei Möglichkeiten, online zu bezahlen:
*E-Commerce verbindet sich direkt mit Banken
*E-Commerce verbindet sich mit Banken über Zahlungsplattformen von Drittanbietern
Der E-Commerce verbindet sich direkt mit Banken, was die Zustimmung der Bank erfordert. Leider sind Banken sehr "großartig" und nicht jemand, der sich mit ihnen verbinden möchte. Wenn Ihr E-Commerce-Geschäft einen großen täglichen Kapitalfluss hat, wird die Bank mit Ihnen in Verbindung gebracht, da das gesamte Geld, das der Kunden an den E-Commerce gezahlt hat, auf das Bankkonto eingezahlt wird! Aber wenn der Kapitalfluss klein ist, wird die Bank Ihnen nicht aufpassen!
Wenn kleine Websites nicht ausreichend Mittel haben und sich nicht mit Banken verbinden können, entscheiden sie sich für die Zusammenarbeit mit Zahlungsunternehmen von Drittanbietern. Jeder versteht auch, was Unternehmen dies sind, wie Alipay, Yibao, Fortune, Kuaiqian und andere Unternehmen sind in China relativ berühmt. Diese Unternehmen können sich mit Banken verbinden (weil sie über genügend Mittel verfügen) und dann kleine E-Commerce-Unternehmen können sich mit ihnen verbinden! Aber Dritte benötigen eine Gebühr! Dritte verlangen im Allgemeinen 1% der E-Commerce-Gebühren, berechnen jedoch kein Geld der Kunden.
Über das obige Bild können Sie erfahren, dass der Namen des Einkaufszentrums, die RMB -Bestellnummer und die Bestellzeit auf der Bankseite angezeigt werden. . . Woher wissen Banken über diese Dinge? Natürlich wird es von E-Commerce an Banken weitergegeben. Nachdem sich das E-Commerce-Unternehmen mit der Bank in Verbindung stellt, muss das E-Commerce-Unternehmen die von der Bankseite an der Bank-Seite erforderlichen Parameter übergeben, damit die Bankseite diese Daten anzeigen kann!
Unser Einkaufszentrum kann jedoch nicht nur eine Bank herstellen! Wir müssen uns mit den vier Unternehmen von BOC, CCB, ABC und ICBC in Verbindung setzen! Die von verschiedenen Banken erforderlichen Docking -Parameter sind unterschiedlich, was bedeutet, dass wir während der Entwicklung unterschiedliche Docking -Codes für verschiedene Banken schreiben müssen. Dies ist auch der Nachteil der direkten Verbindung mit Banken! Natürlich ist ein direkter Zusammenhang mit Banken auch von Vorteil, dh Sicherheit ist nicht erforderlich, keine Handhabungsgebühren!
Entwickeln Sie verschiedene Codes für verschiedene Banken (Nachteile);
Sicherheit (Vorteile);
Keine Handhabungsgebühr (Vorteile);
Kleine E-Commerce-Banken erlauben keine Verbindungen (Nachteile).
Wie in der obigen Abbildung gezeigt, wird er nach der Klicks des Kunden auf der E-Commerce-Website auf die Website des Dritten angerichtet, und dann wird der Dritte mit der Bank in Verbindung treten. Dies zeigt, dass E-Commerce Parameter an Drittanbieter übergeben muss! Der Dritte übergibt dann die Parameter an die Bank. Der Vorteil dieser Methode besteht darin, dass sie nur für Dritte entwickelt werden muss, ohne jeder Bank Parameter bereitzustellen. Es ist eine Aufgabe von Drittanbietern, jeder Bank Parameter bereitzustellen. Wenn jedoch ein Dritter nicht alt und zuverlässig ist, wenn der Dritte bankrott geht und die Leute weglaufen, wird Ihr Geld verschwunden sein. Da das vom Kunden gezahlte Geld nicht auf Ihr Bankkonto geht, wird es auf das Bankkonto des Dritten gezahlt, und Sie haben ein Konto auf dem Dritten. Darüber hinaus berechnen Dritte auch eine Bearbeitungsgebühr, normalerweise 1%, was keine kleine Zahl ist (es ist wirklich schlecht).
3. Durch Online-Zahlungsregeln von Drittanbietern
Wenn E-Commerce einen Händler bei einem Dritten registrieren möchte, muss er dem Dritten eine ICP-Zertifizierung vorlegen. Eine ICP -Geschäftslizenz ist eine Website -Geschäftslizenz, die von einer Geschäftswebsite gemäß den nationalen "Internet -Management -Maßnahmen" bearbeitet werden muss. Wenn dies nicht der Fall ist, ist es illegal zu operieren.
Wir können uns nicht nur wegen der Übung für ICP bewerben! Wir können also keinen Händler bei einem Dritten registrieren. Wir haben jedoch bereits fertige Händler bei Yibao registriert, sodass dieser Schritt ignoriert werden kann.
Wenn Sie sich erfolgreich bei Yibao registrieren, gibt Ihnen Yibao die folgenden Dinge:
Öffnen Sie ein Konto in Yibao (d. H. Händlercode): 10001126856
Yibao -Zugriffsspezifikation: Eine CHM -Datei Symmetrische Verschlüsselungsalgorithmus Klasse: paymentutil.java
Schlüssel: 69CL522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
In der Yibao-Zugriffsspezifikation finden wir das Zahlungsgateway von Yibao, bei dem es sich tatsächlich um eine URL handelt.
In der Yibao -Zugriffsspezifikation finden Sie auch die von Yibao erforderlichen Parameter. Wenn sich E-Commerce mit Yibao verbindet, müssen diese Parameter an das Zahlungsgateway übergeben werden:
Offizielle Anfrage Adresse: https://www.yeepay.com/app-merchant-proxy/node
Diese Parameter müssen an die URL beigefügt werden.
Beachten Sie jedoch, dass die Werte dieser Parameter verschlüsselt werden müssen. Sowohl der Verschlüsselungsschlüssel als auch der Verschlüsselungsalgorithmus Yibao werden!
wobei p8_url angibt, zu welcher Seite zur Rückkehr, wenn die Zahlung erfolgreich ist. Dies bedeutet, dass wir eine Seite schreiben müssen, auf der die Ergebnisse angezeigt werden. Nachdem die Zahlung erfolgreich ist, wird ein Dritter auf die von uns angegebene Rückgabeseite umleiten und uns auch einige Parameter bringen. Unsere Seite muss diese Parameter abrufen und auf der Seite anzeigen. Im Folgenden sind die vom Dritte zurückgegebenen Parameter:
4. Entwickeln Sie ein Online-Zahlungssystem von Drittanbietern
Schritt:
Index.jsp Seite: Ein an BuyServlet eingereichter Form. Die Formularpositionen umfassen: Bestellnummer, Zahlungsbetrag, Bankauswahl
BuyServlet: Nehmen Sie Formular Daten ab und bereiten Sie eine Verbindung zu einem Gateway von Drittanbietern vor. Da auf der Seite von Index.jsp nur 3 Parameter angegeben sind und viele Parameter von Dritten erforderlich sind, werden die von der Seite nicht angegebenen Parameter durch BuyServlet ergänzt. Und die Parameter müssen auch verschlüsselt werden, was auch in BuyServlet abgeschlossen werden muss
BackServlet: Wenn der Benutzer erfolgreich bezahlt, wird der Dritte auf die von uns angegebene Rückgabeseite umgeleitet. Wir verwenden BackServlet als Rückgabeseite, mit dem Parameter empfangen werden, die vom Dritten übergeben und auf der Seite angezeigt werden.
Da wir bereits ein registriertes Geschäft in Yibao haben, müssen wir kein Unternehmen selbst registrieren. Hier finden Sie also Yibao als Zahlungsplattform Dritter zum Testen. Da ich keinen E-Commerce habe (E-Commerce, der die ICP-Zertifizierung bestehen muss), kann ich auch kein Unternehmen bei einem Dritten registrieren.
Das Yibao -Geschäft, das wir jetzt verwenden, wird vom Chuanzhi Podcast bereitgestellt, einem von Baba Sports Network in Yibao registrierten Unternehmen. Das während des Tests gezahlte Geld wurde dem von Baba Sports Network in Yibao registrierten Unternehmen gegeben.
Schritt 1: Index.jsp
<form action="" method="post"> Order number: <input type="text" name="p2_Order"/><br/> Amount: <input type="text" name="p3_Amt"/><br/> Select a bank: <input type="radio" name="pd_FrpId" value="ICBC-NET-B2C"/> Industrial and Commercial Bank of China<img src = "bank_img/icbc.bmp" align = "Middle"/> <Eingabe type = "radio" name = "pd_frpid" value = "boc-net-b2c"/> bank von China <img src = "bank_img/icbc.bmP" align = "Middle"/> <input type "name" name "name" name "name" name "name" name "name" name "name" name "name" name "name" name "name" name "name" name "name" name "name" name " value="BOC-NET-B2C"/>Bank of China<img src="bank_img/bc.bmp" align="middle"/><br/> <input type="radio" name="pd_FrpId" value="ABC-NET-B2C"/> Agricultural Bank of China<img src="bank_img/abc.bmp" align="middle"/> <input type="radio" name="pd_FrpId" value="CCB-NET-B2C"/> Construction Bank<img src="bank_img/ccb.bmp" align="middle"/><br/> <input type="radio" name="pd_FrpId" value="BOCO-NET-B2C"/>Bank of Communications<img src = "bank_img/bcc.bmp" align = "Middle"/> <br/> <Eingabe type = "value =" payment "/> </form>
Der entsprechende Wert jeder Bank:
Schritt 2: BuyServlet.java
Public Class BuyServlet erweitert HttpServlet (public void dopost (httpServletRequest Request, httpServletResponse-Antwort), die ServletException, IOException {Request.Setcharactercoding ("UTF-8"); Antwort.SetContentType ("text/html; charSet = utf-8"); String p0_cmd = "buy"; // Geschäftstyp, fester Wert ist kaufen, dh "kaufen" String p1_merid = "10001126856"; // Der Businessname String p2_order = request.getParameter ("p2_order"); // Bestellnummer P3_AMT = Anfrage. "CNY"; // Die Transaktionswährung ist der feste Wert CNY, der RMB String p5_pid = ""; // Produktname String p6_pcat = ""; // Produktname String p7_pdesc = ""; // Produktbeschreibung String P8_url = "Http: // localhost: 8080/backservlet"; "http: // localhost: 8080/buy/backservlet"; // Die Rückgabeseite von E-Commerce, wenn die Zahlung erfolgreich ist, leitet Yibao auf dieser Seite String p9_saf = ""; // Lieferadress String PA_MP = ""; // Produktverlängerungspflicht pr_needResponse = "1"; // Antwortmechanismus, fester Wert ist 1 // Schlüssel, bereitgestellt von Yibao, nur Händler und Yibao kennen diesen Schlüssel. String keyValue = "69CL522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220iUYE9U37N4Y7RI4PL"; // Durch die oben genannten Parameter, Tasten und Verschlüsselungsalgorithmen wird der HMAC -Wert generiert // Die Reihenfolge der Parameter ist erforderlich. Wenn es keinen Wert gibt, kann Null nicht gegeben werden, aber es sollte eine leere Zeichenfolge gegeben werden. String hmac = paymentUtil.buildHMAC (p0_cmd, p1_merid, p2_order, p3_amt, p4_cur, p5_pid, p6_pcat, p7_pdesc, p8_url, p9_saf, pd_frpid, pr_needressponse, keyvalue); // Verbinden Sie alle Parameter mit der Gateway-Adresse String url = "https://www.yeepay.com/app-merchant-proxy/node"; url + = "? p0_cmd =" + p0_cmd + "& p1_merid =" + p1_merid + "& p2_order =" + p2_order + "& p3_amt =" + p3_amt + "& p4_cur =" + p4_cur + " p6_pcat + "& p7_pdesc =" + p7_pdesc = " + p7_pdesc +" & p8_url = " + p8_url =" + p8_url + "& p9_saf =" + p9_saf + "& pa_mp =" + pa_mp + "& pd_fp. pr_needResponse + "& hmac =" + hmac; System.out.println (URL); // zur gateway reaktion umleiten.sendredirect (URL); }}Schritt 3: Backservlet
öffentliche Klasse BackServlet erweitert HttpServlet (public void dodget (httpServletRequest request, httpServletResponse-Antwort), die ServletException, IOException {response.setContentType ("text/html; charset = utf-8"); / * * Yibao wird eine Reihe von Ergebnisparametern bereitstellen. Wir können das erhalten, was wir brauchen. * Zahlungsbetrag erhalten: R3_AMT * E-Commerce-Bestellnummer erhalten: R6_Order * Ergebnisrückgabe-Typ: R9_BTYPE, 1 bedeutet, die Rückgabe umzuleiten. */ String r1_code = request.getParameter ("r1_code"); String R3_AMT = Request.getParameter ("R3_AMT"); String r6_order = request.getParameter ("r6_order"); String r9_bType = request.getParameter ("r9_bType"); if (r1_code.equals ("1")) {if (r9_bType.equals ("1") {response.getWriter (). print ("<h1> erfolgreich bezahlen! "<br/>"); response.getWriter (). print ("Bestellnummer ist:" + r6_order + "<br/>"); }}}}Tools zum Erhalten von HMAC, die von Yibao -Zahlung bereitgestellt werden
public class paymentutil {private statische String codingCharset = "utf-8"; /*** HMAC -Methode generieren** @param p0_cmd Business Type* @param p1_merid Händlernummer* @param p2_order Händlernummer* @param p3_amt Zahlungsbetrag* @param p4_cur transaktionswährung* @param p5_pid Produktname* @param p6_pcat product type the merchant receiving payment success data* @param p9_SAF Delivery address* @param pa_MP Merchant extension information* @param pd_FrpId Bank code* @param pr_NeedResponse response mechanism* @param keyValue Merchant key* @return */ public static String buildHmac(String p0_Cmd,String p1_MerId, String p2_Order, String p3_Amt, String p4_cur, String p5_pid, String p6_pcat, String p7_pdesc, String p8_url, String p9_saf, String pa_mp, String pd_frpid, string pr_needResponse, String keyValue) {StringBuilder SVALUE = new StringBuper (); // Business Type SValue.Append (p0_cmd); // Händlernummer SValue.Append (p1_merid); // Händlerbestellnummer SValue.Append (p2_order); // Zahlungsbetrag sValue.Append (p3_AMT); // Handelswährung SValue.Append (p4_cur); // Produktname SValue.Append (p5_pid); // Produkttyp SValue.Append (p6_pcat); // Produktbeschreibung SValue.Append (p7_pdesc); // Adresse des Händlers erhält Zahlungserfolgsdaten sValue.Append (p8_url); // Lieferadresse sValue.Append (p9_saf); // Händler -Erweiterungsinformationen sValue.Append (pa_mp); // Bankcode SValue.Append (PD_FRPID); // Antwortmechanismus SValue.Append (pr_needResponse); return paymentutil.hmacSign (SValue.ToString (), KeyValue); } /** * Return to verification hmac method* * @param hmac Encrypted verification code sent by the payment gateway* @param p1_MerId Merchant number* @param r0_Cmd Business type* @param r1_Code Payment result* @param r2_TrxId Yibao payment transaction flow number* @param r3_Amt Payment amount* @param r4_Cur Transaction currency* @param r5_Pid Product name* @param r6_Order Merchant order number* @param r7_Uid Yibao Payment member ID * @param r8_MP Merchant extension information* @param r9_BType Transaction result return type* @param keyValue key* @return */ public static boolean verifyCallback(String hmac, String p1_MerId, String r0_Cmd, String R1_CODE, String R2_TRXID, String R3_AMT, String R4_CUR, String R5_PID, String R6_Order, String R7_UID, String R8_MP, String R9_Btype, String KeyValue) {StringBuilder SValue = new StringBuilder (); // Händlernummer SValue.Append (p1_merid); // Business Type SValue.Append (R0_CMD); // Zahlungsergebnis SValue.Append (r1_code); // yibao Zahlungstransaktionsnummer SValue.Append (r2_trxid); // Zahlungsbetrag sValue.Append (r3_Amt); // Transaktionswährung sValue.Append (r4_cur); // Produktname SValue.Append (R5_PID); // Händlerbestellnummer SValue.Append (r6_order); // yibao payment member id SValue.Append (r7_uid); // Händler -Erweiterungsinformationen sValue.Append (r8_mp); // Transaktionsergebnis Rückgabetyp SValue.Append (R9_BTYPE); String Snewstring = paymentutil.hmacSign (SValue.ToString (), KeyValue); return snewstring.equals (hmac); } / ** * @param avalue * @param akey * @return * / 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 (); } / ** * * @param args * @param key * @return * / 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) {// System.out.println (HMACSIGN ("Annulcard1000043252120080620160450.0Http: //localhost/szxpro/callback.asp 海? 4 564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t"));// }}Yibao -Rückruf
Peer-to-Peer: Yibao greift direkt auf E-Commerce zu, es gibt hier keinen Kunden.
Diese Methode ist ein Muss, und wir können sie nicht so erhalten! Weil wir keine feste IP haben
Yibao hat einen Wiederversendungsmechanismus. Wenn es Sie besucht und Sie die Nachricht nicht zurücksenden, wird es sich weiter verschärfen!
E-Commerce muss eine Zeichenfolge zurückgeben, beginnend mit Erfolg!
Führen Sie den Client-Browser, um sich in den E-Commerce umzuleiten. Es soll Kunden auf E-Commerce zugreifen!
Kann nicht verwendet werden!
HMAC: 13 Parameterwert + KeyValue (Schlüssel) + Algorithmus (MD5)
13 Parameterwert: selbst eingestellt!
KEYVALUE: Der One Yibao, der uns nach unserer Anmeldung an uns gesendet wurde, wussten nur wir und Yibao von diesem Ding!
Der Algorithmus mit dem zugrunde liegenden MD5: paymentutil.buildhmac (14), der HMAC zurücksetzt
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.