1.首先在微信公众平台(https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN)注册一个个人订阅号,个人只能注册订阅号,不能注册服务号,该过程很简单,不细说。
2.
进入微信公众平台,后台管理系统页面。除了开发者中心,其他的菜单都是编辑模式。编辑模式可以满足大部分的订阅号需求。
3.如何成为开发者。
进入开发者中心
最重要的就是url和token。
url是微信服务器发请求至的接口地址,该接口对微信服务器发的请求进行处理并响应微信服务器,该地址必须是一个公网地址接口。token是用来验证接口获得的请求是微信服务器发的请求。
4.如何搭建一个公网地址接口。
利用花生壳可以将本地的服务器地址映射成公网地址。这个过程可以百度。
我的接口本地地址是http://localhost:8080/project/getMessage.action.
映射成公网地址为:http://mierzhu.oicp.net/StrutsProject/getMessage
除了花生壳可以映射公网地址来搭建服务器外,还可以通过百度bae,和新浪sae来搭建。后者有点复杂,具体可以百度。
5.url接口具体如何实现。
action类:
“`
package org.apache.struts.register.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import org.dom4j.DocumentException;
public class GetMessage extends BaseAction {
// 自定义 token
private String TOKEN = “mimizhu”;
/**
* 接收并处理微信客户端发送的请求
*/
public String execute()
throws ServletException, IOException {
// 微信加密签名
String signature = request.getParameter(“signature”);
// 随机字符串
String echostr = request.getParameter(“echostr”);
// 时间戳
String timestamp = request.getParameter(“timestamp”);
// 随机数
String nonce = request.getParameter(“nonce”);
if(signature!=null&&echostr!=null&×tamp!=null&&nonce!=null){
String[] str = { TOKEN, timestamp, nonce };
Arrays.sort(str); // 字典序排序
String bigStr = str[0] + str[1] + str[2];
// SHA1加密
String digest = DigestUtils.sha1Hex(bigStr);
// 确认请求来至微信
if (digest.equals(signature)) {
response.getWriter().print(echostr);
}
}
request.setCharacterEncoding("utf-8");
response.setContentType("text/xml;charset=utf-8");
PrintWriter out = response.getWriter();
try {
System.out.println("request="+request);
Map<String, String> map = MessageUtil.xmlToMap(request);
String toUserName = map.get("ToUserName");
String fromUserName = map.get("FromUserName");
String msgType = map.get("MsgType");
String content = map.get("Content");
String message = null;
if ("text".equals(msgType)) { // 对文本消息进行处理
TextMeaasge text = new TextMeaasge();
text.setFromUserName(toUserName); // 发送和回复是反向的
text.setToUserName(fromUserName);
text.setMsgType("text");
text.setCreateTime(new Date().getTime());
text.setContent(content);
message = MessageUtil.textMessageToXML(text);
message = MessageUtil.textMessageToXML(text);
out.print(message); // 将回应发送给微信服务器
}
} catch (DocumentException e) {
e.printStackTrace();
}finally{
out.close();
}
return NONE;
}
}
解析xml和生成xml类:
package org.apache.struts.register.action;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.thoughtworks.xstream.XStream;
public class MessageUtil {
public static Map<String, String>xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader(); // 使用dom4j解析xml
InputStream ins = request.getInputStream(); // 从request中获取输入流
Document doc = reader.read(ins);
Element root = doc.getRootElement(); // 获取根元素
List<Element> list = root.elements(); // 获取所有节点
for (Element e : list) {
map.put(e.getName(), e.getText());
System.out.println(e.getName() + "--->" + e.getText());
}
ins.close();
return map;
}
/**
* 将文本消息对象转换成XML
*/
public static String textMessageToXML(TextMeaasge textMessage){
XStream xstream = new XStream(); // 使用XStream将实体类的实例转换成xml格式
xstream.alias("xml", textMessage.getClass()); // 将xml的默认根节点替换成“xml”
return xstream.toXML(textMessage);
}
}
注意:action类中的token要和微信公众平台的token一致,点击【提交】就可以成为开发者了。