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
* 플랫폼 요구 사항 : 서블릿 사용 주석지, 플랫폼 요구 사항 : J2EE6.0+, JDK6.0+, Tomcat7.0+
* 데모는 API 구문 분석에 더 중점을 둡니다.
* 테스트 지침을 위해 각 테스트 사례는 독립적이며 다른 방법에 의존하지 않습니다. 포장을 많이 고려하지 마십시오.
* 시연은 API 요구 사항에 따라 가능한 한 많이 수행됩니다. 목적 : 문서가 어떻게 사용되는지 이해하고 한 예에서 학습의 효과를 달성하고 다른 예제에 적용합니다.
* 지식 요구 사항 : Solid Java Foundation, HTTP 네트워크 커뮤니케이션 지식 이해, Javaweb, JSON 분석에 대한 충분한 이해
* 데모 소스 코드 의이 부분은 각 기사의 끝에 제공됩니다. API를 분석 한 후 모든 데모 소스 코드는 소스 코드 패키지 형식으로 제공됩니다.
* 현재 시간 : 4/3/2016 5:32:57 PM, 이번에는 우세합니다.
2. 원본 텍스트 메시지 관리 문서 (초록)
• 문서 주소 : http://mp.weixin.qq.com/wiki/17/F29879F8FB29AB98B2F2971D42552FD.html
• 메시지 관리
◦ 메시지 재주문 일반 메시지
◦ 메시지 평가 이벤트 추진
◦ Message-Passive Reply 메시지를 작성합니다
◦ 수동적 인 응답시 메시지 암호화 및 암호 해독을 세웁니다
◦ 메시지 고객 서비스 메시지를 작성합니다
◦ Message Massage Interface를 작성합니다
◦ Message-Template 메시지 인터페이스를 작성합니다
◦ Message-Template 메시지 작업 사양을 작성합니다
◦ 공식 계정에 대한 자동 응답 구성을 얻습니다
3. 문서 이해
• 메시지를받습니다
◦ 문서는 다음을 설명합니다. 일반적인 WeChat 사용자가 공개 계정으로 메시지를 보내면 WeChat 서버는 게시자가 작성한 URL에 게시 메시지의 XML 데이터를 패키지합니다.
◦ 이해 : WeChat 서버는 사용자가 보낸 메시지를 포스트 스트림 형식으로 Req로 반환합니다. 사용자가 보내는 메시지를 받으려면 req.getInputStream ()을 통해 메시지를받을 수 있습니다. 물론, 우리는 문서의 XML 형식을 기반으로 필요한 구문 분석을 수행 할 수 있습니다.
◦
성취하다:
/**이 부분에서는 사용자가 보낸 정보를 얻고 디스플레이* /// 사용자가 보낸 정보를 구문 분석하려면 <k, v>로 구문 분석합니다. inputStream is = req.getInputStream (); // 요청 스트림을 가져옵니다. // 구문 분석 된 결과를 해시 맵 <string, string, map = new Hashmap <string, string> (); // 구문 분석 XML에 구문 분석 한 텍스트 정보에 사용되는 텍스트 정보를 구문 분석합니다. xml] 문서 문서 = null; try {document = reader.read (is);} catch (documentexcept e1) {// todo 자동 생성 캐치 블록 e1.printstacktrace ();} // xml root 요소 root get xml element list (); e : elementList) map.put (e.getName (), e.getText ()); // 테스트 출력 세트 <string> keyset = map.keyset (); // 테스트 출력이 구문 분석 한 후 사용자가 보낸 정보는 사용자 시스템에 의해 전송됩니다. for (string key : keyset) {system.out.println (key + ":" + map.get (key));} system.out.println (tag + ": 사용자가 보낸 정보를 구문 분석하기 위해 끝); • 메시지를 보내십시오
◦ 문서는 다음을 설명합니다. 사용자가 공식 계정으로 메시지를 보내거나 (또는 특정 사용자 작업에 의해 이벤트를 추진할 때) 게시물 요청이 생성됩니다. 개발자는 응답 패키지에서 특정 XML 구조를 반환하여 메시지에 응답 할 수 있습니다 (이제 응답 텍스트, 그림, 텍스트, 음성, 비디오 및 음악을 지원합니다). 엄격히 말하면, 수동적 응답 메시지를 보내는 것은 실제로 인터페이스가 아니라 WeChat 서버로 전송 된 메시지에 대한 답장입니다.
◦ 이해 : 사용자가 요청을 보내면 사후 요청이 생성되며 Respone을 통해 메시지에 회신 할 수 있습니다. 그러나 회신 내용에는 엄격한 형식 요구 사항이 있습니다. 형식 요구 사항이 충족 된 경우에만 WeChat 서버 프로세스가 처리되어 사용자에게 반환됩니다. 문서 "메시지 관리"모듈을 보면 WeChat에 다양한 메시지가 있으며 각 유형의 메시지에는 고유 한 특정 형식 요구 사항이 있음을 알 수 있습니다. 우리는 요구 사항에 따라 특정 정보를 사용자에게 정상적으로 반환해야합니다. 우리는 필요한 문서 형식의 텍스트 정보 및 그래픽 메시지가있는 사용자에게 답장을 시도합니다. 초점 : 문서 요구 사항에 따라 필요한 매개 변수를 구성하십시오. 특별 참고 : 매개 변수는 대소 문자를 민감합니다.
◦ 정상 문자 메시지에 대한 1- 상영 :
// 예제 1 : 일반 문자 메시지 보내기, "응답 문자 메시지"에 대한 문서의 XML 형식을 확인하십시오. 1 단계 : 필요한 매개 변수 구성 textmsg extmsg = new Textmsg (); textmsg.get ( "fromUsername"); // "사용자"오프 라이트를 보내고 받으십시오. textmsg.setfromusername (map.get ( "tousername")); textmsg.setcreateTime (new date (). gettime ()); // 메시지 작성 시간 (정수) textmsg.setmsgtype ( "text"); // 텍스트 메시지 textmsg.setcontent ( "i server to the user to the x a the sever the sever the the the sever the the the sever to the sever the the sever to the sever the the the the the sever the the sever the the sever step the the sec WeChat [Baidu : xstream bean to xml] xstream xstream = new xstream (); xstream.alias ( "xml", textmsg.getclass ()); String Textmsg2xml = xstream.toxml (textmsg); system.out.println (textmsg2xml); // the the xml the the the the the the the the the the the the the the the the Textms Gomport); WeChat 서버로, 서버는 사용자 printwriter printwriter = resp.getwriter (); printwriter.print (textmsg2xml)로 전달합니다.
◦ 문자 메시지에 대한 2-----
// 예제 2, 그래픽 및 문자 메시지를 보내십시오. 문서의 XML 형식을 확인하십시오. "문자 메시지에 대한 답장"// 1 단계 : 문자 메시지 목록에 필요한 매개 변수를 구성하십시오. 텍스트 메시지 목록 <article> articles = new arraylist <article (); art a = new article (); A.SETPICURL ( "http://b.hiphotos.baidu.com/image/pic/item/08f790529829822720EA58BA7CCB0A46F21FAB50.jpg"); //이 주소는 유효한 이미지 주소입니다. image "); articles.add (a); picandTextmsg picandTextmsg = new PicandTextMsg (); picandTextmsg.setTounsername (map.get ("fromUsername ")); //"사용자 "메시지를 보내고 받고 반대 PicandTextMsg.setfromUsername ("tousername ")); 날짜 (). gettime ()); // 메시지 생성 시간 (정수) picandtextmsg.setmsgtype ( "News"); // 그래픽 및 텍스트 유형 메시지 picandtextmsg.setarticlecount (1); picandtextmsg.setarticles (articles); // 두 번째 단계는 구성된 정보를 wechat [baidu : xstream bean으로 xml로 인식하는 XML 형식으로 변환하는 것입니다. PicandTextmsg2xml = xstream.toxml (picandtextmsg); system.out.println (picandtextmsg2xml); // 세 번째 단계는 XML의 형식 정보를 WeChat 서버로 전송하는 것입니다. 그리고 서버는 사용자 printwriter로 전달됩니다. 이 부분의 모든 작업 소스 코드는 직접 사용할 수 있습니다.
• Coreservlet.java (서버 액세스, 사용자 메시지 수신, 일반 문자 메시지에 대한 답장 및 그래픽 메시지에 대한 응답 포함. 타사 항아리 : Dom4j, Xstream)
package com.gist.servlet; import java.io.ioexception; import java.io.inputStream; import java.io.printwriter; import java.security.messagegegest; import java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.uray; java.util.hashmap; import java.util.list; import java.util.map; import java.util.set; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.httpservlet; import; javax.servlet.http.httpervletrequest; import javax.servlet.http.htttp.httpervletresponse; import org.dom4j.document; import org.dom4j.documentexception; import org.dom4j. Element; import org.dom4j.io.saxreader; import com.gen.article; com.gist.bean.picandtextmsg; import com.thoughtworks.xstream.xstream;/** * @author gao yuan </n> 이메일 : [email protected] </n> 블로그 http://blog.csdn.net/wgyscsf </n> * 작성 기간 2016-3 4:34:05 PM. */@webservlet ( "/coreservlet") public class coreservlet는 httpservlet {private static final long serialversionuid = 1l을 확장합니다. 문자열 태그 = "Coreservlet"; / * * 2 단계 : 개발자가 정보를 제출 한 후 서버 주소의 유효성을 확인하면 WeChat 서버는 채워진 서버 주소 URL에 GET 요청을 보냅니다. * GET 요청에는 서명, 타임 스탬프, Nonce, echoStr * 개발자가 서명을 확인하여 요청을 확인합니다 (아래에 확인 방법이 있음). GET 요청이 WeChat 서버에서 나온지 확인하면 Echostr 매개 변수 내용을 그대로 반환하십시오. *, 액세스가 적용되고 개발자가 성공적으로 발생하면 액세스가 실패합니다. * * 암호화/점검 프로세스는 다음과 같습니다. 1. 1. 토큰, 타임 스탬프 및 Nonce 2의 사전 순서 순서 정렬 세 가지 매개 변수 문자열을 SHA1 암호화를위한 문자열로 스플 라이스. 시퀀스를 형성하는 변수. 이 방법은 알파벳 순서로 또는 소형 및 많은 순서로 소형에서 큰 시퀀스를 형성하는 것입니다. */ @override Protected Void doget (httpservletrequest req, httpservletrepsonse resp) servletexception, ioexception {// 인코딩 req.setcharacterencoding ( "utf-8"); resp.setContentType ( "html/text; charset = utf-8"); resp.setcharacterencoding ( "UTF-8"); // 출력 스트림 get stream printwriter printwriter = resp.getWriter (); // 글로벌 토큰을 설정하면 개발자가 직접 설정합니다. API는 다음을 설명합니다. 토큰은 개발자가 의지적으로 채울 수 있습니다. // 생성 서명으로 사용됩니다 (토큰은 보안을 확인하기 위해 인터페이스 URL에 포함 된 토큰과 비교됩니다) 문자열 토큰 = "WGYSCSF"; // API 설명에 따르면 위의 네 매개 변수를 얻으십시오. string signature = req.getParameter ( "signature"); String timestamp = req.getParameter ( "timestamp"); 문자열 nonce = req.getParameter ( "nonce"); 문자열 echostr = req.getParameter ( "echostr"); // temp : 임시 인쇄, 반환 매개 변수 상황을 시청 // system.out.println (tag + ": 서명 :" + signature + ", timestamp :"// + timestamp + ", nonce :" + nonce + ", echostr :" + echostr); // API에서 언급 한 "암호화/검증 프로세스"에 따라 액세스합니다. 총 1 단계 : 정렬 사전 순서, 타임 스탬프, 3 개의 매개 변수 문자열 문자열 [] parms = new String [] {토큰, 타임 스탬프, nonce}; // 배열 배열에서 정렬 해야하는 문자열을 배열 (parms. 암호화 // 문자열 string parmsstring = ""; // 여기에서 null이 될 수는 없습니다. for (int i = 0; i <parms.length; i ++) {parmsstring+= parms [i]; } // SHA1 암호화 문자열 mparms = null; // 암호화 된 결과 MessageDigest 다이제스트 = null; try {digest = java.security.messagedigest.getinstance ( "sha"); } catch (nosuchalgorithmexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } digest.update (parmsstring.getBytes ()); 바이트 messageDigest [] = digest.digest (); // hex 문자열 생성 stringbuffer hexstring = new StringBuffer (); // 바이트 배열을 16 진수로 변환합니다 (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 (); // 암호화 결과/ * * API 요구 사항 : GET 요청이 WeChat 서버에서 오는지 확인하면 eCHOSTR 매개 변수 컨텐츠를 그대로 반환하면 액세스가 효과적으로 발생하여 개발자가됩니다. 그렇지 않으면 액세스가 실패합니다. *// 3 단계 : 개발자는 암호화 된 문자열을 얻고 서명과 비교하여 요청이 WeChat의 성공적인 액세스에서 비롯된 것을 식별 할 수 있습니다. // system.out.println (tag + ":" + mparms + "--->" + 서명); if (mparms.equals (signature)) {// system.out.println (tag + ":" + mparms + "---->" + signature); printwriter.write (echostr); } else {// 액세스 실패, // system.out.println (tag + "ac }} / * * 메시지 보내기 및 수신 및 기본적으로 동일한 메시지 형식을 눌러 API 문서를 확인하십시오. 다음 형식에서와 같이 : <xml> * <tousername> <! <content> <! [CDATA [이것은 테스트입니다]]> </content> * <sgid> 1234567890123456 </msgid> </xml> 그러면 통합 처리를 수행 할 수 있습니다. * / / * * 먼저 입력 스트림을 얻고 입력 스트림의 정보를 보자. 인쇄물 흐름을 테스트함으로써 사용자가 요청할 때마다 REQ 요청을받는 것을 알 수 있습니다. 요청 형식은 XML 형식이며 문서에 설명되어 있습니다. * / / * * req.getInputStream ()은 한 번만 검색 할 수 있으며 한 번만 읽을 수 있습니다. 여러 번 읽으려면 다른 방법을 찾아야합니다. 단순화를 위해 * 우리는 req.getInputStream () 만 한 번만 얻지 만 출력 스트림 정보를 더 이상 인쇄하지 않습니다. 구문 분석 된 정보를 직접 인쇄하십시오. */ @override Protected Void Dopost (httpservletrequest req, httpservletrepsonse resp) servletexception, ioexception {// 인코딩 req.setcharacterencoding ( "utf-8"); resp.setContentType ( "html/text; charset = utf-8"); resp.setcharacterencoding ( "UTF-8"); /**이 부분에서 우리는 사용자가 보낸 정보를 얻고 디스플레이를 위해 <k, v>로 구문 분석*/////////// // inputStream is = req.getInputStream (); // 요청 스트림을 가져옵니다. // parses XML, 획득 된 반환 결과 XML을 텍스트 정보로 구문 분석합니다. saxReader reader = new SaxReader (); // Third-Party Jar : DOM4J [Baidu : SaxReader Parsing XML] 문서 = NULL; try {document = reader.read (is); } catch (DocumentException e1) {// todo 자동 생성 캐치 블록 e1.printstacktrace (); } // XML root 요소 lement root = document.getRootElement (); // 루트 요소 목록의 모든 자식 노드를 가져옵니다 <EMENTMENTLIST = root.elements (); // (요소 e : elementList) map.put (e.getName (), e.getText ())에 대한 모든 자식 노드를 가로지 릅니다. // 테스트 출력 세트 <string> keyset = map.keyset (); // 분석 시스템 이후 사용자가 보낸 출력 메시지를 테스트합니다. for (string key : keyset) {system.out.println (key + ":" + map.get (key)); } system.out.println (tag + ": 사용자가 보낸 정보를 구문 분석 종료"); / * *이 부분에서는 문서의 필요한 형식에 따라 텍스트 정보와 그래픽 메시지를 사용자에게 응답하려고합니다. 초점 : 문서 요구 사항에 따라 필요한 매개 변수를 구성하십시오. 특별 참고 : 매개 변수는 대소 문자를 민감합니다. *// // 예 1 : 일반 문자 메시지 보내기, "답장 문자 메시지"에 대한 문서의 XML 형식을 확인하십시오. // // 1 단계 : 응답 텍스트 정보에 따라 필요한 매개 변수를 구성 // textmsg = new TextMsg (); // textmsg.settouserName (map.get ( "fromUserName")); // 메시지를 보내고 받고 "사용자"를 정확히 반대 // textmsg.setfromusername ( "tousername")); // textmsg.setcreateTime (new date (). gettime ()); // 메시지 생성 시간 (정수) // textmsg.setmsgtype ( "text"); // 텍스트 유형 메시지 // textmsg.setContent ( "i 서버 답장"); // // // // // // 두 번째 단계는 구성된 정보를 WeChat [Baidu : XStream Bean으로 XML로 인식하는 XML 형식으로 변환하는 것입니다] // XStream XStream = new Xstream (); // xstream.alias ( "xml", textmsg.getClass ()); // 문자열 textmsg2xml = xstream.toxml (textmsg); // system.out.println (textmsg2xml); // // // // // // // 세 번째 단계는 XML의 형식 정보를 WeChat 서버로 보내는 것입니다. 서버는이를 사용자에게 전달합니다. // printwriter printwriter = resp.getWriter (); // printwriter.print (textmsg2xml); // // 예제 2, 그래픽 및 문자 메시지 보내기. "문자 메시지에 대한 회신"의 XML 형식에 대한 문서를 확인하십시오. 1 단계 : 문자 메시지 목록 <article> articles = new ArrayList <article> ()에 따라 필요한 매개 변수를 구성하십시오. 기사 a = 새 기사 (); A.SetTitle ( "나는 그림 제목입니다"); a.setUrl("www.baidu.com");// This address is after clicking on the picture and jumping a.setPicUrl("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg");// This address is a valid image address a.setDescription ( "나는 이미지의 설명입니다"); articles.add (a); picandTextMSG picandTextmsg = new PicandTextMsg (); picandtextmsg.settousername (map.get ( "fromusername")); // 반대의 반대 PicandTextMsg.setFromUserName ( "touserName")에 "사용자"메시지를 보내고받습니다. picandtextmsg.setcreateTime (new date (). gettime ()); // 메시지 생성 시간 (정수) picandtextmsg.setmsgtype ( "News"); // 그래픽 유형 메시지 picandtextmsg.setarticlecount (1); picandtextmsg.setarticles (기사); // 두 번째 단계는 구성된 정보를 WeChat [baidu : xstream bean to xml에서 xstream xstream = new xstream (); xstream.alias ( "xml", picandtextmsg.getClass ()); xstream.alias ( "항목", a.getClass ()); 문자열 picandtextmsg2xml = xstream.toxml (picandtextmsg); System.out.println (picandtextmsg2xml); // 세 번째 단계는 XML의 형식 정보를 WeChat 서버로 보내는 것입니다. 서버는 사용자 printwriter printwriter = resp.getWriter ()로 전달합니다. printwriter.print (picandtextmsg2xml); }}
• testmsg.java (일반 문자 메시지 bean)
package com.gist.bean;/** * @author gao yuan </n> 이메일 : [email protected] </n> 블로그 http://blog.csdn.net/wgyscsf </n> * 쓰기 기간 2016-4-4 2:09:27 PM */Public Class Textmsg {Private Class String Tousern; 서버 이름의 개인 문자열; 사적인 긴 CreateTime; 개인 문자열 msgtype; @override public String toString () {return "textmsg [tousername =" + tousername + ", fromUsername =" + fromUsername + ", createTime =" + createTime + ", msgtype =" + msgtype + ", content =" + content + "]; } 개인 문자열 내용; public textmsg (문자열 tousername, string fromusername, long createTime, String msgtype, String content) {super (); tousername = tousername; fromusername = fromusername; CreateTime = CreateTime; msgtype = msgtype; 내용 = 내용; } public textmsg () {super (); } public String getTouserName () {return tousername; } public void enthousername (String tousername) {tousername = tousername; } public String getFromUserName () {return fromUserName; } public void setfromusername (string fromusername) {fromusername = fromusername; } public long getCreateTime () {return createTime; } public void setCreateTime (Long CreateTime) {CreateTime = CreateTime; } public String getMsgtype () {return msgtype; } public void setmsgtype (String msgtype) {msgtype = msgtype; } public String getContent () {return 컨텐츠; } public void setContent (문자열 내용) {content = content; }}
• article.java (문자 메시지 내부의 기사 Bean)
package com.gist.bean;/** * @author gao yuan </n> 이메일 : [email protected] </n> 블로그 http://blog.csdn.net/wgyscsf </n> * 쓰기 기간 2016-4-4 2:47:08 PM */Private Public Class {Private Public Class Title; @override public String toString () {return "item [title =" + title + ", description =" + description + ", picurl =" + picurl + ", url =" + url + "]; } public string getTitle () {return title; } public void settitle (문자열 제목) {title = title; } public String getDescription () {return description; } public void setDescription (문자열 설명) {설명 = 설명; } public String getPicurl () {return picurl; } public void setpicurl (String Picurl) {picurl = picurl; } public String getUrl () {return url; } public void seturl (String URL) {url = url; } 개인 문자열 설명; 개인 문자열 picurl; 개인 문자열 URL;}
• picandtextmsg.java (그래픽 문자 메시지 bean)
package com.gist.bean; import java.util.list;/** * @author gao yuan </n> 이메일 : [email protected] </n> 블로그 http://blog.csdn.net/wgyscsf </n> * 쓰기 기간 2016-4-4-47:08 PM */public classe {public classand {public class and textg {public classand; 서버 이름의 개인 문자열; 사적인 긴 CreateTime; 개인 문자열 msgtype; 개인 int articlecount; 개인 목록 <기사> 기사; @override public String toString () {return "picandTextmsg [tousername =" + tousername + ", fromUserName =" + fromUserName + ", createTime =" + createTime + ", msgtype =" + msgtype + ", articlecount =" + articlecount = " + articles +" "; } public String getTouserName () {return tousername; } public void enthousername (String tousername) {tousername = tousername; } public String getFromUserName () {return fromUserName; } public void setfromusername (string fromusername) {fromusername = fromusername; } public long getCreateTime () {return createTime; } public void setCreateTime (Long CreateTime) {CreateTime = CreateTime; } public String getMsgtype () {return msgtype; } public void setmsgtype (String msgtype) {msgtype = msgtype; } public int getArticleCount () {return articleCount; } public void setArticleCount (int articleCount) {articleCount = articleCount; } public list <article> getarticles () {return articles; } public void setarticles (list <article> articles) {articles = articles; }}
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.