[トップに置く]WeChat公衆プラットフォームjava開発詳細(工程コード+解析)


説明:今回の教程は主にWeChatの公衆プラットフォームの開発者モードについての解説で、ネット上には似たような文章がたくさんありますが、初心者の方々には霧のようなものが多いので、自分のWeChatの開発経験を総括して、WeChatの開発の全過程システムのリストを作成し、主要コードについて解説して分析しています.本文を読む前に、WeChat公衆プラットフォームの公式開発文書について知っています.受信と送信はいずれもxml形式のデータです.また、内容回答には、図霊ロボットのアプリインターフェースが使われています.これは自然言語解析のオープンプラットフォームです.WeChat全体の開発において最も難しい問題を解決してくれます.
1.1 Wechat Servlet.javaを使ってWechatServlet.javaを使って、Wechat Servlet.javaを登録して開発者モードをオープンする時、urlとtokenを記入する必要があります.コードは以下の通りです.
package demo.servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import demo.process.WechatProcess;
/**
 *            
 * 
 * @author pamchen-1
 * 
 */
public class WechatServlet extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");

		/**       xml   */
		StringBuffer sb = new StringBuffer();
		InputStream is = request.getInputStream();
		InputStreamReader isr = new InputStreamReader(is, "UTF-8");
		BufferedReader br = new BufferedReader(isr);
		String s = "";
		while ((s = br.readLine()) != null) {
			sb.append(s);
		}
		String xml = sb.toString();	//              xml  

		String result = "";
		/**              ,             echostr  ,           */
		String echostr = request.getParameter("echostr");
		if (echostr != null && echostr.length() > 1) {
			result = echostr;
		} else {
			//         
			result = new WechatProcess().processWechatMag(xml);
		}

		try {
			OutputStream os = response.getOutputStream();
			os.write(result.getBytes("UTF-8"));
			os.flush();
			os.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * The doPost method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to
	 * post.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
1.2対応するweb.xmlの構成情報は、以下の通り、Wechat Servlet.javaを生成しながら、web.xmlの構成を自動的に生成することができる.前に述べたurlのところには、例えばhttp;/サーバーアドレス/プロジェクト名/wechat.do
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>WechatServlet</servlet-name>
    <servlet-class>demo.servlet.WechatServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>WechatServlet</servlet-name>
    <url-pattern>/wechat.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
1.3以上のコードを通じて、マイクロクレジット公衆プラットフォーム開発の枠組みを実現しました.すなわち開発者モードを開通し、成功的にアクセスし、メッセージを受信し、メッセージを送信するという3つのステップです.
その核心部分について説明します.受信したxmlデータを解析し、テキスト系メッセージを例にして、図霊ロボットapiインターフェースを通じてスマートな返信を行います.2.1まず全体の流れの処理コードを見てください.xmlデータ処理、図霊api呼び出し、パッケージから戻ったxmlデータを含みます.
package demo.process;

import java.util.Date;

import demo.entity.ReceiveXmlEntity;

/**
 *   xml         
 * @author pamchen-1
 *
 */
public class WechatProcess {
	/**
	 *     xml、        (       api  )
	 * @param xml         
	 * @return	       (xml    )
	 */
	public String processWechatMag(String xml){
		/**   xml   */
		ReceiveXmlEntity xmlEntity = new ReceiveXmlProcess().getMsgEntity(xml);
		
		/**        ,       api  ,       */
		String result = "";
		if("text".endsWith(xmlEntity.getMsgType())){
			result = new TulingApiProcess().getTulingResult(xmlEntity.getContent());
		}
		
		/**   ,        “  ”,          ,result “   ”      
		 *              xml     ,                 
		 * */
		result = new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);
		
		return result;
	}
}
2.2受信したxmlデータを解析します.ここには2つのクラスがあります.ReceiveXml Enttity.javaとReceiveXml Process.javaは、反射のメカニズムによって、エンティティクラスのsetメソッドを動的に呼び出すことで、多くの繰り返しの判断を回避し、コード効率を向上させます.コードは以下の通りです.
package demo.entity;
/**
 *       xml   
 * @author pamchen-1
 *
 */
public class ReceiveXmlEntity {
	private String ToUserName="";
	private String FromUserName="";
	private String CreateTime="";
	private String MsgType="";
	private String MsgId="";
	private String Event="";
	private String EventKey="";
	private String Ticket="";
	private String Latitude="";
	private String Longitude="";
	private String Precision="";
	private String PicUrl="";
	private String MediaId="";
	private String Title="";
	private String Description="";
	private String Url="";
	private String Location_X="";
	private String Location_Y="";
	private String Scale="";
	private String Label="";
	private String Content="";
	private String Format="";
	private String Recognition="";
	
