微信小程序消息推送服务器接入

本文介绍了如何配置微信公众号的客服消息转发功能,包括设置消息转发地址、验证签名及实现GET与POST请求处理。通过具体代码示例展示了如何对接收到的消息进行处理并转发给客服。

1、消息转发地址填写,需要注意的是token和encodingaeskey要和项目中配置一致

2、URL要实现两个路由相同的方法但是一个需要时GET另一个是POST,如下,其中TOKEN参数需要与微信后台配置一致;

  @ResponseBody
  @RequestMapping(method=RequestMethod.GET,produces= "text/plain;charset=utf-8")
  public void authGet(@RequestParam(name = "signature", required = false) String signature,
      @RequestParam(name = "timestamp", required = false) String timestamp,
      @RequestParam(name = "nonce", required = false) String nonce,
      @RequestParam(name = "echostr", required = false) String echostr,HttpServletResponse response) throws Exception {
    this.logger.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, timestamp, nonce, echostr);

    if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
      throw new IllegalArgumentException("请求参数非法,请核实!");
    }
    
    String[] str = { TOKEN, timestamp, nonce };
    Arrays.sort(str); // 字典序排序
    String bigStr = str[0] + str[1] + str[2];
    // SHA1加密
    SHA1 sha1= new SHA1();
    String digest =sha1.gen(str);

    // 确认请求来至微信
    if (digest.equals(signature)) {
        response.getWriter().print(echostr);
    }
   }
  /**
   * POST请求:
   * 接收客服消息; 
   * 此处的value值也就是往微信公众平台要配置的请求的地址
   */
  @ResponseBody
  @RequestMapping(method=RequestMethod.POST)
  public JSONObject doMessagePost(HttpServletRequest request,HttpServletResponse response) {
      try {
          ServletInputStream stream = request.getInputStream();
           BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
           StringBuffer buffer = new StringBuffer();
           String line = new String("");  
           while((line = reader.readLine()) != null){
               buffer.append(line);
           }
			JSONObject jsonObject = JSONObject.fromObject(buffer.toString());

			String to=jsonObject.getString("ToUserName");
			String from=jsonObject.getString("FromUserName");
			String time=jsonObject.getString("CreateTime");
			String sessionFrom=jsonObject.getString("SessionFrom");
			String msgType=jsonObject.getString("MsgType");
			
			PrintWriter out=response.getWriter(); 
			
			String msg="<xml>\r\n" + 
					"     <ToUserName><![CDATA["+to+"]]></ToUserName>\r\n" + 
					"     <FromUserName><![CDATA["+from+"]]></FromUserName>\r\n" + 
					"     <CreateTime>"+time+"</CreateTime>\r\n" + 
					"     <MsgType><![CDATA[transfer_customer_service]]></MsgType>\r\n" + 
					" </xml>";

			out.print(msg);
			
			if("event".equals(msgType)&&"follow".equals(sessionFrom)) {
				pushService.setSendCustomerMsgLink(from);
			}
      } catch (Exception e) {
          e.printStackTrace();
      }
      return null;
  }
第一个方法用于验证,第二个方法用于接收消息转发和其他业务逻辑实现,方法二中也实现了接收到的客服消息转发给客服,关键点在于
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
至此也就全部完成了。

### 配置服务器以实现微信小程序消息推送 #### 1. 准备工作 为了使消息能够成功推送到用户的微信小程序,需先确保已拥有一个经过认证的服务号或订阅号,并已完成微信公众平台上的相应设置。对于基于Egg.js框架的应用程序而言,还需搭建好Node.js环境以及熟悉其路由处理机制。 #### 2. 接入消息推送接口 按照官方指引,现在的小程序采用的是用户自助订阅的方式来进行消息推送[^3]。因此,在服务器端主要负责接收来自微信服务器通知请求,并依据业务逻辑向特定用户发送定制化的内容。具体来说: - **创建API用于接受订阅事件** 当用户同意接收某类别的通知时,会触发一次HTTP POST请求给开发者设定好的回调URL地址。此时可以在Egg.js应用里定义相应的controller来解析此POST数据包中的XML格式信息,从中提取出必要的参数如`ToUserName`, `FromUserName`, `CreateTime`, `MsgType`, `Event`等字段用来确认是哪个用户发起了什么类型的事件操作。 ```javascript // app/controller/subscribe.js const Controller = require('egg').Controller; class SubscribeController extends Controller { async subscribe() { const { ctx } = this; let xmlData = await parseStringPromise(ctx.request.body); // 处理接收到的数据... console.log(xmlData.xml.Event[0]); // 输出 event 类型 ctx.body = 'success'; // 返回 success 表明已经正确响应了此次请求 } } module.exports = SubscribeController; ``` - **配置合法域名** 前往微信公众平台上填写有效的HTTPS协议下的服务器IP白名单列表,保证只有指定源站才能发起对本系统的调用请求。这一步骤非常重要,因为这是安全性的保障措施之一。 - **验证Token合法性** 每当有新的订阅关系建立起来之后,微信服务器将会携带随机字符串token以及其他几个固定参数一起访问上述提到过的那个回调链接;而作为服务提供商,则要根据这些传过来的信息计算签名值并与原文对比校验无误后再继续后续流程。 ```javascript function checkSignature(token, timestamp, nonce, signature) { var array = new Array(token, timestamp, nonce).sort(); var sha1 = crypto.createHash('sha1'); sha1.update(array.join('')); return sha1.digest('hex') === signature; } ``` - **构建并发送模板消息** 一旦获得了用户的授权许可并且完成了前面所有的准备工作以后就可以着手准备实际的消息体结构了。需要注意的是每条记录都应当遵循一定的JSON Schema规范以便于被对方识别理解。最后利用WeChat API提供的能力将组装完毕后的payload传递出去即可达成目标效果。 ```json { "touser": OPENID, "template_id": TEMPLATE_ID, "page": PAGE_PATH, "data": { "first": {"value":"您好"}, "keyword1":{"value":"订单编号:123456789"}, "keyword2":{"value":"商品名称:iPhone X"} }, "emphasis_keyword":"keyword1.DATA" } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值