Dans cette section, nous allons d'abord écrire une démo simple pour tester le processus de paiement de Yibao. Après nous être familiarisés avec ce processus, nous ferons un développement réel. Parce que c'est une démo, je n'ai pas pris en compte certains modèles de conception, mais implémentez simplement directement la fonction de paiement. Pour mettre en œuvre des fonctions de paiement, Yibao nécessite l'API qui nous est fournie. La question est donc de savoir la chose la plus importante lors de l'utilisation d'une plate-forme de paiement tierce est d'obtenir l'API de la plate-forme. Nous devons d'abord obtenir leur API et leurs documents de développement, puis nous pouvons effectuer un développement ultérieur.
1. Obtenez l'API de Yibao
La première étape pour obtenir l'API consiste à enregistrer un compte sur Yibao. Ce compte est le compte du marchand. Après que l'acheteur paie, il déposera l'argent sur le compte et le marchand le retirera par lui-même sur la carte bancaire. Yibao facturera des frais de manipulation pendant le processus de retrait. Il s'agit du modèle de profit de Yibao. Cependant, la condition préalable à l'inscription réussie est que vous devez avoir un site Web ou une entreprise, Bara, Bara, etc. Quoi qu'il en soit, vous devez être qualifié pour postuler. Yibao examinera ce point. Ce n'est que lorsque vous vous le rencontrerez vous permettra de vous inscrire et de vous fournir leur interface. Tout le monde ne peut pas s'inscrire. Je l'ai utilisé aussi bien que d'autres inscrits, mais je n'avais rien moi-même ... Je ne pouvais pas m'inscrire ... Je le sais, mais généralement lorsque je me développe dans une entreprise, il n'y aurait pas ce problème. Il doit y avoir un compte. La chose la plus importante est de maîtriser le processus de développement et les technologies connexes.
2. Testez le processus de paiement
Avec l'API officielle et les documents techniques, vous pouvez commencer à développer. Ici, nous écrivons principalement une démo simple pour tester le processus de paiement de Yibao. La structure de la démo est très simple, un servlet, un filtre, deux pages JSP et une classe d'outils cryptée. Servlet traite le côté serveur Yibao. Nous effectuons un traitement lié à l'interface Yibao. Le filtre est utilisé pour faire face aux éventuels problèmes chinois brouillés. L'un des deux JSP est la page frontale.
Analysons d'abord le processus de demande de paiement, comme indiqué ci-dessous:
Ok, analysons le code pertinent dans la démo en détail:
2.1 Page de test de la réception
Tout d'abord, jetons un coup d'œil au code spécifique de la page de réception index.jsp
<% @ Page Language = "Java" Pageencoding = "UTF-8"%> <! DocType Html Public "- // W3C // DTD HTML 4.01 Transitional // en"> <html> <A-Head> <Title> Front Office Home </ Title> </-head> <body> <h1> Demo de paiement en ligne </h1> <formulaire action = "$ {pagecontext.request.contextPath} / servlet / payservlet" metheth = "post"> le numéro de commande pour ce shopping <entrée = "text" name = "p2_order" /> <br> Money <entrée type = "text" name = "p3_amt" value = "0.01" /> <br> industriel et banc commercial de la Chine <entrée type = "radio" varie name = "PD_FRPID"> Banque de construction <entrée type = "radio" value = "ccb-net" name = "pd_frpid"> <br> <input type = "soumi" value = "soumi" /> <entrée type = "HIDDEN" value = "pay" name = "status" /> </ form> </ body> </ html>À partir de la page JSP ci-dessus, nous pouvons voir que les valeurs d'attribut de nom dans ces balises d'entrée sont très étranges, pi_function (i = 0,1,2,…, 9), et bien sûr j'ai d'autres valeurs. Cela nécessite de se référer au document officiel de Yibao. Ces noms représentent des attributs correspondants et seront transmis au SEVLET pour le traitement. En ce qui concerne ces valeurs d'attribut, j'ai une image comme suit:
Certains de ces noms de paramètres sont transmis à partir de la réception dans les projets réels, tels que le numéro de commande écrit ci-dessus, combien cela coûte-t-il à payer, et ceux-ci seront repris lorsque la commande sera confirmée. Si d'autres paramètres sont nécessaires, ils doivent être spécifiés dans le servlet. Si les champs ne sont pas requis, ils peuvent être vides. Le vide ici n'est pas nul, mais "", qui sera mentionné dans le servlet plus tard.
Jetons un coup d'œil aux valeurs de valeur correspondantes dans les deux banques. Yibao fournira les valeurs de valeur de toutes les banques qu'elle prend en charge. Ceux-ci sont fixes et ne peuvent pas être modifiés. Voici deux banques pour tester l'effet.
Le dernier champ caché est utilisé pour porter un jugement dans le servlet. Qu'il s'agisse d'un paiement ou d'une déclaration après le succès du paiement, il sera expliqué dans le Sevlet ci-dessous.
2.2 SERVLET GRANDE les demandes
Le servlet gère principalement les demandes connexes à Yibao. Il y a deux parties du contenu. Une partie consiste à envoyer un texte brut et un texte de chiffre Jetons un coup d'œil au code d'implémentation spécifique dans la démo:
La classe publique PayServlet étend HttpServlet {public void doGet (HttpServLetRequest Request, HttpServletResponse Response) lève Servlexception, ioException {String Status = request.getParAmter ("Status"); if (status.equals ("Pay")) {// Le champ caché dans index.jsp est payé, donc la partie de paiement est traitée // La clé de chiffrement est utilisée dans l'algorithme de cryptage et fournie par l'intermédiaire de paiement. Chaque marchand a une chaîne unique keyvalue = "W0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677"; // 1: attribuer des valeurs aux paramètres. Ces paramètres (c'est-à-dire le texte brut) sont définis dans le document fourni par Yibao. Nous ne pouvons pas modifier la chaîne de nom p0_cmd = formatString ("acheter"); 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"; // c'est la page à laquelle vous sautez après le succès. Vous pouvez le définir comme page d'accueil du centre commercial. Cette démo est suffisante pour utiliser la page d'accueil de l'Université Tongji ... String p9_saf = "0"; String pa_mp = ""; String pd_frpid = formatString (request.getParameter ("pd_frpid")); PD_FRPID = PD_FRPID.TOUPPERCASE (); String Pr_needRessage = "0"; String hmac = formatString (""); // HMAC est utilisé pour stocker CipherText / * Tout le texte en clair ci-dessus est enveloppé de la méthode de formatString. La méthode est ci-dessous, convertissant principalement Null en "" * car Null ne peut pas être converti en texte chiffré * // résoudre les problèmes de sécurité des données: crypter le texte en clair ---> chiffre, puis remettre les données, enccrét, enclaiment, le texte en jeu et ne compare pas avec le casqueur transmis, (Le marchand et le yibao utilisent tous deux la même clé lors du chiffrement) // Ajouter les données en texte en clair à StringBuffer, notez que l'ordre de l'annexe ne peut pas être modifié, sinon le texte chiffré généré sera différent. // Vous devez écrire strictement selon le nom du document officiel de Yibao, car Yibao est ajouté en fonction de la commande dans le document. 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_NEEDESPONSON); // Le texte chiffré chiffré est stocké dans HMAC, et l'algorithme de chiffrement Yibao le fournira, car il doit également utiliser le même algorithme hmac = digestUtil.hmacsign (infobuffer.toString (), keyValue); // Stockez à la fois le texte brut et le texte de chiffre dans request.setAttribute request.setAttribute ("p0_cmd", p0_cmd); 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_pdescs); 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_NEEDESPONSON", pr_needResponse); request.setAttribute ("HMAC", HMAC); System.out.println ("hmac ->" + hmac); // sauter à reqpay.jsp et soumettre ces informations à yibao request.getRequestDispatcher ("/ reqpay.jsp"). Forward (request, réponse); } else if (status.equals ("Success")) {// Ce qui vient de Yibao est le succès, le traitement renvoie la partie de vérification printwriter out = réponse.getWriter (); String keyValue = "W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677"; // Obtenez toutes les chaînes en clair 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")); // Ajouter les données à PlainText String hmac = FormatString (request.getParameter ("hmac")); StringBuffer infobuffer = new StringBuffer (); infobuffer.append (p1_merid); infobuffer.append (r0_cmd); infobuffer.append (r1_code); infobuffer.append (r2_trxid); infobuffer.append (r3_amt); infobuffer.append (r4_cur); infobuffer.append (r5_pid); infobuffer.append (r6_order); infobuffer.append (r7_uid); infobuffer.append (r8_mp); infobuffer.append (r9_btype); // Crypt la chaîne en texte en clair retourné md5 = digestutil.hmacsign (infobuffer.toString (), keyValue); // Déterminez si le texte chiffré chiffré est égal à la signature de données transmise booléenne ISOK = MD5.equals (HMAC); if (isok && r1_code.equals ("1")) {// r1_code est 1 pour indiquer le succès // modifier l'état de commande réussi à payer, et afficher les informations de réussite de paiement à l'utilisateur // appelle l'interface de service de messagerie, le service d'envoi SMS, etc.///print ici ~ Out.println ("le numéro de commande est:" + r6_Order + "Le montant du paiement est:" + r3_amt); } else {out.println ("échoue !!!"); }}} public void doPost (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {doGet (request, réponse); } String FormatString (String Text) {if (text == null) {return ""; } RETOUR Texte; }}2.3 Algorithme de chiffrement
L'algorithme de chiffrement utilisé pour convertir le texte brut en texte chiffré est fourni par Yibao. Nous avons seulement besoin de l'utiliser pour convertir du texte brut en chiffre d'affaires. L'algorithme est le suivant:
classe publique digestUtil {private static String codingCharSet = "utf-8"; String statique public 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 (); } 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) {// Paramètre 1: PlainText (données à crypter) Paramètre 2: Key System.out.println (digestUtil.hmacsign ("11111", "ABC")); System.out.println (digestutil.hmacsign ("11111", "ABD")); // Résoudre les problèmes de sécurité des données: crypter le texte brut ---> texte secret et le texte brut à yibao // Après que Yibao ait obtenu les données, cryptant le texte brut transmis et le compare avec le texte de chiffre transmis. Si les données égales n'ont pas été falsifiées (le marchand et le yibao utilisent tous deux la même clé lorsque vous chiffrez)}}Je n'ai pas trop étudié l'algorithme de chiffrement. Il semble que ce soit l'algorithme de cryptage MD5 de deuxième génération. Quoi qu'il en soit, jetez simplement le texte brut et il sera certainement crypté dans un texte chiffré. Jetons un coup d'œil à la page reqpay.jsp:
<% @ page Language = "Java" ContentType = "Text / Html; Charset = GBK"%> <html> <adread> <Title> à la page YEEPAY </ Title> </ Head> <Body> <form Name = "YEEPAY" Action = 'https: //www.yeepay.com/app--merchant-proxy/node' méthode = 'post' post 'Blank/App-Merchant-Proxy/Node' Methody = 'Post' Post 'Blank/Apping type = 'Hidden' name = 'p0_cmd' value = '$ {requestscope.p0_cmd}'> <input type = 'Hidden' name = 'p1_merid' value = '$ {requestCcope.p1_merid}'> <entrée type = 'Hidden' name = 'p2_order' value = '$ {requestCpe name = 'p3_amt' value = '$ {requestscope.p3_amt}'> <input type = 'HIDDEN' name = 'p4_cur' value = '$ {requestCcope.p4_cur}'> <input type = 'Hidden' name = 'p5_pid' value = '$ {requetScope. Value = '$ {requestscope.p6_pcat}'> <input type = 'HIDDEN' name = 'p7_pdesc' value = '$ {requestCcope.p7_pdesc}'> <input type = 'Hidden' name = 'p8_url' value = '$ {requestscope.p8_url}'> <entrée type = 'Hidden' name = 'p9_saf' Value = '$ {requestscope.p9_saf}'> <input type = 'Hidden' name = 'pa_mp' value = '$ {requestCcope.pa_mp}'> <input type = 'HIDDEN' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> <entrée = 'Hidden' nom = 'pa_mp'> Value = '$ {requestscope.pa_mp}'> <input type = 'Hidden' name = 'pd_frpid' value = '$ {requestCcope.pd_frpid}'> <input type = "HIDDEN" name = "PR_NEEDRESPONSE" value = '$ {requestscope.hmac}'> <entrée type = 'soumi' /> </ form> </ body> </html> En fait, cette page est très simple. Il s'agit de passer le texte brut et le texte de chiffre à Yibao à travers la forme <form> . L'URL de réception de Yibao est https://www.yeepay.com/app-merchant-proxy/node . Ceci est également fourni par le responsable de Yibao, et nous pouvons écrire celui-ci. En fait, il n'y a qu'un bouton submit . Cliquez sur le bouton submit pour soumettre le texte brut et le texte de chiffre d'affaires. Jetons un coup d'œil aux résultats des tests:
3. Test des résultats de paiement
INDEX FRATHER DE TEST simple.jsp ~~~:
Après la soumission, vous irez à reqpay et jsp. L'effet après avoir cliqué sur le bouton Soumettre est le suivant. Nous testerons ICBC et CCB:
Il n'y a aucun problème avec le processus de paiement. J'ai initialement prévu de payer 1 cent à ICBC pour voir les résultats une fois le paiement terminé, mais j'ai constaté que le bouclier en U avait expiré car il est plus pratique d'utiliser l'alipay maintenant ... Je n'ai pas mis à jour le paiement en U, mais j'ai ouvert le paiement électronique via ICBC, donc je peux également utiliser le paiement électronique dans l'interface ci-dessus, donc j'ai payé généreux ~ le résultat est suivant:
Ensuite, il passera à la page que nous avons spécifiée auparavant, c'est-à-dire à l'Université Tongji ... D'accord, le test est terminé, et l'intégralité du processus de paiement est terminé!
Cette section teste principalement via une démo simple pour voir si elle peut être connectée à l'interface de paiement de la banque. Maintenant, le test est très bien, il a été connecté et vous pouvez simplement payer comme d'habitude plus tard. Préduisons la démo simple. Ensuite, nous continuerons à développer le module de paiement en ligne de notre précédent projet de centre commercial en ligne.
Adresse originale: http://blog.csdn.net/eson_15/article/details/51447492
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.