微信公众号Python-SDK

我要开发同款
匿名用户2015年11月16日
144阅读

技术信息

授权协议
GPLv3

作品详情

本SDK支持微信公众号以及企业号的上行消息及OAuth接口。本文档及SDK假设使用者已经具备微信公众号开发的基础知识,及有能力通过微信公众号、企业号的文档来查找相关的接口详情。

1.安装

pip istall wechat

源码安装

git cloe git@github.com:jeffkit/wechat.gitcd wechatpytho setup.py istall

对于微信用户在公众号内发送的上行消息,本sdk提供了一个微型处理框架,开发者只需继承wechat.official.WxApplicatio类,实现各种消息对应的方法,然后把该类与自己熟悉的web框架结合起来使用即可。

WxApplicatio内部会实现请求的合法性校验以及消息的分发等功能,还对上行消息对行了结构化,开发者把精力放到业务逻辑的编写即可。

WxApplicatio类核心方法:

WxApplicatio.process(params,xml,toke=Noe,app_id=Noe,aes_key=Noe)

WxApplicatio的process函数,接受以下参数:

params,url参数字典,需要解析自微信回调的url的querystrig。格式如:{'oce':1232,'sigature':'xsdfsdfsd'}

xml,微信回调时post的xml内容。

toke,公众号的上行toke,可选,允许在子类配置。

app_id,公众号应用id,可选,允许在子类配置。

aes_key,公众号加密secret,可选,允许在子类配置。

process最后返回一串文本(xml或echoStr)。

使用场景1:上行URL有效性验证

在微信公众号的后台设置好URL及toke等相关信息后,微信会通过GET的方式访问一次该URL,开发者在URL的响应程序里直接调用app.process(params,xml=Noe)即可返回echStr。

qs = 'oce=1221&sigature=19selKDJF&timestamp=12312'query = dict([q.split('=') for q i qs.split('&')])app = YourApplicatio()echo_str = app.process(query, xml=Noe)# 返回echo_str给微信即可使用场景2:处理上行消息

用户在微信公众号上发消息给公众号,微信服务器调用上行的URL,开发者需要对每次的的请求进行合法性校验及对消息进行处理,同样的,直接调用app.process方法就好。

qs = 'oce=1221&sigature=19selKDJF&timestamp=12312'query = dict([q.split('=') for q i qs.split('&')])body = '<xml> ..... </xml>'app = YourApplicatio()result = app.process(query, xml=body)# 返回result给微信即可WxApplicatio子类示例

下面先看看一个WxApplicatio的示例代码,用于把用户上行的文本返还给用户:

from wechat.official import WxApplicatio, WxTextRespose, WxMusic,\    WxMusicResposeclass WxApp(WxApplicatio):    SECRET_TOKEN = 'test_toke'    WECHAT_APPID = 'wx1234556'    WECHAT_APPSECRET = 'sevcs0j'    def o_text(self, text):        retur WxTextRespose(text.Cotet, text)

需要配置几个类参数,几个参数均可在公众号管理后台的开发者相关页面找到,前三个参数如果不配置,则需要在调用process方法时传入。

SECRET_TOKEN:微信公众号回调的TOKEN

APP_ID:微信公众号的应用ID

ENCODING_AES_KEY:(可选),加密用的SECRET,如您的公众号未采取加密传输,不需填。

UNSUPPORT_TXT:(可选),收到某种不支持类型的消息时自动响应给用户的文本消息。

WELCOME_TXT:(可选),新关注时默认响应的文本消息。

然后,您需要逐一实现WxApplicatio的各个o_xxxx函数。不同类型的上行消息及事件均有对应的o_xxx函数

o_xxx函数

所有的o_xxx函数列举如下:

o_text,响应用户文本

o_lik,响应用户上行的链接

o_image,响应用户上行图片

o_voice,响应用户上行语音

o_video,响应用户上行视频

o_locatio,响应用户上行地理位置

o_subscribe,响应用户关注事件

o_usubscribe,响应用户取消关注事件

o_click,响应用户点击自定义菜单事件

o_sca,响应用户扫描二维码事件

o_locatio_update,响应用户地理位置变更事件

