返回介绍

企业微信快速上手

发布于 2023-06-27 19:35:15 字数 4103 浏览 0 评论 0 收藏 0

基于企业微信的开发一般分为如下两种

  • 回调模式
    • 用户通过公众号产生的一系列消息(例如普通文本消息、扫码事件消息、微信支付成功事件消息)

    • 开发者需要根据不同的消息,做出对应的响应

    • 此模式下,可以理解为微信服务器作为开发者服务器的客户端对开发者服务器发送 HTTP 请求(一般情况下为 POST)

  • 主动调用
    • 开发者可以通过企业微信提供的 API 做出一系列操作,例如向用户主动推送消息

微信回调模式接入

验证请求有效性

微信企业号只有微信订阅号的 安全模式 ,所以对于回调模式下的请求都是经过 AES 加密过的。

from wechatpy.enterprise.crypto import WeChatCrypto
from wechatpy.exceptions import InvalidSignatureException

crypto = WeChatCrypto(TOKEN, EncodingAESKey, CorpId)
try:
    echo_str = crypto.check_signature(
        signature,
        timestamp,
        nonce,
        echo_str
    )
except InvalidSignatureException:
    raise  # 处理异常情况

解析 XML 消息

微信服务器发送来的消息在 HTTP 请求的 body 中,将微信服务器当做浏览器客户端,所以微信的 XML 消息正文在 Flask 中是 request.data,在 Tornado 中是 self.request.body

假设开发者将 XML 消息正文储存在变量 raw_message

from wechatpy.enterprise.crypto import WeChatCrypto
from wechatpy.exceptions import InvalidSignatureException
from wechatpy.enterprise.exceptions import InvalidCorpIdException
from wechatpy.enterprise import parse_message

crypto = WeChatCrypto(TOKEN, EncodingAESKey, CorpId)

try:
    decrypted_xml = crypto.decrypt_message(
        raw_message,
        signature,
        timestamp,
        nonce
    )
except (InvalidSignatureException, InvalidCorpIdException):
    raise  # 处理异常情况
else:
    msg = parse_message(decrypted_xml)

对于解析后的消息可以参考 推送消息推送事件 文档,基本与订阅号一致。

回复消息

企业号回复的消息也是经过 AES 加密过的,具体的回复消息也与订阅号基本一致。

from wechatpy.enterprise import parse_message, create_reply
from wechatpy.enterprise.crypto import WeChatCrypto

crypto = WeChatCrypto(TOKEN, EncodingAESKey, CorpId)

xml = create_reply(msg.content, msg).render()
encrypted_xml = crypto.encrypt_message(xml, nonce, timestamp)

基于 Flask 框架的示例可参考 https://github.com/jxtech/wechatpy/tree/master/examples/echo-enterprise

微信主动调用模式接入

对于主动调用 wechatpy 提供了主动调用模式的操作类 wechatpy.enterprise.WeChatClient

from wechatpy.enterprise import WeChatClient
wechat_client = WeChatClient(
    CorpId,
    secret
)

AccessToken

wechatpy 对于微信的 AccessToken 会在内部自动处理,一般情况下开发者不需要手动去操作,如果开发者需要访问 AccessToken,可以通过 wechat_client.access_token 获取到。

Storage

wechatpy 支持多种 AccessToken 的持久化储存,目前支持 memcached,memory,redis,shove

Redis 示例:

from wechatpy.enterprise import WeChatClient
from wechatpy.session.redisstorage import RedisStorage
from redis import Redis

redis_client = Redis.from_url('redis://127.0.0.1:6379/0')
session_interface = RedisStorage(
    redis_client,
    prefix="wechatpy"
)

wechat_client = WeChatClient(
    CorpId,
    secret,
    session=session_interface
)

Shove 示例:

from wechatpy.session.shovestorage import ShoveStorage

memcached 示例:

from wechatpy.session.memcachedstorage import MemcachedStorage

memory 示例:

from wechatpy.session.memorystorage import MemoryStorage
自定义 Storage

对于 wechatpy 不支持的 Storage,也可以自定义 Storage,要使用 Storage,首先要实现自定义的 Storage,自定义的 Storage 需要实现 getsetdelete,具体示例如下

from wechatpy.session import SessionStorage

class CustomStorage(SessionStorage):

    def __init__(self, *args, **kwargs):
        pass

    def get(self, key, default=None):
        pass

    def set(self, key, value, ttl=None):
        pass

    def delete(self, key):
        pass

wechat_client = WeChatClient(
    CorpId,
    secret,
    session=CustomStorage()
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文