微信第三方开发-技术摘要

微信平台开发

本文的部分链接,需要有微信公众号平台的开发账号方可查看使用。

1.微信第三方平台开发架构

微信服务器在自定义服务器与用户终端之间,起到了桥接的作用,微信以XML形式对请求/响应进行转发
微信第三方开发-技术摘要_第1张图片
微信第三方开发架构.png

2.第三方服务器验证

简述: 微信服务器向第三方服务器发送请求,请求参数包含signature、timestamp、nonce、echostr。第三方服务器,对这些参数进行验证,验证成功后,返回原样的echostr,完成验证。

服务器验证有三种方式:明文、兼容、安全模式。
安全模式下验证方式:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
第三方服务器URL,必须以http://或https://开头,分别支持80端口和443端口

部分代码示例:

//本例代码使用的是明文测试
……
//获取echostr
String echostr = request.getParameter("echostr");
    if (echostr != null && echostr.length() > 1) {
            result = echostr;
        }
OutputStream os = response.getOutputStream();
           // 返回echostr 完成验证
            os.write(result.getBytes("UTF-8"));
            os.flush();
            os.close();
……

3.自定义菜单

简述:第三方平台可以根据自己需要创建菜单,创建菜单的方式是向微信服务器发送POST请求,http 的body 是特定的json数据。

3.1 定时token获取

官方文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN
简述:token 时第三方平台向微信服务器发送请求时的身份证明,微信服务器根据开发者的appid、appsecret生成特定的token,有效期一般为2个小时,所以开发者需要定时获取token。另外,token每天的获取次数也是有限制的,根据不同账号类型,次数限制也不同。
部分代码:

//本例使用Timer
public class GetTokenTimerTask extends TimerTask{

    @Override
    public void run() {
        InputStream in = null;
        try {
            in = GetTokenTimerTask.class.getResourceAsStream("/app.properties");

            Properties props = new Properties();
            props.load(in);
            AccessTokenEntity tokenEntity = TokenProcess.getToken();
//            存储token
            props.setProperty("token", tokenEntity.getToken());
            props.setProperty("maintain", tokenEntity.getMaintain());
            props.store(new FileOutputStream(new File("app.properties")),props.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//执行
    Timer timer=new Timer();
    GetTokenTimerTask myTask=new GetTokenTimerTask();
//        第二个参数为延迟时间,第三个参数为循环时间,单位时毫秒ms
    timer.schedule(myTask, 0, 2000);

3.2 创建自定义菜单

简述:自定义菜单是第三方服务器,根据微信平台的规定,封装具体菜单展示形式的Json数据,通过Post方式传递给微信服务器。
自定义菜单接口可实现10种类型按钮,包括点击、跳转、扫码、选择相册等类型。详细描述参照微信开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013&token=&lang=zh_CN
json数据示例:

 {
     "button":[
     {  
          "type":"click",
          "name":"菜单按钮",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单(含子菜单)",
           "sub_button":[
           {    
               "type":"view",
               "name":"菜单跳转",
               "url":"http://www.baidu.com/"
            },
            {
               "type":"click",
               "name":"菜单按钮2",
               "key":"V1001_GOOD"
            }]
       }]
 }

部分代码示例:

//使用Jackson封装解析Json数据,使用httpclient 向微信服务器发送Post请求
……
//jsonString 为上述Json示例中的json字符串,创建StringEntity注意使用UTF-8编码,否则会出现乱码问题
stringEntity = new StringEntity(jsonString, "UTF-8");
httpPost.setEntity(stringEntity);
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
ResponseHandler responseHandler = new BasicResponseHandler();
//发送Post请求,并获取响应信息
responseBody = client.execute(httpPost, responseHandler);
……

注意:
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
测试的时候记得取消关注、然后再次关注

3.3 创建个性化菜单

简述:个性化菜单,就是为不同的用户创建不同的用户菜单展现形式。比如A用户喜欢篮球,B用户喜欢足球,为了体现平台的人性化,我们为A类用户设计了篮球类的菜单选项,为B类用户设计了足球类的菜单选项。通过个性化菜单的配置,那么A用户将会看到篮球专属菜单,而B用户会享受足球专属菜单。

微信第三方开发-技术摘要_第2张图片
微信平台个性化菜单.png

实现:个性化菜单创建方式同基本的菜单创建方式基本相同,不同的时需要添加matchrule 属性,用来制定该菜单属于哪一类人群
json数据示例:

 {
     "button":[
     {  
          "type":"click",
          "name":"NBA",
          "key":"V1001_TODAY_MUSIC"
      },
     "button":[
     {  
          "type":"click",
          "name":"CBA",
          "key":"V1001_TODAY_MUSIC"
      }
      "matchrule":{
      "tag_id":"2",
      "sex":"1",
      "country":"中国",
      "province":"广东",
      "city":"广州",
      "client_platform_type":"2",
      "language":"zh_CN"
  }
 }

关于matchrule:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296&token=&lang=zh_CN

3.4 按钮点击事件响应

简述:对于button类型的菜单项,第三方平台需要根据它的key信息进行响应,比如点击查看历史文章菜单项,返回历史文章信息。
实现:微信服务器在转发请求时,会告知用户请求的类型信息,对于菜单点击来说,它属于event 类型;而用户发送的消息,属于text 类型。所以根据请求类型,进行不同业务逻辑处理,实现不同功能需求。
部分代码示例:

if("text".endsWith(xmlEntity.getMsgType())){
              result = "文本测试!";
//            封装xml文档
              result = new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);
//            result = new TulingApiProcess().getTulingResult(xmlEntity.getContent());
        }
        else if ("event".endsWith(xmlEntity.getMsgType())){
            result = "菜单按钮点击!";
            result = new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);
        }

4.消息回复

简述:根据用户发送的消息(图片、文本信息等),公众号做出及时的响应时每个公众号必备的功能。公众号现在支持回复文本、图片、图文、语音、视频、音乐信息,回复消息方式有关注时自动回复、关键字回复
实现:对于信息的判断逻辑,同3.4讲到的类型判断。本节重点讲关键字回复功能,第三方平台获取到用户输入的关键字之后,根据匹配逻辑,推送相关的图文、图片等信息。
示例响应xml:




12345678



5.小结

作为中继器的微信服务器,主要起到了消息转发、控制的作用。第三方平台需要实现的核心功能是:

  • 数据逐渐庞大之后,如何精确的匹配用户关键词,优化用户交互。

  • 大数据处理,精准信息推送,精准的用户行为预测

  • 设计更加优秀的交互H5页面,利用微信的js-sdk 有效的宣传,或者优化用户与平台的互动

  • 微信商城、微信支付 安全等问题

你可能感兴趣的:(微信第三方开发-技术摘要)