時(shí)間:2023-05-21 10:34:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-21 10:34:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
微信支付——后臺(tái)對(duì)接:最近在做支付平臺(tái)的項(xiàng)目,承接公司業(yè)務(wù)系統(tǒng)與第三方支付平臺(tái)的對(duì)接任務(wù),主要涉及微信支付、支付寶支付以及理房通支付等第三方平臺(tái)。微信支付作為后起之秀,市場(chǎng)占有率大有趕超支付寶之勢(shì),其復(fù)雜多樣的社交屬性使支付場(chǎng)景豐富而深入。以下主要以業(yè)務(wù)后臺(tái)對(duì)接的視角,對(duì)微信開(kāi)發(fā)文檔做了些總結(jié),過(guò)濾出我們需要關(guān)注的點(diǎn)。(前端及App端對(duì)接請(qǐng)查官方資料)
商戶(hù)號(hào):微信支付分配的商戶(hù)號(hào)。支付審核通過(guò)后,申請(qǐng)人郵箱會(huì)收到騰訊下發(fā)的開(kāi)戶(hù)郵件, 郵件中包含商戶(hù)平臺(tái)的賬號(hào)、密碼等重要信息。
appid:商戶(hù)通過(guò)微信管理后臺(tái),申請(qǐng)服務(wù)號(hào)、訂閱號(hào)、小程序或APP應(yīng)用成功之后,微信會(huì)為每個(gè)應(yīng)用分配一個(gè)唯一標(biāo)識(shí)id。
openid:用戶(hù)在公眾號(hào)內(nèi)的身份標(biāo)識(shí),一旦確認(rèn),不會(huì)再變;同一用戶(hù)在不同公眾號(hào)擁有不同的openid。商戶(hù)后臺(tái)系統(tǒng)通過(guò)登錄授權(quán)、支付通知、查詢(xún)訂單等API可獲取到用戶(hù)的openid。主要用途是判斷同一個(gè)用戶(hù),對(duì)用戶(hù)發(fā)送客服消息、模版消息等。
微信管理后臺(tái):微信有很多管理平臺(tái),容易混淆,我們主要關(guān)注下面三個(gè)平臺(tái):
1. 微信公眾平臺(tái) 微信公眾賬號(hào)申請(qǐng)入口和管理后臺(tái)。商戶(hù)可以在公眾平臺(tái)提交基本資料、業(yè)務(wù)資料、財(cái)務(wù)資料申請(qǐng)開(kāi)通微信支付功能。帳號(hào)分類(lèi):服務(wù)號(hào)、訂閱號(hào)、小程序、企業(yè)微信(也叫企業(yè)號(hào),類(lèi)似于企業(yè)OA)。
2. 微信商戶(hù)平臺(tái) 微信支付相關(guān)的商戶(hù)功能集合,包括參數(shù)配置、支付數(shù)據(jù)查詢(xún)與統(tǒng)計(jì)、在線(xiàn)退款、代金券或立減優(yōu)惠運(yùn)營(yíng)等功能。
3. 微信開(kāi)放平臺(tái) 商戶(hù)APP接入微信支付開(kāi)放接口的申請(qǐng)入口,通過(guò)此平臺(tái)可申請(qǐng)微信APP支付。
簽名:商戶(hù)后臺(tái)和微信支付后臺(tái)根據(jù)相同的密鑰和算法生成一個(gè)結(jié)果,用于校驗(yàn)雙方身份合法性。簽名的算法 由微信支付制定并公開(kāi),常用的簽名方式有:MD5、SHA1、SHA256、HMAC等。
密鑰:作為簽名算法中的鹽,需要在微信平臺(tái)及商戶(hù)業(yè)務(wù)系統(tǒng)各存一份,要妥善保管。key設(shè)置路徑:微信商戶(hù)平臺(tái)(http://pay.weixin.qq.com)-->賬戶(hù)設(shè)置-->API安全-->密鑰設(shè)置。
一個(gè)完整的支付流程如下:用戶(hù)在業(yè)務(wù)系統(tǒng)下完單,進(jìn)入收銀臺(tái)頁(yè)面;選擇微信支付,業(yè)務(wù)后臺(tái)將業(yè)務(wù)單信息傳給微信后臺(tái),完成預(yù)下單;拿到預(yù)下單結(jié)果后,收銀臺(tái)喚起微信交互頁(yè)面,用戶(hù)輸密碼確認(rèn)支付;微信后臺(tái)完成支付邏輯,并通知業(yè)務(wù)后臺(tái),完成業(yè)務(wù)端邏輯。目前微信支持多種支付場(chǎng)景,重點(diǎn)關(guān)注掃碼支付與公眾號(hào)支付。1. 刷卡支付 申請(qǐng)流程
用戶(hù)展示微信錢(qián)包內(nèi)的“刷卡條碼/二維碼”給商戶(hù)系統(tǒng)掃描后直接完成支付的模式。主要應(yīng)用線(xiàn)下面對(duì)面收銀的場(chǎng)景。大家比較感興趣的是,收銀員掃了一下我們的微信條形碼,卡上的錢(qián)是怎么被扣掉的呢?免密支付流程
商戶(hù)系統(tǒng)按微信支付協(xié)議生成支付二維碼,用戶(hù)再用微信“掃一掃”完成支付的模式。該模式適用于PC網(wǎng)站支付、實(shí)體店單品或訂單支付、媒體廣告支付等場(chǎng)景。按二維碼的含義分為兩個(gè)模式。(二維碼知識(shí))
又稱(chēng)移動(dòng)端支付,是商戶(hù)通過(guò)在移動(dòng)端應(yīng)用APP中集成開(kāi)放SDK調(diào)起微信支付模塊完成支付的模式。4. 公眾號(hào)支付 申請(qǐng)流程
公眾號(hào)支付是用戶(hù)在微信中打開(kāi)商戶(hù)的H5頁(yè)面,商戶(hù)在H5頁(yè)面通過(guò)調(diào)用微信支付提供的JSAPI接口調(diào)起微信支付模塊完成支付。應(yīng)用場(chǎng)景有:
H5支付是指商戶(hù)在微信客戶(hù)端外的移動(dòng)端網(wǎng)頁(yè)展示商品或服務(wù),用戶(hù)在前述頁(yè)面確認(rèn)使用微信支付時(shí),商戶(hù)發(fā)起本服務(wù)呼起微信客戶(hù)端進(jìn)行支付。主要用于觸屏版的手機(jī)瀏覽器請(qǐng)求微信支付的場(chǎng)景??梢苑奖愕膹耐獠繛g覽器喚起微信支付。6. 小程序支付
申請(qǐng)流程:使用注冊(cè)微信支付時(shí)登記的郵箱,將公司名稱(chēng)+商戶(hù)號(hào)+聯(lián)系方式 以及對(duì)應(yīng)H5支付應(yīng)用場(chǎng)景說(shuō)明發(fā)送到 wxpaySP@tencent.com
用戶(hù)在微信小程序中使用微信支付的場(chǎng)景,接口對(duì)接時(shí)與公眾號(hào)支付很相似。
微信支付開(kāi)發(fā)文檔上將接口分為普通商戶(hù)版和服務(wù)商版。所謂普通商戶(hù),是指有實(shí)際業(yè)務(wù)需求,要對(duì)接微信支付的廣大商戶(hù);而服務(wù)商,是指那些有開(kāi)發(fā)能力的第三方服務(wù)提供商,它們封裝微信支付高級(jí)接口,為普通商戶(hù)提供支付申請(qǐng)、技術(shù)開(kāi)發(fā)、機(jī)具調(diào)試、活動(dòng)營(yíng)銷(xiāo)等全生態(tài)鏈服務(wù)支持,以簡(jiǎn)化對(duì)接流程。因此,普通商戶(hù)對(duì)接微信支付平臺(tái)有兩個(gè)選擇:直接對(duì)接微信平臺(tái) 或 對(duì)接服務(wù)商平臺(tái)。2. 接口文檔
<xml> <appid>wx2421b1c4370ec43b</appid> <body>JSAPI支付測(cè)試</body> <mch_id>10000100</mch_id> <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url> <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid> <out_trade_no>1415659990</out_trade_no> <spbill_create_ip>14.23.150.211</spbill_create_ip> <total_fee>1</total_fee> <trade_type>JSAPI</trade_type> <sign>0CB01533B8C1EF103065174F50BCA001</sign></xml>
獲取openid公眾號(hào)支付模式下,統(tǒng)一下單接口必須要傳用戶(hù)的openid,業(yè)務(wù)后臺(tái)獲取openid的步驟如下:
返回結(jié)果有兩個(gè)狀態(tài)碼return_code及result_code,需要理解其各自的含義。return_code表示通信是否成功,當(dāng)其為SUCCESS時(shí),才會(huì)有后續(xù)的返回字段,當(dāng)其為FAIL時(shí),return_msg會(huì)填充錯(cuò)誤信息;而result_code表示業(yè)務(wù)操作是否成功,當(dāng)其為SUCCESS時(shí),才會(huì)返回后續(xù)的業(yè)務(wù)字段(如prepay_id等),當(dāng)其為FAIL時(shí),會(huì)填充err_code及err_code_des等字段。返參試?yán)?/b>
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str> <openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid> <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id> <trade_type><![CDATA[JSAPI]]></trade_type></xml>
2.2.2 支付結(jié)果通知支付成功后,微信會(huì)把相關(guān)支付結(jié)果和用戶(hù)信息發(fā)送給商戶(hù),商戶(hù)需要接收處理,并返回應(yīng)答。如果微信收到商戶(hù)的應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過(guò)一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功(因此商戶(hù)端需要定時(shí)去check兩邊待支付單子的狀態(tài))。 (通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)。接口鏈接
回調(diào)通知接口對(duì)安全性要求極高,有如下注意點(diǎn):
1. 接口冪等,同樣的通知可能會(huì)多次發(fā)送給商戶(hù)系統(tǒng)。商戶(hù)系統(tǒng)必須保證回調(diào)接口是冪等的,能夠正確處理重復(fù)的通知。
2. 并發(fā)控制,在對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行狀態(tài)檢查和處理之前,要采用數(shù)據(jù)鎖進(jìn)行并發(fā)控制,以避免函數(shù)重入造成的數(shù)據(jù)混亂。
3. 簽名驗(yàn)證,商戶(hù)系統(tǒng)對(duì)于支付結(jié)果通知的內(nèi)容一定要做簽名驗(yàn)證。
4. 金額校驗(yàn),校驗(yàn)返回的訂單金額是否與商戶(hù)側(cè)的訂單金額一致,防止數(shù)據(jù)泄漏導(dǎo)致出現(xiàn)“假通知”,造成資金損失。
該鏈接由商戶(hù)端提供,通過(guò)【統(tǒng)一下單API】中提交的參數(shù)notify_url設(shè)置,通知url必須為直接可訪(fǎng)問(wèn)的url,不能攜帶參數(shù)。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”入?yún)⑿畔?/b>
入?yún)⑿畔⑹怯晌⑿牌脚_(tái)整理發(fā)送的,商戶(hù)后端需要接收并解析各字段,做必要的校驗(yàn)。入?yún)⒗?/b>
<xml> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <bank_type><![CDATA[CFT]]></bank_type> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str> <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid> <out_trade_no><![CDATA[1409811653]]></out_trade_no> <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code> <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign> <time_end><![CDATA[20140903131540]]></time_end> <total_fee>1</total_fee> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id></xml>
返回參數(shù)商戶(hù)后臺(tái)的返回參數(shù)必須是微信支付指定的格式,否則都被微信認(rèn)為通知失敗,會(huì)不斷重試。返參例子
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg></xml>
2.2.3 申請(qǐng)退款 /secapi/pay/refund退款有兩種方式,商戶(hù)可以登錄微信商戶(hù)平臺(tái),直接使用管理后臺(tái)的退款功能;另一種則是接口對(duì)接,在商戶(hù)的業(yè)務(wù)系統(tǒng)里發(fā)起退款。 退款時(shí)需要注意的是:入?yún)⑿畔?/b>
1. 交易時(shí)間超過(guò)一年的訂單無(wú)法提交退款;
2. 微信支付退款支持單筆交易分多次退款,多次退款需要提交原支付訂單的商戶(hù)訂單號(hào)和設(shè)置不同的退款單號(hào)。申請(qǐng)退款總金額不能超過(guò)訂單金額。
3. 每個(gè)支付訂單的部分退款次數(shù)不能超過(guò)50次。
<xml> <appid>wx2421b1c4370ec43b</appid> <mch_id>10000100</mch_id> <nonce_str>6cefdb308e1e2e8aabd48cf79e546a02</nonce_str> <out_refund_no>1415701182</out_refund_no> <out_trade_no>1415757673</out_trade_no> <refund_fee>1</refund_fee> <total_fee>1</total_fee> <transaction_id></transaction_id> <sign>FE56DD4AA85C0EECA82C35595A69E153</sign></xml>
返回參數(shù)這里需要注意返回參數(shù)里return_code為SUCCESS且result_code也為SUCCESS時(shí),只是說(shuō)明退款申請(qǐng)成功了,并不代表錢(qián)已經(jīng)成功退給用戶(hù)。因此,業(yè)務(wù)端需要通過(guò)退款查詢(xún)接口定時(shí)check退款單的狀態(tài),如果有異常需要報(bào)警出來(lái),以便人工處理。退款狀態(tài)
關(guān)鍵詞:后臺(tái),支付
客戶(hù)&案例
營(yíng)銷(xiāo)資訊
關(guān)于我們
客戶(hù)&案例
營(yíng)銷(xiāo)資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。