小程序支付
首先要先了解各個名詞,在小程序文檔都有 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=2_1 小程序的支付模式是要用 JSAPI 模式,而商家需要去 "商戶平台" 申請與小程序綁定,也要開通 JSAPI支付 !
所謂商戶平台是指一個公司可以使用微信支付的一個帳號,而小程序後台是一個公司可以去申請開發小程序,那小程序要使用微信支付時,要跟商戶平台綁定,不然不知道付給誰,商戶平台也要記得去設定 "API KEY" (或稱為API 密鑰、商戶密鑰、商戶 KEY),這個 KEY要記下來,之後下單和付錢時需要這個參數。
支付時,大抵來說是兩個步驟,第一步是"向微信下訂單" (統一下單),第二步是 "由小程序發起微信支付" (調起支付API)
向微信下訂單
這步驟主要是要從微信取得 prepay_id,我們要向微信發起一個 POST 請求,需要帶上一個 xml。內容需要有
- app_id : 小程序的 appid, 由小程序後台得知
- mch_id : 小程序後台申請支付時會給一個商戶 id
- nonceStr : 32字元內的隨機碼
- body : 商品描述
- out_trade_no : 商戶下唯一的訂單號碼,之後可以用這個來查詢訂單
- total_fee : 錢,單位是分,也就是說要付一元人民幣的話,要寫 100
- spbill_create_ip : 發起下單請求的 IP,這個IP需要在小程序後台註冊
- notify_url : 付完錢後微信會 call 這個網址
- trade_type : 支付模式,小程序請填 JSAPI
- open_id : 以 JSPAI 支付時需要帶上 open_id
- sign : 以下介紹
sign 的取得方式為將上列除了 sign 以外的參數字串用字典序 + & 接在一起,最後接上 API KEY,然後進行 MD5加密,加密後的字串轉大寫。
EX: appid=wxa8d8rrrr8fcfa55f&body=mini-program prodect&mch_id=1523376531&nonce_str=1174375263¬ify_url=http://XXXXXXXXXXX&openid=o2n1K5GFi_F0VfRprO2OEV_K565U&out_trade_no=001&spbill_create_ip=192.168.1.105&total_fee=10™_type=JSAPI&key=XXXXXXX => MD5 => sign = 15995F5F08AF963262109989CDF408D5
要注意的是,下訂單這件事無法由小程序裡用 wx.request({}) 完成,某次改版後就不支援這件事,一定要從有註冊的服務器發起這個請求。
發起支付
上一步驟成功的話,會回傳類似以下結果
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxa8d85deb8f00055f]]></appid>
<mch_id><![CDATA[1523376000]]></mch_id>
<nonce_str><![CDATA[PI75jE8LLgkIslCv]]></nonce_str>
<sign><![CDATA[7B2D7BA42C695BC066935448B47B3F00]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx14230639347681fa6a29d7531495862520]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
</xml>
這裡就可以得到 prepay_id,便可以從小程序裡向微信發起 payment request,做法是從小程序裡發wx.requestPayment({}) ,需要的參數是
- timeStamp : 時間戳記
- nonceStr : 32字元內的隨機碼
- package : "prepay_id=XXXXXXXXX"
- signType : "MD5"
- paySign : 簽名產生方法與上面一樣,需要加上 API KEY
而且字的大小寫要一模一樣 !! 發起後如果沒有錯誤應該可以在實體機上看到微信付款的頁面