ในส่วนก่อนหน้าเราได้แสดงหน้าการชำระเงินแล้ว จากรหัส JSP ที่แสดงในส่วนก่อนหน้าเราจะเห็นว่าเมื่อผู้ใช้คลิกเพื่อยืนยันการชำระเงินมันจะข้ามไปยัง การกระทำของ $ {Shop} /pay_gobank.action กล่าวคือหลังจากส่งแล้วเราต้องประมวลผลตรรกะบางอย่างในวิธี Gobank ในการจ่ายเงิน (นั่นคือตรรกะของผังงานในส่วนที่ 21 ตัวอย่าง) นั่นคือรับข้อความธรรมดาเข้ารหัสข้อความธรรมดาลงในลายเซ็น (Ciphertext) จากนั้นเยี่ยมชมเซิร์ฟเวอร์ Yibao
อย่างไรก็ตามเมื่อพิจารณาถึงรูปแบบการออกแบบ MVC เราจะใส่ตรรกะทางธุรกิจด้านบนลงในเลเยอร์บริการสำหรับการประมวลผลดังนั้นให้ใช้ตรรกะการชำระเงินของการสาธิตในส่วนที่ 21
1. เขียนโมเดลเพื่อห่อหุ้มพารามิเตอร์
ก่อนอื่นเราต้องเขียนโมเดล (senddata) เพื่อรับพารามิเตอร์ที่ส่งจากหน้า JSP และเพิ่มพารามิเตอร์อื่น ๆ ที่ต้องส่งด้วยตัวเอง พารามิเตอร์เหล่านี้ถูกกำหนดไว้ในเอกสารอย่างเป็นทางการของ Yibao เราสามารถปฏิบัติตามกฎระเบียบในเอกสารได้อย่างเคร่งครัด:
/ * * ข้อมูลที่ส่งโดยห้างสรรพสินค้าไปยังการชำระเงิน Yibao ถูกห่อหุ้มเป็นเอนทิตี * */คลาสสาธารณะ Senddata ใช้ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionuid = -6304103739907145812L; // (*) ระบุสตริงส่วนตัวฟิลด์ที่ต้องการ p0_cmd; // ประเภทธุรกิจ (*), แก้ไขเป็น: ซื้อสตริงส่วนตัว p1_merid; // หมายเลขผู้ค้า (*) สตริงส่วนตัว p2_order; // หมายเลขคำสั่งซื้อของผู้ค้าสตริงส่วนตัว p3_amt; // การชำระเงินจำนวนสตริงส่วนตัว p4_cur; // สกุลเงินซื้อขาย (*) สตริงส่วนตัว p5_pid; // ชื่อผลิตภัณฑ์ส่วนตัว p6_pcat P8_URL; // ที่อยู่สำหรับพ่อค้าเพื่อรับข้อมูลความสำเร็จการชำระเงินสตริงส่วนตัว p9_saf; // ที่อยู่การจัดส่งสตริงส่วนตัว pa_mp; // ข้อมูลส่วนขยายของผู้ค้าสตริงส่วนตัว pd_frpid; // การเข้ารหัสช่องการชำระเงินนั่นคือธนาคารส่วนตัว Pr_needResponse;แอตทริบิวต์ข้างต้นเป็นพารามิเตอร์ทั้งหมดที่จะส่งไปยัง Yibao คุณสามารถเลือกพารามิเตอร์ที่คุณต้องการ ไม่ใช่ทั้งหมดที่ถูกส่ง ขึ้นอยู่กับสถานการณ์โดยทั่วไปเราผ่านพวกเขาไปยกเว้น P5, P6 และ P7 มาดูรหัสการดำเนินการ:
2. การดำเนินการตามการจ่ายเงิน
ในการจ่ายเงินส่วนใหญ่เราจะห่อหุ้มพารามิเตอร์บางอย่างที่ส่งผ่านในหน้า JSP ลงในโมเดลแล้วเรียกใช้เมธอดชั้นบริการเพื่อเริ่มต้นพารามิเตอร์อื่น ๆ ดังนี้:
@Controller ("การจ่ายเงิน")@scope ("prototype") การจ่ายเงินระดับสาธารณะขยาย baseaction <jobch> ใช้พารามิเตอร์ Asparameteraware {String Public String Gobank () {// 1 พารามิเตอร์ที่สมบูรณ์: P2 P3 PD PA คุณจะต้องได้รับ forder forder = (forder) session.get ("OldForder"); user user = (ผู้ใช้) เซสชัน get ("ผู้ใช้"); model.setp2_order (forder.getId (). toString ()); // หมายเลขคำสั่งซื้อของผู้ค้ารุ่น. SetP3_AMT (forder.getTotal (). toString ()); // จำนวนเงินการชำระเงิน model.setpa_mp (user.getEmail () + "," + user.getphone ()); // ข้อมูลส่วนขยายของผู้ค้า // 2 ผนวกพารามิเตอร์ // 3 เข้ารหัสและรับลายเซ็น // 4 จัดเก็บในโดเมนคำขอเป็น payservice.savedatatoreQuest (คำขอ, โมเดล); // 2,3,4 ตรรกะทางธุรกิจถูกส่งไปยังเลเยอร์บริการสำหรับการประมวลผล // 5 ข้ามไปที่หน้าการชำระเงินคืน "จ่าย"; -ถัดไปให้เขียนรหัสของเลเยอร์บริการ ชั้นบริการส่วนใหญ่ใช้ตรรกะของ 2, 3 และ 4 ขั้นตอนด้านบน:
3. การใช้เลเยอร์บริการ
รหัสเฉพาะมีดังนี้:
// payservice อินเทอร์เฟซสาธารณะ payservice {// ที่เก็บข้อมูลที่เข้ารหัสในแผนที่ Public Public Map <String, Object> SavedatatoreQuest (แผนที่ <String, Object> คำขอ, senddata senddata); // เข้ารหัสข้อมูลที่ส่งคืนเพื่อรับ ciphertext และเปรียบเทียบกับ ciphertext ที่ส่งกลับ (เราจะนำไปใช้ในภายหลัง) publican boolean checkbackdata (backdata backdata);} // payserviceimpl class @Service คีย์สตริง; @Value ("#{prop.p1_merid}") // บัญชี Mer (ไม่ใช่หมายเลขสั่งซื้อ) สตริงส่วนตัว p1_merid; // ที่อยู่ส่งคืนสำหรับการชำระเงินที่สำเร็จ @Value ("#{prop.p8_url}") สตริงส่วนตัว p8_url; // แอตทริบิวต์ทั้งสามข้างต้นเป็นค่าคงที่ทั้งหมดฉันใส่ไว้ในไฟล์กำหนดค่า pay.properties และใช้คำอธิบายประกอบฤดูใบไม้ผลิ @Value โดยตรงเพื่อรับ // กรอกข้อมูลของ SendData, P2 P3 PD PA เป็นการฉีดส่วนหน้าและไม่จำเป็นต้องเติมที่นี่ ฉันได้รับ senddata private senddata แล้ว (senddata senddata) {senddata.setp0_cmd ("ซื้อ"); 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"); ส่งคืน senddata; } // กรอกข้อมูลการเพิ่มและส่งคืนสตริงส่วนตัวที่ต่อท้ายข้อความ oninendDataparam (senddata senddata) {// ข้อมูลทั้งหมดที่เติม 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 ()); ส่งคืน infoBuffer.toString (); } // จัดเก็บข้อมูลที่เข้ารหัสในแผนที่ @Override แผนที่สาธารณะ <สตริงวัตถุ> savedatatoreQuest (แผนที่ <สตริงวัตถุ> คำขอ senddata senddata) {// ส่งคืนสตริงที่จะผนวก (เช่น String String) joinparam = joinsendDataparam 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)); // เพิ่มลายเซ็น (ciphertext) คำขอส่งคืน; -เราจะเห็นได้ว่าหลักการการใช้งานนั้นเหมือนกันกับเซิร์ฟเล็ตในการสาธิตก่อนหน้า รหัสข้างต้นใช้ไฟล์ pay.properties และคำอธิบายประกอบ ลองมาดูการกำหนดค่าในไฟล์ pay.properties และ beans.xml:
#pay.propertieskey = W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677P1_MERID = 10000940764P8_URL = HTTPS
<!-beans.xml-> <bean id = "prop"> <property name = "locations"> <array> <value> classpath: public.properties </value> <!-之前用到的-> <value> classpath: pay.properties </value>
โอเคตอนนี้มีการเขียนเลเยอร์การกระทำและบริการแล้วให้กำหนดค่าไฟล์ struts.xml อีกครั้ง:
4. struts.xml การกำหนดค่าและหน้า pay.jsp
<action name = "pay_*" method = "{1}"> <name result = "Pay">/user/pay.jsp </result> </action>การกำหนดค่าของ struts.xml นั้นง่ายมาก ส่วนใหญ่จะข้ามไปยังหน้าผู้ใช้/pay.jsp ตามค่าการส่งคืนและส่งข้อความธรรมดา (พารามิเตอร์) และ ciphertext (ลายเซ็น) ที่ตั้งไว้ด้านบนไปยังเซิร์ฟเวอร์ Yibao:
<div> <pan> หมายเลขสั่งซื้อ: </span> <strong> $ {requestscope.p2_order} </strong> <span> [โปรดจำหมายเลขนี้เพื่อให้คุณสามารถใช้เมื่อทำการชำระเงินและสอบถามข้อมูล] </span> </div> <div> <pan> จำนวนเงิน: </span> <strong> </span> <img src = "$ {shop} /files/yibao.jpg"/> </div> <div> <pan> ธนาคารการชำระเงิน: </span> <img src = "$ {shop}/ไฟล์/bankimages/$ {pd_frpid} .gif"/> action = 'https: //www.yeepay.com/app-merchant-proxy/node' method = 'post' target = "_ blank"> <input type = 'hidden' name = 'p0_cmd' value = '$ {requestcope.p0_cmd}'> <อินพุต value = '$ {requestscope.p1_merid}'> <อินพุต type = 'hidden' name = 'p2_order' value = '$ {requestscope.p2_order}'> <อินพุต type = 'hidden' name = 'p2_order' value = '$ {requestscope.p2_order}' value = '$ {requestscope.p3_amt}'> <อินพุต type = 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <อินพุต type = 'hidden' name = 'p5_pid' value = '$ {requestscope.p5_pid}' value = '$ {requestscope.p6_pcat}'> <อินพุต type = 'hidden' name = 'p7_pdesc' value = '$ {requestscope.p7_pdesc}'> <อินพุต type = 'hidden' name = 'p8_url' value = '$ {requestscope.p8_url}' value = '$ {requestscope.p9_saf}'> <อินพุตประเภท = 'ซ่อน' ชื่อ = 'pa_mp' value = '$ {requestScope.pa_mp}'> <อินพุตประเภท = 'hidden' name = 'pd_frpid' value = '$ {requestScope.pd_frpid}' value = "$ {requestscope.pr_needResponse}"> <อินพุต type = 'herved' name = 'hmac' value = '$ {requestscope.hmac}'> <div> <อินพุต type = "ส่ง" value = "จ่ายทันที" pay.jsp จะส่งข้อความธรรมดาทั้งหมดที่เราต้องการผ่านและข้อความรหัสที่สอดคล้องกันไปยังเซิร์ฟเวอร์ Yibao Yibao จะเข้ารหัสลงในข้อความรหัสในลักษณะเดียวกันตามข้อความธรรมดาเหล่านี้แล้วจับคู่กับข้อความรหัสที่เราส่งมา หากหมายความว่าข้อมูลนั้นปลอดภัยจะไม่ถูกดัดแปลงในระหว่างกระบวนการส่งและข้ามไปยังหน้าการชำระเงินตามปกติแล้วทำการชำระเงินปกติ หากไม่เหมือนกันการชำระเงินจะไม่ได้รับอนุญาตและหน้าพรอมต์ที่เป็นมิตรจะปรากฏขึ้น
ณ จุดนี้ฉันได้ทำให้ชัดเจนเกี่ยวกับกระบวนการชำระเงินออนไลน์นี้แล้ว เหตุผลนั้นง่ายมาก มันไม่มีอะไรมากไปกว่าการเพิ่มพารามิเตอร์เข้าด้วยกันเพื่อสร้างพวกเขาเพิ่มรหัสผ่านเพื่อสร้าง ciphertext จากนั้นส่งพารามิเตอร์เหล่านี้และ ciphertext ไปยังบุคคลที่สาม นอกจากนี้เขายังเพิ่มรหัสผ่านในวิธีการเข้ารหัสเดียวกันและเปรียบเทียบกับสิ่งที่ฉันส่ง สำหรับวิธีเรียกอินเทอร์เฟซธนาคารไม่ใช่สิ่งที่เราต้องทำ นี่คือความรับผิดชอบของบุคคลที่สามรวมถึงสิ่งที่ปลอดภัยบางอย่าง ทุกคนสามารถมุ่งเน้นไปที่กิจการของตนเอง: ฉันแค่ต้องเชื่อมต่อกับบุคคลที่สามและส่งต่อข้อมูลที่เป็นประโยชน์ให้กับเขา บุคคลที่สามเพียงต้องการมุ่งเน้นไปที่วิธีการเชื่อมต่อกับธนาคารต่าง ๆ ซึ่งนำความสะดวกสบายในการพัฒนา เนื่องจากอินเทอร์เฟซที่เชื่อมต่อกับธนาคารต่าง ๆ นั้นแตกต่างกันอย่างแน่นอน หากเราไปเชื่อมต่อกับธนาคารโดยตรงค่าใช้จ่ายสูงเกินไปและไม่สะดวกที่จะรักษา หากธนาคารอัพเกรดฉันต้องอัพเกรดพวกเขาเช่นกัน ... กับบุคคลที่สามเราจะไม่ต้องกังวลเกี่ยวกับเรื่องนี้ การอัปเกรดเป็นเรื่องของบุคคลที่สามและอินเทอร์เฟซของเรากับบุคคลที่สามจะไม่เปลี่ยนแปลง ~
ลิงค์ดั้งเดิม: http://blog.csdn.net/eson_15/article/details/51464415
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น