1. การทำแผนที่อินทราเน็ต
เนื่องจาก URL ของ WeChat Enterprise Account Mode รองรับการเข้าถึงชื่อโดเมนจึงคาดว่าคุณต้องลงทะเบียนเชลล์ถั่วลิสงและทำการเจาะอินทราเน็ต (มีค่าใช้จ่าย 16 หยวนในการซื้อเวอร์ชันฟรีและคุณสามารถเพิ่มชื่อโดเมนในวันถัดไปหลังจากซื้อ)
2. บัญชี WeChat Enterprise
ลงทะเบียนบัญชี WeChat Enterprise: https://qy.weixin.qq.com/ (เลือกทีมทีมไม่จำเป็นต้องได้รับการรับรอง)
ผู้ติดต่อ: สร้างองค์กรใหม่ -> ติดตามสมาชิก
บัญชีองค์กร -> แอปพลิเคชันเซ็นเตอร์ -> แอปพลิเคชันใหม่ -> แอปพลิเคชันข้อความ -> การเลือกโหมด (โหมดโทรกลับ) -> เปิดการส่งต่อข้อความ WeChat
คำอธิบายโหมดการโทรกลับ: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%BC%8F
การเข้ารหัสโหมดการโทรกลับและรหัสถอดรหัส: 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:
การตั้งค่า -> การตั้งค่าฟังก์ชั่น -> การจัดการสิทธิ์ -> กลุ่มการจัดการใหม่ -> สิทธิ์การใช้งาน (ความลับ)
3. ใช้ Jersey เพื่อพัฒนาบริการเว็บ
3.1 กำหนดโทเค็นในชั้นเรียนรหัสผ่านสุ่ม 43 หลัก, บริษัท Corpid, Secret
3.2 วิธีการตรวจสอบ
/ * * ----------------------------- เมื่อองค์กรเปิดโหมดการโทรกลับหมายเลของค์กรจะส่งคำขอ GET ไปยัง URL การตรวจสอบ * สมมติว่าเมื่อคลิกการตรวจสอบองค์กรจะได้รับคำขอที่คล้ายกัน: GET * /CGI-BIN /WXPUSH × tamp * = 1409659589 & nonce = 263014780 & echosttr = p9nazczydtytweshep1vc5x9xho% * 2FQYX3ZPB4YKA9SKLD1DSH3IYT3TP3ZNDTP%2B4RPCS8TGAE7OABO%2BFZXVNAQQ%3D%3D * HTTP/1.1 โฮสต์: Qy.Weixin.qq.com * (msg_signature), การประทับเวลา (การประทับเวลา), สตริงหมายเลขสุ่ม (nonce *) และสตริงที่เข้ารหัสแบบสุ่ม (echostr) ผลักโดยแพลตฟอร์มสาธารณะ ให้ความสนใจกับการถอดรหัส URL ในขั้นตอนนี้ 2. ตรวจสอบความถูกต้องของข้อความที่มีลายเซ็นของร่างกาย 3. * ถอดรหัสข้อความ echosttr ต้นฉบับปฏิบัติต่อข้อความต้นฉบับเป็นการตอบสนองของคำขอ GET และส่งกลับไปยังแพลตฟอร์มสาธารณะ ขั้นตอนที่ 2. 3 สามารถนำไปใช้งานได้โดยใช้ฟังก์ชั่นไลบรารี VerifyURL ที่จัดทำโดยแพลตฟอร์มสาธารณะ *// ** * URL การโทรกลับ WeChat เรียกวิธีนี้เพื่อตรวจสอบ * * @return */ @get @path ("สถานี") สตริงสาธารณะยืนยัน () {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("timestamp"); String nonce = request.getParameter ("nonce"); System.out.println (timestamp + "" + nonce); String echosttr = request.getParameter ("echosttr"); String sechosttr = null; ลอง {sechosttr = wxcpt.verifyurl (msgsignature, timestamp, nonce, echostr); } catch (Exception E) {E.printStackTrace (); // url การตรวจสอบล้มเหลวโปรดดูข้อยกเว้นสำหรับเหตุผลข้อผิดพลาด} return sechoStr; -3.3 รับข้อมูลผู้ใช้และถอดรหัส
- - - * <tousername> <! [cdata [wx5823bf96d3bd56c7]]> </tousername *> <crypt> <! +RTK1I9QCA6AM/WVQNLSV5ZEPEUSUIX5L5X/0LWFRF0QADHHHGD3QCZCDCUPJ911L3VG3W/ * SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT6666 +6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6 * +KDZ +HMZFJYUR +LTWGC2HGF5GSIJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUMNLUMNLUMNLUMNVUNX +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRAX5WLVMNS0 * +RUPA3K22NCX4XXZS9O0MBH27BON6BPNELLZPS * +/UH9KSNLY6BHCMJU9P8G7M3FVKN28H3KDYA5PL */T8Z1PTDAVE0LXDQ2YOYYH2UYPIGHBZZIS2PDBS8R07+QN+E7Q ==]> </Encrypt> Enterprise ได้รับคำขอโพสต์ควร * 1. แยกพารามิเตอร์ออกจาก URL รวมถึงลายเซ็นของข้อความข้อความ (msg_signature), การประทับเวลา (การประทับเวลา) และสตริงหมายเลขสุ่ม (nonce) * 2 ตรวจสอบความถูกต้องของข้อความร่างกายข้อความ * 3. ข้อมูลที่ร้องขอโพสต์ถูกแยกวิเคราะห์โดย XML และถอดรหัสเนื้อหาของแท็ก <crypt> ข้อความธรรมดาที่ถอดรหัสเป็นข้อความธรรมดาของข้อความตอบกลับของผู้ใช้ โปรดดูเอกสารอย่างเป็นทางการสำหรับรูปแบบข้อความธรรมดา* ขั้นตอนที่ 2 และ 3 สามารถนำไปใช้งานได้โดยใช้ฟังก์ชั่นไลบรารี DECRYPTMSG ที่จัดทำโดยแพลตฟอร์มสาธารณะ */ @post @path ("สถานี") Public String teceiveMsg (String reqData) {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("timestamp"); String nonce = request.getParameter ("nonce"); // ข้อมูล ciphertext ที่ร้องขอโดย post // string sreqdata = // "<xml> <tousername> <! [cdata [wx5823bf96d3bd56c7]]> </tousername> <encrypt> <! [CD ata [Rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHHGD3QCZCDCUPJ911L3VG3W/SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6A8DTT+6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6+KDZ+HMZFJYUR+LTWGC2HGF5GS IJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUMNVW2R+KQCKIW+3IQH03V+BCA9NMELNQBSF6T IWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRAX5WLVMNS0+RUPA3K22NCX4XXZS9O0MBH27BO6BP nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]> </encrypt> ลอง {string smsg = wxcpt.decryptmsg (msgsignature, timestamp, nonce, reqdata); // แยกวิเคราะห์เนื้อหาของแท็ก XML ธรรมดาสำหรับการประมวลผล documentBuilderFactory dbf = documentbuilderfactory.newinstance (); DocumentBuilder db = dbf.newdocumentBuilder (); StringReader SR = ใหม่ stringReader (SMSG); InputSource คือ = new InputSource (SR); เอกสารเอกสาร = db.parse (IS); element root = document.getDocumentElement (); NodeList Nodelist1 = root.getElementByTagname ("เนื้อหา"); if (nodelist1.item (0) == null) ส่งคืน "ตกลง"; เนื้อหาสตริง = nodelist1.item (0) .getTextContent (); System.out.println ("เนื้อหา:" + เนื้อหา); } catch (Exception E) {E.printStackTrace (); // การถอดรหัสล้มเหลวโปรดตรวจสอบข้อยกเว้นสำหรับความล้มเหลว} return "ตกลง"; -3.4 ส่งข้อมูลไปยัง WeChat
การตั้งค่า -> การตั้งค่าฟังก์ชั่น -> การจัดการสิทธิ์ -> สร้างกลุ่มการจัดการใหม่ รับความลับ
/** * วิธีนี้สามารถส่งข้อความประเภทใดก็ได้ * * @param msgtype * ข้อความ | ภาพ | เสียง | วิดีโอ | ไฟล์ | ข่าว * @param touser * รายการสมาชิก ID สมาชิก (ผู้รับข้อความ, ผู้รับหลายคนถูกคั่นด้วย '|' และสูงสุด 1,000 คน) กรณีพิเศษ: ระบุเป็น @all, * จะส่ง * @param topy * รายการ ID แผนกไปยังสมาชิกทุกคนที่ติดตามแอปพลิเคชันระดับองค์กร ผู้รับหลายคนจะถูกคั่นด้วย '|' และรองรับมากถึง 100 ละเว้นพารามิเตอร์นี้เมื่อ touser เป็น @all * @param totag * รายการแท็ก ID, ผู้รับหลายคนจะถูกคั่นด้วย '|' ละเว้นพารามิเตอร์นี้เมื่อ touser คือ @ทั้งหมด * เนื้อหา @param * เมื่อ msgtype = ข้อความเนื้อหาข้อความเนื้อหาข้อความ * @param mediaid * เมื่อ msgtype = ภาพ | เสียง | วิดีโอ, ข้อมูลข้อความที่สอดคล้องกัน (-------) * @param ชื่อเรื่อง * เมื่อ msgtype = ข่าว @param picurl * เมื่อ msgType = ข่าวเส้นทางรูปภาพ * @param ปลอดภัย * ระบุว่าเป็นข้อความที่เป็นความลับ 0 หมายถึงไม่, 1 หมายถึงใช่, เริ่มต้น, 0 */ โมฆะสาธารณะ sendwechatmsg (สตริง msgtype, สตริง touser, สตริง topy, สตริง, สตริง, สตริง String Access_token = getAccessToken (); // สตริงคำขอสตริงการกระทำ = create_session_url + access_token; // encapsulate ส่งข้อความคำขอ 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 ("/" ข้อความ/":" + "{"); sb.append ("/" เนื้อหา/":" + "/" " + เนื้อหา +"/""); 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 ("/" เสียง/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/""); sb.append ("}"); } อื่นถ้า (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" วิดีโอ/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/","); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" คำอธิบาย/":" + "/" " + คำอธิบาย +"/""); sb.append ("}"); } อื่นถ้า (msgtype.equals ("ไฟล์")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" ไฟล์/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/""); sb.append ("}"); } อื่นถ้า (msgtype.equals ("ข่าว")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" ข่าว/":" + "{"); sb.append ("/" บทความ/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" คำอธิบาย/":" + "/" " + คำอธิบาย +"/","); 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 ("}"); สตริง json = sb.toString (); ลอง {url = url ใหม่ (การกระทำ); httpsurlConnection http = (httpsurlconnection) url.openconnection (); http.setrequestmethod ("โพสต์"); http.setRequestProperty ("เนื้อหาประเภท", "แอปพลิเคชัน/json; charset = utf-8"); http.setDoOutput (จริง); http.setDoInput (จริง); System.SetProperty ("sun.net.client.defaultConnectTimeOut", "30000"); // // การเชื่อมต่อหมดเวลา 30 วินาที System.SetProperty ("sun.net.client.defaultreadtimeOut", "30000"); // // อ่านหมดเวลา 30 วินาที http.connect (); OutputStream OS = http.getOutputStream (); OS.WRITE (json.getBytes ("UTF-8")); // ผ่านในพารามิเตอร์อินพุตสตรีมคือ = http.getInputStream (); ขนาด int = is.available (); ไบต์ [] jsonbytes = ไบต์ใหม่ [ขนาด]; IS.READ (JSONBYTES); สตริงผลลัพธ์ = สตริงใหม่ (jsonbytes, "UTF-8"); System.out.println ("คำขอส่งคืนคำขอ:" + ผลลัพธ์); os.flush (); os.close (); } catch (exception e) {e.printstacktrace (); }} // รับรหัสการเข้าถึงอินเตอร์เฟสสตริงสาธารณะ getAccessToken () {httpClient client = new httpClient (); postmethod post = postmethod ใหม่ (access_token_url); Post.Releaseconnection (); post.setRequestheader ("ประเภทเนื้อหา", "แอปพลิเคชัน/x-www-form-urlencoded; charset = utf-8"); namevaluePair [] param = {ใหม่ namevaluePair ("corpid", corpid), namevaluePair ใหม่ ("Corpsecret", ความลับ)}; // กำหนดนโยบายเพื่อป้องกันข้อผิดพลาดของคุกกี้จากการถูกรายงาน defaulthttpparams.getdefaultparams (). setparameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // ตั้งค่าพารามิเตอร์สำหรับโพสต์โพสต์โพสต์โพสต์ post.setRequestBody (param); สตริงผลลัพธ์ = ""; ลอง {client.executemethod (โพสต์); result = สตริงใหม่ (post.getResponseBodyString (). getBytes ("GBK")); } catch (ioexception e) {e.printstacktrace (); } // แปลงข้อมูลเป็น json jsonobject jasonobject; jasonobject = jsonObject.Fromobject (ผลลัพธ์); result = (string) jasonobject.get ("access_token"); Post.Releaseconnection (); System.out.println (ผลลัพธ์); ผลการกลับมา; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {StationResource weChat = ใหม่ stationResource (); // wechat.sendwechatmsgtext ("@all", "2", "", "การแจ้งเตือนศูนย์ข้อมูล", "0"); wechat.sendwechatmsg ("ข่าว", "@all", "", "", "ทดสอบ senmsg", "", "ทดสอบ", "ทดสอบจริง ๆ ", "http://www.baidu.com" "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); -4. การพัฒนาเสร็จสมบูรณ์ คลาสนี้จะต้องเพิ่มลงในส่วนที่เหลือใน webx.xml เพื่อจัดการ
<!-การสนับสนุนพักผ่อน-> <!-บริการ WebSerivce หากมีการเพิ่มบริการพาพา ธ แพ็คเกจของบริการจะต้องเพิ่มลงในค่าพารามิเตอร์-> <servlet> <servlet-name> jax-rs rest servlet </servlet-name> <servlet-class> com.sun.jersey.spi.container.servlet.servlet <param-name> com.sun.jersey.config.property.packages </param-name> <param-value> com.base.pf.restful </param-value> </init-param> <load-on-startup> 2 </load-on-startup> <url-pattern>/rest/*</url-pattern> </servlet-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.defaulthttpparams; นำเข้า 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.xicp.net/security/rest/wx // https://qy.wey.weixin.qq.com // Number Enterprise-> Application Center-> ใหม่แอปพลิเคชัน-> แอปพลิเคชันประเภทข้อความ Application Private String AgentId = "1"; // หมายเลข Enterprise-> Application Center-> คลิกที่แอปพลิเคชัน-> id application id encodingaeskey = "nt6zwtvflynxohfoggozwdjpagefsv8ln5cneyw7mwl"; // Number Enterprise-> Application Center-> ใหม่แอปพลิเคชัน-> แอปพลิเคชันประเภทข้อความสตริงส่วนตัว Corpid = "WXE49318EB604CF00B"; // หมายเลข Enterprise-> Settings-> Enterprise Number Information-> ข้อมูลบัญชี Secret Secret = "M-YFKMGL_KXBVETGETGINZH3RQWBZ4XB6MFEQXXLK77MKPXZENFDYQ-UGERXDUF8REL"; // หมายเลข Enterprise-> การตั้งค่า-> การตั้งค่าฟังก์ชัน-> การจัดการสิทธิ์ @Context httpservletRequest คำขอ; @Context httpservletResponse การตอบสนอง; WxBizMSGCrypt WXCPT = NULL; Public StationResource () {ลอง {WXCPT = ใหม่ WXBIZMSGCRYPT (โทเค็น, ENCODINGAESKEY, CORPID); } catch (aesexception e) {e.printstacktrace (); }} // รับรหัสการเข้าถึง URL ส่วนตัวสุดท้ายสตริงคงที่ access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; // สร้างคำขอเซสชัน URL สตริงคงสุดท้ายส่วนตัว create_session_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="; // รับรหัสการเข้าถึงอินเตอร์เฟสสตริงสาธารณะ getAccessToken () {httpClient client = new httpClient (); postmethod post = postmethod ใหม่ (access_token_url); Post.Releaseconnection (); post.setRequestheader ("ประเภทเนื้อหา", "แอปพลิเคชัน/x-www-form-urlencoded; charset = utf-8"); namevaluePair [] param = {ใหม่ namevaluePair ("corpid", corpid), namevaluePair ใหม่ ("Corpsecret", ความลับ)}; // กำหนดนโยบายเพื่อป้องกันข้อผิดพลาดของคุกกี้จากการถูกรายงาน defaulthttpparams.getdefaultparams (). setparameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // ตั้งค่าพารามิเตอร์สำหรับโพสต์โพสต์โพสต์ post.setRequestBody (param); สตริงผลลัพธ์ = ""; ลอง {client.executemethod (โพสต์); result = สตริงใหม่ (post.getResponseBodyString (). getBytes ("GBK")); } catch (ioexception e) {e.printstacktrace (); } // แปลงข้อมูลเป็น json jsonobject jasonobject; jasonobject = jsonObject.Fromobject (ผลลัพธ์); result = (string) jasonobject.get ("access_token"); Post.Releaseconnection (); System.out.println (ผลลัพธ์); ผลการกลับมา; } / * * ----------------------------- เมื่อองค์กรเปิดโหมดการโทรกลับหมายเลของค์กรจะส่งคำขอ GET ไปยัง URL การตรวจสอบ * สมมติว่าเมื่อคลิกการตรวจสอบองค์กรจะได้รับคำขอที่คล้ายกัน: รับ * /cgi-bin /wxpush? msg_signature = 5C45FF5E21C57E6AD56BAC8758B79B1D9AC89FD3 * × TAMP * = 1409659589 & NONCE = 263014780 & ECHOSTR = P9NAZCZY 2FQYX3ZPB4YKA9SKLD1DSH3IYT3TP3ZNDTP%2B4RPCS8TGAE7OABO%2BFZXVNAQQ%3D%3D * HTTP/1.1 โฮสต์: Qy.Weixin.qq.com * (msg_signature), การประทับเวลา (การประทับเวลา) และสตริงหมายเลขสุ่ม (nonce *) และสตริงที่เข้ารหัสแบบสุ่ม (echostr) ผลักโดยแพลตฟอร์มสาธารณะ ให้ความสนใจกับการถอดรหัส URL ในขั้นตอนนี้ 2. ตรวจสอบความถูกต้องของข้อความที่มีลายเซ็นของร่างกาย 3. * ถอดรหัสข้อความ echosttr ต้นฉบับปฏิบัติต่อข้อความต้นฉบับเป็นการตอบสนองของคำขอ GET และส่งกลับไปยังแพลตฟอร์มสาธารณะ ขั้นตอนที่ 2. 3 สามารถนำไปใช้งานได้โดยใช้ฟังก์ชั่นไลบรารี VerifyURL ที่จัดทำโดยแพลตฟอร์มสาธารณะ *// ** * URL การโทรกลับ WeChat เรียกวิธีนี้เพื่อตรวจสอบ * * @return */ @get @path ("สถานี") สตริงสาธารณะยืนยัน () {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("timestamp"); String nonce = request.getParameter ("nonce"); System.out.println (timestamp + "" + nonce); String echosttr = request.getParameter ("echosttr"); String sechosttr = null; ลอง {sechosttr = wxcpt.verifyurl (msgsignature, timestamp, nonce, echostr); } catch (Exception E) {E.printStackTrace (); // ตรวจสอบ URL ล้มเหลวโปรดตรวจสอบข้อยกเว้นสำหรับเหตุผลข้อผิดพลาด} return SECHOSTR; - msg_signature = 477715d11cdb4164915debcba66cb864d751f3e6 * × tamp = 1409659813 & nonce = 1372623149 http/1.1 โฮสต์: Qy.weixin.q.com * <tousername> <! [cdata [wx5823bf96d3bd56c7]]> </tousername *> <crypt> <! +RTK1I9QCA6AM/WVQNLSV5ZEPEUSUIX5L5X/0LWFRF0QADHHHGD3QCZCDCUPJ911L3VG3W/ * SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT6666 +6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6 * +KDZ +HMZFJYUR +LTWGC2HGF5GSIJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUMNLUMNLUMNLUMNVUNX +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRAX5WLVMNS0 * +RUPA3K22NCX4XXZS9O0MBH27BON6BPNELLZPS * +/UH9KSNLY6BHCMJU9P8G7M3FVKN28H3KDYA5PL */T8Z1PTDAVE0LXDQ2YOYYH2UYPIGHBZZIS2PDBS8R07+QN+E7Q ==]> </Encrypt> Enterprise ได้รับคำขอโพสต์ควร * 1. แยกพารามิเตอร์ออกจาก URL รวมถึงลายเซ็นของข้อความข้อความ (msg_signature), การประทับเวลา (การประทับเวลา) และสตริงหมายเลขสุ่ม (nonce) * 2 ตรวจสอบความถูกต้องของข้อความร่างกายข้อความ * 3. ข้อมูลที่ร้องขอโพสต์ถูกแยกวิเคราะห์โดย XML และถอดรหัสเนื้อหาของแท็ก <crypt> ข้อความธรรมดาที่ถอดรหัสเป็นข้อความธรรมดาของข้อความตอบกลับของผู้ใช้ โปรดดูเอกสารอย่างเป็นทางการสำหรับรูปแบบข้อความธรรมดา* ขั้นตอนที่ 2 และ 3 สามารถนำไปใช้งานได้โดยใช้ฟังก์ชั่นไลบรารี DECRYPTMSG ที่จัดทำโดยแพลตฟอร์มสาธารณะ */ @post @path ("สถานี") Public String teceiveMsg (String reqData) {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("timestamp"); String nonce = request.getParameter ("nonce"); // ข้อมูล ciphertext ที่ร้องขอโดย post // string sreqdata = // "<xml> <tousername> <! [cdata [wx5823bf96d3bd56c7]]> </tousername> <encrypt> <! [CD ata [Rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHHGD3QCZCDCUPJ911L3VG3W/SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6A8DTT+6K4ASKNMPJ48KZJS8QLJVD4XGPUE06DODNLXAUHZM6+KDZ+HMZFJYUR+LTWGC2HGF5GS IJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUMNVW2R+KQCKIW+3IQH03V+BCA9NMELNQBSF6T IWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRAX5WLVMNS0+RUPA3K22NCX4XXZS9O0MBH27BO6BP nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]> </encrypt> ลอง {string smsg = wxcpt.decryptmsg (msgsignature, timestamp, nonce, reqdata); // แยกวิเคราะห์เนื้อหาของแท็ก XML ธรรมดาสำหรับการประมวลผล documentBuilderFactory dbf = documentbuilderfactory.newinstance (); DocumentBuilder db = dbf.newdocumentBuilder (); StringReader SR = ใหม่ stringReader (SMSG); InputSource คือ = new InputSource (SR); เอกสารเอกสาร = db.parse (IS); element root = document.getDocumentElement (); NodeList Nodelist1 = root.getElementByTagname ("เนื้อหา"); if (nodelist1.item (0) == null) ส่งคืน "ตกลง"; เนื้อหาสตริง = nodelist1.item (0) .getTextContent (); System.out.println ("เนื้อหา:" + เนื้อหา); } catch (Exception E) {E.printStackTrace (); // การถอดรหัสล้มเหลวโปรดตรวจสอบข้อยกเว้นสำหรับความล้มเหลว} return "ตกลง"; - - - สมมติว่า บริษัท ต้องตอบกลับข้อความธรรมดาของผู้ใช้ดังนี้: <xml> * <tousername> <! [cdata [myCreate]]> </tousername> * <fromusername> <! [cdata [wx5823bf96d3bd56c7] <msgtype> <! [cdata [text]]> </sgtype> * <เนื้อหา> <! [cdata [นี่คือการทดสอบ]]> </เนื้อหา> * <sgid> 1234567890123456 </msgid> การประทับเวลาและสตริงตัวเลขสุ่ม (nonce) เพื่อสร้างลายเซ็นของข้อความข้อความหรือใช้ค่าที่สอดคล้องกันโดยตรงที่แยกวิเคราะห์จากโพสต์ * url ของแพลตฟอร์มสาธารณะ 2. เข้ารหัสข้อความธรรมดาเพื่อรับข้อความรหัส * 3. ใช้ข้อความรหัส, การประทับเวลา, nonce ที่สร้างขึ้นในขั้นตอนที่ 1 และโทเค็นที่กำหนดโดยองค์กรบนแพลตฟอร์มสาธารณะเพื่อสร้างลายเซ็นร่างกายข้อความ * 4. splice ciphertext, Message Body Signature, Timestamp และ String หมายเลขสุ่มลงในสตริงในรูปแบบ XML และส่งไปยัง Enterprise * สามารถนำไปใช้ขั้นตอน 2, 3 และ 4 ข้างต้นได้โดยใช้ฟังก์ชั่นไลบรารี EncryptMSG ที่จัดทำโดยแพลตฟอร์มสาธารณะ */ // @get // @path ("ส่ง") โมฆะสาธารณะ sendmsg (สตริง timestamp, สตริง nonce) {สตริง srespdata = "<xml> <tousername> <! [cdata [mycreate]]> </tousername> <fromusername> <! [cdata [WXE49318EB604CF00B]> </ ชื่อผู้ใช้> <CreateTime> 1348831860 </createTime> <sgtype> <! [cdata [text]]> </sgtype> <content> <! [cdata [สิ่งนี้ คือการทดสอบ]]> </เนื้อหา> <sgid> 1234567890123456 </sgid> <gentid> 1 </agentid> </xml> "; ลอง {String sencryptmsg = wxcpt.encryptmsg (srespdata, timestamp, nonce); System.out.println ("หลังจากเข้ารหัส sencrytmsg:" + sencryptmsg); Response.getWriter (). พิมพ์ (sencryptmsg); } catch (Exception E) {E.printStackTrace (); // การเข้ารหัสล้มเหลว} // ส่งคืน srespdata; } /** * วิธีนี้สามารถส่งข้อความประเภทใดก็ได้ * * @param msgtype * ข้อความ | ภาพ | เสียง | วิดีโอ | ไฟล์ | ข่าว * @param touser * รายการสมาชิกสมาชิก (ผู้รับข้อความผู้รับหลายคนจะคั่นด้วย '|' และรองรับสูงสุด 1,000) กรณีพิเศษ: ระบุเป็น @all, * จะส่ง * @param topy * รายการ ID แผนกไปยังสมาชิกทุกคนที่ติดตามแอปพลิเคชันระดับองค์กร ผู้รับหลายคนจะถูกคั่นด้วย '|' และรองรับมากถึง 100 ละเว้นพารามิเตอร์นี้เมื่อ touser เป็น @all * @param totag * รายการแท็ก ID, ผู้รับหลายคนจะถูกคั่นด้วย '|' ละเว้นพารามิเตอร์นี้เมื่อ touser คือ @ทั้งหมด * เนื้อหา @param * เมื่อ msgtype = ข้อความเนื้อหาข้อความเนื้อหาข้อความ * @param mediaid * เมื่อ msgtype = ภาพ | เสียง | วิดีโอ, ข้อมูลข้อความที่สอดคล้องกัน (-------) * @param ชื่อเรื่อง * เมื่อ msgtype = ข่าว @param picurl * เมื่อ msgType = ข่าวเส้นทางรูปภาพ * @param ปลอดภัย * ระบุว่าเป็นข้อความที่เป็นความลับ 0 หมายถึงไม่, 1 หมายถึงใช่, เริ่มต้น, 0 */ โมฆะสาธารณะ sendwechatmsg (สตริง msgtype, สตริง touser, สตริง topy, สตริง, สตริง, สตริง String Access_token = getAccessToken (); // สตริงคำขอสตริงการกระทำ = create_session_url + access_token; // encapsulate ส่งข้อความคำขอ 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 ("/" ข้อความ/":" + "{"); sb.append ("/" เนื้อหา/":" + "/" " + เนื้อหา +"/""); 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 ("/" เสียง/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/""); sb.append ("}"); } อื่นถ้า (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" วิดีโอ/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/","); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" คำอธิบาย/":" + "/" " + คำอธิบาย +"/""); sb.append ("}"); } อื่นถ้า (msgtype.equals ("ไฟล์")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" ไฟล์/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/""); sb.append ("}"); } อื่นถ้า (msgtype.equals ("ข่าว")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" ข่าว/":" + "{"); sb.append ("/" บทความ/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" คำอธิบาย/":" + "/" " + คำอธิบาย +"/","); 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 ("}"); สตริง json = sb.toString (); ลอง {url = url ใหม่ (การกระทำ); httpsurlConnection http = (httpsurlconnection) url.openconnection (); http.setrequestmethod ("โพสต์"); http.setRequestProperty ("เนื้อหาประเภท", "แอปพลิเคชัน/json; charset = utf-8"); http.setDoOutput (จริง); http.setDoInput (จริง); System.SetProperty ("sun.net.client.defaultConnectTimeOut", "30000"); // // การเชื่อมต่อหมดเวลา 30 วินาที System.SetProperty ("sun.net.client.defaultreadtimeOut", "30000"); // // อ่านหมดเวลา 30 วินาที http.connect (); OutputStream OS = http.getOutputStream (); OS.WRITE (json.getBytes ("UTF-8")); // ผ่านในพารามิเตอร์อินพุตสตรีมคือ = http.getInputStream (); ขนาด int = is.available (); ไบต์ [] jsonbytes = ไบต์ใหม่ [ขนาด]; IS.READ (JSONBYTES); สตริงผลลัพธ์ = สตริงใหม่ (jsonbytes, "UTF-8"); System.out.println ("คำขอส่งคืนคำขอ:" + ผลลัพธ์); os.flush (); os.close (); } catch (exception e) {e.printstacktrace (); }} โมฆะคงที่สาธารณะหลัก (String [] args) {StationResource weChat = ใหม่ stationResource (); // wechat.sendwechatmsgtext ("@all", "2", "", "การแจ้งเตือนศูนย์ข้อมูล", "0"); wechat.sendwechatmsg ("ข่าว", "@all", "", "", "", "ทดสอบ senmsg", "", "ทดสอบ", "ทดสอบจริง ๆ ", "http://www.baidu.com" "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); -ข้างต้นคือข้อความการตรวจสอบบัญชี/ส่ง/รับ/รับของ WeChat Enterprise ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!