手把手教你微信第三方平台开发
本文适合想接入第三方平台开发的同学,通过真实经验大致讲解一下相关业务,建议收藏以备不时之需。
一、什么是微信开放平台
微信开放平台地址
微信开发平台实际上就是给微信外部人员提供微信能力的平台,我们可以在这个平台创建相关的应用,管理对应的认证、授权信息,然后通过开放接口对接微信提供的种种能力。
其中,账号的申请需要公司主体的相关信息。
二、如何接入微信第三方平台的开发
2.1 注册开放平台账号
注册账号需要邮箱(这个邮箱贼恶心,不能是微信绑定过的,也不能是公众号平台绑定的,小程序平台绑定的也不行),然后需要提供公司主体等相关的信息
2.2 通过开发者资质认证
2.3 创建第三方平台
2.4 完善开发者信息
主要是权限集以及开发资料
授权事件接收URL
- 用于接收授权事件相关通知,也用于接收ticket (ticket的作用后面会说)
消息与事件接收URL
- 接收公众号或小程序消息和事件推送,比如说关注事件,扫码事件等
消息校验Token 和 消息加解密Key
- 主要是对消息的鉴权和解密作用
授权发起页域名
- 必须是这个域名内的网页才可以跳转到授权登陆页面,否则会报错
公众号开发域名
- 当你要做H5 页面需要使用 JS-SDK 去做一些和微信接口交互的功能时,你的发起域名必须时配置在公众号的开发域名上
授权测试公众号/小程序列表
- 未全网发布(测试阶段)可以使用授权能力的公众号或者小程序
白名单IP地址列表
- IP 通讯白名单,一般是服务器的出口IP,这个主要做安全通讯用的
三、接入流程
3.1 相关概念
为了更好理解接入的流程,我们需要先明白几个概念
3.1.1 微信开放平台
微信提供给开发者们使用的系统
3.1.2 微信开发者账号
微信开放平台的一个账号
3.1.3 第三方平台
属于开放平台的一种类型的应用,一个开放平台可以建五个定制化开发服务商和五个平台型服务商,一般sass模式的都是基于平台型的,像我们,我们会给开发环境,测试环境,予发布环境,生产环境各建一个第三方平台,实现资源隔离。
3.1.4 公众号
就是我们平常看到的公众号,本身公众号是可以自己开发能力的,但是有些企业不想重复造轮子,就会授权给其他的第三方平台来管理自己的公众号
3.1.5 第三方平台APPID (component_app_id)
第三方平台的唯一标识
3.1.6 公众号app-id
公众号的唯一标识
3.1.7 第三方平台ticket (component_verify_ticket)
每十分钟会向配置的授权事件接收URL推送aes 加密后的 ticket,作为第三方平台通讯的临时票据,服务器直接 return success 即可。
3.1.8 用户的 open_id
每个微信用户关注一个公众号后都会生成open-id, 它由公众号+用户微信作为唯一性,也就是同个微信号在不同的公众号open-id 是不一样的, 不同的微信号在同个公众号open-id 也是不同的
3.1.9 union_id
微信生态中,用户的平台级的唯一标识,当公众号和小程序都绑定在了同一个开发者账号中,那么这些公众号和小程序对同一个微信用户就会生成一个唯一的 union-id , 从而可以在公众号和小程序中识别到同一个微信用户
3.2 业务流程
图示是我总结的整个授权体系的流程图
简单来说,微信开放平台会定时的推送 ticket给你,这个ticket可以用来获取第三方平台的 component_access_token 作为调用第三方平台接口的凭证。通过调用第三方平台的接口获得预授权码,你可以可以组装链接给用户去访问扫码,组装的链接实际上是微信的域名,用户扫描并且确认授权后,微信就会给你一个属于该公众号的授权码,你通过该授权码就可以拿到公众号的授权信息(包括权限集,access_token,access_refresh_token , 过期时间等),其中 refresh_token 是用来刷新 access_token 的,这些凭证都是有有效期的,需要在过期前进行刷新。
因此,需要有定时任务可以手动帮我们去定时的刷新这些token,主要是第三方平台 component_access_token 的 公众号的 access_token 的刷新。
其中,相对比较麻烦的是,在获取ticket的时候,微信采用了 AES 加密算法,需要进行解密才能拿到译文,目前微信提供了 c++, php, java, python, c# 5 种语言的示例代码 ,你可以很方便的进行接入,但是没有提供 go 的 SDK ,下面我结合了GitHub 已有的案例,简单梳理一下对应的解密过程。
四、AES 解密(Go版本)
微信消息加解密技术介绍
大家可以先看看微信的介绍,再回头看看这边文章。
4.1 算法相关参数
这时候就要用到我们之前配置的开发者配置了。
- token
- 微信开放平台上,服务方设置的接收消息的消息校验 token,比如我上面设置的 mclinkstudywx
- timestamp
- 时间戳,回调的URL会附带该参数
- nonce
- URL 上原有参数,随机数
- msg_signature
- URL 上的参数,用来鉴权
- msg_encrypt
- body的xml 里面的参数,前文描述密文消息体
- encodingAesKey
- 即消息加解密 Key,长度固定为 43 个字符,从 a-z,A-Z,0-9 共 62 个字符中选取。由开发者在创建公众号插件时填写,后也可申请修改
4.2 处理流程
开发者先验证消息体签名的正确性,验证通过后,再对消息体进行解密。
1. 开发者计算签名,dev_msg_signature=sha1(sort(Token、timestamp、nonce, msg_encrypt))
2. 比较dev_msg_signature和URL上带的msg_signature是否相等,相等则表示验证通过。
3. Aes 解密
4. xml 格式解析
...e, err := wxencrypter.NewEncrypter(token, encodingAesKey, appId)if err != nil {return err}b, err := e.Decrypt(msgSignature, timestamp, nonce, deCodeInfo)if err != nil {return err}// 解析xmlvar verifyTicketReq http_service_model.ComponentVerifyTicketReqif err := xml.Unmarshal(b, &verifyTicketReq); err != nil {return err}
...type ComponentVerifyTicketReq struct {AppId string `xml:"AppId"`CreateTime string `xml:"CreateTime"`InfoType string `xml:"InfoType"`ComponentVerifyTicket string `xml:"ComponentVerifyTicket"`AuthorizationCode string `xml:"AuthorizationCode"`
}
本着不重复造轮子的原则,在GitHub上找到了一个兄弟好几年前写的sdk,大家可以将其引入作为拓展包使用。
https://github.com/gomydodo/wxencrypter
由于这个仓库代码作者已经不维护了,建议大家拷贝一下自己改改嵌入到项目中,后续有需要可能会出一个开源的 sdk 给大家参考使用。
其中,需要注意的是
EncodingAESKey: 即消息加解密 Key,长度固定为 43 个字符,从 a-z,A-Z,0-9 共 62 个字符中选取。由开发者在创建公众号插件时填写,后也可申请修改。
AESKey: AESKey=Base64_Decode(EncodingAESKey + “=”),EncodingAESKey 尾部填充一个字符的 “=”, 用 Base64_Decode 生成 32 个字节的 AESKey;
因此实际上用到的AESKE 是上面的算法来生成的,如下图所示。
五、相关的微信接口汇总
- 启动票据推送服务
- 获取验证票据
- 获取第三方component_access_token
- 获取预授权码
- 使用授权码获取授权信息
- 获取/刷新接口调用令牌
六、关于微信用户唯一性的研究
如图,我们前面说到,一个开放平台账号是可以建多个第三方平台的。例如开放平台账号1有着A第三方平台和B第三方平台。
一个公众号可以授权给多个第三方平台(不过权限集有些是互斥的,比如一些权限集只能给其中一个),如公众号A 分别授权给了 开放平台账号1的 A第三方平台和B第三方平台,又同时授权给了开发平台账号3的C第三方平台。
这时候,你可能会有疑问,为啥有虚框和非虚框的绑定的公众号功能。
在后台系统,是有绑定公众号的功能的,你可以将旗下的公众号都绑定进去,那么这些公众号就会打通账号体系了,同一个微信号在这些公众号拿到的union_id 是一致的,而 open_id 是和公众号有关系,因此open_id 会不一致。
如果你是做的对外使用的第三方平台,目前我们是让客户自己去申请属于自己的开放平台账号,让客户自己在他的账号里绑定他们公司的公众号以及小程序等(毕竟每个客户的主体都不同,这是比较好的做法)。
七、总结
本文主要讲解了开放平台的一些操作指引,第三方平台的业务流程说明,常见业务概念的解释,以及微信打通账号体系的原理。算是一篇比较干货的内容,建议收藏,说不定后面你也需要搞类似的业务。
手把手教你微信第三方平台开发相关推荐
- 微信第三方平台开发错误码集合,各种 code
微信第三方平台开发错误码集合 PHP static $codes = array("-1" => "系统繁忙","0" => & ...
- 微信第三方平台开发流程和总结
微信第三方平台开发流程和总结 创建第三方平台 1).在微信开放平台-管理中心-第三方平台中创建第三方平台账号.创建第三方平台 2).选择"平台型服务商类型"创建第三方平台.填写第三 ...
- 微信第三方平台开发接入
微信第三方平台开发接入 授权流程接入步骤如下:( 微信https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=res ...
- 【除夕夜特辑】手把手教你微信公众号开发
文章目录 文章主题 开发环境的搭建 接入微信公众平台 填写服务器配置 验证消息的确来自微信服务器 接收消息 回复消息 聊天机器人 回复图文消息 自定义菜单 菜单响应 模板消息 设置所属行业 发送模板消 ...
- 微信第三方平台开发流程
一个微信公众号菜鸟的摸索之路 准备工作 注册申请开发者账号 开发者资质认证 附上地址:https://open.weixin.qq.com 创建第三方平台 进入管理中心->创建第三方平台 这里解 ...
- 微信端php 开发技术要求,微信第三方平台开发详解——PHP版
申请第三方平台,这个很简单直接按照提示填写,下面的授权事件接收URL中获取的component_verify_ticket是会过期的,所以不要只获取一次,缓存起来每10分钟会发送一次,每1小时会更新一 ...
- 微信第三方平台开发,component_verify_ticket的接收
首先是接收component_verify_ticket 大家在创建完成第三方平台之后,微信服务器就会以10分钟左右的时间通过当时填写的授权事件接收URL.发送ticket.但是在接收之后,需要进行 ...
- 微信第三方平台开发(二)---内网穿透
开发第一步: 创建第三方平台,但是有个前提就是需要存放服务的服务器域名. 有个方法:修改后打包部署到服务器上,但是这很麻烦,的确. 那怎么可以做到本地开发呢? 这个时候就需要内网穿透这个神器了,找了很 ...
- 微信第三方平台开发 - 常见问题汇总
最近在做有关微信第三方相关内容,但是并没有想象中的那么顺利,出现种种的问题,记录在这里 1.微信的消息推送问题 矛盾点: 用户通过页面授权成功之后,通过返回的页面时候的授权码code就可以拉取到用户的 ...
- 微信第三方平台开发三(消息加解密)
代码根本不需要自己写,微信提供示例代码,参数需要"公众号消息校验Token","公众号消息加解密Key" 我是用java写的,出现了下列问题 1.报错:java ...
最新文章
- tfs连不上团队资源管理器问题
- 【机器视觉】 dev_set_color算子
- Thymeleaf的Spring数据
- 曙光服务器优势,5大核心优势 探秘曙光Cloudview三大平台
- sqlyog如何设置.时提示字段名_Spring boot 中使用 Tomcat时 用户名 密码如何设置呢?...
- linux查看ip访问日志文件,linux分析apache日志获取最多访问的前10个IP
- 前端开发发展简史-个人经验分享
- GPS模拟器与Windows Mobile模拟器
- 数字电压表设计程序用c语言at89c51 adc0808,51单片机的ADC0808数字电压表设计
- hdb3编码程序设计c语言,已知代码10000000001011,利用c语言程序编写AMI码跟HDB3码
- 关于ISIS协议TLV TAG标签的研究与简单实验
- 300字总结计算机flash,flash实训报告心得(共10篇).docx
- 安卓音频开发(四)使用lame把wav转mp3
- 一发入魂!15分钟让你快速入门Python
- hdu 1116 并查集和欧拉路径
- 物联网平台搭建的全过程介绍(三)阿里云物联网设备接入订阅发布之Android studio例程
- Windows 10 第七个大版本更新来了,10个全新功能安排得明明白白~
- 动漫Q版人物头部怎么画?
- 【刘二大人 - PyTorch深度学习实践】学习随手记(一)
- 李子的猜数游戏!(β版)
热门文章
- matlab算方差std,MATLAB 方差函数 var std
- Dell 电脑的重装系统以及关键散热驱动建议
- 2021-10-11 全国大学生软件测试大赛赛前学习参考资料
- 新版Namecheap域名转出注册商方法解锁及获取转移
- 解决win10+Ubuntu20.0.4双系统,win10时间错误问题
- android 动态表情包,动态表情包下载免费
- python如何取消上一步操作的快捷键_ai返回上一步的快捷键是什么
- python 组合优化_python中的多周期投资组合优化
- [C#][原创]Magick.NET使用时一些弱点简介
- android dns 设置,安卓手机怎么设置DNS Android手机修改DNS图文教程