有时候产品有这么一些需求,当用户知足必定条件时,给他发必定金额的红包。php
微信各个服务是独立的,比较蛋疼,要用红包功能,首先你须要注册一个微信商户平台帐号。python
代码位置 分支pay-20160802nginx
微信支付比较烦,由于他有本身的加密方式,还要用证书,因此不能用以前sdk的东西,本身随便按照文档封了下加密以及api之类的算法,代码什么的很简单,跟着文档来好了。git
接入时最蛋疼的实际上是刚入手不知道证书以及秘钥什么的有啥用,也没看到什么python的前辈仔细介绍过这些东西。github
首先是微信证书,python用的是apiclient_cert.pem,与apiclient_key.pem这两个。web
其次是加密时用得api秘钥,文档redis
配置算法
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请求是能够带证书的,把微信要的证书给带上。django
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; } }