1. Aperçu du paiement en ligne
Qu'est-ce que le paiement en ligne? C'est vrai, c'est juste dépenser de l'argent en ligne! Tout le monde doit avoir une telle expérience. Mais vous ne savez peut-être pas grand-chose sur «l'histoire intérieure» du paiement en ligne, apprenons-le ci-dessous!
Si vous commencez maintenant à exécuter un site Web de commerce électronique, les utilisateurs doivent payer s'ils achètent quelque chose. Votre site Web doit être en mesure de se connecter aux grandes banques. Ensuite, une fois le paiement terminé, revenez sur votre site Web pour afficher le «succès du paiement»!
C'est ce que nous allons faire aujourd'hui, connecter au système bancaire en ligne de la banque pour effectuer les paiements. Pour être plus professionnel, nous l'appelons "Développer une passerelle pour les paiements en ligne"
2. Deux façons de payer en ligne
Il y a deux façons de payer en ligne:
* Le commerce électronique se connecte directement aux banques
* Le commerce électronique se connecte aux banques via des plateformes de paiement tierces
Le commerce électronique se connecte directement avec les banques, ce qui nécessite le consentement de la banque, mais malheureusement, les banques sont très "géniales" et qui ne veulent pas se connecter avec elles. Si votre entreprise de commerce électronique a un grand flux de capital quotidien, la banque se connectera avec vous car tout l'argent payé par le client au commerce électronique est déposé sur le compte bancaire! Mais si le flux de capital est petit, la banque ne fera pas attention à vous!
Lorsque les petits sites Web sont insuffisants en fonds et ne peuvent pas se connecter avec les banques, ils choisiront de coopérer avec des sociétés de paiement tierces. Tout le monde comprend également quelles sont les entreprises, comme Alipay, Yibao, Fortune, Kuaiqian et d'autres sociétés sont relativement célèbres en Chine. Ces entreprises peuvent se connecter avec les banques (car elles ont suffisamment de fonds), puis les petites entreprises de commerce électronique peuvent se connecter avec elles! Mais les tiers ont besoin de frais! Des tiers facturent généralement 1% des frais de commerce électronique, mais ils ne factureront pas l'argent des clients.
Grâce à l'image ci-dessus, vous pouvez apprendre que le nom du centre commercial, le numéro de commande RMB et le temps de commande seront affichés sur la page bancaire. . . , Comment les banques savent-elles ces choses? Bien sûr, il est transmis aux banques par le commerce électronique. Une fois que la société de commerce électronique s'est connectée à la banque, la société de commerce électronique doit passer les paramètres requis par la page bancaire à la page bancaire, afin que la page bancaire puisse afficher ces données!
Cependant, notre centre commercial ne peut pas se connecter à une seule banque! Nous devons nous connecter avec les quatre sociétés de BOC, CCB, ABC et ICBC! Les paramètres d'amarrage requis par différentes banques sont différents, ce qui signifie que nous devons rédiger différents codes d'amarrage pour différentes banques pendant le développement. C'est également l'inconvénient de se connecter directement avec les banques! Bien sûr, la connexion directe avec les banques est également bénéfique, c'est-à-dire que la sécurité n'est pas requise, pas de frais de manutention!
Développer différents codes pour différentes banques (inconvénients);
Sécurité (avantages);
Pas de frais de traitement (avantages);
Les petites banques de commerce électronique n'autorisent pas les connexions (inconvénients).
Comme indiqué dans la figure ci-dessus, après le clic sur le client pour confirmer le paiement sur le site Web du commerce électronique, il sera dirigé vers le site Web du tiers, puis le tiers se connectera avec la banque. Cela montre que le commerce électronique doit transmettre des paramètres à un tiers! Le tiers transmet ensuite les paramètres à la banque. L'avantage de cette méthode est qu'il ne doit être développé que pour des tiers sans fournir de paramètres à chaque banque. Il s'agit d'une tâche tierce de fournir des paramètres à chaque banque. Cependant, si un tiers n'est pas vieux et fiable, si le tiers fait faillite et que les gens s'enfuient, votre argent sera parti. Parce que l'argent payé par le client ne va pas sur votre compte bancaire, il est versé au compte bancaire du tiers et vous avez un compte sur le tiers. De plus, des tiers facturent également des frais de manutention, généralement 1%, ce qui n'est pas un petit nombre (c'est vraiment mauvais).
3. Grâce aux règles de paiement en ligne tierces
Si le commerce électronique souhaite enregistrer un marchand avec un tiers, il doit fournir une certification ICP au tiers. Une licence commerciale ICP est une licence commerciale de site Web qui doit être traitée par un site Web d'entreprise conformément aux «mesures de gestion d'Internet» nationales. Si ce n'est pas le cas, il est illégal de fonctionner.
Nous ne pouvons pas demander ICP simplement à cause de la pratique! Nous ne pouvons donc pas enregistrer un marchand avec un tiers. Cependant, nous avons déjà des marchands prêts à l'emploi enregistrés auprès de Yibao, donc cette étape peut être ignorée.
Lorsque vous vous inscrivez avec succès auprès de Yibao, Yibao vous donnera les choses suivantes:
Ouvrez un compte dans Yibao (c'est-à-dire le code marchand): 10001126856
Spécification d'accès Yibao: une classe d'algorithme de cryptage symétrique de fichiers CHM: PaymentTutil.java
Clé: 69Cl522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
Dans la spécification d'accès Yibao, nous pouvons trouver la passerelle de paiement de Yibao, qui est en fait une URL, une URL utilisée pour se connecter avec Yibao: https://www.yeepay.com/app-merchant-proxy/node
Dans la spécification d'accès Yibao, vous pouvez également trouver les paramètres requis par Yibao. Lorsque le commerce électronique se connecte avec Yibao, ces paramètres doivent être transmis à la passerelle de paiement:
Adresse officielle de la demande: https://www.yeepay.com/app-rchant-proxy/node
Ces paramètres doivent être annexés à l'URL.
Cependant, sachez que les valeurs de ces paramètres doivent être cryptées. La clé de chiffrement et l'algorithme de cryptage que Yibao fournira!
où p8_url indique à quelle page retourner lorsque le paiement réussit. Cela signifie que nous devons écrire une page qui affiche les résultats. Une fois le paiement réussi, un tiers redirigera vers la page de retour que nous avons spécifiée et nous apportera également des paramètres. Notre page doit obtenir ces paramètres et les afficher dans la page. Voici les paramètres renvoyés par le tiers:
4. Développer un système de paiement en ligne tiers
étape:
Index.jsp Page: Un formulaire soumis à Buyservlet. Les articles du formulaire incluent: numéro de commande, montant du paiement, sélection des banques
Buyservlet: obtenez des données de formulaire et préparez-vous à vous connecter à une passerelle tierce. Étant donné que seuls 3 paramètres sont donnés dans la page index.jsp, et il y a de nombreux paramètres requis par des tiers, les paramètres non donnés par la page sont complétés par Buyservlet. Et les paramètres doivent également être cryptés, qui doivent également être achevés dans Buyservlet
BackServlet: Lorsque l'utilisateur paie avec succès, le tiers sera redirigé vers la page de retour que nous avons spécifiée. Nous utilisons BackServlet comme page de retour, qui est utilisée pour recevoir des paramètres passés par le tiers et les afficher dans la page.
Parce que nous avons déjà une entreprise enregistrée à Yibao, nous n'avons pas à enregistrer une entreprise par nous-mêmes. Voici donc d'utiliser Yibao comme plate-forme de paiement tiers pour les tests. Parce que je n'ai pas de commerce électronique (commerce électronique qui doit passer la certification ICP), je ne peux pas non plus enregistrer une entreprise auprès d'un tiers.
L'activité Yibao que nous utilisons actuellement est fournie par Chuanzhi Podcast, une entreprise enregistrée par Baba Sports Network sur Yibao. L'argent payé pendant le test a donc été donné à la société enregistrée par Baba Sports Network sur Yibao.
Étape 1: index.jsp
<form action = "" Method = "Post"> Numéro d'ordre: <input type = "text" name = "p2_order" /> <br/> Mult: <input type = "text" name = "p3_amt" /> <br/> Sélectionnez une banque: <input type = "radio" name = "pd_frpid" value = "icbc-net-b2c" /> industrie src = "bank_img / icbc.bmp" align = "middle" /> <input type = "radio" name = "pd_frpid" value = "boc-net-b2c" /> banc de China <img src = "banc_img / icbc.bmp" align = "middle" /> <entrée = "radio" name = "pd_frpid" 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 = "midd type = "radio" name = "pd_frpid" value = "ccb-net-b2c" /> Banque de construction <img src = "bank_img / ccb.bmp" align = "middle" /> <br/> <entrée type = "radio" name = "pd_frpid" value = "boco-net-b2c" /> banc des communications <imfrpid " src = "bank_img / bcc.bmp" align = "middle" /> <br/> <input type = "soumi" value = "confirmer le paiement" /> </ form>
La valeur correspondante de chaque banque:
Étape 2: buyservlet.java
public class buyservlet étend httpServlet {public void doPost (httpservletRequest request, httpservletResponse réponse) lève ServletException, ioException {request.SetcharAtterencoding ("utf-8"); Response.SetContentType ("Text / HTML; charSet = UTF-8"); String p0_cmd = "buy"; // type d'entreprise, la valeur fixe est acheter, c'est-à-dire "acheter" String p1_merid = "10001126856"; // Nom de l'entreprise String p2_order = request.getParameter ("p2_Order"); // Commandez numéro de chaîne "CNY"; // La devise de transaction, la valeur fixe est CNY, indiquant la chaîne RMB P5_PID = ""; // Nom de produit chaîne P6_PCAT = ""; // Nom de produit chaîne P7_PDESC = ""; // Product Description String P8_Url = "http: // LocalHost: 8080 / acheter / backservlet"; // Product Description String p8_Url = "http: // localhost: 8080 / buy / backservlet"; // la page de retour de e-commerce, lorsque le paiement réussit, yibao redirigera vers cette page String p9_saf = ""; // la chaîne d'adresse de livraison PA_MP = ""; // String de prolongation du produit PD_FRPID = Pays.getParameter ("PD_FRPID"); PR_NEEDRESPONSE = "1"; // Mécanisme de réponse, la valeur fixe est 1 // clé, fournie par Yibao, seuls les marchands et Yibao connaissent cette clé. String keyValue = "69Cl522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4YY7RI4PL"; // À travers les paramètres, les clés et les algorithmes de chiffrement ci-dessus, la valeur HMAC est générée // L'ordre des paramètres est nécessaire. S'il n'y a pas de valeur, Null ne peut pas être donné, mais une chaîne vide doit être donnée. String HMAC = PAYSETUTIL.BUILDHMAC (P0_CMD, P1_MERID, P2_ORD, P3_AMT, P4_CUR, P5_PID, P6_PCAT, P7_PDESC, P8_URL, P9_SAF, PA_MP, PD_FRPID, PR_NEEDRESPATION, KEYVALUE); // Connectez tous les paramètres à la chaîne d'adresse de passerelle 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 + "& p5_pid =" + p5_pid + "& p6_pcat =" + "+" p6_pcat + "& p7_pdesc =" + p7_pdescs = "+ p7_pdesc +" & p8_url = "+ p8_url =" + p8_url + "& p9_saf =" + p9_saf + "& pa_mp =" + pa_mp + "& pd_frpid =" + pd_frpid + "& pr_neeples =" +) PR_NEEDRESPONSE + "& HMAC =" + HMAC; System.out.println (URL); // rediriger vers la réponse de la passerelle.SenDredirect (URL); }}Étape 3: BackServlet
La classe publique BackServlet étend HttpServlet {public void doGet (HttpServletRequest Request, HttpServletResponse Response) lève ServletException, ioException {réponse.SetContentType ("Text / Html; Charset = UTF-8"); / * * Yibao fournira une série de paramètres de résultat, nous pouvons obtenir ce dont nous avons besoin * Obtenez le résultat du paiement: R1_code, 1 signifie que le paiement est réussi. * Obtenez le montant du paiement: R3_AMT * Obtenez le numéro de commande du commerce électronique: R6_Order * Obtenez le type de retour des résultats: R9_BTYPE, 1 signifie Redirection Retour, 2 signifie Retour point à point, * mais nous ne pouvons pas recevoir de points à point, car nos IPS sont tous des IPS LAN. * / 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")) {réponse.getWriter (). print ("<h1> payer avec succès! </h1>"); // en fait, lorsque le paiement est insuffisant, yibao ne reviendra pas à cette servitude. "<br/>"); réponse.getwriter (). print ("Le numéro de commande est:" + r6_order + "<br/>"); }}}}Outils pour obtenir HMAC fournis par Yibao Payment
classe publique PaysUtil {private static string codingCharsetSet = "utf-8"; / ** * Générer la méthode HMAC * * @Param P0_CMD Type d'entreprise * @param P1_Merid Merchant Number * @param P2_Order Merchant Number * @param P5_PID Nom du produit * @param P4_CUR TRANSATION CURRENCY Données de réussite de paiement des marchands * @param p9_saf Adresse de livraison * @param pa_mp des informations d'extension de marchand * @param pd_frpid code bancaire * @param pr_neeseRaSponse Mécanisme de réponse * @param keyvalue Merchant key p4_cur, chaîne p5_pid, chaîne p6_pcat, chaîne p7_pdescs, chaîne p8_url, chaîne p9_saf, string pa_mp, string pd_frpid, string pr_neeseResponse, string keyValue) {stringBuilder svalue = new StringBuilder (); // Type d'entreprise svalue.append (p0_cmd); // Numéro de marchand SValue.Apend (P1_Merid); // Numéro de commande du marchand SValue.Apend (P2_Order); // Montant de paiement SValue.APPEND (P3_AMT); // Trading Currency SValue.APPEND (P4_CUR); // Nom du produit SValue.Apend (p5_pid); // Type de produit svalue.append (p6_pcat); // Description du produit SValue.APPEND (P7_PDESC); // Adresse du marchand recevant des données de réussite de paiement svalue.append (p8_url); // Adresse de livraison SValue.APPEND (P9_SAF); // Informations d'extension de marchand SValue.Apend (PA_MP); // Code bancaire SValue.Apend (PD_FRPID); // Mécanisme de réponse sValue.Apend (PR_NEEDRESPONSE); Retour PaytUtil.hmacSign (svalue.toString (), keyValue); } / ** * Retour à la méthode HMAC de vérification * * @Param HMAC Code de vérification cryptée envoyée par la passerelle de paiement * @param p1_merid Merchant Number * @param R0_CMD Type d'entreprise * @param r1_code Résultat * @param R2_TRXID YIBAO Paiement Numéro de transaction * @param R3_AMT Montant de paiement * @Param R4_ R5_PID Nom du produit * @param R6_Order Merchant Number Number * @param R7_UID YIBAO Paiement ID de membre * @param R8_MP Merchant Extension Informations * @Param R9_BTYPE Transaction Résultat Type * @param KeyValue Key * String R2_TRXID, chaîne R3_AMT, chaîne R4_CUR, chaîne R5_PID, chaîne R6_Order, String R7_UID, String R8_MP, String R9_BTYPE, String KeyValue) {StringBuilder SValue = new StringBuilder (); // Numéro de marchand SValue.Apend (P1_Merid); // Type d'entreprise svalue.append (r0_cmd); // Résultat de paiement SValue.APPEND (R1_CODE); // Numéro de transaction de paiement Yibao SValue.APPEND (R2_TRXID); // Montant de paiement SValue.APPEND (R3_AMT); // de la devise de transaction svalue.append (r4_cur); // Nom du produit SValue.APPEND (R5_PID); // Numéro de commande du marchand SValue.Apend (R6_Order); // YIBAO Paiement membre ID SValue.APPEND (R7_UID); // Informations d'extension de marchand SValue.Apend (R8_MP); // Résultat de la transaction Type SValue.APPEND (R9_BTYPE); String snewstring = PaymentTUtil.hmacSign (svalue.toString (), keyValue); retour snewstring.equals (HMAC); } / ** * @param avalue * @param akey * @return * / public static String hmacsign (String Avalue, String akey) {byte k_ipad [] = new Byte [64]; octet k_opad [] = nouveau octet [64]; octet keyB []; valeur d'octet []; essayez {keyB = akey.getBytes (EncodingCharset); valeur = avalue.getBytes (EncodingCharset); } catch (UnportEnCoDingException e) {keyB = akey.getBytes (); valeur = avalue.getBytes (); } Arrays.fill (k_ipad, keyb.length, 64, (byte) 54); Arrays.filt (k_opad, keyb.length, 64, (octet) 92); for (int i = 0; i <keyb.length; i ++) {k_ipad [i] = (byte) (keyB [i] ^ 0x36); k_opad [i] = (byte) (keyB [i] ^ 0x5c); } MessagediGest md = null; essayez {md = messagediGest.getInstance ("md5"); } catch (NosuchalgorithMexception e) {return null; } md.update (k_ipad); md.update (valeur); octet dg [] = md.digest (); md.reset (); md.update (k_opad); MD.Update (DG, 0, 16); dg = md.digest (); Retour Tohex (DG); } public static String tohex (byte entrée []) {if (input == null) return null; StringBuffer output = new StringBuffer (input.length * 2); for (int i = 0; i <input.length; i ++) {int current = input [i] & 0xff; if (courant <16) output.append ("0"); Output.Apend (Integer.ToString (Current, 16)); } return output.toString (); } / ** * * @param args * @param key * @return * / public static String gethmac (String [] args, string key) {if (args == null || args.length == 0) {return (null); } StringBuffer str = new StringBuffer (); for (int i = 0; i <args.length; i ++) {str.append (args [i]); } return (hmacsign (str.toString (), key)); } / ** * @param avalue * @return * / public static String Digest (String Avalue) {Avalue = Avalue.trim (); valeur d'octet []; try {value = avalue.getBytes (EncodingCharset); } catch (UnportEnCcodingException e) {value = avalue.getBytes (); } MessagediGest md = null; essayez {md = messagediGest.getInstance ("sha"); } catch (NosuchalgorithMexception e) {e.printStackTrace (); retourner null; } return tohex (md.digest (valeur)); } // public static void main (String [] args) {// System.out.println (HMACSign ("AnnulCard1000043252120080620160450.0http: //localhost/szxpro/callback.asp 海? 4 564868265473632445648682654736324511 "," 8upp0ke8sq73zvp370vko7c39403rtk1ywx40td6irh216036h27eb12792t ")); // }}Rappel Yibao
Peer-to-peer: Yibao accède directement au commerce électronique, il n'y a pas de client ici.
Cette méthode est un incontournable, et nous ne pouvons pas le recevoir de cette façon! Parce que nous n'avons pas de propriété intellectuelle fixe
Yibao a un mécanisme de renvoi. S'il vous rend visite et que vous ne le renvoyez pas le message, il continuera de renverser!
Le commerce électronique doit renvoyer une chaîne à commencer par le succès!
Guide le navigateur du client pour rediriger vers le commerce électronique. C'est pour permettre aux clients d'accéder au commerce électronique!
Je ne peux pas être utilisé!
HMAC: 13 Valeur du paramètre + KeyValue (clé) + algorithme (MD5)
13 Valeur du paramètre: réglé par vous-même!
KeyValue: Celui que Yibao nous a envoyé après nous être inscrits, seuls nous et Yibao savions cette chose!
L'algorithme avec le MD5 sous-jacent: PaymentTutil.buildHmac (14), qui renvoie HMAC
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.