记一次微信公众号发送消息

2019-08-12 12:04:13  卢浮宫  版权声明:本文为站长原创文章,转载请写明出处


一、背景

    公司公众号用于发送消息的openId一直是手动维护的(未上线项目),今天进行功能修改。

这里记录一下当时的操作,留一个记号。


二、功能预期

    用户关注公众号后发送指令进行业务员信息与当前openId信息绑定

PS:业务员绑定手机号可能不是本机号码,这个还是要注意一下的。


三、业务流程

    ①微信公众号配置(服务器url、token、安全密匙、加密模式)

    ②启用!启用!启用!(重要的说三遍)

    ③当用户发送消息时,微信服务器会给接口地址发送一个post请求并携带相关参数

    ④接口拦截微信服务器请求,获取内容参数

    ⑤维护数据库openId


四、业务开发流程

    ①设置服务器url:登录微信公众号--基本配置--输入服务器地址、token、安全密匙  (最后点击启用!!!)

    ②在服务器接口中进行请求拦截

    ③根据不同业务需求进行操作流转


五、部分代码如下

   1、 拦截请求部分代码:    


    @RequestMapping(value = "/weixin", method = {RequestMethod.GET, RequestMethod.POST})
public void doGetAndPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
boolean isGet = request.getMethod().toLowerCase().equals("get");
log.info("接收到微信端消息,类型为:" + request.getMethod().toLowerCase());
if (isGet) {
log.info("微信执行get请求进行验证");
doGet(request,response);
} else {
log.info("微信执行post请求进行业务处理");
doPost(request,response);
}
}


    2、get请求处理    


    public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
String signature = request.getParameter("signature");// 微信加密签名
String timestamp = request.getParameter("timestamp");// 时间戳
String nonce = request.getParameter("nonce");// 随机数
String echostr = request.getParameter("echostr");//
PrintWriter out=response.getWriter();
if(signature==null ||timestamp==null || nonce==null || echostr==null){
out.print("非法请求");
return;
}
String sortString = WeiXinUtil.sort(token, timestamp, nonce);
//加密
String myString = WeiXinUtil.sha1(sortString);
log.error("token验证" + myString + "__" + signature);
//校验
if (myString != null && myString != "" && myString.equals(signature)) {
log.info("微信验证通过......signature="+signature+" 加密后的="+myString);
out.print(echostr);
} else {
log.info("微信验证未通过......signature="+signature+" 加密后的="+myString);
out.print(echostr);
}
}



  3、post请求处理    
    
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("text/html;charset=UTF-8");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(request.getInputStream());
Element root = document.getDocumentElement();
String wechatId = root.getElementsByTagName("ToUserName").item(0).getTextContent();
String openid = root.getElementsByTagName("FromUserName").item(0).getTextContent();
String msgType = root.getElementsByTagName("MsgType").item(0).getTextContent();//消息类型
if("event".equals(msgType)){//接受事件推送
String event = root.getElementsByTagName("Event").item(0).getTextContent();//事件类型
if("subscribe".equals(event)){//订阅公众号
log.info("用户订阅公众号,openid="+openid);
subscribe(response,openid,wechatId);//关注微信后回复
}else if("unsubscribe".equals(event)){//取消订阅
log.info("用户取消关注公众号,openid="+openid);
}
}else {//接受消息推送
String msg = root.getElementsByTagName("Content").item(0).getTextContent().trim();//用户发送的内容
if(msg.indexOf("绑定") > -1){
try {
String mobile = msg.replace("绑定","").trim();
/*校验手机号合法性*/
if(CommonUtil.isMobileNO(mobile)){
log.error("手机号验证成功,进行用户保存");
SysUser myUser = userService.findUserByMobile(mobile);
myUser.setOpenid(openid);
System.out.println(myUser.getUserId());
System.out.println(myUser.getOpenid());
userService.updateUser(myUser);
sendMsgToUser(response,openid,wechatId,"恭喜,手机号绑定成功!");
}else{
/*不合法时发送纠正消息*/
sendMsgToUser(response,openid,wechatId,"您的号码有误,请查证后进行绑定!");
}
}catch (Exception e){
System.out.println(e.toString());
sendMsgToUser(response,openid,wechatId,"手机号绑定异常,请联系管理员!");
}

}
}
}


    4、向用户发送消息    

    
    public void sendMsgToUser(HttpServletResponse response,String openid,String wechatId,String content)throws Exception{
PrintWriter out = response.getWriter();
long createTime = System.currentTimeMillis();
long msgId = System.currentTimeMillis();
String replyMsg = "<xml>"
+ "<ToUserName><![CDATA["+openid+"]]></ToUserName>"
+ "<FromUserName><![CDATA["+wechatId+"]]></FromUserName>"
+ "<CreateTime>"+createTime+"</CreateTime>"
+ "<MsgType><![CDATA[text]]></MsgType>"
+ "<Content><![CDATA["+content+"]]></Content>"
+ "<MsgId>"+msgId+"</MsgId> "
+ " </xml>";
out.println(replyMsg);
}




更多精彩请关注guangmuhua.com


最新评论: