对接微信公众号的流程

前言

最近对接一个新的微信公众号,功能比较简单,但是不熟悉微信公众号对接流程的同学可能需要花些时间阅读官方文档和调试。笔者对接过程也是一波三折,于是把流程分享出来帮助没有对接过的同学。

对接流程

首先,开发微信公众号的相关功能一般是公司新申请的服务号,如果刚开始产品同学的需求比较简单,没有复杂的交互,可以先尝试在微信公众平台的功能编辑区完成功能,如果简单的情况下一般产品和运营同学就可以直接完成了,如下图。

在这里插入图片描述
由于我这里需求略微复杂,配置功能无法满足需求,所以只能开发自己的公众号相关服务,具体步骤如下:

  • 进入开发的基本配置里,配置公众号密码(APPSecret)和ip白名单,Secret在和微信的接口交互中会一直用到,设置好了需要保存好,作为配置项配置在配置中心或者配置文件中;ip白名单需要加入获取access_token的服务器的出网ip,一般部署多个服务一定是多台服务器,最好都配置上。在这里插入图片描述

  • 开发Token验证的服务,部署到生产或者测试环境,一定要有外网地址可以访问的服务,这里以Java服务为例,服务入参为:HttpServletRequest request, HttpServletResponse response 注意一定是GET请求,然后根据入参中的signature, timeStamp, nonce三个参数进行验证,注意

  • 参与验签的参数中没有echoStr

  • 验签需要的token和APPSecret是自己在微信平台设置的,但是token想设置成功首先要经过微信的echoStr验证这个服务是验签通过的,这也是我们为什么要先开发token验签的服务并且部署上线的目的

  • 验签的方式为微信官方给出的方式,如下图。这里需要注意的是如果验签成功后在这里插入图片描述

  • 示例代码如下,可以在微信官方下载到: ` /** * 验证URL * @param msgSignature
    签名串,对应URL参数的msg_signature * @param timeStamp 时间戳,对应URL参数的timestamp

    • @param nonce 随机串,对应URL参数的nonce * * @return 解密之后的echostr *
      @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 */ public boolean
      verifyUrl(String msgSignature, String timeStamp, String nonce)
      throws AesException { String signature =
      SHA1.getSHA1WithoutMsg(token, timeStamp, nonce);

      if (signature.equals(msgSignature)) { return true; }

      return false; }`

  • 验证Token服务验签没问题,可以正常返回原请求参数中的echoStr,这里还需要提醒一下,一定是个字符串,不是json串,一些项目里controller层配置了@ControllerAdvice注解的有特殊封装的都需要特殊处理。保证服务没有问题可以在微信公众号配置token,微信会自动发起配置相关url和token的请求,验证通过就配置成功了,如下图:在这里插入图片描述

  • 必要参数都配置好之后就可以正式对接需求了,最先开始还是access_token服务,由于微信每隔两个小时原先的access_token就失效了,所以需要业务方有一个中央服务专门维护access_token的获取,可以是缓存过期等请求来了再向微信发起,也可以是做个定时任务每隔两个小时发起一次缓存下来,具体根据业务场景来做。

业务对接

自动回复功能,自动回复是对用户发起的一次消息的回复,所以是一次交互处理两个逻辑,首先要接收客户的消息并验签,其次是根据用户发送的消息进行解析然后决定给客户回复什么样的消息。
由于微信后台的MsgType分为text、image、video、voice、shortvideo、location和event,而event又分为subscribe、unsubscribe、SCAN、LOCATION、VIEW,因此可以开发个策略模式分别处理这些不同类型的消息和事件,比如我的示例代码:

public abstract class AbstractWechatMsgHandler {

    abstract public WechatMessageDTO msgHandler(WechatMessageDTO messageDTO);
}

public class TextMsgHandler extends AbstractWechatMsgHandler {

    @Override
    public WechatMessageDTO msgHandler(WechatMessageDTO messageDTO) {
        WechatMessageDTO reply = new WechatMessageDTO();
        reply.setFromUserName(messageDTO.getToUserName());
        reply.setToUserName(messageDTO.getFromUserName());
        reply.setCreateTime(System.currentTimeMillis()/1000);
        reply.setMsgType(WechatMsgTypeDef.TEXT.getMsgType());
        reply.setContent(WechatConstant.replyContent);

        return reply;
    }
}

自定义菜单功能,需要首先从中央服务获取access_token,然后根据需求封装菜单的jsonbody的嵌套数据,比如微信官方的示例代码。
接口调用请求说明
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
click和view的请求示例

{
     "button":[
     {	
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {	
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
                 "type":"miniprogram",
                 "name":"wxa",
                 "url":"http://mp.weixin.qq.com",
                 "appid":"wx286b93c14bbf93aa",
                 "pagepath":"pages/lunar/index"
             },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }

接口调试链接,请点击这里

其他小程序或者其他的处理方式基本上类似,笔者不再赘述。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值