	public String getRecognition() {
		return Recognition;
	}
	public void setRecognition(String recognition) {
		Recognition = recognition;
	}
	public String getFormat() {
		return Format;
	}
	public void setFormat(String format) {
		Format = format;
	}
	public String getContent() {
		return Content;
	}
	public void setContent(String content) {
		Content = content;
	}
	public String getLocation_X() {
		return Location_X;
	}
	public void setLocation_X(String locationX) {
		Location_X = locationX;
	}
	public String getLocation_Y() {
		return Location_Y;
	}
	public void setLocation_Y(String locationY) {
		Location_Y = locationY;
	}
	public String getScale() {
		return Scale;
	}
	public void setScale(String scale) {
		Scale = scale;
	}
	public String getLabel() {
		return Label;
	}
	public void setLabel(String label) {
		Label = label;
	}
	public String getTitle() {
		return Title;
	}
	public void setTitle(String title) {
		Title = title;
	}
	public String getDescription() {
		return Description;
	}
	public void setDescription(String description) {
		Description = description;
	}
	public String getUrl() {
		return Url;
	}
	public void setUrl(String url) {
		Url = url;
	}
	public String getPicUrl() {
		return PicUrl;
	}
	public void setPicUrl(String picUrl) {
		PicUrl = picUrl;
	}
	public String getMediaId() {
		return MediaId;
	}
	public void setMediaId(String mediaId) {
		MediaId = mediaId;
	}
	public String getEventKey() {
		return EventKey;
	}
	public void setEventKey(String eventKey) {
		EventKey = eventKey;
	}
	public String getTicket() {
		return Ticket;
	}
	public void setTicket(String ticket) {
		Ticket = ticket;
	}
	public String getLatitude() {
		return Latitude;
	}
	public void setLatitude(String latitude) {
		Latitude = latitude;
	}
	public String getLongitude() {
		return Longitude;
	}
	public void setLongitude(String longitude) {
		Longitude = longitude;
	}
	public String getPrecision() {
		return Precision;
	}
	public void setPrecision(String precision) {
		Precision = precision;
	}
	public String getEvent() {
		return Event;
	}
	public void setEvent(String event) {
		Event = event;
	}
	public String getMsgId() {
		return MsgId;
	}
	public void setMsgId(String msgId) {
		MsgId = msgId;
	}
	public String getToUserName() {
		return ToUserName;
	}
	public void setToUserName(String toUserName) {
		ToUserName = toUserName;
	}
	public String getFromUserName() {
		return FromUserName;
	}
	public void setFromUserName(String fromUserName) {
		FromUserName = fromUserName;
	}
	public String getCreateTime() {
		return CreateTime;
	}
	public void setCreateTime(String createTime) {
		CreateTime = createTime;
	}
	public String getMsgType() {
		return MsgType;
	}
	public void setMsgType(String msgType) {
		MsgType = msgType;
	}
}
package demo.process;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import demo.entity.ReceiveXmlEntity;
/**
 *         xml,      
 * @author pamchen-1
 *
 */
public class ReceiveXmlProcess {
	/**
	 *     xml  
	 * @param strXml
	 * @return
	 */
	public ReceiveXmlEntity getMsgEntity(String strXml){
		ReceiveXmlEntity msg = null;
		try {
			if (strXml.length() <= 0 || strXml == null)
				return null;
			 
			//        XML    
			Document document = DocumentHelper.parseText(strXml);
			//         
			Element root = document.getRootElement();
			//            
			Iterator<?> iter = root.elementIterator();
			
			//       
			msg = new ReceiveXmlEntity();
			//      ,  set  
			//         
			Class<?> c = Class.forName("demo.entity.ReceiveXmlEntity");
			msg = (ReceiveXmlEntity)c.newInstance();//         
			
			while(iter.hasNext()){
				Element ele = (Element)iter.next();
				//  set        (      )
				Field field = c.getDeclaredField(ele.getName());
				//  set  ,field.getType())          
				Method method = c.getDeclaredMethod("set"+ele.getName(), field.getType());
				//  set  
				method.invoke(msg, ele.getText());
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("xml     : "+ strXml);
			e.printStackTrace();
		}
		return msg;
	}
}
2.3図霊ロボットapiインターフェースを呼び出し、スマートな返信内容を取得する:
package demo.process;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

/**
 *        api  ,        
 * @author pamchen-1
 *
 */
public class TulingApiProcess {
	/**
	 *        api  ,        ,          
	 * @param content
	 * @return
	 */
	public String getTulingResult(String content){
		/**      api  ,  key         ,  11111111   */
		String apiUrl = "http://www.tuling123.com/openapi/api?key=11111111&info=";
		String param = "";
		try {
			param = apiUrl+URLEncoder.encode(content,"utf-8");
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} //     url  
		
		/**   httpget   */
		HttpGet request = new HttpGet(param);
		String result = "";
		try {
			HttpResponse response = HttpClients.createDefault().execute(request);
			if(response.getStatusLine().getStatusCode()==200){
				result = EntityUtils.toString(response.getEntity());
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		/**        */
		if(null==result){
			return "   ,          ……";
		}
		
		try {
			JSONObject json = new JSONObject(result);
			// code=100000  ,       api  
			if(100000==json.getInt("code")){
				result = json.getString("text");
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
}
2.4結果をWeChatで規定されたxml形式にカプセル化し、1.1で作成されたservletインターフェースに戻す.
package demo.process;

import java.util.Date;
/**
 *      xml    
 * @author pamchen-1
 *
 */
public class FormatXmlProcess {
	/**
	 *           
	 * @param to
	 * @param from
	 * @param content
	 * @return
	 */
	public String formatXmlAnswer(String to, String from, String content) {
		StringBuffer sb = new StringBuffer();
		Date date = new Date();
		sb.append("<xml><ToUserName><![CDATA[");
		sb.append(to);
		sb.append("]]></ToUserName><FromUserName><![CDATA[");
		sb.append(from);
		sb.append("]]></FromUserName><CreateTime>");
		sb.append(date.getTime());
		sb.append("</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[");
		sb.append(content);
		sb.append("]]></Content><FuncFlag>0</FuncFlag></xml>");
		return sb.toString();
	}
}
まとめまして、以上はWeChat公式プラットフォームの開発のすべての流れです.全体的に見ても複雑ではありません.図霊ロボットが提供するapiインターフェースに感謝し、スマート回復という難しい問題を解決してくれました.他のタイプのメッセージ処理は例と似ています.興味のある開発者は私に連絡して交流学習を行うことができます.
本質問のコード例はcsdnの個人リソースにアップロードされました.必要なものはダウンロードしてもいいです.http://download.csdn.net/detail/pamchen/7793979