1.开发准备
网穿透
我用的花生壳
填入你的域名 (花生壳默认送你一个) 和你现在内网的ip 192.168.x.x
然后测试一下
通过域名访问你的项目
2.公众号配置
Token(令牌): 随意(我这里弄的是token);
EncodingAESKey :随机生成就可以
url填写为自己服务器的域名 如:http://www.xxxx.com/weixin/verify
/weixin/chat 是下面chatController ,推送的链接。
提交服务器配置微信返回
signature , timestamp , nonce , echostr 4个参数
/**
* 接入微信服务 (验证服务只使用一次)
* @param request
* @param response
*/
@RequestMapping(value="/verify",method= RequestMethod.GET)
public void index(HttpServletRequest request,HttpServletResponse response){
log.info("微信接入服务器");
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String token = "token";
String echostr = request.getParameter("echostr");
if (weChatServiceImpl.verifyInfo(signature, timestamp, nonce, token)) {
log.info("echostr为:{}"+echostr);
if (echostr != null) {
try {
response.getWriter().write(echostr);
log.info("微信接入服务器成功");
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
log.info("微信接入服务器失败");
log.info("signature为:{}"+signature);
log.info("timestamp为:{}"+timestamp);
log.info("nonce为:{}"+nonce);
log.info("token为:{}"+token);
}
}
将token(就是你上面填写的)、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比查看是否正确
最后将echostr 字符串返回给微信
//微信服务验证
public Boolean verifyInfo(String signature, String timestamp, String nonce,
String token) {
TreeSet<String> set = new TreeSet<String>();
set.add(token);
set.add(timestamp);
set.add(nonce);
StringBuilder sBuilder = new StringBuilder();
for (String item : set) {
sBuilder.append(item);
}
String sign = DigestUtils.sha1Hex(sBuilder.toString());
return signature.equalsIgnoreCase(sign);
}
提交后显示配置成功 表示微信通过此接口进行交互
获取所有用户在公众号的操作 进一步处理将返回操作和消息进行自动回复等操作
/**
* 微信动作推送
* @param request
* @param response
* @throws Exception
*/
@RequestMapping(value = "/verify", method = RequestMethod.POST)
@ResponseBody
public void verifyPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
try {
msg = weChatService.weixinPost(request);
out.write(msg);
log.info("The request completed successfully--请求成功");
log.info("to weixin server "+"\n"+msg);
} catch (Exception e) {
log.error("返回微信服务消息为"+msg+",不能发送到公众号");
log.error("Failed to convert the message from weixin!");
}finally{
out.close();
}
}
取得微信消息 分类然后回复 或者不做处理(文档中有具体类型)
public String weixinPost(HttpServletRequest request) throws Exception {
String respMessage = null;
// 1.将xml转换成Map格式
Map<String, String> resultMap = WeChatUtil.parseXmlToMap(request);
log.info("###收到微信消息####resultMap:" + resultMap.toString());
// 2.判断消息类型
String msgType = resultMap.get("MsgType");
// 开发者微信公众号
String toUserName = resultMap.get("ToUserName");
// 消息来自公众号 取得openId
String fromUserName = resultMap.get("FromUserName");
// 消息内容
String content = resultMap.get("Content");
Map<String, Object> userInfo = WeChatUtil.getUserInformationByOpenid(fromUserName);
log.info("openId: " + fromUserName + ", 开发者微信公众号: " + toUserName + ", 消息类型: " + msgType + ", 消息内容: " + content);
// 文本消息
if (RESP_MESSAGE_TYPE.TEXT.name.equals(msgType)) {
//关键字
if (content.equals("测试")) {
ReplyTextMsg text = new ReplyTextMsg();
text.setContent("微信jsapi支付测试:http://kikock.iok.la/mtmall/wxPay/jsapiPay");
text.setToUserName(fromUserName);
text.setFromUserName(toUserName);
text.setCreateTime();
text.setMsgType(RESP_MESSAGE_TYPE.TEXT.name);
respMessage = text.Msg2Xml();
} else if (content.equals("缓存")) {
ReplyTextMsg text = new ReplyTextMsg();
text.setContent("debugx5.qq.com");
text.setToUserName(fromUserName);
text.setFromUserName(toUserName);
text.setCreateTime();
text.setMsgType(RESP_MESSAGE_TYPE.TEXT.name);
respMessage = text.Msg2Xml();
}
//地理位置
} else if (RESP_MESSAGE_TYPE.LOCATION.name.equals(msgType)) {
// 事件推送
} else if (RESP_MESSAGE_TYPE.EVENT.name.equals(msgType)) {
// 事件类型
String eventType = resultMap.get("Event");
//关注事件
if (RESP_MESSAGE_TYPE.SUBSCRIBE.name.equals(eventType)) {
ReplyTextMsg text = new ReplyTextMsg();
text.setContent("欢迎关注,kikock的公众号");
text.setToUserName(fromUserName);
text.setFromUserName(toUserName);
text.setCreateTime();
text.setMsgType(RESP_MESSAGE_TYPE.TEXT.name );
respMessage= text.Msg2Xml();
}
}
return respMessage;
}