1. رسم الخرائط الداخلية
نظرًا لأن URL of WeChat Enterprise Account ، فإن وضع رد الاتصال يدعم الوصول إلى اسم المجال ، يقدر أنك بحاجة إلى تسجيل قذيفة الفول السوداني والقيام باختراق إنترانت (يكلف 16 يوانًا لشراء نسخة مجانية ، ويمكنك فقط إضافة اسم المجال في اليوم التالي بعد شرائها)
2. حساب WeChat Enterprise
سجل حساب WeChat Enterprise: https://qy.weixin.qq.com/ (حدد فريقًا ، لا يتطلب الفريق شهادة)
جهات الاتصال: إنشاء منظمة جديدة -> اتبع الأعضاء
حساب المؤسسة -> مركز التطبيق -> تطبيق جديد -> تطبيق الرسائل -> تحديد الوضع (وضع رد الاتصال) -> قم بتشغيل إعادة توجيه رسالة WeChat ،
وضع رد الاتصال الوصف:
تشفير وضع رد الاتصال ورمز فك التشفير: http://qydev.weixin.qq.com/wiki/index.php؟title=٪E5٪8A٪A0٪E8٪A7٪A3٪E5 ٪ AF ٪ 86 ٪ E5 ٪ BA ٪ 93 ٪ E4 ٪ B8 ٪ 8B ٪ E8 ٪ BD ٪ BD E4 ٪ B8 ٪ 8E E8 ٪ BF ٪ 94 ٪ E5 ٪ 9B ٪ 9E ٪ E7 ٪ A0 ٪ 81
كما هو مبين في الشكل 1:
القائمة المخصصة: يظهر مسار الطلب لتطبيق التطوير في الشكل 2:
الإعدادات -> إعدادات الوظائف -> إدارة الإذن -> مجموعة إدارة جديدة -> أذونات التطبيق (Secret)
3. استخدم جيرسي لتطوير خدمات خدمة الويب
3.1 تحديد الرمز المميز في الفصل ، كلمة المرور العشوائية 43 رقمًا ، شركة شركة ، سرية
3.2 طريقة التحقق
/ * * ----------------------------- عند تشغيل المؤسسة على وضع رد الاتصال ، سيرسل رقم المؤسسة طلبًا إلى عنوان URL للتحقق * لنفترض أنه عند النقر فوق التحقق ، يتلقى المؤسسة طلبًا مشابهًا: GET * /CGI-BIN /WXPUSH؟ × TAMP * = 1409659589 و nonce = 263014780 & echosttr = p9nazczydtytweshep1vc5xho ٪ * 2fqyx3zpb4yka9skld1dsh3iyt3tp3zndtp ٪ 2b4rpcs8tgae * http/1.1 المضيف: qy.weixin.qq.com * * عند استلام هذا الطلب ، يجب على المؤسسة * 1. تحليل المعلمات لطلب الحصول على ، بما في ذلك توقيع جسم الرسائل (msg_signature) ، و timestamp (timestamp) ، وسلسلة الأرقام العشوائية (nonce *) وسلسلة encryped العشوائية (صدى). انتبه إلى فك تشفير URL في هذه الخطوة. 2. تحقق من صحة توقيع جسم الرسالة 3. يمكن تنفيذ الخطوة 2. 3 باستخدام وظيفة المكتبة VERIFYURL التي توفرها المنصة العامة. *// ** * عنوان URL للاتصال ، يستدعي WeChat هذه الطريقة للتحقق * * @RETURN */ GETPTAR ("Station") سلسلة Public Verify () {String msgSignature = request.getParameter ("msg_signature") ؛ سلسلة Timestamp = request.getParameter ("Timestamp") ؛ سلسلة nonce = request.getParameter ("nonce") ؛ system.out.println (timestamp + "" + nonce) ؛ سلسلة echosttr = request.getParameter ("echosttr") ؛ سلسلة sechoStr = فارغة ؛ حاول {sechostr = wxcpt.verifyurl (msgSignature ، timestamp ، nonce ، echosttr) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ // فشل URL للتحقق ، يرجى الاطلاع على الاستثناء لسبب الخطأ} إرجاع SechoStr ؛ }3.3 استلام معلومات المستخدم وفك تشفيرها
/ * * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * <TouserName> <! . +6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6 * +KDZ +HMZFJYUR +LTWGC2HGF5GSIJFF0EKUNXIQATP7PF5MZZ3IZON1S4ZG4LUMNER +3iqh03v +bca9nmelnqbsf6tiwsrxjb3lavgucallcrw8v2t9el4ehzjwrquax5wlvmns0 * +rupa3k22ncx4xxs9o0mbh27bpnzps +/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl */t8z1ptdave0lxdq2yoyoyh2uypzzis2pdbs8r07+qn+e7q ==] يتلقى Enterprise طلب Post ، يجب أن يتوصل إلى المعلمات على عنوان URL ، بما في ذلك توقيع جسم الرسائل (msg_signature) ، الطابع الزمني (الطابع الزمني) وسلسلة الأرقام العشوائية (nonce) * 2. تحقق من صحة توقيع الجسم. * 3. يتم تحليل البيانات المطلوبة بواسطة XML وفك تشفير محتوى علامة <Cnrypt>. النص العادي المصطلح هو النص العادي لرسالة رد المستخدم. يرجى الرجوع إلى المستند الرسمي لتنسيق النص العادي* الخطوة 2 و 3 يمكن تنفيذها باستخدام دالة المكتبة decryptmsg التي توفرها المنصة العامة. */ post @path ("Station") السلسلة العامة stensiveMsg (String reqdata) {String msgSignature = request.getParameter ("msg_signature") ؛ سلسلة Timestamp = request.getParameter ("Timestamp") ؛ سلسلة nonce = request.getParameter ("nonce") ؛ // بيانات النص المشفر المطلوب بواسطة post // string sreqdata = // "<xml> <TouserName> <! ata [rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHHGD3QCZCDCUPJ911L3VG3W/SYYVUJTS3TUUKSXXACASCASS0QHXCHRRYT66WISPGLYL42A M6A8DTT+6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6+KDZ+HMZFJYUR+LTWGC2HGF5GS IJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUNGLEVW2R+KQCKIW+3IQH03V+BCA9NMELNQBSF6T iwsrxjb3lavgucallcrw8v2t9el4ehzjwrquax5wlvmns0+rupa3k22ncx4xzs9o0mbh27bo6bp nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyoyyh2uypizis2pdbs8r07+qn+e7q ==]] حاول {String smsg = wxcpt.decryptmsg (msgSignature ، timestamp ، nonce ، reqdata) ؛ // تحليل محتوى علامة XML plaintext لمعالجة documentBuilderFactory dbf = documentBuilderfactory.newinstance () ؛ documentBuilder db = dbf.newdocumentBuilder () ؛ StringReader Sr = New StringReader (smsg) ؛ Inputsource هو = New Inputsource (SR) ؛ وثيقة المستند = db.parse (IS) ؛ العنصر جذر = document.getDocumentElement () ؛ nodelist nodeList1 = root.getElementsByTagName ("المحتوى") ؛ if (nodelist1.item (0) == null) return "ok" ؛ content string = nodelist1.item (0) .getTextContent () ؛ System.out.println ("المحتوى:" + المحتوى) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ // فشل فك التشفير ، يرجى التحقق من الاستثناء من الفشل} الإرجاع "OK" ؛ }3.4 إرسال المعلومات إلى WeChat
الإعدادات -> إعدادات الوظائف -> إدارة الإذن -> إنشاء مجموعة إدارة جديدة ؛ كن سرا
/** * يمكن أن ترسل هذه الطريقة رسائل من أي نوع * * param msgtype * نص | صورة | صوت | فيديو | File | News * param touser * قائمة معرف الأعضاء (يتم فصل المستفيدين من الرسائل ، ويتم فصل العديد من المستلمين بـ '|' ، ودعم ما يصل إلى 1000). الحالة الخاصة: المحددة على أنها @gall ، سيتم إرسال * @param topy * قائمة معرف القسم لجميع الأعضاء الذين يتبعون تطبيق المؤسسة. يتم فصل العديد من المستفيدين عن طريق '|' ، ودعم ما يصل إلى 100. تجاهل هذه المعلمة عندما يكون touser هو @gall * param totag * قائمة معرف العلامة ، يتم فصل العديد من المستلمين بواسطة '|'. تجاهل هذه المعلمة عندما يكون touser هو @all * @param content * عندما msgtype = نص ، محتوى الرسائل النصية * param mediaid * عندما msgtype = صورة | صوت | فيديو ، معرف معلومات الرسالة المقابل (-------) param picurl * عندما يشير msgtype = news ، مسار الصورة * param safe * إلى ما إذا كانت رسالة سرية ، يشير 0 إلى لا ، 1 يشير إلى نعم ، الافتراضي 0 */ public void sendwechatmsg (String msgtype ، string touser ، string topy ، string totag ، String MediaId ، عنوان السلسلة ، السلسلة url ، سلسلة. string access_token = getAccessToken () ؛ // string request string string action = create_session_url + access_token ؛ // تغليف إرسال رسالة طلب json stringbuffer sb = new StringBuffer () ؛ sb.append ("{") ؛ sb.append ("/" touser/":" + "/" " + touser +"/"،") ؛ sb.append ("/" toparty/":" + "/" " + toparty +"/"،") ؛ sb.append ("/" totag/":" + "/" " + totag +"/"،") ؛ if (msgtype.equals ("text")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" text/":" + "{") ؛ sb.append ("/" content/":" + "/" " + content +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("Image")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" Image/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("صوت")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" voice/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" video/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"،") ؛ sb.append ("/" title/":" + "/" " + title +"/"،") ؛ sb.append ("/" description/":" + "/" " + description +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("file")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" file/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("news")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" news/":" + "{") ؛ sb.append ("/" المقالات/":" + "[") ؛ sb.append ("{") ؛ sb.append ("/" title/":" + "/" " + title +"/"،") ؛ sb.append ("/" description/":" + "/" " + description +"/"،") ؛ sb.append ("/" url/":" + "/" " + url +"/"،") ؛ sb.append ("/" picurl/":" + "/" " + picurl +"/"") ؛ sb.append ("}") ؛ sb.append ("]") ؛ sb.append ("}") ؛ } sb.append ("،/" Safe/":" + "/" " + Safe +"/"،") ؛ sb.append ("/" AgentId/":" + "/" " + 1 +"/"،") ؛ sb.append ("/" debug/":" + "/" " +" 1 " +"/"") ؛ sb.append ("}") ؛ String json = sb.toString () ؛ حاول {url = url new (Action) ؛ httpsurlconnection http = (httpsurlConnection) url.openconnection () ؛ http.setRequestMethod ("post") ؛ http.setRequestProperty ("نوع المحتوى" ، "التطبيق/json ؛ charset = utf-8") ؛ http.setDooutput (true) ؛ http.setDoInput (true) ؛ System.SetProperty ("sun.net.client.defaultConnectTimeout" ، "30000") ؛ // // timeout timeout 30 ثانية System.SetProperty ( // // قراءة المهلة 30 ثانية http.connect () ؛ OutputStream OS = http.getOutputStream () ؛ OS.Write (json.getbytes ("utf-8")) ؛ // pass in parameter inputStream is = http.getInputStream () ؛ int size = is.available () ؛ byte [] jsonbytes = new byte [size] ؛ is.read (jsonbytes) ؛ String Result = new String (Jsonbytes ، "UTF-8") ؛ System.out.println ("RESET RESETTS RESORD:" + result) ؛ os.flush () ؛ OS.Close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} // احصل على رمز الوصول إلى الواجهة العامة getAccessToken () {httpclient client = new httpclient () ؛ postmethod post = new postmethod (Access_token_url) ؛ post.ReLeasEconnection () ؛ post.setRequestHeader ("نوع المحتوى" ، "التطبيق/x-www-form-urlencoded ؛ charset = utf-8") ؛ nameValuePair [] param = {new nameValuePair ("corpid" ، corpid) ، new NameValuePair ("CorpSecret" ، secret)} ؛ // تعيين سياسة لمنع الإبلاغ عن أخطاء ملفات تعريف الارتباط من DefaultHttParams.getDefaultParams (). // تعيين المعلمات للنشر المنشور post post.setRequestBody (param) ؛ نتيجة السلسلة = "" ؛ حاول {client.executemethod (post) ؛ النتيجة = سلسلة جديدة (post.getResponseBondAssTring (). getBytes ("GBK")) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } // تحويل البيانات إلى JSON JSONOBJECT JASONOBJECT ؛ jasonobject = jsonobject.fromObject (النتيجة) ؛ النتيجة = (سلسلة) jasonobject.get ("access_token") ؛ post.ReLeasEconnection () ؛ System.out.println (نتيجة) ؛ نتيجة العودة } public static void main (string [] args) {stationResource weChat = new StationResource () ؛ // wechat.sendwechatmsgtext ("@all" ، "2" ، "" ، "إعلام مركز المعلومات" ، "0") ؛ wechat.sendwechatmsg ("News" ، "@all" ، "" ، "،" ، "اختبار Senmsg" ، "" ، "تم اختباره" ، "تم اختباره حقًا" ، "http://www.baidu.com" "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg" ، "0") ؛ }4. تم الانتهاء من التنمية. يجب إضافة هذه الفئة إلى الراحة في webx.xml للإدارة
<!-دعم مريح-> <!-خدمة webserivce. في حالة إضافة خدمة ، يجب إضافة مسار الحزمة للخدمة إلى القيمة المتوهجة-> <Sradlet> <Sradlet-Name> Jax-Rs Rest Servlet </servlet-name> <Servlet-Class> com.sun.jersey.spi.container.servlet.servletcontainer </servlet-class> <Param-name> com.sun.jersey.config.property.packages </param-name> <param-value> com.base.pf.restful </parm-value> </ith-param> <load-on-startup> 2 </ <Url-pattern>/rest/*</urol-pattern> </rectlet-mapping>
5. تم الانتهاء من الرمز الكامل
حزمة com.base.pf.restful ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputStream ؛ استيراد java.io.stringReader ؛ استيراد java.net.url ؛ استيراد javax.net.ssl.httpsurlConnection ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد javax.ws.rs.get ؛ استيراد javax.ws.rs.post ؛ استيراد javax.ws.rs.path ؛ استيراد javax.ws.rs.core.context ؛ استيراد javax.xml.parsers.documentBuilder ؛ استيراد javax.xml.parsers.documentBuilderFactory ؛ استيراد net.sf.json.jsonobject ؛ استيراد org.apache.commons.httpclient.httpclient ؛ استيراد org.apache.commons.httpclient.namevaluepair ؛ استيراد org.apache.commons.httpclient.cookiePolicy ؛ استيراد org.apache.commons.httpclient.methods.postmethod ؛ استيراد org.apache.commons.httpclient.params.defaulthttparams ؛ استيراد org.w3c.dom.document ؛ استيراد org.w3c.dom.element ؛ استيراد org.w3c.dom.nodelist ؛ استيراد org.xml.sax.inputsource ؛ استيراد com.qq.weixin.mp.aes.aesexception ؛ استيراد com.qq.weixin.mp.aes.wxbizmsgcrypt ؛ /** * تطوير حساب WeChat Enterprise * * Author Zhen.l * */path ("WX") فئة عامة stationResource {// http://hichinamobile.cickp.net/security/rest/wx // https:/qy.weixin.qq.com token = "spm" ؛ // رقم المؤسسة-> مركز التطبيق-> تطبيق جديد-> نوع الرسائل تطبيق السلسلة الخاصة = "1" ؛ // رقم المؤسسة-> مركز التطبيق-> انقر فوق التطبيق-> معرف التطبيق الخاص بالسلسلة الخاصة charsingaeeskey = "nt6zwtvflynxohfoggozwdjpagefsv8ln5cneyw7mwl" ؛ // رقم المؤسسة-> مركز التطبيق-> تطبيق جديد-> تطبيق من نوع السلسلة الخاصة corpid = "WXE49318EB604CF00B" ؛ // رقم المؤسسة-> الإعدادات-> معلومات رقم المؤسسة-> معلومات الحساب السلسلة الخاصة = "M-yfkmgl_kxbvetginzh3rqwbz4xb6mfeqxxlk77mkpxzenfdyq-ugerxduf8rel" ؛ // Enterprise Number-> Settings-> STEPSSIONAL STEPSS- context httpservletresponse استجابة ؛ wxbizmsgcrypt wxcpt = null ؛ Public StationResource () {try {wxcpt = new WxBizMsgCrypt (token ، encodingaeskey ، corpid) ؛ } catch (aesexception e) {E.PrintStackTrace () ؛ }} // احصل على رمز Access URL الخاص بالسلسلة الثابتة النهائية access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken" ؛ // قم بإنشاء طلب url الخاص بالجلسة url سلسلة ثابتة خاصة بـ create_session_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send؟access_token=" ؛ // احصل على رمز الوصول إلى الواجهة العامة getAccessToken () {httpclient client = new httpclient () ؛ postmethod post = new postmethod (Access_token_url) ؛ post.ReLeasEconnection () ؛ post.setRequestHeader ("نوع المحتوى" ، "التطبيق/x-www-form-urlencoded ؛ charset = utf-8") ؛ nameValuePair [] param = {new nameValuePair ("corpid" ، corpid) ، new NameValuePair ("CorpSecret" ، secret)} ؛ // تعيين سياسة لمنع الإبلاغ عن أخطاء ملفات تعريف الارتباط من DefaultHttParams.getDefaultParams (). // تعيين المعلمات للنشر المنشور post.setRequestBody (param) ؛ نتيجة السلسلة = "" ؛ حاول {client.executemethod (post) ؛ النتيجة = سلسلة جديدة (post.getResponseBondAssTring (). getBytes ("GBK")) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } // تحويل البيانات إلى JSON JSONOBJECT JASONOBJECT ؛ jasonobject = jsonobject.fromObject (النتيجة) ؛ النتيجة = (سلسلة) jasonobject.get ("access_token") ؛ post.ReLeasEconnection () ؛ System.out.println (نتيجة) ؛ نتيجة العودة } / * * ------------------------------- عند تشغيل المؤسسة على وضع رد الاتصال ، سيرسل رقم المؤسسة طلب الحصول على عنوان URL للتحقق * لنفترض أنه عند النقر فوق التحقق ، يتلقى المؤسسة طلبًا مشابهًا: الحصول على * /cgi-bin /wxpush؟ msg_signature = 5C45FF5E21C57E6AD56BAC8758B79B1D9AC89FD3 * × TAMP * = 1409659589 & nonce = 263014780 & ECHOSTR = 2fqyx3zpb4yka9skld1dsh3iyt3tp3zndtp ٪ 2b4rpcs8tgae7oabo ٪ 2bfzxvnaq ٪ 3d ٪ 3d * http/1.1 مضيف: qy.weixin.qq.com * * عند تلقي هذا الطلب ، (msg_signature) ، الطابع الزمني (الطابع الزمني) ، وسلسلة الأرقام العشوائية (nonce *) والسلاسل المشفرة العشوائية (EchoStr) التي دفعتها المنصة العامة. انتبه إلى فك تشفير URL في هذه الخطوة. 2. تحقق من صحة توقيع جسم الرسالة 3. يمكن تنفيذ الخطوة 2. 3 باستخدام وظيفة المكتبة VERIFYURL التي توفرها المنصة العامة. *// ** * عنوان URL للاتصال ، يستدعي WeChat هذه الطريقة للتحقق * * @RETURN */ GETPTAR ("Station") سلسلة Public Verify () {String msgSignature = request.getParameter ("msg_signature") ؛ سلسلة Timestamp = request.getParameter ("Timestamp") ؛ سلسلة nonce = request.getParameter ("nonce") ؛ system.out.println (timestamp + "" + nonce) ؛ سلسلة echosttr = request.getParameter ("echosttr") ؛ سلسلة sechoStr = فارغة ؛ حاول {sechostr = wxcpt.verifyurl (msgSignature ، timestamp ، nonce ، echosttr) ؛ } catch (استثناء e) {e.printstacktrace () ؛ // فشل التحقق من عنوان URL ، يرجى التحقق من الاستثناء لسبب الخطأ} إرجاع SechoStr ؛ } /* * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- msg_signature = 477715d11cdb4164915debcba66cb864d751f3e6 * × tamp = 1409659813 & nonce = 1372623149 http/1.1 مضيف: <TouserName> <! . +6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6 * +KDZ +HMZFJYUR +LTWGC2HGF5GSIJFF0EKUNXIQATP7PF5MZZ3IZON1S4ZG4LUMNER +3iqh03v +bca9nmelnqbsf6tiwsrxjb3lavgucallcrw8v2t9el4ehzjwrquax5wlvmns0 * +rupa3k22ncx4xxs9o0mbh27bpnzps +/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl */t8z1ptdave0lxdq2yoyoyh2uypzzis2pdbs8r07+qn+e7q ==] يتلقى Enterprise طلب Post ، يجب أن يتوصل إلى المعلمات على عنوان URL ، بما في ذلك توقيع جسم الرسائل (msg_signature) ، الطابع الزمني (الطابع الزمني) وسلسلة الأرقام العشوائية (nonce) * 2. تحقق من صحة توقيع الجسم. * 3. يتم تحليل البيانات المطلوبة بواسطة XML وفك تشفير محتوى علامة <Cnrypt>. النص العادي المصطلح هو النص العادي لرسالة رد المستخدم. يرجى الرجوع إلى المستند الرسمي لتنسيق النص العادي* الخطوة 2 و 3 يمكن تنفيذها باستخدام دالة المكتبة decryptmsg التي توفرها المنصة العامة. */ post @path ("Station") السلسلة العامة stensiveMsg (String reqdata) {String msgSignature = request.getParameter ("msg_signature") ؛ سلسلة Timestamp = request.getParameter ("Timestamp") ؛ سلسلة nonce = request.getParameter ("nonce") ؛ // بيانات النص المشفر المطلوب بواسطة post // string sreqdata = // "<xml> <TouserName> <! ata [rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHHGD3QCZCDCUPJ911L3VG3W/SYYVUJTS3TUUKSXXACASCASS0QHXCHRRYT66WISPGLYL42A M6A8DTT+6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6+KDZ+HMZFJYUR+LTWGC2HGF5GS IJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUNGLEVW2R+KQCKIW+3IQH03V+BCA9NMELNQBSF6T iwsrxjb3lavgucallcrw8v2t9el4ehzjwrquax5wlvmns0+rupa3k22ncx4xzs9o0mbh27bo6bp nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyoyyh2uypizis2pdbs8r07+qn+e7q ==]] حاول {String smsg = wxcpt.decryptmsg (msgSignature ، timestamp ، nonce ، reqdata) ؛ // تحليل محتوى علامة XML plaintext لمعالجة documentBuilderFactory dbf = documentBuilderfactory.newinstance () ؛ documentBuilder db = dbf.newdocumentBuilder () ؛ StringReader Sr = New StringReader (smsg) ؛ Inputsource هو = New Inputsource (SR) ؛ وثيقة المستند = db.parse (IS) ؛ العنصر جذر = document.getDocumentElement () ؛ nodelist nodeList1 = root.getElementsByTagName ("المحتوى") ؛ if (nodelist1.item (0) == null) return "ok" ؛ content string = nodelist1.item (0) .getTextContent () ؛ System.out.println ("المحتوى:" + المحتوى) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ // فشل فك التشفير ، يرجى التحقق من الاستثناء من الفشل} الإرجاع "OK" ؛ } / * * -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- لنفترض أن الشركة تحتاج إلى الرد على نص المستخدم العادي على النحو التالي: <xml> * <TouserName> <! <sggtype> <! stamp stamp وسلسلة رقم عشوائية (nonCe) لإنشاء توقيع هيئة الرسائل ، أو استخدام القيمة المقابلة المحلية مباشرة من عنوان url post * للمنصة العامة. 2. تشفير النص العادي للحصول على نص تشفير. * 3. استخدم نص الشفرات ، الطابع الزمني ، NONCE الذي تم إنشاؤه في الخطوة 1 والرمز المميز الذي حددته المؤسسة على النظام الأساسي العام لإنشاء توقيعات هيئة الرسائل. * 4. لصق النص المشفر ، توقيع جسم الرسائل ، الطابع الزمني ، وسلسلة الأرقام العشوائية في سلسلة بتنسيق XML وأرسلها إلى المؤسسة. * يمكن تنفيذ الخطوات أعلاه 2 و 3 و 4 باستخدام تشفير وظيفة المكتبة التي توفرها النظام الأساسي العام. ام "<xml> <TouserName> <! username> <CreateTime> 1348831860 </treeTime> <sgtype> <! هو اختبار]]> </content> <sgid> 1234567890123456 </sggid> <AcenterId> 1 </agentId> </sml> "؛ حاول {string sencryptmsg = wxcpt.encryptmsg (srespdata ، timestamp ، nonce) ؛ System.out.println ("بعد تشفير sencrytmsg:" + sencryptmsg) ؛ استجابة. } catch (استثناء e) {E.PrintStackTrace () ؛ // Encryption فشل} // return srespdata ؛ } /** * يمكن أن ترسل هذه الطريقة أي نوع من الرسائل * * param msgtype * نص | صورة | صوت | ملف | news * param touser * قائمة معرف الأعضاء (يتم فصل المستفيدين من الرسائل ، ويتم فصل العديد من المستلمين عن طريق '|' ، ويتم دعم ما يصل إلى 1000). الحالة الخاصة: المحددة على أنها @gall ، سيتم إرسال * @param topy * قائمة معرف القسم لجميع الأعضاء الذين يتبعون تطبيق المؤسسة. يتم فصل العديد من المستفيدين عن طريق '|' ، ودعم ما يصل إلى 100. تجاهل هذه المعلمة عندما يكون touser هو @gall * param totag * قائمة معرف العلامة ، يتم فصل العديد من المستلمين بواسطة '|'. تجاهل هذه المعلمة عندما يكون touser هو @all * @param content * عندما msgtype = نص ، محتوى الرسائل النصية * param mediaid * عندما msgtype = صورة | صوت | فيديو ، معرف معلومات الرسالة المقابل (-------) param picurl * عندما يشير msgtype = news ، مسار الصورة * param safe * إلى ما إذا كانت رسالة سرية ، يشير 0 إلى لا ، 1 يشير إلى نعم ، الافتراضي 0 */ public void sendwechatmsg (String msgtype ، string touser ، string topy ، string totag ، String MediaId ، عنوان السلسلة ، السلسلة url ، سلسلة. string access_token = getAccessToken () ؛ // string request string string action = create_session_url + access_token ؛ // تغليف إرسال رسالة طلب json stringbuffer sb = new StringBuffer () ؛ sb.append ("{") ؛ sb.append ("/" touser/":" + "/" " + touser +"/"،") ؛ sb.append ("/" toparty/":" + "/" " + toparty +"/"،") ؛ sb.append ("/" totag/":" + "/" " + totag +"/"،") ؛ if (msgtype.equals ("text")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" text/":" + "{") ؛ sb.append ("/" content/":" + "/" " + content +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("Image")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" Image/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("صوت")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" voice/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" video/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"،") ؛ sb.append ("/" title/":" + "/" " + title +"/"،") ؛ sb.append ("/" description/":" + "/" " + description +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("file")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" file/":" + "{") ؛ sb.append ("/" media_id/":" + "/" " + mediaid +"/"") ؛ sb.append ("}") ؛ } آخر إذا (msgtype.equals ("news")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/"،") ؛ sb.append ("/" news/":" + "{") ؛ sb.append ("/" المقالات/":" + "[") ؛ sb.append ("{") ؛ sb.append ("/" title/":" + "/" " + title +"/"،") ؛ sb.append ("/" description/":" + "/" " + description +"/"،") ؛ sb.append ("/" url/":" + "/" " + url +"/"،") ؛ sb.append ("/" picurl/":" + "/" " + picurl +"/"") ؛ sb.append ("}") ؛ sb.append ("]") ؛ sb.append ("}") ؛ } sb.append ("،/" Safe/":" + "/" " + Safe +"/"،") ؛ sb.append ("/" AgentId/":" + "/" " + AgentId +"/"،") ؛ sb.append ("/" debug/":" + "/" " +" 1 " +"/"") ؛ sb.append ("}") ؛ String json = sb.toString () ؛ حاول {url = url new (Action) ؛ httpsurlconnection http = (httpsurlConnection) url.openconnection () ؛ http.setRequestMethod ("post") ؛ http.setRequestProperty ("نوع المحتوى" ، "التطبيق/json ؛ charset = utf-8") ؛ http.setDooutput (true) ؛ http.setDoInput (true) ؛ System.SetProperty ("sun.net.client.defaultConnectTimeout" ، "30000") ؛ // // timeout timeout 30 ثانية System.SetProperty ( // // قراءة المهلة 30 ثانية http.connect () ؛ OutputStream OS = http.getOutputStream () ؛ OS.Write (json.getbytes ("utf-8")) ؛ // pass in parameter inputStream is = http.getInputStream () ؛ int size = is.available () ؛ byte [] jsonbytes = new byte [size] ؛ is.read (jsonbytes) ؛ String Result = new String (Jsonbytes ، "UTF-8") ؛ System.out.println ("RESET RESETTS RESORD:" + result) ؛ os.flush () ؛ OS.Close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} public static void main (string [] args) {stationResource weChat = new StationResource () ؛ // wechat.sendwechatmsgtext ("@all" ، "2" ، "" ، "إعلام مركز المعلومات" ، "0") ؛ wechat.sendwechatmsg ("News" ، "@all" ، "" ، "،" ، "،" test senmsg "،" ، "،" تم اختباره "،" تم اختباره حقًا "،" http://www.baidu.com "، ، ، ،" "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg" ، "0") ؛ }}ما ورد أعلاه هو التحقق/إرسال حساب WeChat Enterprise/استلامه المقدمة لك من قبل المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!