1. نظرة عامة على الدفع عبر الإنترنت
ما هو الدفع عبر الإنترنت؟ هذا صحيح ، إنه مجرد إنفاق المال عبر الإنترنت! يجب أن يكون لدى الجميع مثل هذه التجربة. ولكن قد لا تعرف الكثير عن "القصة الداخلية" للدفع عبر الإنترنت ، دعنا نتعلم عنها أدناه!
إذا بدأت في تشغيل موقع ويب للتجارة الإلكترونية الآن ، فيجب على المستخدمين الدفع إذا قاموا بشراء شيء ما. يجب أن يكون موقع الويب الخاص بك قادرًا على الاتصال بالبنوك الرئيسية. ثم ، بعد اكتمال الدفع ، ارجع إلى موقع الويب الخاص بك لعرض "نجاح الدفع"!
هذا ما سنفعله اليوم ، تواصل مع النظام المصرفي عبر الإنترنت للبنك لإكمال المدفوعات. لكي نكون أكثر احترافًا ، نسميها "تطوير بوابة للمدفوعات عبر الإنترنت"
2. طريقتان للدفع عبر الإنترنت
هناك طريقتان للدفع عبر الإنترنت:
*التجارة الإلكترونية تتصل مباشرة بالبنوك
*التجارة الإلكترونية تتصل بالبنوك من خلال منصات دفع الطرف الثالث
تتصل التجارة الإلكترونية مباشرة بالبنوك ، والتي تتطلب موافقة البنك ، ولكن لسوء الحظ ، فإن البنوك "رائعة" للغاية وليس أي شخص يريد التواصل معها. إذا كان لشركتك الإلكترونية في التجارة الإلكترونية تدفق رأس مال يومي كبير ، فسوف يتواصل البنك معك لأن جميع الأموال التي يدفعها العميل إلى التجارة الإلكترونية يتم إيداعها في الحساب المصرفي! ولكن إذا كان تدفق رأس المال صغيرًا ، فلن ينتبه البنك لك!
عندما لا تكون مواقع الويب الصغيرة غير كافية في الأموال ولا يمكنها الاتصال بالبنوك ، فسيختارون التعاون مع شركات الدفع الطرف الثالث. يفهم الجميع أيضًا ما هو الشركات ، مثل Alipay و Yibao و Fortune و Kuaiqian وغيرها من الشركات التي تشتهر نسبيًا في الصين. يمكن لهذه الشركات التواصل مع البنوك (لأن لديها ما يكفي من الأموال) ، ثم يمكن لشركات التجارة الإلكترونية الصغيرة التواصل معها! لكن الأطراف الثالثة تتطلب رسومًا! تتقاضى أطراف ثالثة عمومًا 1 ٪ من رسوم التجارة الإلكترونية ، لكنها لن تتقاضى أموال العملاء.
من خلال الصورة أعلاه ، يمكنك أن تتعلم أن اسم المركز التجاري ورقم طلب RMB ووقت الطلب سيتم عرضه على صفحة البنك. . . ، كيف تعرف البنوك عن هذه الأشياء؟ بالطبع ، يتم نقله إلى البنوك عن طريق التجارة الإلكترونية. بعد أن تتصل شركة التجارة الإلكترونية بالبنك ، تحتاج شركة التجارة الإلكترونية إلى تمرير المعلمات التي تتطلبها صفحة البنك إلى صفحة البنك ، بحيث يمكن للصفحة المصرفية عرض هذه البيانات!
ومع ذلك ، لا يمكن للمركز التجاري الخاص بنا الاتصال ببنك واحد فقط! يجب أن نتواصل مع الشركات الأربع من BOC و CCB و ABC و ICBC! تختلف معلمات الإرساء المطلوبة من قبل البنوك المختلفة ، مما يعني أننا بحاجة إلى كتابة رموز إرساء مختلفة للبنوك المختلفة أثناء التطوير. هذا هو أيضا عيب الاتصال مباشرة مع البنوك! بطبيعة الحال ، فإن الاتصال المباشر مع البنوك مفيد أيضًا ، أي أن الأمن غير مطلوب ، ولا توجد رسوم معالجة!
تطوير رموز مختلفة للبنوك المختلفة (عيوب) ؛
السلامة (المزايا) ؛
لا رسوم التعامل (المزايا) ؛
لا تسمح بنوك التجارة الإلكترونية الصغيرة بالاتصالات (العيوب).
كما هو موضح في الشكل أعلاه ، بعد نقر العميل لتأكيد الدفع على موقع التجارة الإلكترونية ، سيتم توجيهه إلى موقع الطرف الثالث ، ثم يتواصل الطرف الثالث مع البنك. هذا يدل على أن التجارة الإلكترونية تحتاج إلى نقل المعلمات إلى الطرف الثالث! ثم يمرر الطرف الثالث المعلمات إلى البنك. تتمثل ميزة هذه الطريقة في أنه يجب تطويرها فقط لأطراف ثالثة دون تقديم معلمات لكل بنك. إنها مهمة طرف ثالث تقديم معلمات لكل بنك. ومع ذلك ، إذا لم يكن طرف ثالث قديمًا وموثوقًا ، إذا أفلست الطرف الثالث وتهرب الناس ، فسيختفي أموالك. نظرًا لأن الأموال التي يدفعها العميل لا تذهب إلى حسابك المصرفي ، يتم دفعها إلى الحساب المصرفي للطرف الثالث ، ولديك حساب على الطرف الثالث. علاوة على ذلك ، تتقاضى الأطراف الثالثة أيضًا رسوم التعامل ، عادة 1 ٪ ، وهو ليس عددًا صغيرًا (إنه سيء حقًا).
3. من خلال قواعد الدفع عبر الإنترنت من طرف ثالث
إذا كانت التجارة الإلكترونية تريد تسجيل تاجر مع طرف ثالث ، فإنها تحتاج إلى تقديم شهادة ICP للطرف الثالث. رخصة عمل ICP هي رخصة أعمال موقع ويب يجب معالجتها بواسطة موقع ويب تجاري وفقًا لـ "تدابير إدارة الإنترنت" الوطنية. إذا لم يحدث ذلك ، فمن غير القانوني العمل.
لا يمكننا التقدم بطلب للحصول على برنامج المقارنات الدولية لمجرد الممارسة! لذلك لا يمكننا تسجيل تاجر مع طرف ثالث. ومع ذلك ، لدينا بالفعل تجار جاهدين مسجلين لدى Yibao ، لذلك يمكن تجاهل هذه الخطوة.
عندما تقوم بالتسجيل بنجاح مع Yibao ، سوف يمنحك Yibao الأشياء التالية:
افتح حسابًا في Yibao (أي رمز تجاري): 10001126856
مواصفات الوصول إلى Yibao: خوارزمية تشفير CHM CHM الفئة: PaymentUtil.java
المفتاح: 69Cl522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
في مواصفات الوصول إلى Yibao ، يمكننا العثور على بوابة الدفع الخاصة بـ Yibao ، والتي هي في الواقع عنوان URL ، عنوان URL يستخدم للتواصل مع yibao: https://www.yeepay.com/app-merchant-proxy/node
في مواصفات الوصول إلى Yibao ، يمكنك أيضًا العثور على المعلمات المطلوبة بواسطة Yibao. عندما تتصل التجارة الإلكترونية بـ yibao ، يجب نقل هذه المعلمات إلى بوابة الدفع:
عنوان الطلب الرسمي: https://www.yeepay.com/app-merchant-proxy/node
تحتاج هذه المعلمات إلى إلحاق عنوان URL.
ومع ذلك ، كن على علم بأن قيم هذه المعلمات تحتاج إلى تشفير. كل من مفتاح التشفير وخوارزمية التشفير التي ستوفرها Yibao!
حيث يشير P8_URL إلى الصفحة التي يجب العودة إليها عند نجاح الدفع. هذا يعني أننا بحاجة إلى كتابة صفحة تعرض النتائج. بعد النجاح في الدفع ، سيتم إعادة توجيه طرف ثالث إلى صفحة الإرجاع التي حددناها ، وستجلب لنا أيضًا بعض المعلمات. تحتاج صفحتنا إلى الحصول على هذه المعلمات وعرضها في الصفحة. فيما يلي المعلمات التي تم إرجاعها من قبل الطرف الثالث:
4. تطوير نظام دفع على الإنترنت من طرف ثالث
خطوة:
index.jsp صفحة: نموذج يتم إرساله إلى Buyservlet. تتضمن عناصر النموذج: رقم الطلب ، ومبلغ الدفع ، واختيار البنك
Buyservlet: احصل على بيانات النموذج واستعد للاتصال ببوابة طرف ثالث. نظرًا لأن 3 معلمات فقط يتم تقديمها في صفحة INDEX.JSP ، وهناك العديد من المعلمات المطلوبة من قبل أطراف ثالثة ، يتم استكمال المعلمات التي لا تقدمها الصفحة بواسطة Buyservlet. ويجب تشفير المعلمات أيضًا ، والتي يجب إكمالها أيضًا في Buyservlet
BackServlet: عندما يدفع المستخدم بنجاح ، سيقوم الطرف الثالث بإعادة توجيه صفحة الإرجاع التي حددناها. نستخدم BackServlet كصفحة الإرجاع ، والتي يتم استخدامها لتلقي المعلمات التي يتم تمريرها من قبل الطرف الثالث وعرضها في الصفحة.
نظرًا لأن لدينا بالفعل شركة مسجلة في Yibao ، فلا يتعين علينا تسجيل عمل تجاري بأنفسنا. لذا ، هنا لاستخدام Yibao كمنصة دفع تابعة لجهة خارجية للاختبار. نظرًا لأنني لا أملك التجارة الإلكترونية (التجارة الإلكترونية التي يجب أن تمرر شهادة ICP) ، لا يمكنني تسجيل شركة مع طرف ثالث أيضًا.
يتم توفير أعمال Yibao التي نستخدمها الآن بواسطة Chuanzhi Podcast ، وهي شركة مسجلة لشبكة Baba Sports على Yibao. لذلك تم تقديم الأموال المدفوعة خلال الاختبار للشركة المسجلة من قبل شبكة Baba Sports على Yibao.
الخطوة 1: index.jsp
<form Action Action = "" "method =" post "> رقم الطلب: <input type =" text "name =" p2_order "/> <br/> المبلغ: <input type =" text "name =" p3_amt "/> <br/> حدد بنك: <إدخال type =" radio "name =" pd_frpid "value =" icbc-net-b2c " src = "bank_img/icbc.bmp" align = "middle"/> <input type = "radio" name = "pd_frpid" value = "boc-net-b2c"/> bank of China <img src = "bank_img/icbc.bmp" align = "middle"/> الصين <img src = "bank_img/bc.bmp" align = "middle"/> <br/> <input type = "radio" name = "pd_frpid" value = "ABC-NET-B2C"/> bank agricultural of China <img src = "bank_img/abc.bcp" align = "middle"/> value = "ccb-net-b2c"/> بنك البناء <img src = "bank_img/ccb.bmp" align = "middle"/> <br/> <input type = "radio" name = "pd_frpid" value = "boco-net-b2c"/> bank of communications <img src = <type type = "إرسال" value = "تأكيد الدفع"/> </form>
القيمة المقابلة لكل بنك:
الخطوة 2: buyservlet.java
يمتد Buyservlet للطبقة العامة httpservlet {public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {request.setcharacterencoding ("utf-8") ؛ استجابة. السلسلة p0_cmd = "buy" ؛ // نوع العمل ، القيمة الثابتة هي الشراء ، أي ، "شراء" string p1_merid = "10001126856" ؛ // سلسلة اسم العمل p2_order = request.getParameter ("p2_order") ؛ // order number string p3_amt = request.getParameter ( عملة المعاملة ، القيمة الثابتة هي CNY ، تشير إلى سلسلة RMB p5_pid = "" ؛ // اسم المنتج السلسلة p6_pcat = "" ؛ // string string p7_pdesc = " "http: // localhost: 8080/buy/backservlet" ؛ // صفحة الإرجاع للتجارة الإلكترونية ، عندما يكون الدفع ناجحًا ، ستعيد yibao التوجيه إلى هذه الصفحة p9_saf = "" ؛ // string string pa_mp = "" pr_needResponse = "1" ؛ // آلية الاستجابة ، القيمة الثابتة هي مفتاح 1 // ، الذي يوفره yibao ، فقط التجار و yibao يعرفون هذا المفتاح. سلسلة keyvalue = "69Cl522V6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U3N4Y7RI4PL" ؛ // من خلال المعلمات المذكورة أعلاه ، والمفاتيح ، وخوارزميات التشفير ، يتم إنشاء قيمة HMAC // أمر معلمات ضروري. إذا لم تكن هناك قيمة ، فلا يمكن إعطاء NULL ، ولكن يجب إعطاء سلسلة فارغة. String HMAC = paymentutil.buildhmac (p0_cmd ، p1_merid ، p2_order ، p3_amt ، p4_cur ، p5_pid ، p6_pcat ، p7_pdesc ، p8_url ، p9_saf ، pa_mp ، pd_frpid ، pr_needreesponse ، keyvalue) ؛ // قم بتوصيل جميع المعلمات بسلسلة عنوان البوابة url = "https://www.yeepay.com/app-merchant-proxy/node" ؛ url + = "؟ p0_cmd =" + p0_cmd + "& p1_merid =" + p1_merid + "& p2_order =" + p2_order + "& p3_amt =" + p3_amt + "& p4_cur =" + p4_cur + "& p5_pid = "& p7_pdesc =" + p7_pdesc = " + p7_pdesc +" & p8_url = " + p8_url =" + p8_url + "& p9_saf =" + p9_saf + " + "& hmac =" + hmac ؛ System.out.println (url) ؛ // إعادة توجيه إلى Gateway Response.SendRedirect (url) ؛ }}الخطوة 3: Backservlet
يمتد Public Class Backservlet httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {response.setContentType ("text/html ؛ charset = utf-8") ؛ / * * سيقدم Yibao سلسلة من معلمات النتائج ، يمكننا الحصول على ما نحتاج إليه * الحصول على نتيجة الدفع: R1_Code ، 1 يعني أن الدفع ناجح. * احصل على مبلغ الدفع: R3_AMT * الحصول على رقم طلب التجارة الإلكترونية: R6_order * احصل على نوع الإرجاع: r9_btype ، 1 يعني إعادة التوجيه ، 2 وسيلة من نقطة إلى نقطة ، * ولكن لا يمكننا تلقي نقطة إلى نقطة ، لأن IPs لدينا كلها IPs LAN. */ string r1_code = request.getParameter ("r1_code") ؛ String r3_amt = request.getParameter ("r3_amt") ؛ String r6_order = request.getParameter ("r6_order") ؛ String r9_btype = request.getParameter ("r9_btype") ؛ if (r1_code.equals ("1"))) {if (r9_btype.equals ("1")) {response.getWriter (). print ("<h1> ادفع بنجاح! </h1>") ؛ // في الواقع ، عندما يكون الدفع غير ناجح ، لن يعود yibao إلى هذا servlet.getwriter (). "<br/>") ؛ desponse.getWriter (). print ("رقم الطلب هو:" + r6_order + "<br/>") ؛ }}}}أدوات للحصول على HMAC المقدمة عن طريق الدفع yibao
Public Class PassionUtil {private static string chigodingcharset = "utf-8" ؛ /*** إنشاء طريقة HMAC** param p0_cmd نوع العمل* param p1_merid رقم التاجر* param p2_order رقم الطلب التاجر* param p3_amt مبلغ الدفع من تاجر استلام بيانات نجاح الدفع بيانات* param p9_saf عنوان التسليم* param pa_mp معلومات تمديد التاجر* param pd_frpid رمز البنك* param pr_needresponse استجابة آلية* @string p1_merid ، string p2_mort ، string p2_mort. p4_cur ، سلسلة p5_pid ، سلسلة p6_pcat ، السلسلة p7_pdesc ، السلسلة p8_url ، السلسلة p9_saf ، السلسلة pa_mp ، سلسلة pd_frpid ، سلسلة pr_needresponse ، string keyvalue) {StringBuilder svalue = new StringBuilder () // business type svalue.append (p0_cmd) ؛ // رقم التاجر svalue.append (p1_merid) ؛ // رقم أمر التاجر svalue.append (p2_order) ؛ // مبلغ الدفع svalue.append (p3_amt) ؛ // Trading Currency Svalue.Append (p4_cur) ؛ // اسم المنتج svalue.append (p5_pid) ؛ // نوع المنتج svalue.append (p6_pcat) ؛ // وصف المنتج svalue.append (p7_pdesc) ؛ // عنوان التاجر الذي يستلم بيانات الدفع بيانات svalue.append (p8_url) ؛ // عنوان التسليم svalue.append (p9_saf) ؛ // معلومات تمديد التاجر svalue.append (pa_mp) ؛ // code bank svalue.append (pd_frpid) ؛ // آلية الاستجابة svalue.append (pr_needResponse) ؛ الإرجاع paymentutil.hmacsign (svalue.toString () ، keyvalue) ؛ } /*** إرجاع إلى التحقق hmac طريقة** param hmac رمز التحقق المشفر المرسلة بواسطة بوابة الدفع* param p1_merid رقم التاجر* @param r0_cmd نوع الأعمال* param r1_cod r5_pid اسم المنتج* param r6_order رقم الطلب التاجر* param r7_uid yibao معرف العضو* param r8_mp معلومات التمديد التاجر* param r9_btype trendront type type hmac ، string p1_merid ، string r0. R1_Code ، String R2_TRXID ، سلسلة R3_AMT ، سلسلة R4_CUR ، السلسلة R5_PID ، سلسلة R6_Order ، سلسلة R7_UID ، سلسلة R8_MP ، السلسلة R9_BTYPE ، سلسلة مفاتيح) // رقم التاجر svalue.append (p1_merid) ؛ // business type svalue.append (r0_cmd) ؛ // نتيجة الدفع svalue.append (r1_code) ؛ // yibao رقم معاملة الدفع svalue.append (r2_trxid) ؛ // مبلغ الدفع svalue.append (r3_amt) ؛ // Transaction Currency Svalue.Append (r4_cur) ؛ // اسم المنتج svalue.append (r5_pid) ؛ // رقم أمر التاجر svalue.append (r6_order) ؛ // yibao payment member id svalue.append (r7_uid) ؛ // معلومات تمديد التاجر svalue.append (r8_mp) ؛ // TREMATE RETRECT TYPE SVALUE.Append (r9_btype) ؛ String SnewString = paymentUtil.hmacSign (svalue.toString () ، keyvalue) ؛ إرجاع snewstring.equals (HMAC) ؛ } / ** * param avalue * param akey * @regurn * / public static string hmacsign (String avalue ، string 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 () ؛ } / ** * * @param args * param key * @return * / public static string gethmac (string [] args ، string key) {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)) ؛ } // public static void main (string [] args) {// System.out.println (HmacSign ("annulcard10043252120080620160450.0http: //localhost/szxpro/callback.asp 海؟ 4 564868265473632445648682654736324511 "،" 8upp0ke8sq73zvp370vko7c39403rtk1ywx40td6irh216036h27eb12792t ")) ؛ }}رد الاتصال ييباو
نظير إلى نظير: ييباو يصل مباشرة إلى التجارة الإلكترونية ، لا يوجد عميل هنا.
هذه الطريقة لا بد من استخدامها ، ولا يمكننا استلامها بهذه الطريقة! لأننا ليس لدينا عنوان IP ثابت
ييباو لديه آلية إعادة الالتزام. إذا قامت بزيارتك ولم ترسلها للرسالة ، فستستمر في إعادة بيعها!
يحتاج التجارة الإلكترونية إلى إرجاع سلسلة تبدأ من النجاح!
توجيه متصفح العميل لإعادة التوجيه إلى التجارة الإلكترونية. هو السماح للعملاء بالوصول إلى التجارة الإلكترونية!
لا يمكن استخدامه!
HMAC: 13 قيمة المعلمة + KeyValue (مفتاح) + خوارزمية (MD5)
13 قيمة المعلمة: تعيين بنفسك!
Keyvalue: أرسل إلينا Yibao بعد تسجيلنا ، فقط نحن و Yibao على علم بهذا الشيء!
الخوارزمية مع MD5 الأساسي: paymentutil.buildhmac (14) ، الذي يعيد HMAC
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.