1: معرفة محو الأمية في وقت مبكر من WeChat
الشرط المسبق هو أن هناك بالفعل حساب رسمي قد تقدم بطلب للحصول على وظيفة دفع WeChat ، ومن ثم نحتاج إلى الحصول على حساب AppId و WeChat التاجر الرسمي. يمكن العثور على ذلك على حساب WeChat الرسمي ومنصة تاجر مدفوعات WeChat على التوالي. في الواقع ، بعد التقدم بنجاح للحصول على وظيفة الدفع ، ستقوم WeChat بإعادة توجيه البريد إليك عبر البريد الإلكتروني. مع هذه المعلومات ، يمكننا الانتقال إلى صفحة دعم خدمة الدفع WeChat: https://pay.weixin.qq.com/service_provider/index.shtml
افتح هذه الصفحة وانقر فوق الرابط [Development Document] في الزاوية اليمنى العليا لإدخال صفحة وصف مستند API ، والتي تشبه ما يلي
اختر الدائرة الحمراء لمسح الرمز المطلوب دفعه ، مما يعني أننا بحاجة إلى القيام بأسلوب الوصول. انقل الماوس إلى ما سبق وأطالبك بعرض وثيقة التطوير. إذا كنت لا تعرف كيفية عرض هذا ، فيمكنك الاستحمام والذهاب إلى الفراش. أنت حقًا غير مناسب للمبرمج. العنوان كما يلي:
https://pay.weixin.qq.com/wiki/doc/api/nistive.php؟chapter=6_1 سترى بعد فتحه في متصفحك
المحتوى الذي نركز عليه ونقرأه بالفعل مميز بمسائل حمراء. أولاً ، اقرأ مواصفات البروتوكول في [قواعد الواجهة]. فقط تمزح ، إذا لم تقرأ هذا ، فأنت تريد القيام بدفع WeChat. هذا كما تريد لالتقاط الفتيات. يجب عليك جمع بعض المعلومات الأساسية الأساسية أولاً وفهم خصائص الطرف الآخر ، وإلا كيف يمكنك التواصل أدناه. اتضح أن المبرمجين فقط الذين يمكنهم التقاط الفتيات هم بائعون جيدون. بعد الخروج من الموضوع ، سوف ننظر في الحالات والمواصفات في [مقدمة المشهد]. مجرد إلقاء نظرة على شعار WeChat Pay. هذا هو وضعه أخيرًا على صفحة الويب الخاصة بدفاع رمز الاستجابة السريعة ، والتي تبدو أكثر احترافًا. بعد ذلك ، ركز على [الوضع 2]
سنستخدم هنا طريقة MODE 2 لتحقيق وظيفة دفع رمز مسح صفحة الكمبيوتر.
إن التفسير الرسمي للوضع 2 من قبل WeChat هو كما يلي: "يقوم نظام التاجر الخلفي أولاً باستدعاء الواجهة الفردية الموحدة لـ WeChat Pay ، ونظام WeChat الخلفي يقوم بإرجاع Code_Url ، وينشئ نظام Backend Merchant صورة رمز QR مع القيمة المترو قسط." إذا فهمت ، فيجب علينا أولاً الاتصال بـ WeChat لتوفير واجهة واحدة موحدة والحصول على معلومات مفتاح Code_url (أما بالنسبة لما هو هذا الجحيم ، لا أعرف) ، ثم ننشئ رمز QR من خلال برنامجنا الخاص. يمكنني استخدام مكتبة Zxing من Google هنا. ثم فقط عرض رمز الاستجابة السريعة على صفحة الويب الخاصة بك. وبهذه الطريقة ، سيدفع المستخدم الطرفي عن طريق مسح الرمز وسيتم إكمال الدفع. يجب أن تكون متحمسًا جدًا لرؤية هذا. تجد أن دفعة WeChat بسيطة للغاية. هناك شيء آخر لا نعرفه بعد. يعرف العملاء أنهم دفعوا ، لكن جانب الخادم الخاص بنا لا يعرف بعد. مع معدل الذكاء لمطوري WeChat ، فكروا في هذه المشكلة لفترة طويلة. لذلك عندما تتصل بالواجهة الفردية الموحدة ، هناك معلمة مطلوبة هي عنوان URL للاتصال. أي إذا كان العميل يدفع بنجاح ، فسيقوم WeChat بإرسال بعض البيانات إلى الخادم الخاص بنا من خلال عنوان URL هذا ، ثم نقوم بتحليل البيانات في الخلفية لإكمال عملياتنا الخاصة. عندها فقط يمكننا معرفة ما إذا كان العميل قد دفع بالفعل من خلال WeChat. وبهذه الطريقة انتهت العملية برمتها ، وهذا هو النمط 2. يستخدم WeChat مخطط توقيت لتمثيل هذه العملية.
من المعقد أن التعبير ويبدو أنه صعب. لتلخيص ، ما يجب أن يفعله خادمنا على النحو التالي:
1. تمرير المعلمات الصحيحة (بالطبع ، عنوان URL للاتصال الخاص بنا) والتحقق من التوقيع من خلال واجهة واحدة موحدة ، واحصل على البيانات المقابلة لـ Code_url من بيانات الإرجاع.
2. استنادًا إلى بيانات code_url ، نقوم بإنشاء صورة رمز الاستجابة السريعة وعرضها على صفحة ويب المتصفح.
3. أضف معالجة منطق الأعمال الخاصة بنا في عنوان URL لرد الاتصال.
انتهت محو الأمية الآن ، وأنت تعرف أخيرًا نوع العملية التي يجب دفعها عن طريق مسح الرمز. دعنا نلقي نظرة على استخدام API ذات الصلة ونقوم بعمل جيد في معالجة كل خطوة.
الثاني: عملية التنمية
قبل تطوير الكود ، يرجى إعداد بعض الأشياء أولاً.
1. إضافة تبعية maven Zxing
2. أضف تبعية Maven JDOM
3. قم بتنزيل برنامج Java Version SDK Demo ، العنوان هنا
https://pay.weixin.qq.com/wiki/doc/api/nistile.php؟chapter=11_1
نحن بحاجة إلى md5util.java و xmlutil.java ملفان
4. نستخدم HTTPClient الإصدار 4.5.1 ، تذكر أن تضيف تبعيات Maven
بعد الانتهاء من الاستعدادات أعلاه ، تابع القراءة:
أولاً ، نحتاج إلى استدعاء واجهة WeChat الموحدة. عندما نضغط على المنفرد الموحد في [قائمة API] ، سنرى صفحة مثل هذه:
أخذ الموقف الفعلي لمكالمتي كمثال ، فإن المعلمات التالية ضرورية. من أجل راحة الجميع ، حولته إلى كائن Pojo. الرمز كما يلي:
الطبقة العامة UnipedOrderDTO تنفذ weixinconstants {private String AppId ؛ private string body ؛ private string device_info ؛ string private mch_id ؛ سلسلة خاصة nonce_str ؛ سلسلة خاصة notify_url ؛ سلسلة خاصة openId ؛ سلسلة خاصة out_trade_no ؛ سلسلة خاصة spbill_create_ip ؛ private int total_fee ؛ {this.appid = appid ؛ this.mch_id = wxpaymentAct String getBody () {return body ؛} public void setbody (سلسلة السلسلة) {this.body = body ؛} السلسلة العامة getDevice_Info () {return device_info ؛} public void setDevice_info (string device_info) {this.devo_info = device_info ؛ setmch_id (String mch_id) {this.mch_id = mch_id ؛} السلسلة العامة getnonce_str () {return nonce_str ؛} public void setnonce_str (string nonce_str) {this.nonce_str = nonce_str ؛ Notify_url) {this.notify_url = notify_url ؛} السلسلة العامة getOpenId () {return openId ؛ {this.out_trade_no = out_trade_no ؛} السلسلة العامة getSpbill_create_ip () {return spbill_create_ip ؛ void settotal_fee (int total_fee) {this.total_fee = total_fee ؛} السلسلة العامة gettrade_type () {return trade_type ؛} public void settrade_type (string trade_type) {this.trade_type = trade_type ؛ {this.sign = sign ؛} السلسلة العامة getProduct_id () {return product_id ؛} public void setProduct_id (string product_id) {this.product_id = product_id ؛} السلسلة العامة cenderatexmlContent () {String xml = "<vice_info> web </creaded_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nnonce_str>" + " this.out_trade_no + "</out_trade_no>" + "<product_id>" + this.product_id + "</product_id>" + "<spbill_create_ip>" + this.spbill_create_ip + "</spbill_create_ip> "</sotal_fee>" + "<trade_type>" + this.trade_type + "</trade_type>" + "<sign>" + this.sign + "</sign>" + "</sml> ؛ "& mch_id =" + this.mch_id + "& nonce_str =" + this.nonce_str + "؟ ify_url =" + this.notify_url + "& out_trade_no =" + this.out_trade_no + "& product_id =" this.spbill_create_ip + "& total_fee =" + string.valueof (this.total_fee) + "& trade_type =" + this.trade_type ؛ content = content + "& key =" + weixinconstants.md5_api_key ؛ string = signature.touppercase () ؛}}يمكن العثور على شرح كل متغير عضو في وصف [الواجهة الفردية الموحدة].
بعد ذلك ، نحتاج إلى ملء المحتوى الذي قمنا بتعيينه ، والاتصال بالواجهة للحصول على بيانات الإرجاع ، والحصول على بيانات code_url ، وإنشاء صورة ثنائية الأبعاد بناءً عليها ، وإرجاع عنوان الصورة إلى صفحة الويب للكمبيوتر الشخصي ، وبعد ذلك سيتم عرضه. سنقوم هنا بتوضيح ملاحظة خاصة مفادها أنه عندما ننقر على مدفوعات WeChat ، سنقوم باستدعاء وحدة تحكم SPRINGMVC الخلفية الخاصة بنا من خلال طريقة AJAX ، ثم أكملوا تحليل الواجهة الفردية الموحدة لـ WeChat من خلال httpclient في الطريقة المقابلة لوحدة التحكم للحصول على بيانات XML التي يتم إرجاعها بواسطة Code_url ، ثم قم بإنشاء رمز QRIN وإرجاعها إلى الصفحة الأولى. الرمز المنفذ في وحدة التحكم هو كما يلي:
خريطة <سلسلة ، كائن> نتيجة = new hashmap <string ، object> () ؛ unideorderdto dto = new unideOrderDTo () ؛ if (cash == null || ".equals (cash)) {result.put (" error "، totalfee) ؛ dto.setProduct_id (string.valueof (system.currentTimeMillis ())) ؛ dto.setbody ("إصلاح") ؛ dto.setnonce_str (string.valueof (system.nanotime ()) علامة التعريف dto.setout_trade_no ("رقم طلبك + معلومات مفتاحك ، يتم إرساله مرة أخرى بعد رد اتصال WeChat ، يمكنك التحقق") ؛ dto.settotal_fee (totalfee) ؛ dto.setspbill_create_ip ("127.0.0.1") dto.makesign ()) ؛ logger.info ("محتوى XML:" + dto.generaxmlContent ()) ؛ جرب {httpclient httpclient = httpclientbuilder.create (). build () ؛ httppost post = new httppost (weixinconstants.unifiedorder_url) ؛ post.addheader ("type-type" ، "text/xml ؛ charset = utf-8") ؛ xmlentity strationity = new strity (dto.generaxmlcontent () ، contentType.text_xml) ؛ post.setentity (xmlentity) ؛ httpresponse httpresponse = httpclient.execute (post) ؛ string responsexml = entityutils.toString (httpresponse.getentity () ، "utf-8") ؛ code_url contentMap <string ، string = ""> resultMap = (map <string ، string = "">) xmlutil.doxmlparse (responsexml) ؛ logger.info ("reponse code_url:" + resultmap.get ("code_url") ؛ ! ". النتيجة ؛ </string ،> </string ،> </string ، Object> </string ، Object>الرمز الذي يولد رمز الاستجابة السريعة هو كما يلي:
سلسلة خاصة collateqrcode (سلسلة codeurl) {file folder = file new (basepath + "qrcode") ؛ if (! lover.exists ()) {loveler.mkdirs () ؛} string f_name = uuidutil.uuid () + ".png fio = new FileOutputStream (f) ؛ multiformatwriter multiformatwriter = new multiformatwriter () ؛ map hints = new hashmap () ؛ hints.put (encodehinttype.character_set ، "UTF-8") ؛ // قم بتعيين مجموعة الحرف ترميز نوع bitmatrix bitmatrix = null ؛ bitmatrix = multiformatwriter.encode (codeurl ، barcodeformat.qr_code ، 300 ، 300 ، تلميحات) ؛ ("qrcode/" + f_name) ؛} catch (استثناء e1) {e1.printstacktrace () ؛ return null ؛}}في هذا الوقت ، بعد مسح رمز WeChat QR على العميل ، سنستخدم رد الاتصال لجعل عنوان URL وإرجاع البيانات إلينا. سنكمل المعالجة الخاصة بنا في طريقة رد الاتصال. من المهم أن نلاحظ هنا أنه يجب تنفيذ واجهة رد الاتصال الخاصة بك من خلال طريقة نشر HTTP ، وإلا فلن يتم قبول بيانات XML. رمز معالجة رد الاتصال هو كما يلي:
requestmapping (value = "/your_callback_url" ، method = requestMethod.post) responsebodypublic void finishpayment (httpservletRequest request ، httpservletponse response) {try {logger.info ( hashmap <string ، string = ""> () ؛ inputStream inputStream = request.getInputStream () ؛ // اقرأ دفق الإدخال saxbuilder saxbuilder = new saxbuilder () root.getChildren () ؛ iterator it = list.iterator () ؛ بينما (it.hasnext ()) {element e = (element) it.next () ؛ string k = xmlutil.getChildRentext (أطفال) ؛} resultmap.put (k ، v) ؛} // تحقق من التوقيع! ! ! /*string [] keys = resultmap.keyset (). tararray (سلسلة جديدة [0]) ؛ صفائف. إذا كان (i = "=" 0) = "" kvparams = "" + = "(مفاتيح [i]" "=" + resultmap.get (مفاتيح [i]))) ؛} else {kvparams + = ( weixinpaymentutil.md5encode (esign ، "utf-8") ؛ = "if (! md5esign.equals (resultMap.get (" sign ")) =" "الإرجاع ؛" ReturnCode = "resultmap.get (" return_code ") ؛" outTradeno) ؛ = "" "logger.info (" Total_fee = "" nfee) ؛ = "" Processing Processing Business = "" if ("Success. reponseDwriter (). print (xmlutil.getRetResultXml (resultMap.get ("return_code") ، = "" resultmap.get ("return_code"))) ؛ = "" "else =" "resultmap.get (" "" report_msg ")) ؛ =" catch (ioexception = "" ioe) = "ioe. (jdomexception = "" "e1) =" "e1.printstacktrace () ؛ =" "}تذكر استخدام فئتين من Xmlutil و MD5UTIL المستخدمة في إصدار Java الرسمي من WeChat Demo. يمكن العثور على الرمز التجريبي على الصفحة التجريبية الرسمية. تبعيات Maven ذات الصلة هي كما يلي:
<Rependency> <roupiD> jdom </rougiD> jdom </stifactid> <الإصدار> 1.1 </version> </sependency> <redence> <roupiD> com.google.zxing </groupId> Core </stifactid> <splect>
أخيرًا ، يجب أن أولي اهتمامًا خاصًا للتوقيع. قمت بتنزيل إصدار Java مباشرة من برنامج العرض التجريبي من موقع WeChat الرسمي للحصول على التوقيع. أقترح عليك أن تفعل الشيء نفسه ، لأن هذا هو الخيار الأفضل للتأكد من أن توقيع MD5 ثابت. بالنسبة للخوارزمية المحددة لإنشاء توقيعات ، يمكنك عرض وثيقة WeChat الرسمية. هنا نوصي بشدة أن توضح واجهة برمجة التطبيقات الرسمية. 90 ٪ من المشكلات المختلفة التي تواجهها في التطوير هي أنك لا تقرأ المستندات الرسمية ، ولكن تثق في مدونة شخص ما! هذا هو الغرض الحقيقي والغرض من كتابتي هذه المقالة. وفقًا للوثائق الرسمية ، قمت بتطبيقه باستخدام رمز Java الخاص بي. قم بفحص رمز الاستجابة السريعة على صفحات الويب WeChat PC ودفع مقابل الدفع سيطير بالتأكيد في تطبيق الويب الخاص بك.
ما ورد أعلاه هو تطبيق Java SpringMVC لصفحة الويب WeChat QR Code (الإصدار الكامل) الذي قدمه المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!