في القسم السابق ، قمنا بعرض صفحة الدفع. من رمز JSP المعروض في القسم السابق ، يمكننا أن نرى أنه عندما ينقر المستخدم لتأكيد الدفع ، فإنه سيقفز إلى إجراء $ {Shop} /pay_gobank.action . وهذا يعني ، بعد تقديمه ، يتعين علينا معالجة بعض المنطق في طريقة gobank في الدفع (أي ، منطق المخطط الانسيابي في القسم 21 العرض التوضيحي) ، أي الحصول على النص العادي ، وترميز النص العادي في توقيع (نص مشفر) ثم زيارة خادم Yibao ، ييباو يربط بالبنك لإكمال الدفع.
ومع ذلك ، بالنظر إلى نمط تصميم MVC ، سنضع منطق العمل أعلاه في طبقة الخدمة للمعالجة ، لذلك دعونا ننفذ منطق دفع العرض التوضيحي في القسم 21.
1. اكتب نموذجًا لتغليف المعلمات
بادئ ذي بدء ، نحتاج إلى كتابة نموذج (SendData) لتلقي المعلمات المنقولة من صفحة JSP ، وإضافة معلمات أخرى تحتاج إلى إرسالها من قبل أنفسنا. يتم تنصاء هذه المعلمات في المستندات الرسمية لـ Yibao. يمكننا متابعة اللوائح على المستندات بشكل صارم:
/ * * يتم تغليف المعلومات التي يتم إرسالها بواسطة المركز التجاري إلى yibao ككيان * */فئة SendData العامة القابلة للتسلسل {Private Static Final Long SerialVersionuid = -6304103739907145812L ؛ // (*) يشير إلى الحقل المطلوب سلسلة خاصة p0_cmd ؛ // نوع الأعمال (*) ، ثابت على النحو التالي: شراء سلسلة خاصة p1_merid ؛ // رقم التاجر (*) السلسلة الخاصة p2_order ؛ // رقم طلب التاجر سلسلة خاصة p3_amt ؛ // مبلغ الدفع الخاص السلسلة الخاصة p4_cur ؛ // Trading Currency (*) سلسلة خاصة p5_pid ؛ // اسم المنتج الخاص p6_pcat ؛ p8_url ؛ // عنوان للتجار لتلقي بيانات نجاح الدفع سلسلة خاصة p9_saf ؛ // عنوان التسليم السلسلة الخاصة pa_mp ؛ // معلومات تمديد التاجر السلسلة الخاصة pd_frpid ؛ // تشفير قناة الدفع ، أي ، السلسلة الخاصة المصرفية pr_needresponsالسمات المذكورة أعلاه هي كل المعلمات التي سيتم نقلها إلى Yibao. يمكنك اختيار المعلمات التي تحتاجها. ليس كل منهم ينتقل. اعتمادًا على الموقف ، نمررهم بشكل عام باستثناء P5 و P6 و P7. دعونا نلقي نظرة على مدونة العمل:
2. تنفيذ الدفع
في الدفع ، نقوم بتغليف بعض المعلمات التي تم تمريرها في صفحة JSP في النموذج ، ثم استدعاء طريقة طبقة الخدمة لتهيئة المعلمات الأخرى ، على النحو التالي:
Controller ("PayAction")@SCOPE ("OrityType") تمتد دفع الفئة العامة على BaseAction <Object> ParameterAware {Public String gobank () {// 1. المعلمات الكاملة: P2 P3 PD PA ، تحتاج إلى الحصول على session forder = (forder). مستخدم المستخدم = (المستخدم) Session.get ("المستخدم") ؛ model.setp2_order (forder.getId (). toString ()) ؛ // Merchant Order Number Model.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 Interface Interface Interface Payservice {// تخزين المعلومات المشفرة في خريطة ArrumentMap Public Abstract <String ، Object> SoveDatatoreQuest (خريطة <سلسلة ، كائن> ، SendData SendData) ؛ . مفتاح السلسلة الخاص ؛ Value ("#{prop.p1_merid}") // حساب mer (ليس رقم الطلب) سلسلة خاصة p1_merid ؛ // عنوان الإرجاع للدفع الناجح Value ("#{prop.p8_url}") سلسلة خاصة p8_url ؛ . لقد حصلت بالفعل على SendData FinishSendData (SendData SendData) {sendData.setp0_cmd ("buy") ؛ 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 ؛ }. StringBuffer InfoBuffer = جديد 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 () ؛ }. 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) ؛ }}يمكننا أن نرى أن مبدأ التنفيذ هو في الواقع نفس Servlet في العرض التوضيحي السابق. يستخدم الرمز أعلاه ملف pay.properties والشروح. لنلقي نظرة على التكوين في ملف pay.properties و beans.xml:
#pay.propertieskey = W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C4167P1_MERID = 10000940764P8_URL = HTTPS/: //WWWW.HOO
<!-beans.xml-> <bean id = "prop"> <property name = "sortations"> <ray> <value> classpath: public.properties </value> <!-之前用到的-> <value> classpath: pay.properties </value> </ray> </pertar
حسنًا ، الآن بعد كتابة طبقات الإجراء والخدمة ، دعنا نكون ملف STRUTS.XML مرة أخرى:
4. تكوين struts.xml و pay.jsp صفحة
<action name = "pay_*" method = "{1}"> <result name = "pay">/user/pay.jsp </redress> </uction>تكوين Struts.xml بسيط للغاية. إنه يقفز بشكل أساسي إلى صفحة المستخدم/الدفع.
<div> <span> رقم الطلب: </span> <strong> $ {requestscope.p2_order} </strong> <span> [يرجى تذكر هذا الرقم حتى تتمكن من استخدامه عند إجراء المدفوعات والاستفسارات] </span> </viv> <div> <span> مبلغ الدفع: </span> <strong> ¥ $ {requestscope.p3 - </span> <img src = "$ {shop} /files/yibao.jpg"/> </viv> <viv> <span> بنك الدفع: </span> <img src = "$ {shop}/files/bankimages/$ {pd_frpid}. Action = 'https: //www.yeepay.com/app-merchant-proxy/node' method = 'post' target = "_ blank"> <input type = 'hidden' name = 'p0_cmd' value = '$ {requestscope.p0_cmd}'> <input type = 'hidden' name = '' p1_merid ' value = '$ {requestscope.p1_merid}'> <input type = 'hidden' name = 'p2_order' value = '$ {requestscope.p2_order}'> <input type = 'Hidden' value = '$ {requestscope.p3_amt}'> <input type = 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <input type = 'hidden' name = 'p5_pid' value = '$ {requestscope.p5_pid}' value = '$ {requestscope.p6_pcat}'> <input type = 'hidden' name = 'p7_pdesc' value = '$ {requestscope.p7_pdesc}'> <input type = 'hidden' name = 'p8_url' value = '$ {requestscope.p8_url}'> value = '$ {requestscope.p9_saf}'> <input type = 'hidden' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> <input type = 'hidden' name = 'pd_frpid' value = '$ {requestscope.pd_frpid}' value = "$ {requestscope.pr_needResponse}"> <input type = 'hidden' name = 'hmac' value = '$ {requestscope.hmac}'> <viv> <input type = "subder" value = "pay الآن سترسل jsp جميع النص العادي الذي نريد تمريره ونص المشفر المقابل إلى خادم ييباو. سوف يشفر yibao إلى نص مشفر بالطريقة نفسها بناءً على هذه النصوص العادية ، ثم تطابقها مع النص المشفر الذي أرسلناه. إذا كان الشيء نفسه يعني أن البيانات آمنة ، فهي لا يتم العبث بها أثناء عملية الإرسال ، والانتقال إلى صفحة الدفع بشكل طبيعي ، ثم قم بالدفع العادي ؛ إذا لم يكن الأمر نفسه ، فلا يُسمح بالدفع ، وتظهر صفحة موجهة ودية.
في هذه المرحلة ، لقد أوضحت بالفعل حول عملية الدفع عبر الإنترنت هذه. السبب بسيط للغاية. ليس أكثر من إضافة معلمات معًا لتشكيلها ، وإضافة كلمة مرور لإنشاء نص مشفر ، ثم إرسال هذه المعلمات والنص المشفر إلى طرف ثالث. يضيف أيضًا كلمة مرور في نفس طريقة التشفير ويقارنها بما أرسلته لها. أما بالنسبة لكيفية استدعاء واجهة البنك ، فليس ما يتعين علينا القيام به. هذه هي مسؤولية الطرف الثالث ، بما في ذلك بعض الأشياء الأمنية. يمكن للجميع التركيز على شؤونهم الخاصة: أنا فقط بحاجة إلى التواصل مع الطرف الثالث ونقل معلومات مفيدة له ؛ يحتاج الطرف الثالث فقط إلى التركيز على كيفية التواصل مع البنوك المختلفة ، مما يجلب الراحة الكبيرة للتنمية. لأن الواجهات المرتبطة مع البنوك المختلفة مختلفة بالتأكيد. إذا ذهبنا مباشرة للتواصل مع البنوك ، فإن التكلفة مرتفعة للغاية ومن غير المريح الحفاظ عليها. إذا ترقيت البنك ، فيجب علي ترقيتها أيضًا ... مع طرف ثالث ، فلن نضطر إلى القلق أبدًا. الترقية هي مسألة طرف ثالث ، ولن تتغير واجهةنا مع طرف ثالث ~
الرابط الأصلي: http://blog.csdn.net/eson_15/article/details/51464415
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.