wechatpy
wechatpy copied to clipboard
微信小程序 client api 的集成
一个微信公众号可以绑定多个微信小程序,所以微信小程序的 app_id 还有 secret 与微信公众号的不一致
我看到目前的 wechatpy.client 中的 wxa.py 使用的是 wechatpy.client (微信公众号)的 app_id 和 secret,这样在一个 client 中是无法同时使用微信公众号的 API。目前在 wxa.py 中没有登录之类的和 app_id 和 secret 密切相关的接口。
所以,对于小程序是否可以采用下面的二(三)种解决方案
- 跟微信企业号一样,不与
wechatpy.client集成在一起,单独一个wechatpy.wxa - 集成在
wechatpy.client中,还是现在的 wxa.py- 使用
wechatpy.client的 app_id 和 secret,二选一,当使用微信小程序的 app_id 和 secret 时,调用微信公众号 API 时抛出错误来,微信小程序换取 token 的 api 接口与微信公众号是一样的 - 使用
wechatpy.client,但是新增加 wxa_app_id 和 wxa_secret,单独处理微信小程序的,这样可以在一个 client 同时使用wechatpy.client
- 使用
十分科学的问题。
目前我们的解决方案,要求调用方要明白自己是公众号还是小程序。 假如公众号调用了小程序的接口, 会在微信API层面报48001无授权的错。 但是大部分情况可以一视同仁,做归一化的处理。 (比如刷新access token,之类之类的操作)
假如说我们拆分了wechatpy.wxa,
优势是见文知意,拆分了不同的对象,调用方便于管理。
麻烦的地方在于比较难做归一化处理,
而且分散了地方。
集成在wechatpy.client的话,
其实我们默设了一个前提,
就是一个公众号对应一个小程序。
这三种处理方式都各有优点, 就我个人而言,倾向现有的处理方式。 库提供归一化的对象, 让业务代码来控制小程序、公众号的API。😃
倒是可以有个 wechatpy.wxa,然后想办法让目前的 wechatpy.client 里面的 wxa 使用 wechatpy.wxa 的实现避免短期内的 breaking change.
@LKI 你们的解决方案很适合 platform 形式的
如果作为个人开发者,我更倾向于方案1,这样可以将微信公众号与微信小程序解耦合,在代码层面,我可以知道一个 client 是微信小程序的还是微信公众号,亦或者是微信企业号。
@messense 的方案我比较赞同
我觉得 breaking change 不是一个好事,特别是对于有使用者的情况下,应该保持在大版本的前提下尽量向下兼容。
@cloverstd
嗯,科学, 拆分以后 api 调用的权限区分也会更加明显。
暂定 wechatpy 1.7,当然能进 1.6 也没问题。
对与在一个服务中管理多个程序,我采用的如下代码(简化后),这样每次通过ent_id查询对应企业的信息来操作对应企业的公众号且不会重复,感觉加入小程序判断即可达到要求
_wechat_container = dict()
def wechat_container(ent_id):
client = _wechat_container.get(ent_id)
if not client:
wechat_info = WechatInfo.query.filter_by(ent_id=ent_id).first()
if wechat_info:
client = WeChatClient(wechat_info.app_id, wechat_info.app_secret)
_wechat_container[ent_id] = client
else:
raise ValueError('没有对应数据')
return client
所以我觉得只要能在初始化 WeChatOAuth 中加入对小程序和公众号的区分即可,这样可以最小化改动源码,这是我的初衷,看各位的高见😊
@azurecn 这种做法不是线程安全的,同一个 app_id 的 client 可能会被初始化多次,不过大部分情况下不是太大问题。