蟒蛇微信

weixin-python的Python项目详细描述


安装

使用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 子异常类名分别为 WeixinLoginErrorWeixinPayErrorWeixinMPErrorWeixinMsgError

参数

  • 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_IDWEIXIN_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_tokenjsapi_ticket函数

access_token默认保存在~/.access_tokenjsapi_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")

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java实现的一个简单算法(计算概率)   更改应用程序背景动画的java首选项   java捕获图像并通过socket发送   基于双精度数组的对象的java排序Arraylist?   java似乎无法获得前面数字的正确总和   java卡住了Tomcat线程。日食乐观锁定   java是一个异步的Throwable类的printStackTrace()   java随机错误(可能是)Android支持库   java我应该在代码中自动创建DB表,还是在安装过程中使用preinit?   在被调用的方法/函数Java/Android中处理异常?   arraylist Java发送电子邮件非法分号?   while循环中的Java数组   java Arquillian和TransactionAttribute类型。需要新的   java“未找到合适的驱动程序”获取此错误   java高性能地将子类转换为真正的超类   java如何从另一个活动访问变量   安卓 Java Kotlin泛型将类getter作为参数传递到函数中   尝试访问数组的某个位置时需要java“]”