WeChat 공개 계정의 개발은 일반적으로 기업 및 조직을 대상으로합니다. 개인은 구독 계정 만 신청할 수 있으며 호출하는 인터페이스는 제한적입니다. 공개 계정에 액세스하는 단계를 간략하게 설명해 봅시다.
1. 우선, WeChat 공식 계정 플랫폼에 등록 할 이메일 주소가 필요합니다.
등록 방법에는 가입 계정, 공식 계정, 미니 프로그램 및 기업 계정이 포함됩니다. 개인, 우리는 여기에서 구독 계정 만 선택할 수 있습니다.
2. 등록 후 공식 계정 플랫폼 ---> 개발 ---> 기본 구성에 로그인합니다. 여기서 URL과 토큰을 채워야합니다. URL은 서버를 사용하는 인터페이스입니다.
3. Java Web Server 프로그램이 서버에 컴파일되어 배포되어 실행할 수있는 경우 Wechat 공식 계정에서 온라인 인터페이스를 디버깅 할 수 있습니다.
1) 적절한 인터페이스를 선택하십시오
2) 시스템은이 인터페이스에 대한 매개 변수 테이블을 생성합니다. 텍스트 상자에서 해당 매개 변수 값을 직접 채울 수 있습니다 (빨간색 별표는이 필드가 필요하다는 것을 나타냅니다).
3) 문제 확인 버튼을 클릭하여 해당 디버깅 정보를 얻으십시오.
예 : Access_Token을 얻는 단계 :
1) 인터페이스 유형 : 기본 지원
2) 인터페이스 목록 : access_token 인터페이스/토큰을 얻습니다
3) 해당 매개 변수를 채우십시오 : grant_type, appid, secret
4) 문제를 확인하려면 클릭하십시오
5) 확인이 성공한 후 결과와 프롬프트가 반환되며 결과는 다음과 같습니다.
여기에 더 많은 검증이있는 것은 메시지 인터페이스 디버깅입니다 : 문자 메시지, 사진 메시지, 음성 메시지, 비디오 메시지 등.
4. 인터페이스를 이해하지 못하면 개발-> 개발자 도구-> 쿼리 개발자 문서로 이동할 수 있습니다.
5. 인터페이스 권한 : 가입 계정에는 주로 기본 지원, 메시지 수신 및 웹 서비스의 일부 인터페이스가 있습니다.
아래에서 우리는 주로 구독 계정으로 메시지를받는 방법 에 대해 이야기합니다.
1. 개인 WeChat 구독 계정을 신청해야합니다.
2. URL 서버 및 서버 측 코드 배포 (Tencent Cloud 또는 Alibaba Cloud Server를 사용할 수 있음)
1) accountsservlet.java 클래스 WeChat 서버 및 WeChat 서버에서 메시지 처리를 확인합니다.
패키지 cn.jon.wechat.servlet; import java.io.ioexception; import java.io.printwriter; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; cn.jon.wechat.service.accountsservice import; cn.jon.wechat.utils.signutil import; 공개 클래스 계정 servlet는 httpservlet {public accountsservlet () {super (); } public void destroy () {super.destroy (); // 코드를 여기에 여기에 넣습니다}/ *** 요청이 weChat 서버에서 나옵니다*/ public void doget (httpservletrequest 요청, httpservletResponse 응답)이 servletexception, ioexception {system.out.println ( "인터페이스 테스트 시작 !!!"); // weChat 암호화 서명 string signature = request.getParameter ( "signature"); // timeStamp String timestamp = request.getParameter ( "timestamp"); // 랜덤 번호 문자열 nonce = request.getParameter ( "nonce"); // random String String echostr = request.getParameter ( "echostr"); printwriter out = response.getwriter (); // 서명을 확인하여 요청을 확인하십시오. 검증이 성공적이면 Echostr을 그대로 반환합니다. 액세스가 성공했음을 나타냅니다. 그렇지 않으면 액세스가 실패하면 (signutil.checksignature (signature, timestamp, nonce)) {out.print (echostr); } out.close (); out = null; // response.encoderedirecturl ( "success.jsp"); } /*** WeChat 서버에서 보낸 프로세스 메시지* /public void dopost (httpservletrequest request, httpservletResponse 응답)는 servletexception, ioexception {// 메시지 요청에 대한 수신, 처리 및 응답을 던졌습니다. 응답 .SetchAracterEncoding ( "UTF-8"); // 메시지 및 프로세스 메시지를 받아들이려면 핵심 비즈니스 유형을 호출 문자열 RESPMESSAGE = AccionsService.ProcessRequest (요청); // 응답 메시지 printWriter out = response.getWriter (); out.print (respmessage); out.close (); } public void init ()가 servletexception {// 코드를 여기에 넣습니다}} 2) signutil.java 클래스, 요청 확인 도구 클래스, 토큰은 Wechat에 채워진 토큰과 일치해야합니다.
패키지 cn.jon.wechat.utils; java.security.messagegegest; java.security.nosuchalgorithmexception import; import java.util.arrays; import java.util.iterator; java.util.map import; java.util.set import; java.util.concurrent.concurrenthashmap import; /*** 요청 검증 도구 클래스* @Author Jon*/public class signUtil {// weChat 구성 개인 정적 문자열 토큰 = ""의 토큰과 일치합니다. "; public static boolean checksignature (문자열 서명, 문자열 타임 스탬프, String nonce) {String [] array = new String [] {Token, timestamp, nonce}; //arrays.sort(Arra); StringBuilder sb = new StringBuilder (); for (int i = 0; i <arra.length; i ++) {sb.append (arra [i]); } MessageDigest md = null; 문자열 stnstr = null; try {md = messageDigest.getInstance ( "SHA-1"); 바이트 [] digest = md.digest (sb.tostring (). getBytes ()); stnstr = bytetostr (digest); } catch (nosuchalgorithmexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } // 무료 메모리 sb = null; // SHA1의 암호화 된 문자열을 서명과 비교하여 요청이 wechat return stnstr! = null? stnstr.equals (signature.toupperCase ())에서 나온 것을 식별합니다. } / ** * 바이트 배열을 16 진수 문자열로 변환 * @param digestarra * @return * / private static string bytetoStr (byte [] digestarra) {// todo 자동 생성 메소드 스터브 문자열 digeststr = "; for (int i = 0; i <digestarra.length; i ++) {digeststr+= bytetoHexstr (digestarra [i]); } 반환 다이제스트 스트; } / *** 바이트를 육각형 문자열로 변환* / 개인 정적 문자열 bytetoHexstr (byte dbyte) {// todo 자동 생성 메소드 스터브 char [] digit = { '0', '1', '2', '3', '4', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; char [] tmparr = new char [2]; tmparr [0] = digit [(dbyte >>> 4) & 0x0f]; tmparr [1] = 숫자 [dbyte & 0x0f]; 문자열 s = 새 문자열 (tmparr); 반환 s; } public static void main (String [] args) { /*byte dbyte = 'a'; System.out.println (bytetohexstr (dbyte));*/ map <string, string> map = new ConsprenthashMap <String, String> (); map.put ( "4", "Zhangsan"); map.put ( "100", "lisi"); set set = map.keyset (); 반복자 iter = set.iterator (); while (iter.hasnext ()) {// string keyv = (string) iter.next (); 문자열 key = (string) iter.next (); System.out.println (map.get (key)); // system.out.println (map.get (iter.next ())); } /*for (int i = 0; i <map.size (); i ++) {}* /}} 3) AccountsService.java Service 클래스, 주로 메시지 요청 및 응답 처리를위한 및 사용자가 공식 계정을 팔로우하면 기본 푸시 메시지를 설정할 수 있습니다.
패키지 cn.jon.wechat.service; import java.util.date; java.util.map import; import javax.servlet.http.httpservletrequest; cn.jon.wechat.message.req.imagemessage 가져 오기; cn.jon.wechat.message.req.linkmessage 가져 오기; cn.jon.wechat.message.req.locationmessage import; cn.jon.wechat.message.req.videomessage import; cn.jon.wechat.message.req.voicemessage import; cn.jon.wechat.message.resp.textmessage 가져 오기; cn.jon.wechat.utils.messageUtil import; / *** 디퍼 커플 링, 비즈니스 로직 계층에서 제어 계층을 분리하고 주로 요청을 처리하고 응답* @Author Jon*/ public static string processRequest (httpservletRequest 요청) {String respmessage = null; // 기본적으로 리턴 된 문자 메시지 컨텐츠 respContent = "요청 처리 예외, 나중에 시도하십시오!"; 시도 {// xml 요청 구문 분석지도 <string, string> requestmap = messageUtil.parexml (request); // sender ac // 공개 계정 문자열 touserName = requestMap.get ( "touserName"); // 메시지 유형 문자열 msgtype = requestMap.get ( "msgtype"); // 기본적 으로이 문자 메시지를 기본적으로 회신합니다. textMessage defaultTextMessage = new TextMessage (); defaultTextMessage.setTounserName (FromUserName); defaultTextMessage.setfromusername (tousername); defaultTextMessage.setCreateTime (new Date (). gettime ()); defaultTextMessage.setmsgtype (messageUtil.MessSage_Type_Text); defaultTextMessage.setFuncFlag (0); // HREF 속성 값은 이중 인용문으로 야기해야하므로 문자열 자체의 이중 인용문과 충돌해야합니다. DefaultTextMessage.setContent는 "<a href =/"http://blog.csdn.net/j086924/ "> Jon 's Blog </a>"); // defaultTextMessage.setContent (getMainMenu ()); // 문자 메시지 객체를 XML 문자열로 변환 replmessage = messageUtil.textMessagetOxml (defaultTextMessage); // 문자 메시지 if (msgtype.equals (messageutil.messsage_type_text)) {// respcontent = "hi, 문자 메시지를 보내고 있습니다!"; // 문자 메시지 텍스트 메신저에 응답 textMessage = new TextMessage (); // textMessage.settouserName (tousername); // textMessage.setfromusername (fromusername); // 여기에 참고, 그렇지 않으면 메시지를 사용자 textMessage.setTouserName (fromUserName)에 응답 할 수 없습니다. TextMessage.setfromusername (tousername); TextMessage.setCreateTime (새 날짜 (). gettime ()); TextMessage.setmsgtype (messageUtil.MessSage_Type_Text); TextMessage.setfuncflag (0); respContent = "안녕하세요, 보낸 메시지는 다음과 같습니다."+requestMap.get ( "Content"); TextMessage.setContent (respcontent); respmessage = messageutil.textmessagetoxml (TextMessage); } // 이미지 메시지 else if (msgtype.equals (messageutil.messsage_type_image)) {imageMessage imagemessage = new imageMessage (); imageMessage.settouserName (FromUsername); imageMessage.setfromusername (tousername); imageMessage.setCreateTime (새 날짜 (). gettime ()); imageMessage.setmsgtype (messageUtil.messsage_type_image); //respcontent=requestmap.get("picurl "); imageMessage.setpicurl ( "http://img24.pplive.cn/2013//07//24//12103112092_230x306.jpg"); respmessage = messageutil.imagemessagetoxml (imageMessage); } // 지리적 위치 else if (msgtype.equals (messageutil.messsage_type_location)) {locationMessage locationMessage = new LocationMessage (); locationMessage.setTounserName (FromUserName); LocationMessage.setfromusername (tousername); LocationMessage.setCreateTime (새 날짜 (). gettime ()); LocationMessage.setmsgtype (MessageUtil.MessSage_Type_location); LocationMessage.setLocation_X (requestMap.get ( "location_x")); LocationMessage.setLocation_y (requestMap.get ( "location_y")); LocationMessage.setScale (requestMap.get ( "scale")); locationMessage.setLabel (requestMap.get ( "label")); respmessage = messageutil.locationmessagetoxml (locationMessage); } // 비디오 메시지 else if (msgtype.equals (messageutil.messsage_type_video)) {videomessage videomessage = new videomessage (); videomessage.settousername (fromusername); videomessage.setfromusername (tousername); videomessage.setcreateTime (new date (). gettime ()); videomessage.setmsgtype (messageutil.messsage_type_video); videomessage.setmediaid (requestmap.get ( "mediaid")); videomessage.setThumbMediaId (requestMap.get ( "whilmMediaId")); respmessage = messageutil.videomessagetoxml (videomessage); } // 링크 메시지 else if (msgtype.equals (messageutil.messsage_type_link)) {linkMessage linkMessage = new LinkMessage (); linkMessage.setTounserName (FromUserName); linkmessage.setfromusername (tousername); linkMessage.setCreateTime (새 날짜 (). gettime ()); linkmessage.setmsgtype (messageUtil.MessSage_Type_Link); linkMessage.setTitle (requestMap.get ( "title")); linkMessage.setDescription (requestMap.get ( "description")); linkMessage.setUrl (requestMap.get ( "url")); respmessage = messageutil.linkmessagetoxml (linkmessage); } // 음성 메시지 else if (msgtype.equals (messageutil.messsage_type_voice)) {voicemessage voicemessage = new VoiceMessage (); VoICEMESSAGE.SETTOUSERNAME (FromUsername); VoICEMESSAGE.SETFROMUSERNAME (TouserName); VoICEMESSAGE.SETCREATETIME (new Date (). getTime ()); VoICEMESSAGE.SETMSGTYPE (MessageUtil.MessSage_Type_voice); VoICEMESSAGE.SETMEDIAD (requestMap.get ( "mediaid")); VoICEMESSAGE.SETFORMAT (requestMap.get ( "format")); respmessage = messageutil.voicemessagetoxml (voicemessage); } // event push else if (msgtype.equals (messageutil.messsage_type_event)) {// event type string eventType = requestMap.get ( "event"); // if (eventType.equals (messageUtil.event_type_subscribe)) {respcontent = "주의를 기울여 주셔서 감사합니다!"; } // 다른 if (eventType.equals (messageUtil.event_type_unsubscribe)) {// system.out.println ( "Unsubscribe"); } else if (eventType.equals (messageUtil.event_type_click)) {// 사용자 정의 메뉴 메시지 처리 시스템.out.println ( "사용자 정의 메뉴 메시지 처리"); }}} catch (예외 e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } return respmessage; } public static string getMainMenu () {StringBuffer buffer = new StringBuffer (); Buffer.Append ( "안녕하세요, 저는 Jon입니다. Number Selection Service에 답장하십시오 :"). Append ( "/n"); buffer.append ( "1. 내 블로그"). Append ( "/n"); Buffer.Append ( "/n"); Buffer.Append ( "2. DEMENT ON DEMENT"). Append ( "/N"); Buffer.Append ( "3. Classic Game"). Append ( "/N"); Buffer.Append ( "4. 채팅 및 플레이 카드"). Append ( "/n/n"); Buffer.Append ( "Reply"+"0"+"Show Help Menu"); return buffer.toString (); }} 4) 끊임없는 정의 및 XML 메시지 변환 및 처리를 포함한 MessageUtil.java 도움말 클래스
패키지 cn.jon.wechat.utils; import java.io.inputstream; import java.io.writer; java.util.hashmap import; Java.util.list 가져 오기; java.util.map import; import javax.servlet.http.httpservletrequest; import org.dom4j.document; import org.dom4j.element; import org.dom4j.io.saxreader; cn.jon.wechat.message.req.imagemessage 가져 오기; cn.jon.wechat.message.req.linkmessage 가져 오기; cn.jon.wechat.message.req.locationmessage import; cn.jon.wechat.message.req.videomessage import; cn.jon.wechat.message.req.voicemessage import; cn.jon.wechat.message.req.voicemessage import; cn.jon.wechat.message.resp.textmessage 가져 오기; cn.jon.wechat.message.resp.musicmessage import; cn.jon.wechat.message.resp.textmessage 가져 오기; cn.jon.wechat.message.resp.textmessage 가져 오기; cn.jon.wechat.message.resp.textmessage 가져 오기; cn.jon.wechat.message.resp.textmessage 가져 오기; import com.thoughtworks.xstream.xstream; import com.thoughtworks.xstream.core.util.quickwriter; import com.thoughtworks.xstream.io.hierarchicalStreamwriter; import com.thoughtworks.xstream.io.xml.prettyprintwriter; import com.thoughtworks.xstream.io.xml.xppdriver; / *** 다양한 메시지 처리 클래스* @Author jon*/ public class messageUtil {/ *** 텍스트 유형*/ public static final String messsage_type_text = "text"; / *** 음악 유형*/ public static final string messsage_type_music = "music"; / *** 사진 유형*/ public static final String messsage_type_news = "News"; / *** 비디오 유형*/ public static final string messsage_type_video = "비디오"; / *** 이미지 유형*/ public static final String messsage_type_image = "image"; / *** 링크 유형*/ public static final String messsage_type_link = "링크"; / *** 지리적 위치 유형*/ 공개 정적 최종 문자열 messsage_type_location = "위치"; / *** 오디오 유형*/ public static final String messsage_type_voice = "음성"; / *** 푸시 유형*/ public static final String messsage_type_event = "event"; / ** * 이벤트 유형 : 구독 (구독) */ public static final String event_type_subscribe = "구독"; / ** * 이벤트 유형 : Unbscribe (구독 취소) */ public static final String event_type_unsubscribe = "구독"; / ** * 이벤트 유형 : 클릭 (사용자 정의 메뉴 클릭 이벤트) */ public static final String event_type_click = "클릭"; /** * * PARSING 요청 XML이 weChat */@suppresswarnings ( "확인되지 않은") 공개 정적 맵 <문자열, 문자열> parexml (httpservletrequest 요청)에 의해 보낸 xml 예외 {// 구문 분석 된 결과를 해시 맵 <string, string> reqmap = new hashmap <string, string> (); // 요청에서 입력 스트림을 가져옵니다. inputStream inputStream = request.getInputStream (); // 입력 스트림을 읽습니다 saxReader reader = new SaxReader (); 문서 문서 = reader.read (inputStream); // XML 루트 요소를 가져옵니다. 요소 root = document.getRootElement (); // 루트 요소 목록의 모든 자식 노드를 가져옵니다 <EMENTMENTLIST = root.elements (); // 모든 자식 노드를 수송하여 (요소 elem : elementList) {reqMap.put (elem.getName (), elem.getText ())에 대한 정보 클래스 내용을 얻습니다. } // resource inputStream.close ()를 해제합니다. inputStream = null; 반환 reqmap; } / ** * 응답 메시지를 XML로 변환하여 XML * / public static String textMessagetOxml (textMessage textMessage) {XStream.Alias ( "XML", textMessage.getClass ()); xstream.toxml을 반환합니다 (TextMessage); } / ** * 음성 객체를 XML로 변환 * * / public static String VoICEMESSAGETOXML (VoICEMESSAGE VOICEMESSAGE) {XSTREAM.ALIAS ( "XML", VoICEMESSAGE.getClass ()); xstream.toxml을 반환합니다 (VoiceMessage); } / ** * 비디오 객체를 XML로 변환 * * / public static string videomessagetoxml (videomessage videomessage) {xstream.alias ( "xml", videomessage.getclass ()); xstream.toxml을 반환합니다 (videomessage); } / ** * 음악 객체를 XML로 변환 * * / public static string musicmessagetoxml (musicmessage musicmessage) {xstream.alias ( "xml", musicmessage.getClass ()); xstream.toxml을 반환합니다 (MusicMessage); } / ** * 그래픽 객체를 XML로 변환 * * / public static string NewsMessagetOxml (NewsMessage NewsMessage) {xstream.alias ( "XML", NewsMessage.getClass ()); xstream.alias ( "항목", 새 기사 (). getClass ()); xstream.toxml을 반환합니다 (Newsmessage); } / ** * 이미지 객체를 XML로 변환 * * / public static String imageMessagetoxml (imageMessage imageMessage) {xstream.alias ( "xml", imageMessage.getClass ()); xstream.toxml을 반환합니다 (imageMessage); } / ** * 링크 객체를 XML로 변환 * * / public static string linkmessagetoxml (linkMessage linkMessage) {xstream.alias ( "xml", linkmessage.getClass ()); xstream.toxml을 반환합니다 (linkmessage); } / ** * geolocation 객체를 xml * * / public static string locateMessagetOxml (locationMessage locationMessage) {xstream.alias ( "xml", locationMessage.getClass ()); xstream.toxml을 반환합니다 (LocationMessage); } /*** CDATA 블록을 지원하기 위해 XSTREAM 확장* /private static XStream XStream = new XStream (new xppdriver () {public HierarchicalStreamWriter CreateWriter (Writer Out) {return new PrettyPrintwriter (out) {// 모든 XML 노드에 CDATA 태그 추가; StartNode (Class) {super.StartNode (Clazz) {QuickWriter, String Text) {writer.write }); } 5) Basemessage.java 메시지 기준 클래스 (개발자 wechat 계정, 사용자 계정, 생성 시간, 메시지 유형, 메시지 ID 변수), 텍스트, 비디오 및 이미지 메시지 포함은이 기본 클래스를 상속 받게 되며이 기반으로 자체 변수를 확장하여 개발자의 문서에서 다양한 메시지 속성을 기반으로 정의 할 수 있습니다.
패키지 cn.jon.wechat.message.req; /** * 메시지 기반 클래스 (일반 사용자-공개 계정) * @Author Jon */public class basemessage {// developer wechat id private String tousername; // Sender 계정 (One OpenID) 개인 문자열에서 atusername; // 메시지 생성 시간 (정수) 프라이버시 긴 CreateTime; // 메시지 유형 (텍스트/이미지/위치/링크 ...) 개인 문자열 msgtype; // 메시지 ID 64 비트 정수 비공개 문자열 msgid; 공공 Basemessage () {super (); // TODO 자동 생성 생성자 Stub} public Basemessage (문자열 tousername, string fromUsername, long createTime, String msgtype, String msgid) {super (); tousername = tousername; fromusername = fromusername; CreateTime = CreateTime; msgtype = msgtype; msgid = msgid; } 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 getMsgid () {return msgid; } public void setmsgid (String msgid) {msgid = msgid; }} 6) TextMessage.java 문자 메시지, 5의 기본 클래스에서 상속되어 콘텐츠 속성을 확장
패키지 cn.jon.wechat.message.req; /*** 문자 메시지* @author jon*/public class textMessage 확장 BaseMessage {// 메시지 내용 개인 문자열 내용; 공개 문자열 getContent () {return 컨텐츠; } public void setContent (문자열 내용) {this.content = content; }}7) imagemessage.java 이미지 메시지
패키지 cn.jon.wechat.message.req; /*** 이미지 메시지* @author jon*/public class imagemessage 확장 Basemessage {// pic link private String picurl; 공개 문자열 getPicurl () {return picurl; } public void setpicurl (String Picurl) {picurl = picurl; }} 8) videomessage.java 비디오 메시지
패키지 cn.jon.wechat.message.req; 공개 클래스 Videomessage 확장 Basemessage {private String mediaid; 개인 문자열 jummmediaid; public String getMediaId () {return mediaid; } public void setMediaId (String MediaId) {this.mediaid = mediaid; } public String getThumbMediaid () {return thumbmediaid; } public void setThumbMediaid (String ThumbMediaId) {this.thumbMediaid = thumbmediaid; }}다른 메시지 클래스는 개발자의 문서를 기반으로 스스로 완료 할 수 있습니다. 또한 개발자는 개발의 관련 콘텐츠를 테스트하기 위해 공개 플랫폼 테스트 계정을 신청할 수도 있습니다.
이 기사는 "Android WeChat Development Tutorial Summary"로 편집되었으며 "Java WeChat Development Tutorial Summary"는 모두가 배우고 읽을 수 있도록 환영합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.