Dans la section précédente, nous avons fait l'affichage de la page de paiement. À partir du code JSP affiché dans la section précédente, nous pouvons voir que lorsque l'utilisateur clique pour confirmer le paiement, il passera à l'action de $ {shop} /pay_gobank.action . C'est-à-dire, après avoir soumis, nous devons traiter une logique dans la méthode Gobank dans la PayAction (c'est-à-dire la logique de l'organigramme de la démo de la section 21), c'est-à-dire obtenir le texte brut, crypter le texte brut dans une signature (CipherText), puis visiter le serveur Yibao, Yibao se connecte à la banque pour compléter le paiement.
Cependant, compte tenu du modèle de conception MVC, nous mettrons la logique métier ci-dessus dans la couche de service pour le traitement, alors mettons en œuvre la logique de paiement de la démo dans la section 21.
1. Écrivez un modèle pour encapsuler les paramètres
Tout d'abord, nous devons écrire un modèle (sendData) pour recevoir les paramètres transmis à partir de la page JSP et ajouter d'autres paramètres qui doivent être envoyés par nous-mêmes. Ces paramètres sont stipulés dans les documents officiels de Yibao. Nous pouvons strictement suivre les réglementations sur les documents:
/ * * Les informations envoyées par le paiement du centre commercial au paiement Yibao sont encapsulées en tant qu'entité * * / classe publique SendData implémente Serializable {private static final SerialVersionUID = -6304103739907145812l; // (*) Indique la chaîne privée de champ requise p0_cmd; // Type d'entreprise (*), fixé comme: acheter une chaîne privée P1_Merid; // Numéro de marchand (*) chaîne privée P2_Order; // Numéro de commande du commerçant P3_AMT; // Montant de paiement String privé P4_Cur; // Trading Currency (*) Private String P5_PID; // Nom de produit Private String P6_PCAT; // Produit String Private String P7_PDESC; P8_URL; // Adresse pour que les commerçants reçoivent le paiement de paiement Données de réussite Private String P9_Saf; // Adresse de livraison String privé PA_MP; // Informations d'extension de marchand chaîne privée PD_FRPID; // Encodage du canal de paieLes attributs ci-dessus sont tous des paramètres à transmettre à Yibao. Vous pouvez choisir les paramètres dont vous avez besoin. Tous ne sont pas transmis. Selon la situation, nous les passons généralement, sauf P5, P6 et P7. Jetons un coup d'œil au code d'action:
2. Implémentation de PayAction
Dans PayAction, nous encapsulons principalement certains paramètres passés dans la page JSP dans le modèle, puis appelons la méthode de la couche de service pour initialiser d'autres paramètres, comme suit:
@Controller ("PayAction") @ Scope ("Prototype") Public Class PayAction étend Baseaction <Bject> Implémentez ParameterAware {public String Gobank () {// 1. Paramètres complets: P2 P3 PD PA, vous devez obtenir Frander FORDER = (FORDER) Session.get ("OldForder"); User user = (utilisateur) session.get ("utilisateur"); Model.Setp2_Order (fourder.getId (). ToString ()); // Numéro d'ordre marchand modèle.setp3_amt (fourder.getTotal (). ToString ()); // Montant de paiement modèle.setpa_mp (user.getEmail () + "," + user.getphone ()); // Informations d'extension du marchand // 2. Paramètres d'ajout // 3. Crypter et obtenir la signature // 4. Stocker dans le domaine de la demande à payer.SaveDatatorequest (demande, modèle); // La logique commerciale du 2,3,4 est remise à la couche de service pour le traitement // 5. Sautez à la page de paiement Retour "Pay"; }}Ensuite, écrivons le code de la couche de service. La couche de service implémente principalement la logique des 2, 3 et 4 étapes ci-dessus:
3. Implémentation de la couche de service
Le code spécifique est le suivant:
// Interface de paie Interface publique PayService {// Stockage Les informations cryptées dans la carte abstraite publique de requestmap <String, objet> SAVEDATATOREQUEST (MAP <String, objet> request, sendData sendData); // crypter les données renvoyées pour obtenir le texte chiffré et les comparer avec le texte chiffré renvoyé (nous les implémenterons plus tard) booléen booléenbackdata (backdata backdata);} // la classe de paiement de la connexion @Service ("payservice") clé; @Value ("# {Prop.P1_Merid}") // Mer Compte (Not Order Number) String privé P1_Merid; // L'adresse de retour pour le paiement réussi @Value ("# {prop.p8_url}") chaîne privée p8_url; // Les trois attributs ci-dessus sont toutes des valeurs fixes, je les mets dans le fichier de configuration Pay.properties et j'utilise directement l'annotation de printemps @Value pour obtenir // compléter les données de SendData, P2 P3 Pd PA est une injection frontale, et il n'est pas nécessaire de les remplir ici. J'ai déjà obtenu Private SendData finalSendData (SendData sendData) {sendData.setp0_cmd ("acheter"); sendData.setp1_merid (p1_merid); sendData.setp4_cur ("cny"); sendData.setp5_pid (""); sendData.setp6_pcat (""); senddata.setp7_pdescsc (""); sendData.setp8_url (p8_url); sendData.setp9_saf ("0"); sendData.setpr_needResponse ("0"); return sendData; } // Terminez l'ajout de données et renvoyez la chaîne privée en plaine annexe JOINSENDDATAPARAM (SendData SendData) {// Toutes les données remplies SendData = this.finishSendData (SendData); StringBuffer infobuffer = new StringBuffer (); infobuffer.append (sendData.getp0_cmd ()); infobuffer.append (senddata.getp1_merid ()); infobuffer.append (sendData.getp2_order ()); infobuffer.append (sendData.getp3_amt ()); infobuffer.append (sendData.getp4_cur ()); infobuffer.append (sendData.getp5_pid ()); infobuffer.append (senddata.getp6_pcat ()); infobuffer.append (senddata.getp7_pdesc ()); infobuffer.append (senddata.getp8_url ()); infobuffer.append (sendData.getp9_saf ()); infobuffer.append (sendData.getpa_mp ()); infobuffer.append (senddata.getpd_frpid ()); infobuffer.append (sendData.getpr_needResponse ()); return infobuffer.toString (); } // Stockez les informations cryptées dans la carte publique de requestmap @Override <String, objet> SAVEDATATOREQUEST (MAP <String, Object> Request, SendData sendData) {// Renvoie la chaîne à annexer (c'est-à-dire un texte en claire) joinParam = joinendDataparam (sendData); request.put ("p0_cmd", senddata.getp0_cmd ()); request.put ("p1_merid", senddata.getp1_merid ()); request.put ("p2_order", senddata.getp2_order ()); request.put ("p3_amt", senddata.getp3_amt ()); request.put ("p4_cur", senddata.getp4_cur ()); request.put ("p5_pid", senddata.getp5_pid ()); request.put ("p6_pcat", senddata.getp6_pcat ()); request.put ("p7_pdesc", senddata.getp7_pdescs ()); request.put ("p8_url", senddata.getp8_url ()); request.put ("p9_saf", senddata.getp9_saf ()); request.put ("pa_mp", senddata.getpa_mp ()); request.put ("pd_frpid", senddata.getpd_frpid ()); request.put ("PR_NEEDRESPONSE", SendData.getpr_needRessuSon ()); request.put ("hmac", digestutil.hmacsign (joinParam, key)); // ajouter la demande de retour signature (CIPherText); }}Nous pouvons voir que le principe de mise en œuvre est en fait le même que le servlet dans la démo précédente. Le code ci-dessus utilise le fichier Pay.properties et les annotations. Jetons un coup d'œil à la configuration dans le fichier Pay.properties et bean.xml:
# pay.propertieskey = w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677p1_merid = 10000940764p8_url = https /: //www..hao123.com
<! - beans.xml -> <bean id = "prop"> <propriété name = "Locations"> <Rarray> <Value> classPath: public.properties </value> <! - 之前用到的 -> <value> CLASSPATH: Pay.Properties </value> </rarray> </premy> </pan>
D'accord, maintenant que les couches d'action et de service sont écrites, configurons à nouveau le fichier struts.xml:
4. Struts.xml Configuration et page Pay.jsp
<action name = "Pay_ *" Method = "{1}"> <result name = "Pay"> / user / Pay.jsp </ result> </ action>La configuration de struts.xml est très simple. Il saute principalement sur la page user / pay.jsp en fonction de la valeur de retour et envoie le texte en clair (paramètres) et le texte cipher (signature) défini ci-dessus sur le serveur Yibao:
<v> <span> Numéro de commande: </span> <strong> $ {requestscope.p2_order} </strong> <span> [Veuillez vous souvenir de ce numéro afin que vous puissiez l'utiliser lorsque vous effectuez des paiements et des demandes] </span> </div> <div> <span> Montant de paiement: </span> <strong> ¥ $ {requetScope.p3_amt} </strong> </v> src = "$ {shop} /files/yibao.jpg" /> </ div> <div> <span> Banque de paiement: </span> <img src = "$ {shop} / fichiers / bankimages / $ {pd_frpid} .gif" /> </ div> <v> <form name = "yeepay" Action = 'https: //www.yeepay.com/app-rchant-proxy/node' méthode = 'post' cible = "_ Blank"> <input type = 'Hidden' name = 'p0_cmd' value = '$ {requestCcope.p0_cmd}'> <entrée type = 'Hidden' name = 'p1_merid' Value = '$ {requestscope.p1_merid}'> <input type = 'HIDDEN' name = 'p2_order' value = '$ {requestCcope.p2_order}'> <input type = 'Hidden' name = 'p2_order' value = '$ {requestscope.p2_order}'> <entrée = 'Hidden' nom = 'p3_amt' Value = '$ {requestscope.p3_amt}'> <input type = 'Hidden' name = 'p4_cur' value = '$ {requestCcope.p4_cur}'> <input type = 'HIDDEN' name = 'p5_pid' value = '$ name =' p6_pcat ' 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 = 'pd_frpid' value = '$ {requestCcope.pd_frpid}'> <entrée = ' Value = "$ {requestCcope.pr_needResponse}"> <input type = 'Hidden' name = 'hmac' value = '$ {requestCcope.hmac}'> <div> <input type = "soup" value = "PAY NOW" /> </ div> </ form> </v> </div> Pay.jsp enverra tout le texte brut que nous voulons passer et le texte de chiffrement correspondant au serveur Yibao. Yibao le cryptera en texte de chiffre de la même manière en fonction de ces textes brusques, puis le fera correspondre au texte de chiffre que nous avons transmis. Si la même chose signifie que les données sont sûres, elle n'est pas falsifiée pendant le processus de transmission, et passez à la page de paiement normalement, puis effectuez un paiement normal; Si ce n'est pas la même chose, le paiement n'est pas autorisé et une page d'invite amicale apparaît.
À ce stade, j'ai déjà clairement indiqué ce processus de paiement en ligne. La raison est très simple. Ce n'est rien de plus que d'ajouter des paramètres pour les former, d'ajouter un mot de passe pour générer un texte chiffré, puis d'envoyer ces paramètres et un texte chiffré à un tiers. Il ajoute également un mot de passe dans la même méthode de chiffrement et le compare à ce que je l'ai envoyé. Quant à la façon d'appeler l'interface bancaire, ce n'est pas ce que nous devons faire. C'est la responsabilité du tiers, y compris certaines choses de sécurité. Tout le monde peut se concentrer sur ses propres affaires: j'ai juste besoin de me connecter avec le tiers et de lui transmettre des informations utiles; Le tiers n'a qu'à se concentrer sur la façon de se connecter avec différentes banques, ce qui apporte une grande commodité au développement. Parce que les interfaces connectées à différentes banques sont définitivement différentes. Si nous allons directement pour nous connecter avec les banques, le coût est trop élevé et il n'est pas pratique à maintenir. Si la banque améliore, je dois également les mettre à niveau ... avec un tiers, nous n'aurons jamais à nous en soucier. La mise à niveau est une question d'un tiers, et notre interface avec un tiers ne changera pas ~
Lien original: http://blog.csdn.net/eson_15/article/details/51464415
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.