wechatpy icon indicating copy to clipboard operation
wechatpy copied to clipboard

微信小程序 client api 的集成

Open cloverstd opened this issue 8 years ago • 7 comments
trafficstars

一个微信公众号可以绑定多个微信小程序,所以微信小程序的 app_id 还有 secret 与微信公众号的不一致

我看到目前的 wechatpy.client 中的 wxa.py 使用的是 wechatpy.client (微信公众号)的 app_id 和 secret,这样在一个 client 中是无法同时使用微信公众号的 API。目前在 wxa.py 中没有登录之类的和 app_id 和 secret 密切相关的接口。

所以,对于小程序是否可以采用下面的二(三)种解决方案

  1. 跟微信企业号一样,不与 wechatpy.client 集成在一起,单独一个 wechatpy.wxa
  2. 集成在 wechatpy.client 中,还是现在的 wxa.py
    1. 使用 wechatpy.client 的 app_id 和 secret,二选一,当使用微信小程序的 app_id 和 secret 时,调用微信公众号 API 时抛出错误来,微信小程序换取 token 的 api 接口与微信公众号是一样的
    2. 使用 wechatpy.client,但是新增加 wxa_app_id 和 wxa_secret,单独处理微信小程序的,这样可以在一个 client 同时使用 wechatpy.client

cloverstd avatar Jul 31 '17 10:07 cloverstd

十分科学的问题。

目前我们的解决方案,要求调用方要明白自己是公众号还是小程序。 假如公众号调用了小程序的接口, 会在微信API层面报48001无授权的错。 但是大部分情况可以一视同仁,做归一化的处理。 (比如刷新access token,之类之类的操作)

假如说我们拆分了wechatpy.wxa, 优势是见文知意,拆分了不同的对象,调用方便于管理。 麻烦的地方在于比较难做归一化处理, 而且分散了地方。

集成在wechatpy.client的话, 其实我们默设了一个前提, 就是一个公众号对应一个小程序。

这三种处理方式都各有优点, 就我个人而言,倾向现有的处理方式。 库提供归一化的对象, 让业务代码来控制小程序、公众号的API。😃

LKI avatar Jul 31 '17 10:07 LKI

倒是可以有个 wechatpy.wxa,然后想办法让目前的 wechatpy.client 里面的 wxa 使用 wechatpy.wxa 的实现避免短期内的 breaking change.

messense avatar Jul 31 '17 10:07 messense

@LKI 你们的解决方案很适合 platform 形式的

如果作为个人开发者,我更倾向于方案1,这样可以将微信公众号与微信小程序解耦合,在代码层面,我可以知道一个 client 是微信小程序的还是微信公众号,亦或者是微信企业号。

@messense 的方案我比较赞同

我觉得 breaking change 不是一个好事,特别是对于有使用者的情况下,应该保持在大版本的前提下尽量向下兼容。

cloverstd avatar Jul 31 '17 12:07 cloverstd

@cloverstd

嗯,科学, 拆分以后 api 调用的权限区分也会更加明显。

LKI avatar Jul 31 '17 12:07 LKI

暂定 wechatpy 1.7,当然能进 1.6 也没问题。

messense avatar Aug 02 '17 05:08 messense

对与在一个服务中管理多个程序,我采用的如下代码(简化后),这样每次通过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 avatar Dec 13 '17 06:12 azurecn

@azurecn 这种做法不是线程安全的,同一个 app_idclient 可能会被初始化多次,不过大部分情况下不是太大问题。

messense avatar Dec 13 '17 06:12 messense