كيفية الحصول على الرسائل والرد عليها من WeChat Development API ، سأقدم لك أدناه
1. التفسير
* تم تطوير هذا المثال وإظهاره وفقًا لوثيقة تطوير WeChat: http://mp.weixin.qq.com/wiki/home/index.html أحدث إصدار (4/3/2016 5:34:36 PM).
* منصة التحرير: myeclipse10.7+win32+jdk1.7+tomcat7.0
* الخادم: Alibaba Cloud Windows Server 2008 64bits
* متطلبات النظام الأساسي: طريقة شرح استخدام Servlet ، متطلبات النظام الأساسي: J2EE6.0+، JDK6.0+، Tomcat7.0+
* التوضيح يركز أكثر على تحليل API.
* من أجل تعليمات الاختبار ، تكون كل حالة اختبار مستقلة ولا تعتمد على طرق أخرى. لا تفكر في العبوة كثيرًا.
* يتم تنفيذ العرض التوضيحي قدر الإمكان وفقًا لمتطلبات API. الغرض: فهم كيفية استخدام المستند وتحقيق تأثير التعلم من مثال واحد وتطبيقه على الآخرين.
* متطلبات المعرفة: مؤسسة جافا الصلبة ، فهم معرفة اتصالات شبكة HTTP ، والفهم الكافي لـ Javaweb ، تحليل JSON
* سيتم إعطاء هذا الجزء من رمز المصدر التجريبي في نهاية كل مقالة. بعد تحليل واجهة برمجة التطبيقات ، سيتم إعطاء جميع رموز المصدر التجريبي في شكل حزمة رمز المصدر.
* الوقت الحالي: 4/3/2016 5:32:57 مساءً ، تسود هذه المرة.
2. توثيق إدارة الرسائل النصية الأصلية (الملخص)
• عنوان المستند:
• إدارة الرسائل
ergective رسالة طبيعية لرسالة مستقبلة
push recepeceive recemeive acture push
◦SED رسالة رد الرسائل الواردة
◦SSED إدانة الرسائل وفك التشفير عند الرد السلبي
◦SSENT رسالة خدمة خدمة الولادة
◦SEND واجهة جمع الرسائل
◦S SEND واجهة رسالة الرسائل
◦SSED مواصفات تشغيل الرسائل المواصفات
◦ الحصول على تكوين الرد التلقائي للحساب الرسمي
3. فهم الوثيقة
• تلقي الرسائل
◦ يشرح المستند هذا: عندما يرسل مستخدم WeChat العادي رسالة إلى حساب عام ، سيقوم خادم WeChat بتعبئة بيانات XML لرسالة البريد إلى عنوان URL الذي تم ملؤه بواسطة المطور.
extensionshending: يقوم خادم WeChat بإرجاع الرسالة التي أرسلها المستخدم إلى REQ في شكل دفق ما بعد. عندما نريد إرسال الرسالة التي أرسلها المستخدم ، يمكننا الحصول عليها من خلال req.getInputStream (). بالطبع ، يمكننا إجراء التحليل اللازم بناءً على تنسيق XML لرسالة الإرجاع في المستند.
◦
ينجز:
/** في هذا الجزء ، نحصل على المعلومات التي يرسلها المستخدم ونحلها إلى <k ، v> للعرض* /// تحليل المعلومات التي أرسلها المستخدم. inputStream هو = req.getInputStream () ؛ // الحصول على دفق الطلب // تخزين النتيجة المحلية في خريطة hashmap <string ، string> map = new hashmap <string ، string> () ؛ // parse xml ، parse الناتج عن الإرجاع الذي تم الحصول عليه في المعلومات النصية التي اعتدنا عليها على reader saxreader تحليل xml] مستند مستند = null ؛ حاول {document = reader.read (is) ؛} catch (documentException e1) {// todo todo catch catch e1.printstacktrace () ؛} العقد لـ (Element E: elementlist) map.put (e.getName () ، e.gettext ()) ؛ // مجموعة إخراج الاختبار <string> keyset = map.keyset () ؛ // بعد أن يتم تحليل إخراج الاختبار ، يتم إرسال المعلومات التي يتم إرسالها بواسطة المستخدم بواسطة المستخدم. لـ (مفتاح السلسلة: KeySet) {system.out.println (Key + ":" + map.get (key)) ؛} system.out.println (tag + ": end لتحليل المعلومات المرسلة من قبل المستخدم") ؛ • أرسل رسالة
◦ يشرح المستند هذا: عندما يرسل المستخدم رسالة إلى الحساب الرسمي (أو عندما يتم دفع الحدث بواسطة عملية مستخدم معينة) ، سيتم إنشاء طلب نشر. يمكن للمطور إرجاع بنية XML محددة في حزمة الاستجابة (الحصول على) للرد على الرسالة (يدعم الآن نص الرد ، والصور ، والصور ، والنص ، والصوت ، والفيديو ، والموسيقى). بالمعنى الدقيق للكلمة ، فإن إرسال رسائل الاستجابة السلبية ليس في الواقع واجهة ، ولكن رد على رسالة تم إرسالها إلى خادم WeChat.
ussunderSting: عندما يرسل المستخدم طلبًا ، سيتم إنشاء طلب نشر ، ويمكننا الرد على الرسائل من خلال Respone. ومع ذلك ، فإن محتوى الرد له متطلبات تنسيق صارمة. فقط عند استيفاء متطلبات التنسيق ، فإن عملية خادم WeChat وإعادتها إلى المستخدم. من خلال عرض وحدة "إدارة الرسائل" المستند ، يمكننا أن نرى أن هناك رسائل مختلفة في WeChat ، وكل نوع من الرسائل له متطلبات تنسيق خاصة بها. يجب أن نتبع متطلبات إرجاع معلومات محددة إلى المستخدم بشكل طبيعي. نحاول الرد على المستخدمين الذين لديهم معلومات نصية ورسائل رسمية بالتنسيق المطلوب من المستند. التركيز: بناء المعلمات المطلوبة وفقا لمتطلبات المستند. ملاحظة خاصة: المعلمات حساسة للحالة.
implement 1 بشكل موحد للرسائل النصية العادية:
// مثال 1: أرسل رسالة نصية عادية ، يرجى التحقق من تنسيق XML للمستند حول "الرد النص النصفي" // الخطوة 1: إنشاء المعلمات المطلوبة textMsgg = new TextMsg () ؛ textmsg.settousername (map.get ("fromusername")) ؛ textmsg.setfromusername (map.get ("touserName")) ؛ textMsg.SetCreateTime (تاريخ جديد (). التنسيق المعترف به من قبل WeChat [Baidu: Xstream Bean إلى XML] Xstream Xstream = جديد Xstream () ؛ xstream.alias ( إلى خادم WeChat ، ويقوم الخادم بإعادة توجيهه إلى user printWriter printWriter = resp.getWriter () ؛ printWriter.print (textMsg2xml) ؛ exemplement 2-على الرسالة النصية:
// مثال 2 ، أرسل الرسائل الرسومية والرسائل النصية. يرجى التحقق من تنسيق XML لمستند "الرد على الرسالة النصية" // الخطوة 1: إنشاء المعلمات المطلوبة من قبل الردود على قائمة الرسائل النصية <article> المقالات = New ArrayList <article> () ؛ المقالة A = مقالة جديدة () ؛ A.Setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg") ؛ picandTextMsg = new picandtextmsg () ؛ picandtextmsg.settousername (map.get ("fromusername") picandtextmsg.setmsgtype ("News") ؛ // الرسائل ونوع النص رسالة picandtextmsg.setarticleCount (1) ؛ picandtextmsg.setArticles (مقالات) ؛ // الخطوة الثانية هي تحويل المعلومات التي تم إنشاؤها إلى تنسيق XML المعترف به بواسطة WeChat [Baidu: Xstream Bean to XML] Xstream Xstream = New Xstream () ؛ picandtextMsg2xml = xstream.toxml (picandtextMsg) ؛ system.out.println (picandtextMsg2xml) ؛ // الخطوة الثالثة هي إرسال معلومات التنسيق الخاصة بـ xml إلى خادم WeChat ، والخادم يتم توجيهه إلى المستخدم printwriter = respriterriter () يمكن استخدام جميع رموز مصدر التشغيل في هذا الجزء مباشرة
• CoreServlet.java (بما في ذلك الوصول إلى الخادم ، وتلقي رسائل إرسال المستخدم ، والرد على الرسائل النصية العادية ، والرد على الرسائل الرسومية. الجرار الطرف الثالث: DOM4J ، Xstream)
package com.gist.servlet ؛ import java.io.ioException ؛ import java.io.inputstream ؛ import java.io.printwriter ؛ import java.security.messagedigest ؛ import java.security.nosuchalgorithmexception ؛ import java.util. java.util.hashmap ؛ import java.util.list ؛ import java.util.map ؛ import java.util javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد org.dom4j.document ؛ استيراد org.dom4j.documentException ؛ استيراد org.dom4j.Element ؛ import org.dom4j.saxaxReader ؛ com.gist.bean.picandtextmsg ؛ import com.theaughterworks.xstream.xstream ؛/** * Author gao yuan </n> البريد الإلكتروني: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> */@webservlet ("/coreervlet") يمتد CoreServlet الفئة العامة httpservlet {private static final long serialversionuid = 1l ؛ سلسلة tag = "CoreServlet" ؛ ] * يحمل طلب GET أربعة معلمات: التوقيع ، الطابع الزمني ، nonce ، echostr * يتحقق المطور من الطلب عن طريق التحقق من التوقيع (هناك طريقة التحقق أدناه). إذا أكدت أن طلب GET هو من خادم WeChat ، فيرجى إرجاع محتوى معلمة EchoStr كما هو. *، سيصبح الوصول ساري المفعول ويصبح مطورًا بنجاح ، وإلا فإن الوصول سيفشل. *. المتغيرات لتشكيل تسلسل. تتمثل الطريقة في تكوين تسلسل من صغير إلى كبير بالترتيب الأبجدي أو بترتيب أعداد صغيرة وكبيرة. */ override void void doget (httpservletrequest req ، httpservletresponse resp) يلقي servletexception ، ioException {// تعيين req.setcharacterencoding ("utf-8") ؛ Resp.SetContentType ("html/text ؛ charset = utf-8") ؛ Resp.SetcharActerEncoding ("UTF-8") ؛ // الحصول على دفق الإخراج printWriter printWriter = resp.getWriter () ؛ // حدد رمزًا عالميًا ، يقوم المطور بتعيينه بنفسه. يشرح API هذا: يمكن ملء الرمز المميز في الإرادة من قبل المطور ، // يستخدم كتوقيع الأجيال (سيتم مقارنة الرمز المميز مع الرمز المميز الموجود في عنوان URL للواجهة للتحقق من الأمن) token = "wgyscsf" ؛ // وفقًا لوصف API ، احصل على توقيع سلسلة المعلمات الأربعة أعلاه = req.getParameter ("التوقيع") ؛ سلسلة Timestamp = req.getParameter ("Timestamp") ؛ سلسلة nonce = req.getParameter ("nonce") ؛ سلسلة echosttr = req.getParameter ("echosttr") ؛ // // temp: طباعة مؤقتة ، شاهد حالة معلمة الإرجاع // system.out.println (tag + ": التوقيع:" + signature + "، timestamp:" // + timestamp + "، nonce:" + nonce + "، echoStr:" + echoStr) ؛ // الوصول وفقًا لـ "عملية التشفير/التحقق" التي ذكرها API. هناك ثلاث خطوات في Total // الخطوة 1: فرز ترتيب القاموس من الرمز المميز ، الطابع الزمني ، غير المعلمات غير المعلمات [] parms = سلسلة جديدة [] {token ، timestamp ، nonce} ؛ تشفير // لصق السلسلة parmsstring = "" ؛ // لاحظ أنه لا يمكن = فارغ هنا. لـ (int i = 0 ؛ i <parms.length ؛ i ++) {parmsstring+= parms [i] ؛ } // sha1 تشفير سلسلة mparms = null ؛ // النتيجة المشفرة messagedigest digest = null ؛ حاول {digest = java.security.messagedigest.getInstance ("sha") ؛ } catch (nosuchalgorithmexception e) {// todo catch catch e.printstacktrace () ؛ } digest.update (parmsstring.getBytes ()) ؛ byte messagedigest [] = digest.digest () ؛ // إنشاء hex string stringbuffer hexstring = new StringBuffer () ؛ // تحويل صفيف البايت إلى الرقم السداسي ل (int i = 0 ؛ i <messagedigest.length ؛ i ++) {String Shahex = Integer.ToHexString (messagedigest [i] & 0xff) ؛ if (shahex.length () <2) {hexstring.append (0) ؛ } hexstring.append (shahex) ؛ } mparms = HexString.toString () ؛ // نتيجة التشفير/ * * * * * متطلبات واجهة برمجة التطبيقات: إذا أكدت أن طلب GET يأتي من خادم WeChat ، فيرجى إرجاع محتوى معلمة echostr كما هو ، وسيأثير الوصول إلى التأثير وتصبح مطورًا بنجاح. خلاف ذلك ، سيفشل الوصول. */ // الخطوة 3: يحصل المطور على السلسلة المشفرة ويمكنه مقارنةها بالتوقيع لتحديد أن الطلب يأتي من الوصول الناجح لـ WeChat. // system.out.println (tag + ":" + mparms + "--->" + signature) ؛ if (mparms.equals (signature)) {// system.out.println (tag + ":" + mparms + "---->" + signature) ؛ printWriter.write (echoStr) ؛ } آخر {// فشل الوصول ، لا حاجة للكتابة // system.out.println (العلامة + "فشل الوصول") ؛ }} / * * تحقق من مستند API لإرسال الرسائل واستلامها ودفع تنسيق الرسالة نفسه بشكل أساسي. كما هو الحال في التنسيق التالي: <xml> * <touserName> <! <truction> <! * / / * * دعنا أولاً نحصل على دفق الإدخال ونرى المعلومات الموجودة في دفق الإدخال. من خلال اختبار تدفق المطبوعة ، يمكننا أن نرى أنه في كل مرة يطلب المستخدم ، نتلقى طلبًا REQ. تنسيق الطلب بتنسيق XML ، والذي تم شرحه في المستند. * / / * * لاحظ أن req.getInputStream () لا يمكن استردادها إلا مرة واحدة ولا يمكن قراءتها إلا مرة واحدة. إذا كنت ترغب في قراءتها عدة مرات ، فأنت بحاجة إلى العثور على طريقة أخرى. من أجل البساطة ، * نحصل فقط على req.getInputStream () مرة واحدة ولم نعد طباعة معلومات دفق الإخراج. طباعة مباشرة المعلومات المحسورة. */ Override void dopost (httpservletrequest req ، httpservletresponse resp) يرمي servletexception ، ioException {// تعيين req.setcharacterencoding ("utf-8") ؛ Resp.SetContentType ("html/text ؛ charset = utf-8") ؛ Resp.SetchAracterEncoding ("UTF-8") ؛ /** في هذا الجزء ، نحصل على المعلومات التي يتم إرسالها من قبل المستخدم ونجعلها في <k ، v> للعرض* // تحليل المعلومات التي يتم إرسالها بواسطة userstream المستخدم هي = req.getInputStream () ؛ // الحصول على دفق الطلب // تخزين النتائج المحسورة في خريطة hashmap <string> string> map = new hasmap <string> () ؛ // تحليل XML ، تحليل نتيجة الإرجاع التي تم الحصول عليها XML في معلومات النص التي نستخدمها في قارئ SaxReader = جديد SaxReader () ؛ // جرة جهة خارجية: DOM4J [BAIDU: SAXREADER PARSING XML] وثيقة = NULL ؛ حاول {document = reader.read (is) ؛ } catch (documentException e1) {// todo catch catch e1.printstacktrace () ؛ } // GET XML element element element element root = document.getRootElement () ؛ // احصل على جميع العقد الفرعية لقائمة عنصر الجذر <Element> elementlist = root.elements () ؛ // اجتياز جميع العقد الفرعية لـ (Element E: ElementList) map.put (e.getName () ، e.getText ()) ؛ // Test Output Set <string> keyset = map.keyset () ؛ // اختبار رسالة الإخراج التي أرسلها المستخدم بعد نظام التحليل. لـ (مفتاح السلسلة: keyset) {system.out.println (key + ":" + map.get (key)) ؛ } system.out.println (tag + ": نهاية تحليل المعلومات التي أرسلها المستخدم") ؛ / * * في هذا الجزء ، نحاول الرد على معلومات النص والرسائل الرسومية للمستخدم وفقًا للتنسيق المطلوب للمستند. التركيز: بناء المعلمات المطلوبة وفقا لمتطلبات المستند. ملاحظة خاصة: المعلمات حساسة للحالة. *////// مثال 1: أرسل رسالة نصية عادية ، يرجى التحقق من تنسيق XML للمستند حول "رد رسالة نصية" // // الخطوة 1: إنشاء المعلمات المطلوبة وفقًا لمعلومات نص الرد // textmsgg = new textMsg () ؛ // textmsg.settouserName (map.get ("fromuserName")) ؛ // إرسال واستقبال الرسالة "المستخدم" بالضبط معاكس // textMsg.setFromuserName (map.get ("touserName")) ؛ // textmsg.setCreateTime (Date () // // // // // // الخطوة الثانية هي تحويل المعلومات التي تم إنشاؤها إلى تنسيق XML المعترف بها بواسطة WeChat [Baidu: Xstream Bean to XML] // Xstream Xstream = New Xstream () ؛ // xstream.alias ("xml" ، textMsg.getClass ()) ؛ // string textMSG2XML = xStream.toxml (textMsg) ؛ // system.out.println (textMsg2xml) ؛ // // // // // // // الخطوة الثالثة هي إرسال معلومات التنسيق الخاصة بـ XML إلى خادم WeChat ، ويقوم الخادم بإعادة توجيهه إلى user // printwriter printWriter = resp.getWriter () ؛ // printWriter.print (textMsg2xml) ؛ // // مثال 2 ، أرسل الرسائل الرسومية والرسائل النصية. يرجى التحقق من المستند حول تنسيق XML لـ "الرد على الرسالة النصية" // الخطوة 1: إنشاء المعلمات المطلوبة وفقًا للردود على قائمة الرسائل النصية <article> المقالات = ArrayList جديد <article> () ؛ المادة أ = مقالة جديدة () ؛ A.Settitle ("أنا عنوان الصورة") ؛ A.SetUrl ("www.baidu.com") ؛ // هذا العنوان هو بعد النقر على الصورة والقفز A.Setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21 A.SetDescription ("أنا وصف الصورة") ؛ مقالات. Add (a) ؛ picandTextMsg picandTextMsg = new PicAndTextMsg () ؛ picandtextmsg.settouserName (map.get ("fromusername")) ؛ // إرسال واستقبال الرسالة "المستخدم" فقط picandtextmsg.setfromusername (map.get ("touserName")) ؛ picandtextmsg.setCreateTime (تاريخ جديد (). getTime ()) ؛ // وقت إنشاء الرسائل (integer) picandtextmsg.setmsgtype ("الأخبار") ؛ // رسالة نوع الرسوم picandtextmsg.setarticleCount (1) ؛ picandtextmsg.setArticles (مقالات) ؛ // الخطوة الثانية هي تحويل المعلومات التي تم إنشاؤها إلى تنسيق XML المعترف بها بواسطة WeChat [Baidu: Xstream Bean إلى XML] Xstream Xstream = جديد Xstream () ؛ Xstream.Alias ("XML" ، picandtextmsg.getClass ()) ؛ xstream.alias ("item" ، a.getClass ()) ؛ String picandTextMsg2xml = xstream.toxml (picandTextMsg) ؛ system.out.println (picandTextMsg2xml) ؛ // الخطوة الثالثة هي إرسال معلومات التنسيق الخاصة بـ XML إلى خادم WeChat ، ويقوم الخادم بإعادة توجيهه إلى printWriter printWriter = resp.getWriter () ؛ printWriter.print (picandTextMsg2xml) ؛ }}
• testmsg.java (حبة رسالة نصية عادية)
حزمة com.gist.bean ؛/** * Author Gao Yuan </n> البريد الإلكتروني: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * فترة الكتابة 2016-4 2:09:27 PM */public classg سلسلة خاصة من اسم username ؛ خاص طويل الإبداع ؛ سلسلة خاصة msgtype ؛ Override public string toString () {return "textMsg [touserName =" + touserName + "، fromuserName =" + fromuserName + "، createTime =" + createTime + "، msgtype =" + msgtype + "، content =" content + "] ؛ } محتوى السلسلة الخاصة ؛ TextMsg العامة (سلسلة touserName ، سلسلة من اسم username ، createTime الطويل ، سلسلة msgtype ، سلسلة المحتوى) {super () ؛ touserName = touserName ؛ fromusername = fromusername ؛ createTime = createTime ؛ msgtype = msgtype ؛ المحتوى = المحتوى ؛ } textMsg () {super () ؛ } السلسلة العامة getTouserName () {return touserName ؛ } الاسم المستقر الفراغ العام (سلسلة touserName) {touserName = touserName ؛ } السلسلة العامة getFromuserName () {return fromuserName ؛ } public void setFromUsername (سلسلة fromuserName) {fromuserName = fromuserName ؛ } public getCreateTime () {return createTime ؛ } public void setCreateTime (long createTime) {createTime = createTime ؛ } السلسلة العامة getMsgType () {return msgtype ؛ } public void setMsgType (String msgtype) {msgtype = msgtype ؛ } السلسلة العامة getContent () {return content ؛ } public void setContent (سلسلة المحتوى) {content = content ؛ }}
• article.java (مقالة بين الرسالة النصية)
Package com.gist.bean ؛/** * Author Gao Yuan </n> البريد الإلكتروني: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * كتابة الفترة 2016-4-4 2:47:08 PM */Public Class article Override public string toString () {return "item [title =" + title + "، description =" + description + "، picurl =" + picurl + "، url =" + url + "] ؛ } السلسلة العامة getTitle () {return title ؛ } public void setTitle (tring title) {title = title ؛ } السلسلة العامة getDescription () {return description ؛ } public void setDescription (وصف السلسلة) {الوصف = الوصف ؛ } السلسلة العامة getpicurl () {return picurl ؛ } public void setpicurl (String picurl) {picurl = picurl ؛ } السلسلة العامة geturl () {return url ؛ } public void seturl (url url) {url = url ؛ } وصف السلسلة الخاصة ؛ سلسلة خاصة picurl ؛ عنوان URL الخاص بالسلسلة الخاصة ؛}
• picandtextmsg.java (رسالة نصية رسمية)
package com.gist.bean ؛ import java.util.list ؛/** * Author Gao Yuan </n> البريد الإلكتروني: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * فترة الكتابة 2016-4 2:47:08 سلسلة خاصة من اسم username ؛ خاص طويل الإبداع ؛ سلسلة خاصة msgtype ؛ الخاص int articleCount ؛ قائمة خاصة <article> المقالات ؛ Override public string toString () {return "picandtextMsg [touserName =" + touserName + "، fromuserName =" + fromuserName + "، createTime =" + CreateTime + "، msgtype =" + msgtype + "، articleCount =" + articlecount + " } السلسلة العامة getTouserName () {return touserName ؛ } الاسم المستقر الفراغ العام (سلسلة touserName) {touserName = touserName ؛ } السلسلة العامة getFromuserName () {return fromuserName ؛ } public void setFromUsername (سلسلة fromuserName) {fromuserName = fromuserName ؛ } public getCreateTime () {return createTime ؛ } public void setCreateTime (long createTime) {createTime = createTime ؛ } السلسلة العامة getMsgType () {return msgtype ؛ } public void setMsgType (String msgtype) {msgtype = msgtype ؛ } public int getArticLecount () {return articleCount ؛ } public void setarticleCount (int articleCount) {articleCount = articleCount ؛ } القائمة العامة <article> getArticles () {return articles ؛ } public void setArticles (قائمة <article> المقالات) {المقالات = المقالات ؛ }}
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.