小程序支付

首先要先了解各個名詞,在小程序文檔都有 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&notify_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

而且字的大小寫要一模一樣 !! 發起後如果沒有錯誤應該可以在實體機上看到微信付款的頁面

results matching ""

    No results matching ""