服务端推送消息至微信公众号

使用场景: 当需要服务端需要在自定义时间或者条件推送消息给用户时

1. 前期准备工作

  • 微信公众平台注册服务号(只能以组织或者公司注册,个人无法注册)
  • 完成微信认证、“新的功能”中添加“模板管理”功能
  • 获取公众号AppID、AppSecret(需保存到本地,后续无法查看)

2. 成为微信公众号开发者

  • 需要拥有自己的线上服务器IP、域名,可在公网访问,用作微信服务器验证使用
  • 服务器中处理微信发来的验证接口并返回对应的参数,成为公众号开发者文档,这里使用node.js做服务端实现一个简单demo
  • 在公众号后台基本配置里面新增IP白名单,将服务器IP地址添加至白名单中

在服务端新增接口(用于微信服务器请求校验):

   // 使用nodeJs自带的crypto进行sha1加密
   const sha1 = (data) => {
   
   
 	  return crypto.createHash('sha1').update(data).digest('hex');
 	}
 	// 字典排序
 	 const sort = (arr) => {
   
   
 	  return arr.sort(function (a, b) {
   
   
 	    return a.localeCompare(b)
 	  })
 	}
 	
 	 app.get('/verify', async (req, res) => {
   
   
 	  const {
   
    timestamp, nonce, signature, echostr } = req.query // 接口微信服务器请求参数
 	  const str = sort([ 'hcha', timestamp, nonce 
### 如何接收处理微信公众号服务器推送消息参数 为了能够成功接收到来自微信公众号服务器推送消息,开发者需要设置一个有效的回调URL来接收消息。当用户与公众号互动时,微信公众平台会将XML数据包POST到该URL上。 #### 设置回调URL和Token验证 在配置消息接口之前,需先通过微信提供的`token`完成安全校验。具体做法是在接入指南中提到的URL后面加上`?signature=xxx&timestamp=xxx&nonce=xxx&echnoechostr=xxx`这样的查询字符串[^1]。服务端接收到请求后要按照特定算法计算签名并与传入的`signature`对比,如果一致则返回`echostr`的内容作为响应,从而确认此次握手有效。 #### 接收并解析XML格式的数据 一旦完成了上述的安全认证过程,每当有新的事件发生(比如关注/取消关注、点击菜单项等),或是粉丝向公众号发送了文字、图片等内容时,微信服务器就会主动调用已设定好的回调地址,并附带相应的通知信息。这些信息是以标准的XML形式编码而成,在Java环境中可以利用SAXParser或DOM Parser等方式来进行解码操作[^3]。 下面给出一段简单的Servlet代码片段用于演示如何接收以及初步处理由微信服务器发来的原始HTTP POST请求: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设定字符集为UTF-8以防止中文乱码问题 request.setCharacterEncoding("utf-8"); // 获取输入流中的内容即为完整的xml报文体 InputStream inputStream = request.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder sb = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null){ sb.append(line); } String xmlContent = sb.toString(); System.out.println(xmlContent); // 输出日志方便调试 try{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); InputSource source = new InputSource(new StringReader(xmlContent)); org.w3c.dom.Document document = builder.parse(source); NodeList toUserNameNodeList = document.getElementsByTagName("ToUserName").item(0).getChildNodes(); String ToUserName = toUserNameNodeList.item(0).getNodeValue().trim(); NodeList fromUserNameNodeList = document.getElementsByTagName("FromUserName").item(0).getChildNodes(); String FromUserName = fromUserNameNodeList.item(0).getNodeValue().trim(); NodeList createTimeNodeList = document.getElementsByTagName("CreateTime").item(0).getChildNodes(); long CreateTime = Long.parseLong(createTimeNodeList.item(0).getNodeValue()); NodeList msgTypeNodeList = document.getElementsByTagName("MsgType").item(0).getChildNodes(); String MsgType = msgTypeNodeList.item(0).getNodeValue().trim(); // 更多字段可以根据实际需求继续提取... // 处理业务逻辑... } catch (Exception e){ e.printStackTrace(); } } ``` 此段程序展示了基本的流程框架,包括但不限于读取HTTP请求体内的XML文本、创建DOM树结构以便于访问各个节点属性值等功能模块。对于不同的消息类型,则可能还需要进一步细化对应的处理机制[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值