Weixin for Python
Project description
微信SDK
======
提供微信登陆,公众号管理,微信支付,微信消息的全套功能
## 文档目录
* [快速开始](#目录)
* [微信消息](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E6%B6%88%E6%81%AF)
* [微信支付](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98)
* [微信登陆](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E7%99%BB%E9%99%86)
* [微信公众平台](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%B9%B3%E5%8F%B0)
欢迎提交[Pull requests](https://github.com/zwczou/weixin-python/pulls)
如果需要单独使用其中的某些模块,可以见[文档目录](#文档目录)的具体模块
如果需要组合在一起可以参考[快速开始](#目录)
## 目录
* [安装](#安装)
* [功能](#功能)
* [异常](#异常)
* [用法](#用法)
* [参数](#参数)
* [初始化](#初始化)
* [微信消息](#微信消息)
* [微信登陆](#微信登陆)
* [微信支付](#微信支付)
* [微信公众号](#微信公众号)
## 安装
使用pip
`sudo pip install weixin-python`
使用easy_install
`sudo easy_install weixin-python`
安装开发版本
`sudo pip install git+https://github.com/zwczou/weixin-python@dev`
## 功能
* 微信登陆
* 微信支付
* 微信公众号
* 微信消息
## 异常
父异常类名为 `WeixinError`
子异常类名分别为 `WeixinLoginError` `WeixinPayError` `WeixinMPError` `WeixinMsgError`
## 用法
### 参数
* `WEIXIN_TOKEN` 必填,微信主动推送消息的TOKEN
* `WEIXIN_SENDER` 选填,微信发送消息的发送者
* `WEIXIN_EXPIRES_IN` 选填,微信推送消息的有效时间
* `WEIXIN_MCH_ID` 必填,微信商户ID,纯数字
* `WEIXIN_MCH_KEY` 必填,微信商户KEY
* `WEIXIN_NOTIFY_URL` 必填,微信回调地址
* `WEIXIN_MCH_KEY_FILE` 可选,如果需要用退款等需要证书的api,必选
* `WEIXIN_MCH_CERT_FILE` 可选
* `WEIXIN_APP_ID` 必填,微信公众号appid
* `WEIXIN_APP_SECRET` 必填,微信公众号appkey
上面参数的必填都是根据具体开启的功能有关, 如果你只需要微信登陆,就只要选择 `WEIXIN_APP_ID` `WEIXIN_APP_SECRET`
* 微信消息
* `WEIXIN_TOKEN`
* `WEIXIN_SENDER`
* `WEIXIN_EXPIRES_IN`
* 微信登陆
* `WEIXIN_APP_ID`
* `WEIXIN_APP_SECRET`
* 微信公众平台
* `WEIXIN_APP_ID`
* `WEIXIN_APP_SECRET`
* 微信支付
* `WEIXIN_APP_ID`
* `WEIXIN_MCH_ID`
* `WEIXIN_MCH_KEY`
* `WEIXIN_NOTIFY_URL`
* `WEIXIN_MCH_KEY_FILE`
* `WEIXIN_MCH_CERT_FILE`
### 初始化
如果使用flask
```
# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from flask import Flask, jsonify, request, url_for
from weixin import Weixin, WeixinError
app = Flask(__name__)
app.debug = True
# 具体导入配
# 根据需求导入仅供参考
app.config.fromobject(dict(WEIXIN_APP_ID='', WEIXIN_APP_SECRET=''))
# 初始化微信
weixin = Weixin()
weixin.init_app(app)
# 或者
# weixin = Weixin(app)
```
如果不使用flask
```
# 根据需求导入仅供参考
config = dict(WEIXIN_APP_ID='', WEIXIN_APP_SECRET='')
weixin = Weixin(config)
```
### 微信消息
如果使用django,添加视图函数为
```
url(r'^/$', weixin.django_view_func(), name='index'),
```
如果为flask,添加视图函数为
```
app.add_url_rule("/", view_func=weixin.view_func)
```
```
@weixin.all
def all(**kwargs):
"""
监听所有没有更特殊的事件
"""
return weixin.reply(kwargs['sender'], sender=kwargs['receiver'], content='all')
@weixin.text()
def hello(**kwargs):
"""
监听所有文本消息
"""
return "hello too"
@weixin.text("help")
def world(**kwargs):
"""
监听help消息
"""
return dict(content="hello world!")
@weixin.subscribe
def subscribe(**kwargs):
"""
监听订阅消息
"""
print kwargs
return "欢迎订阅我们的公众号"
````
# 微信登陆
````
@app.route("/login")
def login():
"""登陆跳转地址"""
openid = request.cookies.get("openid")
next = request.args.get("next") or request.referrer or "/",
if openid:
return redirect(next)
callback = url_for("authorized", next=next, _external=True)
url = weixin.authorize(callback, "snsapi_base")
return redirect(url)
@app.route("/authorized")
def authorized():
"""登陆回调函数"""
code = request.args.get("code")
if not code:
return "ERR_INVALID_CODE", 400
next = request.args.get("next", "/")
data = weixin.access_token(code)
openid = data.openid
resp = redirect(next)
expires = datetime.now() + timedelta(days=1)
resp.set_cookie("openid", openid, expires=expires)
return resp
```
# 微信支付
注意: 微信网页支付的timestamp参数必须为字符串
```
@app.route("/pay/jsapi")
def pay_jsapi():
"""微信网页支付请求发起"""
try:
out_trade_no = weixin.nonce_str
raw = weixin.jsapi(openid="openid", body=u"测试", out_trade_no=out_trade_no, total_fee=1)
return jsonify(raw)
except WeixinError, e:
print e.message
return e.message, 400
@app.route("/pay/notify")
def pay_notify():
"""
微信异步通知
"""
data = weixin.to_dict(request.data)
if not weixin.check(data):
return weixin.reply("签名验证失败", False)
# 处理业务逻辑
return weixin.reply("OK", True)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=9900)
```
### 微信公众号
**注意**: 如果使用分布式,需要自己实现`access_token`跟`jsapi_ticket`函数
`access_token`默认保存在`~/.access_token`
`jsapi_ticket`默认保存在`~/.jsapi_ticket`
默认在(HOME)目录下面,如果需要更改到指定的目录,可以导入库之后修改,如下
```
import weixin
DEFAULT_DIR = "/tmp"
```
获取公众号唯一凭证
weixin.access_token
获取ticket
weixin.jsapi_ticket
创建临时qrcode
data = weixin.qrcode_create(123, 30)
print weixin.qrcode_show(data.ticket)
创建永久性qrcode
# scene_id类型
weixin.qrcode_create_limit(123)
# scene_str类型
weixin.qrcode_create_limit("456")
长链接变短链接
weixin.shorturl("http://example.com/test")
======
提供微信登陆,公众号管理,微信支付,微信消息的全套功能
## 文档目录
* [快速开始](#目录)
* [微信消息](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E6%B6%88%E6%81%AF)
* [微信支付](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98)
* [微信登陆](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E7%99%BB%E9%99%86)
* [微信公众平台](https://github.com/zwczou/weixin-python/wiki/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%B9%B3%E5%8F%B0)
欢迎提交[Pull requests](https://github.com/zwczou/weixin-python/pulls)
如果需要单独使用其中的某些模块,可以见[文档目录](#文档目录)的具体模块
如果需要组合在一起可以参考[快速开始](#目录)
## 目录
* [安装](#安装)
* [功能](#功能)
* [异常](#异常)
* [用法](#用法)
* [参数](#参数)
* [初始化](#初始化)
* [微信消息](#微信消息)
* [微信登陆](#微信登陆)
* [微信支付](#微信支付)
* [微信公众号](#微信公众号)
## 安装
使用pip
`sudo pip install weixin-python`
使用easy_install
`sudo easy_install weixin-python`
安装开发版本
`sudo pip install git+https://github.com/zwczou/weixin-python@dev`
## 功能
* 微信登陆
* 微信支付
* 微信公众号
* 微信消息
## 异常
父异常类名为 `WeixinError`
子异常类名分别为 `WeixinLoginError` `WeixinPayError` `WeixinMPError` `WeixinMsgError`
## 用法
### 参数
* `WEIXIN_TOKEN` 必填,微信主动推送消息的TOKEN
* `WEIXIN_SENDER` 选填,微信发送消息的发送者
* `WEIXIN_EXPIRES_IN` 选填,微信推送消息的有效时间
* `WEIXIN_MCH_ID` 必填,微信商户ID,纯数字
* `WEIXIN_MCH_KEY` 必填,微信商户KEY
* `WEIXIN_NOTIFY_URL` 必填,微信回调地址
* `WEIXIN_MCH_KEY_FILE` 可选,如果需要用退款等需要证书的api,必选
* `WEIXIN_MCH_CERT_FILE` 可选
* `WEIXIN_APP_ID` 必填,微信公众号appid
* `WEIXIN_APP_SECRET` 必填,微信公众号appkey
上面参数的必填都是根据具体开启的功能有关, 如果你只需要微信登陆,就只要选择 `WEIXIN_APP_ID` `WEIXIN_APP_SECRET`
* 微信消息
* `WEIXIN_TOKEN`
* `WEIXIN_SENDER`
* `WEIXIN_EXPIRES_IN`
* 微信登陆
* `WEIXIN_APP_ID`
* `WEIXIN_APP_SECRET`
* 微信公众平台
* `WEIXIN_APP_ID`
* `WEIXIN_APP_SECRET`
* 微信支付
* `WEIXIN_APP_ID`
* `WEIXIN_MCH_ID`
* `WEIXIN_MCH_KEY`
* `WEIXIN_NOTIFY_URL`
* `WEIXIN_MCH_KEY_FILE`
* `WEIXIN_MCH_CERT_FILE`
### 初始化
如果使用flask
```
# -*- coding: utf-8 -*-
from datetime import datetime, timedelta
from flask import Flask, jsonify, request, url_for
from weixin import Weixin, WeixinError
app = Flask(__name__)
app.debug = True
# 具体导入配
# 根据需求导入仅供参考
app.config.fromobject(dict(WEIXIN_APP_ID='', WEIXIN_APP_SECRET=''))
# 初始化微信
weixin = Weixin()
weixin.init_app(app)
# 或者
# weixin = Weixin(app)
```
如果不使用flask
```
# 根据需求导入仅供参考
config = dict(WEIXIN_APP_ID='', WEIXIN_APP_SECRET='')
weixin = Weixin(config)
```
### 微信消息
如果使用django,添加视图函数为
```
url(r'^/$', weixin.django_view_func(), name='index'),
```
如果为flask,添加视图函数为
```
app.add_url_rule("/", view_func=weixin.view_func)
```
```
@weixin.all
def all(**kwargs):
"""
监听所有没有更特殊的事件
"""
return weixin.reply(kwargs['sender'], sender=kwargs['receiver'], content='all')
@weixin.text()
def hello(**kwargs):
"""
监听所有文本消息
"""
return "hello too"
@weixin.text("help")
def world(**kwargs):
"""
监听help消息
"""
return dict(content="hello world!")
@weixin.subscribe
def subscribe(**kwargs):
"""
监听订阅消息
"""
print kwargs
return "欢迎订阅我们的公众号"
````
# 微信登陆
````
@app.route("/login")
def login():
"""登陆跳转地址"""
openid = request.cookies.get("openid")
next = request.args.get("next") or request.referrer or "/",
if openid:
return redirect(next)
callback = url_for("authorized", next=next, _external=True)
url = weixin.authorize(callback, "snsapi_base")
return redirect(url)
@app.route("/authorized")
def authorized():
"""登陆回调函数"""
code = request.args.get("code")
if not code:
return "ERR_INVALID_CODE", 400
next = request.args.get("next", "/")
data = weixin.access_token(code)
openid = data.openid
resp = redirect(next)
expires = datetime.now() + timedelta(days=1)
resp.set_cookie("openid", openid, expires=expires)
return resp
```
# 微信支付
注意: 微信网页支付的timestamp参数必须为字符串
```
@app.route("/pay/jsapi")
def pay_jsapi():
"""微信网页支付请求发起"""
try:
out_trade_no = weixin.nonce_str
raw = weixin.jsapi(openid="openid", body=u"测试", out_trade_no=out_trade_no, total_fee=1)
return jsonify(raw)
except WeixinError, e:
print e.message
return e.message, 400
@app.route("/pay/notify")
def pay_notify():
"""
微信异步通知
"""
data = weixin.to_dict(request.data)
if not weixin.check(data):
return weixin.reply("签名验证失败", False)
# 处理业务逻辑
return weixin.reply("OK", True)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=9900)
```
### 微信公众号
**注意**: 如果使用分布式,需要自己实现`access_token`跟`jsapi_ticket`函数
`access_token`默认保存在`~/.access_token`
`jsapi_ticket`默认保存在`~/.jsapi_ticket`
默认在(HOME)目录下面,如果需要更改到指定的目录,可以导入库之后修改,如下
```
import weixin
DEFAULT_DIR = "/tmp"
```
获取公众号唯一凭证
weixin.access_token
获取ticket
weixin.jsapi_ticket
创建临时qrcode
data = weixin.qrcode_create(123, 30)
print weixin.qrcode_show(data.ticket)
创建永久性qrcode
# scene_id类型
weixin.qrcode_create_limit(123)
# scene_str类型
weixin.qrcode_create_limit("456")
长链接变短链接
weixin.shorturl("http://example.com/test")
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
weixin-python-0.5.2.tar.gz
(16.4 kB
view details)
File details
Details for the file weixin-python-0.5.2.tar.gz
.
File metadata
- Download URL: weixin-python-0.5.2.tar.gz
- Upload date:
- Size: 16.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 44ad205131b9aa9abd7ca9177d3dd85e58bc95464c1cd7b3094b2110a0482852 |
|
MD5 | 9d38dcc6792a51019947225cf8274feb |
|
BLAKE2b-256 | 8145da52d56cee0389ba7fbcf3def78b960be2dbc853df7d0c6a0073db7daef1 |