Im vorherigen Abschnitt haben wir die Anzeige der Zahlungsseite durchgeführt. Aus dem im vorherigen Abschnitt angezeigten JSP -Code können wir feststellen, dass der Benutzer, wenn der Benutzer zur Bestätigung der Zahlung, zur Aktion von $ {Shop} /pay_gobank.Action springt. Das heißt, wir müssen nach der Übermittlung eine Logik in der Gobank -Methode in der Zahlung verarbeiten (dh die Logik des Flow -Diagramms in Abschnitt 21 Demo), dh den einfachen Text, den Klartext in eine Signatur (Chiffretext) und dann den Yibao -Server zu besuchen, Yibao verbindet die Bank, um die Zahlung zu vervollständigen.
In Anbetracht des MVC -Entwurfsmusters werden wir jedoch die obige Geschäftslogik für die Verarbeitung in die Serviceschicht einfügen. Implementieren wir also die Zahlungslogik der Demo in Abschnitt 21.
1. Schreiben Sie ein Modell, um Parameter zu verkapulieren
Zunächst müssen wir ein Modell (sendData) schreiben, um die von der JSP -Seite übertragenen Parameter zu empfangen und andere Parameter hinzuzufügen, die von uns selbst gesendet werden müssen. Diese Parameter sind in den offiziellen Dokumenten von Yibao festgelegt. Wir können die Vorschriften der Dokumente strikt befolgen:
/ * * Die vom Einkaufszentrum an Yibao -Zahlung gesendeten Informationen werden als Entität eingekapselt. // (*) Zeigt das erforderliche Feld Private String p0_cmd an; // Business Type (*), behoben als: Kaufen Sie private Zeichenfolge p1_merid; // Händlernummer (*) private Zeichenfolge P2_Order; // Händlerbestellnummer private Zeichenfolge P3_AMT; // Zahlungsbetrag private Zeichenfolge p4_cur; // Handelswährung (*) private String P5_PID; // Produktname private String P6_PCat; // Produkttyp PRODUTTION STING; p8_url; // Adresse für Händler, um Zahlungserfolgsdaten private Zeichenfolge P9_SAF; // Zustelladresse private String Pa_mp; // Händler -Erweiterungsinformationen private Zeichenfolge PD_FRPID; // Zahlungskanal Encodierung, dh Bank private String pr_needResponse; // Antwortmechanismus // Verlassen von Get -und -Set -Methoden}}
Die obigen Attribute sind alle Parameter, die an Yibao übertragen werden sollen. Sie können die benötigten Parameter auswählen. Nicht alle von ihnen werden übertragen. Abhängig von der Situation geben wir sie im Allgemeinen außer P5, P6 und P7 weiter. Schauen wir uns den Aktionscode an:
2. Implementierung der Zahlung
In der Zahlung sind wir hauptsächlich einige Parameter in die JSP -Seite in das Modell ein.
@Controller ("PayAction")@scope ("Prototyp") öffentliche Klassenzahlung erweitert Baseaction <FORGANGE <Objekt> implementiert Parameteraware {public String gobank () {// 1. Vollständige Parameter: P2 P3 PD PA, Sie müssen Fderer Fder = (fder) session.get ("OldForder") erhalten; User user = (user) session.get ("user"); model.setp2_order (fder.getId (). toString ()); // Händlerbestellnummer modell.setp3_Amt (fder.gettotal (). ToString ()); // Zahlungsbetrag model.setpa_mp (user.getemail () + "," + user.getone ()); // Händlerweiterungsinformationen // 2. Parameter anhängen // 3. Verschlüsseln und Signaturen erhalten // 4. Speichern Sie in der Anfrage -Domain in PayService.SavedatOrequest (Anfrage, Modell); // 2,3,4 Geschäftslogik wird zur Verarbeitung an die Serviceschicht übergeben // 5. Zur Zahlung der Zahlungsseite "Pay" springen; }}Schreiben wir als nächstes den Code der Serviceschicht. Die Serviceschicht implementiert hauptsächlich die Logik der obigen 2, 3 und 4 Schritte:
3. Implementierung der Serviceschicht
Der spezifische Code lautet wie folgt:
// PayService Interface öffentliche Schnittstelle PayService {// Speichern Sie die verschlüsselten Informationen in der RequestMap Public Abstract Map <String, Object> SAREDATETOREQUEST (MAP <String, Objekt> Anforderung, sendData sendData); // Verschlüsseln Sie die zurückgegebenen Daten, um den Chiffretext zu erhalten, und vergleichen Sie sie mit dem zurückgesandten Chiffretext (wir werden ihn später implementieren). privater Stringschlüssel; @Value ("#{prop.p1_merid}") // mer -Konto (nicht Bestellnummer) private Zeichenfolge p1_merid; // Die Rückgabeadresse für eine erfolgreiche Zahlung @Value ("#{prop.p8_url}") private String p8_url; // Die obigen drei Attribute sind alle festen Werte, ich stelle sie in die Konfigurationsdatei Pay.Properties ein und verwende die Spring-Annotation @Value direkt, um die Daten von sendData zu vervollständigen, P2 P3 PD PA ist eine Front-End-Injektion, und hier ist nicht erforderlich. Ich habe bereits private sendData addsendData (sendData sendData) {sendData.setp0_cmd ("buy") erhalten; sendData.setp1_merid (p1_merid); sendData.setp4_cur ("cny"); sendData.setp5_pid (""); sendData.setp6_pcat (""); sendData.setp7_pdesc (""); sendData.setp8_url (p8_url); sendData.setp9_saf ("0"); sendData.setpr_needResponse ("0"); Rückgabe sendData; } // Die Dateneradung vervollständigen und die angehängte private String -String -String -String -String -String -String -JOsinsendDataparam zurückgeben (sendData sendData) {// Alle Daten füllten 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 (); } // Die verschlüsselten Informationen in der requestmap @Override public map <String, Object> gespeichertDatOrequest (MAP <String, Objekt> Anforderung, sendData sendData) {// Die angehängte Zeichenfolge (d. H. PlainText) String -String -JoinParam = jensendDatAparam zurückgeben (sendEdata) zurückgeben; 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_pdesc ()); 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_needResponse ()); request.put ("hmac", digestutil.hmacsign (joinparam, key)); // Signature (Ciphertext) Rückgabeanforderung hinzufügen; }}Wir können sehen, dass das Implementierungsprinzip tatsächlich das gleiche wie das Servlet in der vorherigen Demo ist. Der obige Code verwendet die Datei und Anmerkungen von Pay.Properties. Schauen wir uns die Konfiguration in der Pay.Properties -Datei und beans.xml an:
#pay.PropertiesKey = W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677P1_MERID = 10000940764P8_url = https/: //www.hao123.com
<!-beans.xml-> <bean id = "prop"> <Eigenschaft name = "Standorte"> <array> <wert> classPath: public.Properties </value> <!-之前用到的-> <wert> classPath: pay.properties </value> </array> </property> </bean> </bean> </bean>
Okay, jetzt, da die Aktions- und Serviceschichten geschrieben werden, konfigurieren wir die Struts.xml -Datei erneut:
V.
<Action name = "pay_*" method = "{1}"> <result name = "pay">/user/pay.jsp </result> </action>Die Konfiguration von Struts.xml ist sehr einfach. Es springt hauptsächlich auf die Seite Benutzer/Pay.jsp nach dem Rückgabewert und sendet den Klartext (Parameter) und Ciphertext (Signature) oben auf den Yibao -Server fest:
<Div> <span> Bestellnummer: </span> <strong> $ {requestScope.p2_order} </strong> <span> [Bitte erinnern Sie sich diese Nummer, damit Sie sie bei der Erstellung von Zahlungen und Anfragen verwenden können. </span><img src="${shop }/files/yibao.jpg" /> </div> <div> <span>Payment bank: </span><img src="${shop }/files/bankImages/${pd_FrpId}.gif" /> </div> <div> <form name="yeepay" action = 'https: //www.yeepay.com/app-mantchant-proxy/node' methode = 'post' target = "_ leer"> <Eingabe type = 'Hidden' name = 'p0_cmd' value = '$ {requestScope.p0_cmd}'> <Eingabe type = 'Hidden' name 'name' name 'name' name 'name' name 'name' name 'name' name 'name' name 'name' name 'name' name 'name' name 'name' name 'name' name 'name' name 'p1_merid' ' value = '$ {requestScope.p1_merid}'> <Eingabe type = 'Hidden' name = 'p2_order' value = '$ {requestScope.p2_order}'> <input type = 'hidden' name = 'p2_order' value = '$ {requestScope.p2_Order}} <Eingabe' <Eingabe -Typ = 'Hidden' name = 'name =' name = 'name =' name = 'name =' name = 'name =' name value = '$ {RequestScope.p3_AMT}'> <Eingabe type = 'Hidden' name = 'p4_cur' value = '$ {requestScope.p4_cur}'> <Eingabe type = 'Hidden' name = 'p5_pid' value = '$ {requestScope.p5_pid}'> <input type = 'hidden' name = 'name =' name = 'name =' name = 'name =' name = 'name =' name = 'name =' value = '$ {requestScope.p6_pcat}'> <Eingabe type = 'Hidden' name = 'p7_pdesc' value = '$ {requestScope.p7_pdesc}'> <Eingabe type = 'Hidden' name = 'p8_url' value = '$ {{requestScope.p8_url}}' <input ' value='${requestScope.p9_SAF}'> <input type='hidden' name='pa_MP' value='${requestScope.pa_MP}'> <input type='hidden' name='pd_FrpId' value='${requestScope.pd_FrpId}'> <input type="hidden" name="pr_NeedResponse" value = "$ {requestScope.pr_needResponse}"> <Eingabe type = 'Hidden' name = 'hmac' value = '$ {requestScope.hmac}'> <div> <Eingabe type = "value =" pay now "/> </div> </div> </div> </div> </div> Pay.jsp sendet den gesamten Klartext, den wir übergeben möchten, und den entsprechenden Verschlüsselungstext an Yibao -Server. Yibao wird es auf die gleiche Weise in Cipher -Text auf der gleichen Weise verschlüsseln und dann mit dem von uns übertragenen Verschlüsselungstext übereinstimmen. Wenn dieselbe bedeutet, dass die Daten sicher sind, wird sie während des Übertragungsprozesses nicht manipuliert, und springen normalerweise zur Zahlungsseite und leisten dann eine normale Zahlung. Wenn es nicht dasselbe ist, ist die Zahlung nicht erlaubt und eine freundliche schnelle Seite wird angezeigt.
Zu diesem Zeitpunkt habe ich bereits über diesen Online -Zahlungsvorgang klargestellt. Der Grund ist sehr einfach. Es ist nichts anderes, als Parameter zusammen hinzuzufügen, um sie zu bilden, ein Kennwort hinzuzufügen, um einen Chiffretext zu generieren und dann diese Parameter und Ciphertext an einen Dritten zu senden. Er fügt auch ein Passwort in derselben Verschlüsselungsmethode hinzu und vergleicht es mit dem, was ich es gesendet habe. Wie wir die Bankschnittstelle anrufen, ist es nicht das, was wir tun müssen. Dies liegt in der Verantwortung der Dritten, einschließlich einiger Sicherheitsdaten. Jeder kann sich auf seine eigenen Angelegenheiten konzentrieren: Ich muss mich nur mit dem Dritten verbinden und nützliche Informationen an ihn weitergeben. Der Dritte muss sich nur darauf konzentrieren, wie sie sich mit verschiedenen Banken in Verbindung setzen können, was einen großen Bequemlichkeit der Entwicklung bringt. Weil die mit verschiedenen Banken verbundenen Schnittstellen definitiv unterschiedlich sind. Wenn wir uns direkt mit Banken verbinden, sind die Kosten zu hoch und es ist unpraktisch zu warten. Wenn die Bank aufrüstet, muss ich sie auch aktualisieren ... mit einem Dritten werden wir uns nie darum kümmern müssen. Das Upgrade ist eine Frage eines Dritten, und unsere Schnittstelle zu Dritten wird sich nicht ändern ~
Original -Link: http://blog.csdn.net/eson_15/article/details/51464415
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.