有時候產品有這麼一些需求,當用戶知足必定條件時,給他發必定金額的紅包。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; } }