本文适合想接入第三方平台开发的同学,通过真实经验大致讲解一下相关业务,建议收藏以备不时之需。
一、什么是微信开放平台
微信开放平台地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/912254722e554965b0f8975ce65c2159.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
微信开发平台实际上就是给微信外部人员提供微信能力的平台,我们可以在这个平台创建相关的应用,管理对应的认证、授权信息,然后通过开放接口对接微信提供的种种能力。
其中,账号的申请需要公司主体的相关信息。
二、如何接入微信第三方平台的开发
![在这里插入图片描述](https://img-blog.csdnimg.cn/00fa8ddf35c04bf3b32ba40781d5cd90.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
2.1 注册开放平台账号
![在这里插入图片描述](https://img-blog.csdnimg.cn/bb3e7a80080145139292418384773f63.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
注册账号需要邮箱(这个邮箱贼恶心,不能是微信绑定过的,也不能是公众号平台绑定的,小程序平台绑定的也不行),然后需要提供公司主体等相关的信息
2.2 通过开发者资质认证
![在这里插入图片描述](https://img-blog.csdnimg.cn/f114c25f6a7c4269b28ab4353fc7dfdf.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
2.3 创建第三方平台
![在这里插入图片描述](https://img-blog.csdnimg.cn/fa704bede9314bfd8b2929dd4edacd0a.png)
2.4 完善开发者信息
主要是权限集以及开发资料
![在这里插入图片描述](https://img-blog.csdnimg.cn/3941c94e3a6f4dbd975a94436ad53b49.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/192cdbe1a9b249218c2adbe94231b89f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
-
授权事件接收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 业务流程
![在这里插入图片描述](https://img-blog.csdnimg.cn/cabb12bd27f34c1f8b65eecc3c2942d1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
图示是我总结的整个授权体系的流程图
简单来说,微信开放平台会定时的推送 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
- nonce
- msg_signature
- msg_encrypt
- 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
}
// 解析xml
var verifyTicketReq http_service_model.ComponentVerifyTicketReq
if 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
![在这里插入图片描述](https://img-blog.csdnimg.cn/26d3fc8fe9694dde9426360982078d65.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
由于这个仓库代码作者已经不维护了,建议大家拷贝一下自己改改嵌入到项目中,后续有需要可能会出一个开源的 sdk 给大家参考使用。
其中,需要注意的是
EncodingAESKey: 即消息加解密 Key,长度固定为 43 个字符,从 a-z,A-Z,0-9 共 62 个字符中选取。由开发者在创建公众号插件时填写,后也可申请修改。
AESKey: AESKey=Base64_Decode(EncodingAESKey + “=”),EncodingAESKey 尾部填充一个字符的 “=”, 用 Base64_Decode 生成 32 个字节的 AESKey;
因此实际上用到的AESKE 是上面的算法来生成的,如下图所示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e50ffc128c054c7b9c23ee046c4906c3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
五、相关的微信接口汇总
六、关于微信用户唯一性的研究
![在这里插入图片描述](https://img-blog.csdnimg.cn/ec720bca244c4eb092c48aa89b9d9b2c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
如图,我们前面说到,一个开放平台账号是可以建多个第三方平台的。例如开放平台账号1有着A第三方平台和B第三方平台。
一个公众号可以授权给多个第三方平台(不过权限集有些是互斥的,比如一些权限集只能给其中一个),如公众号A 分别授权给了 开放平台账号1的 A第三方平台和B第三方平台,又同时授权给了开发平台账号3的C第三方平台。
这时候,你可能会有疑问,为啥有虚框和非虚框的绑定的公众号功能。
![在这里插入图片描述](https://img-blog.csdnimg.cn/edce32e0428648e2a4c7e4a653029088.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATUNsaW5r,size_20,color_FFFFFF,t_70,g_se,x_16)
在后台系统,是有绑定公众号的功能的,你可以将旗下的公众号都绑定进去,那么这些公众号就会打通账号体系了,同一个微信号在这些公众号拿到的union_id 是一致的,而 open_id 是和公众号有关系,因此open_id 会不一致。
如果你是做的对外使用的第三方平台,目前我们是让客户自己去申请属于自己的开放平台账号,让客户自己在他的账号里绑定他们公司的公众号以及小程序等(毕竟每个客户的主体都不同,这是比较好的做法)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/477d4d4dbdf14b77a5326b81717256eb.png)
七、总结
本文主要讲解了开放平台的一些操作指引,第三方平台的业务流程说明,常见业务概念的解释,以及微信打通账号体系的原理。算是一篇比较干货的内容,建议收藏,说不定后面你也需要搞类似的业务。