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

微信平台开发

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

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

微信服务器在自定义服务器与用户终端之间,起到了桥接的作用,微信以XML形式对请求/响应进行转发
微信第三方开发架构.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<String> 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用户会享受足球专属菜单。

微信平台个性化菜单.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:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

5.小结

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

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,103评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,626评论 4 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,577评论 25 707
  • MC黑糍 真实姓名:杨子晗 性别:男 职业:网络麦手 身高:183cm 体重:63kg 出生地:陕西省澄城县 生日...
    MC黑糍阅读 142评论 0 0