في هذا القسم ، سنكتب أولاً عرضًا تجريبيًا بسيطًا لاختبار عملية دفع Yibao. بعد التعرف على هذه العملية ، سنقوم بتطوير فعلي. لأنه عرض تجريبي ، لم أفكر في بعض أنماط التصميم ، ولكن فقط تنفيذ وظيفة الدفع مباشرة. لتنفيذ وظائف الدفع ، يتطلب Yibao واجهة برمجة التطبيقات المقدمة لنا. لذا فإن السؤال هو أن أهم شيء عند استخدام منصة دفع تابعة لجهة خارجية هو الحصول على واجهة برمجة تطبيقات النظام الأساسي. يجب علينا أولاً الحصول على واجهة برمجة التطبيقات (API) ووثائق التطوير الخاصة بهم ، ثم يمكننا القيام بمزيد من التطوير.
1. الحصول على واجهة برمجة تطبيقات yibao
الخطوة الأولى للحصول على واجهة برمجة التطبيقات هي تسجيل حساب على Yibao. هذا الحساب هو حساب التاجر. بعد أن يدفع المشتري ، سيودع الأموال في الحساب ، وسيقوم التاجر بسحبها إلى البطاقة المصرفية بنفسه. سوف ييباو رسوم معالجة معينة أثناء عملية السحب. هذا هو نموذج ربح Yibao. ومع ذلك ، فإن الشرط المسبق للتسجيل الناجح هو أنه يجب أن يكون لديك موقع ويب ، أو شركة ، BARA ، BARA ، إلخ. على أي حال ، يجب أن تكون مؤهلاً للتقدم. سوف ييباو مراجعة هذه النقطة. فقط عندما تقابله ، سيسمح لك بالتسجيل وتزويدك بواجهةهم. لا يمكن للجميع التسجيل. لقد استخدمتها وكذلك مسجلة أخرى ، لكن لم يكن لدي أي شيء بنفسي ... لم أستطع التسجيل ... أعرف ذلك ، ولكن بشكل عام عند التطوير في شركة ، لن تكون هناك هذه المشكلة. يجب أن يكون هناك حساب. الشيء الأكثر أهمية هو إتقان عملية التطوير والتقنيات ذات الصلة.
2. اختبر عملية الدفع
مع واجهة برمجة التطبيقات الرسمية والوثائق التقنية ، يمكنك البدء في التطوير. نحن هنا نكتابة بشكل رئيسي عرضًا بسيطًا لاختبار عملية الدفع Yibao. بنية العرض التجريبي بسيط للغاية ، و servlet ، ومرشح ، وصفحتين JSP وفئة الأدوات المشفرة. يتعامل Servlet مع جانب خادم Yibao. نحن نفعل بعض المعالجة المتعلقة بواجهة ييباو. يتم استخدام المرشح للتعامل مع المشكلات الصينية المحتملة المحتملة. واحدة من اثنين من JSP هي الصفحة الأمامية.
دعنا أولاً نحلل عملية طلب الدفع ، كما هو موضح أدناه:
حسنًا ، دعنا نحلل الكود ذي الصلة في العرض التوضيحي بالتفصيل:
2.1 صفحة اختبار مكتب الاستقبال
أولاً ، دعنا نلقي نظرة على الكود المحدد للصفحة الاستقبلية index.jsp
<٪@ page language = "java" pageencoding = "utf-8" ٪> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <head> Office Office Home </title> <h1> demo demo </h1> Action = "$ {pagecontext.request.contextpath}/servlet/payservlet" method = "post"> رقم الطلب لهذا التسوق <type type = "text" name = "p2_order"/> <br> money <type type = "text" name = "p3_amt" value = "0.01"/> name = "pd_frpid"> بنك البناء <type type = "radio" value = "ccb-net" name = "pd_frpid"> <br> <input type = "submit" value = "submit"/> <input type = "hidden" value = "pay" name = "status"/> </pody> </html>من صفحة JSP أعلاه ، يمكننا أن نرى أن قيم سمة الاسم في علامات الإدخال هذه غريبة للغاية ، pi_function (i = 0،1،2 ، ... ، 9) ، وبالطبع لدي قيم أخرى. هذا يتطلب الإشارة إلى وثيقة ييباو الرسمية. تمثل هذه الأسماء السمات المقابلة وسيتم نقلها إلى Sevlet للمعالجة. فيما يتعلق بقيم السمات هذه ، لدي صورة على النحو التالي:
يتم إرسال بعض أسماء المعلمات هذه من مكتب الاستقبال في المشاريع الفعلية ، مثل رقم الطلب المكتوب أعلاه ، ومدى تكلفة الدفع ، وسيتم الاستيلاء عليها عند تأكيد الطلب. إذا كانت المعلمات الأخرى مطلوبة ، فيجب تحديدها في Servlet. إذا لم تكن الحقول مطلوبة ، فقد تكون فارغة. الفارغة هنا ليست فارغة ، ولكن "" ، والتي سيتم ذكرها في servlet لاحقًا.
دعنا نلقي نظرة على قيم القيمة المقابلة في البنكين. سيوفر Yibao قيم القيمة لجميع البنوك التي تدعمها. هذه ثابتة ولا يمكن تعديلها. فيما يلي البنوك لاختبار التأثير.
يتم استخدام الحقل الخفي الأخير لإصدار حكم في Servlet. سواء كانت دفعة أو عائد بعد النجاح ، سيتم شرحه في Sevlet أدناه.
2.2 Servlet يعالج الطلبات
يتولى Servlet بشكل رئيسي الطلبات ذات الصلة مع Yibao. هناك جزءان من المحتوى. جزء واحد هو إرسال نص عادي ونص مشفر إلى Yibao ، والجزء الآخر هو الحكم على النص العادي والنص المشفر الذي أرسله Yibao. دعونا نلقي نظرة على رمز التنفيذ المحدد في العرض التوضيحي:
يمتد Payservlet الفئة العامة httpservlet {public void doget (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {String status = request.getParameter ("الحالة") ؛ إذا تم دفع (status.equals ("pay")) {// يتم دفع الحقل المخفي في index.jsp ، لذلك يتم معالجة جزء الدفع // يتم استخدام مفتاح التشفير في خوارزمية التشفير وتوفيرها بواسطة وسيط الدفع. كل تاجر لديه keyvalue سلسلة فريدة = "W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677" ؛ // 1: تعيين القيم للمعلمات. يتم تعريف هذه المعلمات (أي النص العادي) في المستند المقدم من yibao. لا يمكننا تغيير اسم سلسلة p0_cmd = formatString ("شراء") ؛ String p1_merid = formatString ("10000940764") ؛ String p2_order = formatString (request.getParameter ("p2_order")) ؛ String p3_amt = formatString (request.getParameter ("p3_amt")) ؛ سلسلة p4_cur = formatString ("cny") ؛ سلسلة p5_pid = "" ؛ سلسلة p6_pcat = "" ؛ سلسلة p7_pdesc = "" ؛ String p8_url = "http://www.tongji.edu.cn" ؛ // هذه هي الصفحة التي تقفز إليها بعد النجاح. يمكنك ضبطه كصفحة رئيسية للمركز التجاري. هذا العرض التوضيحي كافٍ لاستخدام الصفحة الرئيسية لجامعة تونغجي ... سلسلة p9_saf = "0" ؛ سلسلة pa_mp = "" ؛ String pd_frpid = formatString (request.getParameter ("pd_frpid")) ؛ pd_frpid = pd_frpid.toupperCase () ؛ String pr_needResponse = "0" ؛ سلسلة hmac = formatString ("") ؛ // يتم استخدام HMAC لتخزين ciphertext/*يتم لف جميع النص العادي أعلاه باستخدام طريقة التنسيق. الطريقة أدناه ، بشكل أساسي تحويل NULL إلى "" *لأنه لا يمكن تحويل NULL إلى نص مشفر *// حل مشكلات أمان البيانات: تشفير النص العادي ---> النص المشفر ثم تسليم كل من النص العادي والتشفير إلى ما إذا كان yibao/ بعد yibao يحصل على البيانات ، وترسيخ transmated data. العبث بـ (يستخدم كل من Merchant و Yibao نفس المفتاح عند التشفير) // إلحاق بيانات النص العادي إلى StringBuffer ، لاحظ أنه لا يمكن تغيير ترتيب الإلحاق ، وإلا فإن النص المشفر الذي تم إنشاؤه سيكون مختلفًا. // يجب أن تكتب بشكل صارم وفقًا لاسم وثيقة Yibao الرسمية ، لأنه يتم إضافة Yibao وفقًا للطلب في المستند. 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_needResponse) ؛ // يتم تخزين النص المشفر المشفر في HMAC ، وسيوفر خوارزمية التشفير Yibao ، لأنه يجب أيضًا استخدام الخوارزمية نفسها HMAC = Digestutil.hmacSign (infobuffer.tostring () ، keyvalue) ؛ // تخزين كل من النص العادي والنص المشفر في 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_pdesc) ؛ 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_needResponse" ، pr_needResponse) ؛ request.setAttribute ("HMAC" ، HMAC) ؛ System.out.println ("HMAC->" + HMAC) ؛ // skip to reqpay.jsp وقدم هذه المعلومات إلى yibao request.getRequestDispatcher ("/reqpay.jsp"). } آخر إذا (status.equals ("النجاح")) {// ما هو قادم من yibao هو النجاح ، معالجة جزء التحقق من printwriter out = response.getWriter () ؛ سلسلة keyvalue = "W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677" ؛ // احصل على جميع سلسلة النص العادي 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")) ؛ // إلحاق البيانات إلى سلسلة النص العادي hmac = formatString (request.getParameter ("HMAC")) ؛ StringBuffer InfoBuffer = جديد 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) ؛ // encrypt string plaintext string md5 = digestutil.hmacsign (infobuffer.toString () ، keyvalue) ؛ // حدد ما إذا كان النص المشفر المشفر مساوياً لتوقيع البيانات المنقولة المنطقية ISOK = MD5.Equals (HMAC) ؛ if (isok && r1_code.equals ("1")) {// r1_code هو 1 للإشارة إلى النجاح // تغيير حالة الطلب الناجحة إلى مدفوعة الأجر ، وعرض معلومات نجاح الدفع إلى المستخدم // اتصل بواجهة خدمة البريد الإلكتروني ، خدمة إرسال الرسائل القصيرة ، إلخ. } آخر {out.println ("فشل !!!") ؛ }}} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ } String FormatString (نص سلسلة) {if (text == null) {return "" ؛ } نص الإرجاع ؛ }}2.3 خوارزمية التشفير
يتم توفير خوارزمية التشفير المستخدمة لتحويل النص العادي إلى نص مشفر بواسطة Yibao. نحتاج فقط إلى استخدامه لتحويل نص عادي إلى نص مشفر. الخوارزمية كما يلي:
الفئة العامة Digestutil {private static string chigodingcharset = "utf-8" ؛ السلسلة الثابتة العامة hmacsign (سلسلة Avalue ، سلسلة akey) {byte k_ipad [] = new byte [64] ؛ بايت k_opad [] = بايت جديد [64] ؛ Byte Keyb [] ؛ قيمة البايت [] ؛ حاول {keyb = akey.getBytes (isodingcharset) ؛ value = avalue.getBytes (charsodingcharset) ؛ } catch (UnsupportedEncodingException e) {keyb = akey.getBytes () ؛ القيمة = avalue.getBytes () ؛ } arrays.fill (k_ipad ، keyb.length ، 64 ، (byte) 54) ؛ Arrays.fill (k_opad ، keyb.length ، 64 ، (byte) 92) ؛ لـ (int i = 0 ؛ i <keyb.length ؛ i ++) {k_ipad [i] = (byte) (keyb [i] ^ 0x36) ؛ k_opad [i] = (byte) (keyb [i] ^ 0x5c) ؛ } messagedigest md = null ؛ حاول {md = messagedigest.getInstance ("md5") ؛ } catch (nosuchalgorithmexception e) {return null ؛ } md.update (k_ipad) ؛ md.update (القيمة) ؛ Byte dg [] = md.digest () ؛ Md.Reset () ؛ Md.update (k_opad) ؛ MD.Update (DG ، 0 ، 16) ؛ dg = md.digest () ؛ إرجاع tohex (DG) ؛ } السلسلة الثابتة العامة tohex (إدخال بايت []) {if (input == null) return null ؛ stringBuffer Output = new StringBuffer (input.length * 2) ؛ لـ (int i = 0 ؛ i <input.length ؛ i ++) {int current = input [i] & 0xff ؛ إذا (الحالي <16) output.append ("0") ؛ output.append (integer.toString (Current ، 16)) ؛ } الإرجاع Output.ToString () ؛ } السلسلة الثابتة العامة gethmac (string [] args ، مفتاح السلسلة) {if (args == null || args.length == 0) {return (null) ؛ } StringBuffer str = new StringBuffer () ؛ لـ (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 () ؛ قيمة البايت [] ؛ حاول {value = avalue.getBytes (charsodingcharset) ؛ } catch (UnsupportedEncodingException e) {value = avalue.getBytes () ؛ } messagedigest md = null ؛ حاول {md = messagedigest.getInstance ("sha") ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ العودة لاغية. } إرجاع tohex (md.digest (value)) ؛ }. system.out.println (digestutil.hmacsign ("11111" ، "ABD")) ؛ // حل مشكلات أمان البيانات: تشفير النص العادي ---> النص السري والنص العادي إلى Yibao // بعد أن يحصل Yibao على البيانات ، وشرب النص العادي المنقول ومقارنته بنص المشفر المنقولة. إذا لم يتم العبث بالبيانات المتساوية باستخدام (كل من التاجر و yibao يستخدمان نفس المفتاح عند التشفير)}}لم أدرس خوارزمية التشفير أكثر من اللازم. يبدو أنها خوارزمية تشفير MD5 من الجيل الثاني. على أي حال ، ما عليك سوى رمي النص العادي فيه وسيتم بالتأكيد تشفيره في نص مشفر. دعنا نلقي نظرة على صفحة reqpay.jsp:
<٪@page language = "java" contentType = "text/html ؛ charset = gbk" ٪> <html> <head> <title> to yeepay page </title> </head> <body> <form = "int int in in in in int in in in in in in in in in in in in in in in in in in in ind 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 name = 'p3_amt' 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' value = '$ {requestscope.pa_mp}'> <input type = 'hidden' name = 'pd_frpid' value = '$ {requestscope.pd_frpid}'> <input type = "hidden" name = "pr_needResponse" value = "$ {requestscope.pr_needresponse} value = '$ {requestscope.hmac}'> <input type = 'submit'/> </form> </body> </html> في الواقع ، هذه الصفحة بسيطة للغاية. هو تمرير النص العادي ونص الشفرات إلى Yibao من خلال نموذج <form> . عنوان URL الخاص بـ Yibao هو https://www.yeepay.com/app-merchant-proxy/node . يتم توفير هذا أيضًا من قبل مسؤول Yibao ، ويمكننا كتابة هذا. في الواقع ، لا يوجد سوى زر submit . انقر فوق الزر submit لإرسال النص العادي والنص المشفر. لنلقي نظرة على نتائج الاختبار:
3. اختبار نتائج الدفع
اختبار مكتب الاستقبال البسيط index.jsp ~~~:
بعد التقديم ، ستذهب إلى Reqpay و JSP. التأثير بعد النقر على زر إرسال كما يلي. سنقوم باختبار كل من ICBC و CCB:
لا توجد مشكلة في عملية الدفع. لقد خططت في الأصل لدفع 1 في المائة إلى ICBC لرؤية النتائج بعد اكتمال الدفع ، لكنني وجدت أن U-SHIELD قد انتهت لأنه من المريح استخدام Alipay الآن ... لم أقم بتحديث U-SHIELD ، لكنني فتحت الدفع الإلكتروني من خلال ICBC ، لذلك يمكنني أيضًا استخدام E-Payment في الواجهة أعلاه ، لذلك دفعت بسمية واحدة سمية ~ على النحو التالي:
بعد ذلك ، سوف تقفز إلى الصفحة التي حددناها من قبل ، أي جامعة تونغجي ... حسنًا ، تم الانتهاء من الاختبار ، وعملية الدفع بأكملها قد انتهت!
يختبر هذا القسم بشكل أساسي من خلال عرض تجريبي بسيط لمعرفة ما إذا كان يمكن توصيله بواجهة دفع البنك. الآن الاختبار على ما يرام ، لقد تم توصيله ، ويمكنك الدفع كالمعتاد لاحقًا. دعونا نقدم العرض التوضيحي البسيط. ثم سنستمر في تطوير وحدة الدفع عبر الإنترنت لمشروع المركز التجاري السابق عبر الإنترنت.
العنوان الأصلي: http://blog.csdn.net/eson_15/article/details/51447492
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.