微信的交互原理
手机的微信关注某个公众号,向公众号发送消息到微信服务器,微信服务器转发到指定的URL的服务器;这台指定URL的服务器返回数据到微信服务器,微信服务器再返回信息到手机.
第一次接触微信开发,可能写的比较简单,下面就献丑了:
消息推送
@Controller
public class WeixinController {
@RequestMapping(value="/weixin",method=RequestMethod.GET)
@ResponseBody
public String checkSignature(String signature,String timestamp,String nonce,String echostr){
System.out.println(signature);
System.out.println(timestamp);
System.out.println(nonce);
System.out.println(echostr);
//加密/校验流程如下:
String[] arr = {WeixinUtil.TOKEN,timestamp,nonce};
//1)将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
String str = "";
//2)将三个参数字符串拼接成一个字符串进行sha1加密
for (String temp : arr) {
str += temp;
}
//3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (signature.equals(SecurityUtil.SHA1(str))) {
System.out.println("接入成功!");
return echostr;
}
System.out.println("接入失败!");
return null;
}
}
识别是URL验证还是消息处理,利用请求的方式
get请求代表URL验证
post请求代表消息处理
消息推送
@RequestMapping(value="/weixin",method=RequestMethod.POST)
@ResponseBody
public XmlMessageEntity handlerMessage(@RequestBody XmlMessageEntity entity){
System.out.println(entity);
XmlMessageEntity newEntity = new XmlMessageEntity();
//设置发送方
newEntity.setFromUserName(entity.getToUserName());
//设置接收方
newEntity.setToUserName(entity.getFromUserName());
//设置发送时间
newEntity.setCreateTime(new Date().getTime());
//如果是第一次关注,回复“欢迎关注!”
if("event".equals(entity.getMsgType())){
//如果是关注事件
if("subscribe".equals(entity.getEvent())){
//调用接口获取用户详细信息
String reuslt = HttpUtil.get(WeixinUtil.GET_USERINFO_URL.replace("ACCESS_TOKEN", WeixinUtil.getAccessToken())
.replace("OPENID", entity.getFromUserName()));
System.out.println(WeixinUtil.GET_USERINFO_URL.replace("ACCESS_TOKEN", WeixinUtil.getAccessToken())
.replace("OPENID", entity.getFromUserName()));
System.out.println(reuslt);
//创建客户信息,保存到数据库
//回复内容
newEntity.setContent("欢迎关注!");
}else if ("unsubscribe".equals(entity.getEvent())) {
//更新客户状态,设置为取消关注
}
}
//如果发送的是电话,回复“3333”
if(entity.getContent().contains("电话")){
newEntity.setContent("3333");
}else{
newEntity.setContent("我不知道你说什么!");
}
//发送类型
newEntity.setMsgType("text");
return newEntity;
}