描述
有时候产品有这么一些需求,当用户满足一定条件时,给他发一定金额的红包。
微信各个服务是独立的,比较蛋疼,要用红包功能,首先你需要注册一个微信商户平台账号。
代码位置 分支pay-20160802
微信支付比较烦,因为他有自己的加密方式,还要用证书,所以不能用之前sdk的东西,自己随便按照文档封了下加密以及api之类的算法,代码什么的很简单,跟着文档来好了。
一些需要介绍的东西
接入时最蛋疼的其实是刚入手不知道证书以及秘钥什么的有啥用,也没看到什么python的前辈仔细介绍过这些东西。
首先是微信证书,python用的是apiclient_cert.pem,与apiclient_key.pem这两个。
其次是加密时用得api秘钥,文档
代码讲解
配置
WEIXIN_PAY_CERT_FOLDER_PATH = 'cert_folder_path' # 证书文件夹路径
# 四个证书具体路径
WEIXIN_PAY_P12_CERT_PATH = 'apiclient_cert.p12_file_path'
WEIXIN_PAY_CERT_PATH = 'apiclient_cert.pem_file_path'
WEIXIN_PAY_CERT_KEY_PATH = 'apiclient_key.pem_file_path'
WEIXIN_PAY_CA_CERT_PATH = 'rootca.pem_file_path'
WEIXIN_PAY_API_KEY = '' # 微信商户平台api安全中设置的安全码
WEINXIN_PAY_MCH_ID = '' # 微信商户平台id
具体发红包的代码 pay.py
加密发红包没什么好说的,照着文档写就是了,就下面这一句,requests请求是可以带证书的,把微信要的证书给带上。
respose = requests.post(SENDREDPACK_URL, data=content, headers=headers,
cert=(settings.WEIXIN_PAY_CERT_PATH, settings.WEIXIN_PAY_CERT_KEY_PATH))
血坑!!!解决方案请自行考虑
由于是血坑,我已经踩进去了,所以这里用一级标题标识。
并发啊,高并发啊,中国人知道发钱这种事情都是疯子啊,当你丢出一个发钱的链接后,就会有人用fiddler,charles之类的抓包然后干你,数据库太太太慢了,你一定要做好api的调用频次限制,而且这种活动上线后最好把跟主服务的几台机器分开,nginx只把这个活动的东西代过来,频次限制之类的一定要用redis之类的缓存,而且微信会面临红包的各种failed状况,无论微信那边成功失败与否,一次请求就是一次请求,频次限制无视微信那边的返回都要限(不要说用户体验不好,服务器炸了一天的飘过,当整个服务器炸了之后谁还管体验)。
写在最后
微信web开发者工具挺好用的,服务号里把自己加为开发者就能用了。
一个nginx例子
例如,我已经有一个web服务,假设web的名字叫做 www.duoduo369.com,这时候80端口已经没了,但是我要接微信服务器,又没有另外的一台机器,这时候用nginx做一下就ok了,首先django加一个url,/weixin_server,创建一个二级域名例如weixin.duoduo369.com,然后nginx把weixin.duoduo369.com的所有请求代到 www.duoduo369.com/weixin_server即可。
upstream your-backend {
server 127.0.0.1:8000 fail_timeout=0;
}
server {
server_name weixin.yourdomain.com yourdomain.ittun.com;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://your-backend/weixin_server;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。