微信支付對(duì)接銀行服務(wù)商
前言
大家好勤篮,我是許RR都毒。最近為公司的聚合支付平臺(tái)對(duì)接廣發(fā)銀行(廣東發(fā)展銀行)服務(wù)商的支付通道,遇到很多問(wèn)題碰缔,特此記錄一下
概念
估計(jì)很多17年前做微信支付的朋友會(huì)對(duì)現(xiàn)在的微信支付模式感覺到奇怪账劲,比如出現(xiàn)了各種概念,商戶平臺(tái)金抡,渠道商瀑焦,之前的代理商概念也被換成了服務(wù)商,配置支付授權(quán)目錄也從公眾號(hào)后臺(tái)遷移到了商戶平臺(tái)上梗肝,支付白名單也悄然消失榛瓮,沒有了配置的地方,微信文檔也出現(xiàn)了三種對(duì)接模式巫击,包括普通商戶禀晓、服務(wù)商和銀行服務(wù)商。經(jīng)過(guò)我這幾天的重新學(xué)習(xí)坝锰,總結(jié)了一點(diǎn)概念分享給大家粹懒。首先先介紹各種對(duì)接模式的區(qū)別。
普通商戶接入
所謂普通商戶的對(duì)接就是最樸實(shí)無(wú)華的開發(fā)模式顷级,公眾號(hào)主體開通普通商戶類型的商戶后關(guān)聯(lián)到公眾號(hào)凫乖,開發(fā)拿到公眾號(hào)appId
、mch_id
這些參數(shù)到微信的接口去請(qǐng)求愕把,這種模式的優(yōu)勢(shì)在于簡(jiǎn)單快速拣凹,開發(fā)起來(lái)也沒有那么多的阻礙。但是缺點(diǎn)是不容易集成管理恨豁,沒有可重復(fù)性。
服務(wù)商商戶接入
服務(wù)商商戶是種比較特殊的商戶爬迟,17年前是沒有的橘蜜,但是可能是因?yàn)檎呋蛘吣承┰虺霈F(xiàn)了,服務(wù)商是有能力開發(fā)支付軟件的第三方公司付呕。我舉一個(gè)例子计福,比如說(shuō)XX醫(yī)院現(xiàn)在需要做線上就診業(yè)務(wù),需要開發(fā)一套公眾號(hào)網(wǎng)站徽职,但是只有自己的公眾號(hào)象颖,甚至連普通商戶也沒有,怎么辦呢姆钉?醫(yī)院就將開發(fā)線上就診公眾號(hào)軟件的責(zé)任交給我司说订,我司通過(guò)在我司的公眾號(hào)服務(wù)商商戶中新建一個(gè)子商戶(或者叫特約商戶)并綁定該醫(yī)院的公眾號(hào)抄瓦,讓該醫(yī)院根據(jù)微信指引開通各種東西,包括設(shè)置一個(gè)對(duì)公賬戶陶冷,通過(guò)這些設(shè)置钙姊,該醫(yī)院成為我司服務(wù)商商戶號(hào)下的一個(gè)子商戶,服務(wù)商開發(fā)拿到一些和子商戶有關(guān)的參數(shù)去微信的接口請(qǐng)求埂伦,最終金錢也是流向子商戶的設(shè)置的銀行賬戶煞额。這種模式的優(yōu)勢(shì)在于開發(fā)的可重用性高,一套代碼多次復(fù)用沾谜,并且可管理性高膊毁,并且服務(wù)商應(yīng)該還有一些我這種開發(fā)不知道的好處。
銀行服務(wù)商接入
其實(shí)銀行服務(wù)商和普通服務(wù)商應(yīng)該區(qū)別不大(微信文檔中提到)基跑,但是具體差別在哪我也不清楚媚媒,這個(gè)只有銀行的開發(fā)才知道了。
對(duì)接流程
準(zhǔn)備參數(shù)
普通商戶模式
普通商戶需要的參數(shù):
參數(shù) | 參數(shù)名 | 參數(shù)說(shuō)明 |
---|---|---|
appId | 公眾號(hào)賬號(hào)id | 微信支付分配的公眾賬號(hào)ID(企業(yè)號(hào)corpid即為此appId) |
mch_id | 商戶號(hào) | 微信支付分配的商戶號(hào)(需要在微信的商戶平臺(tái)申請(qǐng)到普通商戶賬號(hào)涩僻,并關(guān)聯(lián)到公眾號(hào)) |
key | 商戶平臺(tái)api安全key | 微信退款時(shí)要用到缭召,在商戶平臺(tái)的api安全設(shè)置中設(shè)置 |
準(zhǔn)備測(cè)試環(huán)境
我司的業(yè)務(wù)是這樣的,有一個(gè)醫(yī)院想要做線上就診業(yè)務(wù)逆日,并且將開發(fā)公眾號(hào)網(wǎng)站的任務(wù)交給了我們嵌巷,我們代替醫(yī)院開發(fā)公眾號(hào)網(wǎng)站并且對(duì)接廣發(fā)銀行的服務(wù)商。第一步要做的就是準(zhǔn)備測(cè)試環(huán)境(這里我建議要對(duì)接銀行服務(wù)商的朋友開發(fā)時(shí)使用正式的公眾號(hào)參數(shù)進(jìn)行測(cè)試室抽,微信提供的測(cè)試公眾號(hào)還是與正式公眾號(hào)差別較大搪哪,部署起來(lái)問(wèn)題很多)。首先銀行有一套自己測(cè)試環(huán)境坪圾,并且銀行的測(cè)試環(huán)境對(duì)接微信的沙箱測(cè)試環(huán)境晓折,銀行服務(wù)商提供的測(cè)試環(huán)境其實(shí)相當(dāng)完備。接下來(lái)我們聊聊整個(gè)測(cè)試環(huán)境的流程與準(zhǔn)備兽泄。
進(jìn)件
將要開發(fā)的公眾號(hào)的主體名和appId
提供給銀行服務(wù)商在測(cè)試環(huán)境進(jìn)價(jià)漓概,銀行服務(wù)商在銀聯(lián)進(jìn)件后會(huì)搭好和微信相關(guān)的沙箱環(huán)境。一般測(cè)試環(huán)境進(jìn)件后銀行方會(huì)提供一些銀行方的參數(shù)(比如廣發(fā)銀行這里是提供了廣發(fā)銀行的商戶id病梢,廣發(fā)銀行的商戶號(hào)和廣發(fā)商戶應(yīng)用編號(hào))胃珍,他們接口的后端會(huì)自己去和微信的參數(shù)做關(guān)聯(lián),一般不會(huì)直接提供給對(duì)接方有關(guān)微信的參數(shù)(比如說(shuō)微信的商戶號(hào))蜓陌。
提供異步通知地址
微信支付完成后微信會(huì)將支付成功的結(jié)果異步通知到開發(fā)方觅彰。對(duì)接服務(wù)商的話,微信會(huì)先通知到服務(wù)商的后臺(tái)钮热,再由服務(wù)商后臺(tái)異步通知到對(duì)接服務(wù)商的后臺(tái)填抬,所以需要對(duì)接服務(wù)商的后臺(tái)開發(fā)提供異步通知地址給銀行方,讓銀行方去配置隧期,保證支付成功的結(jié)果能夠通知到開發(fā)商戶后臺(tái)飒责。
正式開發(fā)(實(shí)踐)
加密驗(yàn)簽通訊
我對(duì)接的銀行服務(wù)商有一套加密解密赘娄,加簽驗(yàn)簽的模式,我覺得可以完全避免安全問(wèn)題读拆。
請(qǐng)求方生成隨機(jī)字符串
encryptKey
請(qǐng)求方使用自己的私鑰對(duì)請(qǐng)求體進(jìn)行簽名擅憔,生成
sign
請(qǐng)求方使用
encryptKey
作為密鑰,用對(duì)稱加密方法去加密請(qǐng)求體檐晕,生成加密體請(qǐng)求方使用響應(yīng)方的公鑰對(duì)
encryptKey
進(jìn)行非對(duì)稱加密暑诸,生成encryptKey1
請(qǐng)求方用加密體作為請(qǐng)求體,把
encryptKey1
和sign
附在http請(qǐng)求頭上發(fā)送給響應(yīng)方響應(yīng)方接收請(qǐng)求
響應(yīng)方從請(qǐng)求頭上獲取
encryptKey1
并且用自己的私鑰解密辟灰,獲取encryptKey
響應(yīng)方用解密得到的
encryptKey
去解密加密體个榕,得到請(qǐng)求體-
響應(yīng)方從請(qǐng)求頭上獲取
sign
,再用請(qǐng)求方額公鑰對(duì)請(qǐng)求體進(jìn)行驗(yàn)簽芥喇,驗(yàn)簽成功即代表成功這種加密加簽方式可以防止類型的任何攻擊西采,應(yīng)該說(shuō)是兩方對(duì)接接口的最佳實(shí)踐了。
接入預(yù)支付/下單接口
微信文檔提到的預(yù)支付继控,其實(shí)意思就是在微信下單械馆。調(diào)用大多數(shù)微信接口,需要保障的是微信和本身業(yè)務(wù)系統(tǒng)數(shù)據(jù)一致武通,舉個(gè)例子霹崎,我現(xiàn)在做的是一個(gè)門診的預(yù)約掛號(hào)業(yè)務(wù),患者要先掛號(hào)成功了冶忱,生成了成功的掛號(hào)單后尾菇,再去調(diào)用微信下單接口進(jìn)行下單,如果業(yè)務(wù)系統(tǒng)沒有處理下單失敗的結(jié)果囚枪,那么我們業(yè)務(wù)系統(tǒng)的數(shù)據(jù)就會(huì)亂了派诬,因?yàn)榘蠢碚f(shuō)我掛號(hào)成功了,是包括下單成功的链沼,假如我下單失敗了默赂,那么掛號(hào)業(yè)務(wù)也應(yīng)該失敗。我們系統(tǒng)內(nèi)的實(shí)踐是忆植,一但下單服務(wù)失敗放可,那么掛號(hào)也會(huì)失敗,直接返回給患者朝刊,讓患者手動(dòng)重試,同時(shí)釋放號(hào)源蜈缤。
接入退款接口
退款是業(yè)務(wù)中的重中之重拾氓,假如業(yè)務(wù)單是成功狀態(tài),但是退款接口卻給退款了底哥,那么無(wú)疑是生產(chǎn)事故咙鞍。最好的方法是先到微信查單房官,獲取支付訂單的最新狀態(tài),先判斷支付單是否已經(jīng)支付過(guò)续滋,可否退款翰守,再到業(yè)務(wù)系統(tǒng)中確認(rèn)業(yè)務(wù)單是否可退款,如果業(yè)務(wù)系統(tǒng)是不可退款疲酌,那么自然不能允許這次請(qǐng)求蜡峰。我們系統(tǒng)內(nèi)的實(shí)踐是,先進(jìn)行微信接口查單對(duì)系統(tǒng)內(nèi)的支付訂單進(jìn)行狀態(tài)更新朗恳,先查詢支付訂單是否處于已支付狀態(tài)湿颅,如果支付訂單不是已支付狀態(tài)那么不允許,如果支付訂單是已支付狀態(tài)粥诫,再去業(yè)務(wù)系統(tǒng)查詢業(yè)務(wù)訂單是否是可退款狀態(tài)油航,如果不是可退款狀態(tài),那么自然不可以給他退款怀浆。
接入查單接口
查單接口需要進(jìn)行系統(tǒng)內(nèi)的支付訂單和微信訂單進(jìn)行核對(duì)校驗(yàn)谊囚,保證系統(tǒng)內(nèi)的支付訂單是最新的狀態(tài),我們系統(tǒng)內(nèi)的實(shí)踐是执赡,每次查單接口被調(diào)用镰踏,就發(fā)起一次微信查單請(qǐng)求,對(duì)比系統(tǒng)內(nèi)的支付訂單與微信訂單的狀態(tài)搀玖,如果不相同則更新數(shù)據(jù)庫(kù)的支付訂單狀態(tài)余境。
接入支付
支付回調(diào)是用戶成功對(duì)微信訂單支付后,微信主動(dòng)異步請(qǐng)求業(yè)務(wù)系統(tǒng)服務(wù)端接口的一種消息通知灌诅,有使用過(guò)消息隊(duì)列的小伙伴可以把當(dāng)成微信發(fā)的一條消息隊(duì)列的消息芳来,業(yè)務(wù)系統(tǒng)主動(dòng)去消費(fèi)。這個(gè)異步通知猜拾,因?yàn)槭钱惒降募瓷啵椅⑿艜?huì)多次通知,所以需要業(yè)務(wù)系統(tǒng)提供的接口實(shí)現(xiàn)冪等性挎袜,并且因?yàn)槎啻萎惒降耐ㄖ缒簦枰偃绶植际芥i。我們系統(tǒng)內(nèi)的實(shí)踐是盯仪,在接口被調(diào)用第一行上加上基于redis setnx的分布式鎖紊搪,并設(shè)置過(guò)期時(shí)間為3秒,搶不到鎖的請(qǐng)求一律返回失敗全景,搶到鎖后耀石,先去數(shù)據(jù)庫(kù)查詢訂單,核對(duì)訂單狀態(tài)爸黄,如果訂單狀態(tài)不是未支付的滞伟,也返回失敗揭鳞,如果訂單狀態(tài)是已支付,那么說(shuō)明已經(jīng)被通知過(guò)了梆奈,直接返回成功野崇,保證冪等性。如果訂單狀態(tài)是未支付狀態(tài)亩钟,那么核對(duì)金額乓梨,金額對(duì)不上也返回失敗,直到經(jīng)過(guò)了所以的校驗(yàn)径荔,才對(duì)數(shù)據(jù)庫(kù)的訂單狀態(tài)進(jìn)行一個(gè)更新督禽。
未完待續(xù)。总处。狈惫。