iOS 微信支付

在開發(fā)中我們會(huì)經(jīng)常遇到微信支付的場景,不管是 從微信付錢到商戶,還是從商戶提現(xiàn)到微信 都屬于支付。都需要在微信開放平臺(tái)注冊(cè)應(yīng)用,申請(qǐng)支付權(quán)限,對(duì)接SDK。下面,我們就來了解一下具體的支付流程。
對(duì)于支付過程,請(qǐng)看開放平臺(tái)文檔:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Resource_Center_Homepage.html?action=dir_list&t=resource%2Fres_list&verify=1&lang=zh_CN

支付模式
  • 付款碼支付
    付款碼支付是用戶展示微信錢包內(nèi)的“刷卡條碼/二維碼”給商戶系統(tǒng)掃描后直接完成支付的模式。主要用于線下的面對(duì)面收銀的場景。
  • Native 支付
    Native支付是商戶系統(tǒng)按微信支付協(xié)議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式。該模式適用于PC網(wǎng)站支付,實(shí)體店單品或訂單支付,媒體廣告支付等場景。
  • JSAPI支付
    JSAPI支付 是用戶在微信中打開商戶的H5頁面,商戶在H5頁面通過調(diào)用微信支付提供的JSAPI接口調(diào)起微信支付模塊完成支付。應(yīng)用場景有:
    1> 用戶在微信公眾號(hào)內(nèi)進(jìn)入商家公眾號(hào),打開某個(gè)頁面,完成支付。
    2> 用戶的好友在朋友圈,聊天窗口等分享商家頁面鏈接,用戶點(diǎn)擊鏈接打開商家頁面,完成支付
    3> 將商戶頁面轉(zhuǎn)換成二維碼,用戶掃描二維碼后在微信瀏覽器中打開頁面后完成支付。
  • APP支付
    APP 支付又稱移動(dòng)端支付,是商戶通過在移動(dòng)端應(yīng)用APP中集成開放SDK調(diào)起微信支付模塊完成支付的模式
  • H5支付
    H5支付主要是在手機(jī),iPad等移動(dòng)設(shè)備中通過瀏覽器來喚起微信支付產(chǎn)品
  • 小程序支付
    小程序支付是專門被定義使用在小程序中的支付產(chǎn)品。目前在小程序中能且只能使用小程序支付的方式來喚起微信支付。
接口規(guī)則
  • 傳輸方式
    為保證交易安全性,采用HTTPS傳輸
  • 提交方式
    采用post方法提交
  • 數(shù)據(jù)格式
    提交和返回?cái)?shù)據(jù)都為xml 格式,節(jié)點(diǎn)為xml
  • 字符編碼
    微信支付API 僅支持UTF-8 字符編碼的一個(gè)子集: 使用一到三個(gè)字節(jié)編碼的字符。也就是說 不支持Unicode輔助平面中的四至六字節(jié)編碼的字符
  • 簽名算法
    MD5
  • 簽名要求
    請(qǐng)求和接收數(shù)據(jù)均需要校驗(yàn)簽名
  • 證書要求
    調(diào)用申請(qǐng)退款,撤銷訂單接口需要商戶證書
  • 判斷邏輯
    先判斷協(xié)議字段返回,再判斷業(yè)務(wù)返回,最后判斷交易狀態(tài)
簽名算法 (https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
  • 設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(key1=value1&key2=value2),拼接成字符串stringA
  • 在stringA最后拼接上key得到stringSing temp 字符串,并對(duì)stringSign Temp 進(jìn)行MD5云算,再將得到的字符串所有字符轉(zhuǎn)換為大寫,得到sign值 signValue。注意 秘鑰的長度為32字節(jié)
    **** key 設(shè)置路徑:審核后的郵件有返回 或者 微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置
    例如: 傳送的參數(shù)如下
appid: wxd930ea5d5a258f4f

mch_id: 10000100

device_info: 1000

body: test

nonce_str: ibuaiVcKdpRxkhJA

1> 對(duì)參數(shù)按照key = value 的格式,并按照參數(shù)名ASCII字典排序如下:

stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

2> 拼接API秘鑰

MD5簽名方式:

stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" [//注:key為商戶平臺(tái)設(shè)置的密鑰key](https://kf.qq.com/faq/180830UVRZR7180830Ij6ZZz.html)

sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5簽名方式

3> 最終得到最終發(fā)送的數(shù)據(jù):

<xml>

<appid>wxd930ea5d5a258f4f</appid>

<mch_id>10000100</mch_id>

<device_info>1000</device_info>

<body>test</body>

<nonce_str>ibuaiVcKdpRxkhJA</nonce_str>

<sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>

</xml>

以下就是APP 支付流程圖:


image.png
  • 用戶使用商戶APP 客戶端,選擇商品進(jìn)行下單,將訂單信息給 商戶后臺(tái)系統(tǒng),請(qǐng)求生成支付訂單

  • 商戶后臺(tái)收到用戶訂單信息,生成平臺(tái)訂單,調(diào)用微信支付統(tǒng)一下單接口,請(qǐng)求創(chuàng)建訂單

  • 微信統(tǒng)一下單接口 會(huì)返回正常的prepay_id, 然后再按照簽名規(guī)范重新生成簽名,將數(shù)據(jù)傳輸給APP。參與簽名的字段為,appid, partnerid,prepayid,noncestr,timestamp,package,其中package 的格式為Sign=WXPay
    這些參數(shù)都會(huì)返回給APP


    123.png
  • 商戶APP 用這些參數(shù),調(diào)起微信客戶端,發(fā)起支付

  • 微信客戶端向微信后臺(tái)發(fā)起支付請(qǐng)求,微信后臺(tái)驗(yàn)證支付授權(quán)權(quán)限,向微信客戶端返回支付授權(quán)

  • 用戶輸入密碼,提交授權(quán),微信后臺(tái)驗(yàn)證授權(quán),完成支付

  • 獲取支付結(jié)果
    在方法onResq 中會(huì)獲取回調(diào),如果支付成功,則去后臺(tái)查詢支付結(jié)果再展示用戶實(shí)際支付結(jié)果。注意一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)。

參考:
[1] https://blog.csdn.net/zhouxiangyu666666/article/details/71136906
[2] https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容