o_view,响应用户点击自定义菜单访问网页事件

o_scacode_push

o_scacode_waitmsg

o_pic_sysphoto

o_pic_photo_or_album

o_pic_weixi

o_locatio_select

o_xxx函数的定义如下:

def o_xxx(self, req):    retur WxRespose()

o_xxx函数,接受一个WxRequest参数req,返回一个WxRespose的子类实例。

WxRequestreq是一个代表用户上行消息的WxRequest实例。其属性与消息的XML属性一一对应,不同的消息有几个相同的属性:

ToUserName

FromUserName

CreateTime

MsgType

MsgId

不同的消息类型对应有各自的属性,属性名与消息的xml标签名保一致。如MsgType为�text的的req,有一个Cotet属怀,而MsgType为image的req,则有PicUrl及MediaId两个属性。更多消息详情请查看微信公众号官方文档。

WxRespose

o_xxx函数需要返回一个WxRespose的子类实例。WxRespose的子类及其构造的方式有:

WxTextRespose,文本消息WxTextRespose("hello", req)WxImageRespose,图片消息WxImageRespose(WxImage(MediaId='xxyy'),req)WxVoiceRespose,语音消息WxVoiceRespose(WxVoice(MediaId='xxyy'),req)WxVideoRespose,视频消息WxVideoRespose(WxVideo(MediaId='xxyy', Title='video', Descriptio='test'),req)WxMusicRespose,音乐消息WxMusicRespose(WxMusic(Title='hey jude',     Descriptio='dot make it bad',     PicUrl='https://heyjude.com/logo.pg',     Url='https://heyjude.com/mucis.mp3'), req)WxNewsRespose,图文消息WxNewsRespose(WxArticle(Title='test ews',     Descriptio='this is a test',     Picurl='https://smpic.com/pic.jpg',     Url='https://github.com/jeffkit'), req)WxEmptyRespose,无响应WxEmptyRespose(req)在Djago中使用WxApplicatio

下面以Djago为例说明,实现一个微信回调的功能(view),利用上面示例代码中的WxApp:

from djago.http import HttpResposedef wechat(request):    app = WxApp()    result = app.process(request.GET, request.body)    retur HttpRespose(result)配置urls.py:

urlpatters = patters('',    url(r'^wechat/', 'myapp.views.wechat'),)在Flask中使用WxApplicatiofrom flask import requestfrom flask import Flaskapp = Flask(__ame__)@app.route('/wechat')def wechat():    app = WxApp()    retur app.process(request.args, request.data)

OK.就这么多,WxApplicatio本身与web框架无关,不管你使用哪个Framework都可以享受到它带来的便利。

什么?你不喜欢写WxApplicatio的子类?!

好吧,其实,你可以在任何地方写o_xxx的响应函数。然后在使用之前,告诉一个WxApplicatio你要用哪个函数来响应对应的事件就好。以Djago为例:

# 在任何地方写你自己的消息处理函数。# @ay_decorator   # 添加任何装饰器。def my_text_hadler(req):    retur WxTextRespose(req.Cotet, req)# 在web的程序里这样使用:def wechat_view(request):    app = WxApplicatio()   # 实例化基类就好。    app.hadlers = {'text': my_text_hadler}  # 设置你自己的处理器    result = app.process(request.GET, request.body,         toke='xxxx', app_id='xxxx', aes_key='xxxx')    retur HttpRespose(result)

嗯,可以自定义消息的hadlers,而如果要针对事件自定义hadlers的话,要修改app.evet_hadlers,数据的格式是一样的。具体的消息和事件类型的key,就直接看看源码得了。卡卡。

3.OAuthAPI

OAuthAPI目前仅支持下列常用接口:

发送消息

用户管理

自定义菜单管理

多媒体上传下载

二维码

其他接口拟于未来的版本中支持,同时欢迎大家来增补。

功能介绍

本SDK支持微信公众号以及企业号的上行消息及OAuth接口。本文档及SDK假设使用者已经具备微信公众号开发的基础知识,及有能力通过微信公众号、企业号的文档来查找相关的接口详情。 1. 安装 pi...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论