開發前准備
1.已認證的服務號
2.開通微信支付功能。
開啟“微信支付——產品中心——現金紅包”此項功能,如圖2所示
圖 2
3.微信支付開發文檔:開發系統找羅經理:189”2232“7019 微電
https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
開始開發
1.開發思路:筆者利用mindject整理了程序結構及調用關系。
2.接口:POST方式,帶XML參數。
https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack;
3.參數拆分:因發送紅包的參數非常多,如圖3所示,逐一介紹。
圖 3
1)nonce_str:隨機字符串,用來生成簽名。隨機字符串簽名可以通用,26個字母,10個數字,字符串最長為36。隨機字符串程序如下,因為程序較為簡單,所以寫在redPacketPay.php主程序的類中,用$this->調用。
圖 4
2)sign:簽名。簽名的獲取較為復雜所以並沒有在redPacketPay.php中拼裝。
(簽名算法:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3)
分析簽名算法,它可以拆分為:
a)在支付平台中設置密鑰,密鑰需保密。
圖 5
b)檢查其他參數是否已生產。
圖 6
c)對參數按照 key=value 的格式,並按照參數名 ASCII 字典序排序,並拼接為字符串,如圖7所示。其中ksort()函數作用為ASCII 字典序排序;formatQueryParaMap()函數作用為拼接為字符串,如圖8所示。
圖 7
圖 8
d)用MD5加密算法獲得簽名,如圖9所示。
圖 9
3)mch_billno:訂單編號=商戶號+YYMMDDHHIISS+RANDOM(1000,9999)把時間補全HHIISS有六位,再來一個隨機四位數即可。
4)mch_id:商戶號,注冊了支付平台就有的
5)wxappid:appID
6)send_name:發送方名稱
7)nick_name:如果做為第三方支付開發方,幫商戶開發時候,此字段指開放方(非必須)
8)re_openid:用戶的openid,傳參的時候直接用$object->FromUserName
9)total_amount:付款金額,分為單位,最小為100分,即1元
10)total_num:發紅包總數,普通紅包1,裂變紅包可以為其他值
11)wishing:紅包祝福語
12)client_ip:新浪雲的ip是動態的,所以要動態獲取,獲取方式如圖10所示。
圖 10
13)act_name:活動信息
14)remark:備注信息,
以上參數均為必須,完成參數設置之后,需要將參數拼裝為XML數據。
4.組裝XML數組,其方法如圖11所示。
圖 11
5.發起POST請求。涉及金錢,所以要使用證書,證書對於每個商戶是唯一的,必須妥善保管,方法如圖12所示。
圖 12
全文總結
當執行完POST請求后,即完成發紅包動作。微信原生紅包的開發其實並不復雜,只是涉及到較多的參數,需要運用較多的方法。建議利用筆者提供的“紅包思路”先梳理一下開發的流程,再結合源代碼進行開發。