Java Wechat Public Platform Development News Management, 먼저 공식 문서를 읽어야합니다.
WeChat 메시지 관리는 일반 메시지 수신, 이벤트 푸시 수신, 메시지 보내기 (수동 회신), 고객 서비스 메시지, 대량 메시지 및 템플릿 메시지로 나뉩니다.
1. 일반 메시지를받습니다
평범한 WeChat 사용자가 공개 계정으로 메시지를 보내면 WeChat 서버는 Post 메시지의 XML 데이터 패킷을 개발자가 작성한 URL에 포장합니다.
MSGID와 관련하여 공식 설명은 각 메시지 ID와 같습니다. 재 시도 메시지 무게와 관련하여 Msgid를 큐를 사용하는 것이 좋습니다. WeChat 서버가 5 초 안에 응답을받지 못하면 요청을 분리하고 재개하고 총 세 번 다시 시도합니다.
예를 들어, 문자 메시지의 XML 예제입니다
<xml> <tousername> <! [cdata [touser]]> </tousername> <fromusername> <! 테스트]]> </content> <sgid> 1234567890123456 </msgid> </xml>
공식 문서의 다른 메시지를 확인하고 다음 메시지를 간단히 캡슐화하십시오. Abstract Base Class Abstractmsg.java
package com.phil.wechat.msg.model.req; java.io.serializable import; / ** * 기본 메시지 클래스 * * @Author Phil * */ public acpract class Abstractmsg는 시리얼이 가능성 {private static final long serialversionuid = -6244277633057415731L; 개인 문자열 tousername; // 개발자 wechat id private string fromusername; // Sender 계정 (OpenID) private String msgtype = setmsgtype (); // 메시지 유형, 예를 들어/텍스트/이미지 비공개 긴 CreateTime; // 메시지 생성 시간 (정수) Private Long Msgid; // 메시지 ID, 64 비트 정수/ ** * 메시지 유형 * * @return */ public Abstract String setmsgtype (); }문자 메시지 textmsg.java
package com.phil.wechat.msg.model.req; / *** 문자 메시지* @Author Phil* @Date 2017 년 6 월 30 일**/ public class textmsg actordmsg {private static final long serialversionuid = -1764016801417503409L; 개인 문자열 내용; // 문자 메시지 @override public String setmsgtype () {return "text"; }}다른 사람들은 이렇게 ...
2. 사용자 메시지에 수동적으로 회신합니다
WECHAT 서버가 공식 계정의 개발자 서버 주소 (개발자 센터에서 구성)로 사용자의 메시지를 보내면 WeChat 서버는 5 초 이내에 응답을받지 못하고 요청을 다시 시작하고 총 세 번 시도합니다. 디버깅 중에 사용자가 응답 메시지를받을 수 없다는 것이 발견되면 메시지 처리 시간이 초과되었는지 확인할 수 있습니다. 서버가 5 초 안에 처리하고 응답 할 것을 보장 할 수 없으면 빈 문자열에 직접 응답 할 수 있습니다. WeChat 서버는이를 처리하지 않으며 재 시도를 시작하지 않습니다.
"이 공식 계정이 당분간 서비스를 제공 할 수 없다면 나중에 다시 시도하십시오"라는 두 가지 이유가 있습니다.
예를 들어, 회신 문자 메시지 XML 예제입니다
<xml> <tousername> <! [cdata [touser]]> </tousername> <fromusername> <! </xml>
간단한 패키지로
답장 메시지 추상 기본 클래스 respabstractmsg.java
package com.phil.wechat.msg.model.resp; java.io.serializable import; / ** * 메시지 기반 클래스 (공개 계정-> 일반 사용자) * * @Author Phil * */ public acpract class respabstractmsg {// 수신기 계정 (수신) private String tousername; // 개발자 wechat id private string fromusername; // 메시지 생성 시간 (적분) 프라이빗 롱 크리젠 테레 타임; // 메시지 유형 (텍스트/음악/뉴스) 비공개 문자열 msgtype = setmsgtype (); // 메시지 유형 public Abstract String setmsgtype (); } 답장 문자 메시지 resptextmsg.java
package com.phil.wechat.msg.model.resp; / ** * 이미지 메시지에 답장 * * @Author Phil * @Data 2017 년 3 월 26 일 * */ public class respimagemsg respabstractmsg {개인 이미지 이미지; @override public String setmsgtype () {return "image"; } / ** * * @Author Phil * @date 2017 년 7 월 19 일 * / public class image {// 자료 관리의 인터페이스를 통해 멀티미디어 파일을 업로드하여 ID를 얻습니다. 개인 문자열 mediaid; public String getMediaId () {return mediaid; } public void setMediaId (String MediaId) {mediaid = mediaid; }}} 다른 메시지 유형은 다음과 같습니다.
3. 메시지 처리
마스터 XML 파싱
package com.phil.wechat.msg.controller; import java.io.ioexception; import java.io.inputstream; java.util.map import; import java.util.objects; import org.apache.commons.lang3.stringutils; import org.dom4j.documentException; import org.slf4j.logger; org.slf4j.loggerfactory; org.springframework.beans.factory.annotation.autowired; org.springframework.stereotyp.controller import; org.springframework.web.bind.annotation.requestmapping; org.springframework.web.bind.annotation.requestmethod; import com.phil.modules.config.wechatconfig; import com.phil.modules.util.msgutil; import com.phil.modules.util.signatureutil; import com.phil.modules.util.xmlutil; import com.phil.wechat.base.controller.basecontroller; import com.phil.wechat.base.result.wechatresult; import com.phil.wechat.msg.model.req.basicmsg; import com.phil.wechat.msg.model.resp.respabstractmsg; import com.phil.wechat.msg.model.resp.respnewsmsg; import com.phil.wechat.msg.model.resp.respnewsmsg; import com.phil.wechat.msg.service.wechatmsgservice; /** * @Author Phil * @Date 2017 년 9 월 19 일 */@Controller @RequestMapping ( "/wechat") 공개 클래스 WechatmsgController 확장 BaseController {private logger = loggerfactory.getLogger (this.getClass ()); @autowired private wechatmsgservice wechatmsgservice; /** * 정보가 WeChat 서버에서 전송되는지 확인하고 메시지를 처리하고 * @param out * @throws ioexception */@requestmapping (value = "/handler", method = {requestMethod.get, requestMethod.post}) public void processpost () public void processpost (this.getRequest). this.getResponse (). SetCharacterEncoding ( "UTF-8"); 부울 ispost = objects.equals ( "post", this.getRequest (). getMethod (). toupperCase ()); if (ispost) {logger.debug ( "액세스가 성공적이며 논리가 처리되고 있습니다"); String respxml = defaultmsgdispose (this.getRequest (). getInputStream ()); // processRequest (요청, 응답); if (stringUtils.isnotblank (respxml)) {this.getResponse (). getWriter (). 쓰기 (respxml); }} else {문자열 서명 = this.getRequest (). getParameter ( "signature"); // timeStamp String timestamp = this.getRequest (). getParameter ( "timestamp"); // random number string nonce = this.getRequest (). getParameter ( "nonce"); // 서명을 확인하여 요청을 확인합니다. 확인이 성공하면 Echostr을 그대로 반환하여 액세스가 성공했음을 나타냅니다. 그렇지 않으면 (signatureUtil.checksignature (signature, timestamp, nonce)) {// random string echostr = this.getRequest (). getParameter ( "echostr"); logger.debug ( "성공, echostr {}", echostr); this.getResponse (). getWriter (). 쓰기 (echostr); }}} / ** * 기본 처리 방법 * @param input * @return * @throws exception * @throws documentException * / private string defaultmsgdispose (inputStream inputStream) 예외 {string result = null; if (inputStream! = null) {map <string, string> params = xmlutil.parsestreamTomap (inputStream); if (params! = null && params.size ()> 0) {basicmsg msginfo = new Basicmsg (); 문자열 createTime = params.get ( "CreateTime"); 문자열 msgid = params.get ( "msgid"); msginfo.setcreateTime ((createTime! = null &&! " msginfo.setfromusername (params.get ( "fromusername")); msginfo.setmsgid ((msgid! = null &&! "". equals (msgid))? long.parselong (msgid) : 0); msginfo.settousername (params.get ( "tousername")); wechatresult resultObj = CoreHandler (msginfo, params); if (resultobj == null) {// return null; } 부울 성공 = resultObj.issuccess (); // true 인 경우 XML 파일이 반환되고 직접 변환 될 수 있으며, 그렇지 않으면 (성공) {result = resultObj.getObject (). toString (); } else {int type = resultObj.getType (); // 1 개의 그래픽 메시지가 여기에 지정되어 있습니다. 그렇지 않으면 (type == wechatresult.newsmsg) {respnewsmsg newsmsg = (respnewsmsg) resultObj.getObject (); 결과 = msgutil.newsmsgtoxml (newsmsg); } else {respabstractmsg basicmsg = (respabstractmsg) resultObj.getObject (); 결과 = msgutil.msgtoxml (Basicmsg); }} else {result = "msg가 잘못되었습니다"; }} 반환 결과; } / ** * 핵심 처리 * * @param msg * 메시지 기반 클래스 * @param params * xml parsed data * @return * / private wechatresult corehandler (basicmsg msg, map <string, string> params) {wechatresult result = null; 문자열 msgtype = params.get ( "msgtype"); if (stringUtils.isempty (msgtype)) {switch (msgtype) {case wechatconfig.req_message_type_text : // 문자 메시지 결과 = wechatmsgservice.textmsg (msg, params); 부서지다; case wechatconfig.req_message_type_image : // 이미지 메시지 결과 = wechatmsgservice.imagemsg (msg, params); 부서지다; case wechatconfig.req_message_type_link : // 링크 메시지 결과 = wechatmsgservice.linkmsg (msg, params); 부서지다; CASE WECHATCONFIG.REQ_MESSAGE_TYPE_LOCATE : // 지리적 위치 결과 = wechatmsgservice.locationmsg (msg, params); 부서지다; case wechatconfig.req_message_type_voice : // 오디오 메시지 결과 = wechatmsgservice.voicemsg (msg, params); 부서지다; CASE WECHATCONFIG.REQ_MESSAGE_TYPE_SHORTVIDEO : // 짧은 비디오 메시지 결과 = wechatmsgservice.shortvideo (msg, params); 부서지다; CASE WECHATCONFIG.REQ_MESSAGE_TYPE_VIDEO : // 비디오 메시지 결과 = wechatmsgservice.shortvideo (msg, params); 부서지다; CASE WECHATCONFIG.REQ_MESSAGE_TYPE_VIDEO : // 비디오 메시지 결과 = wechatmsgservice.videomsg (msg, params); 부서지다; case wechatconfig.req_message_type_event : // 이벤트 메시지 문자열 eventType = params.get ( "event"); // if (eventType! = null &&! "". 부서지다; CASE WECHATCONFIG.EVENT_TYPE_UNSUBSCRIBE : result = wechatmsgservice.unsubscribe (msg, params); 부서지다; case wechatconfig.event_type_scan : result = wechatmsgservice.scan (msg, params); 부서지다; CASE WECHATCONFIG.EVENT_TYPE_LOCATE : result = wechatmsgservice.eventLocation (msg, params); 부서지다; case wechatconfig.event_type_click : result = wechatmsgservice.eventClick (msg, params); 부서지다; case wechatconfig.event_type_view : result = wechatmsgservice.eventView (msg, params); 부서지다; CASE WECHATCONFIG.KF_CREATE_SESSION : result = wechatmsgservice.kfcreatesession (msg, params); 부서지다; CASE WECHATCONFIG.KF_CLOSE_SESSION : result = wechatmsgservice.kfclosesession (msg, params); 부서지다; CASE WECHATCONFIG.KF_CLOSE_SESSION : result = wechatmsgservice.kfclosesession (msg, params); 부서지다; CASE WECHATCONFIG.KF_SWITCH_SESSION : result = wechatmsgservice.kfswitchsession (msg, params); 부서지다; 기본값 : wechatmsgservice.eventDefaultreply (msg, params); 부서지다; } } 부서지다; 기본값 : wechatmsgservice.defaultmsg (msg, params); }} 반환 결과; }}아이디어를 제공하고 코드를 참조하면 이동하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.