【微信支付】“刷卡支付”、“被掃支付”開(kāi)發(fā)說(shuō)明

快速上手

  • 什么是“被掃支付”、“刷卡支付”
    • 刷卡支付是用戶展示微信錢(qián)包內(nèi)的“刷卡條碼/二維碼”給商戶系統(tǒng)掃描后直接完成支付的模式。主要應(yīng)用線下面對(duì)面收銀的場(chǎng)景。

什么是“被掃支付”

  • “被掃支付”是用戶展示微信上“我的刷卡條碼/二維碼”給商戶系統(tǒng)掃描后直接完成支付的模式,主要應(yīng)用線下面對(duì)面收銀的場(chǎng)景。
  • 具體的場(chǎng)景如下:
    1. 第一步用戶選擇被掃支付付款并打開(kāi)微信,進(jìn)入“我”->“錢(qián)包”->“刷卡”條碼界面;(如圖5.1所示)
    2. 第二步收銀員在商戶系統(tǒng)操作生成支付訂單,用戶確認(rèn)支付金額;
    3. 第三步商戶收銀員用掃碼設(shè)備掃描用戶的條碼/二維碼,商戶收銀系統(tǒng)提交支付;
    4. 第四步微信支付后臺(tái)系統(tǒng)收到支付請(qǐng)求,根據(jù)驗(yàn)證密碼規(guī)則判斷是否驗(yàn)證用戶的支付密碼,不需要驗(yàn)證密碼的交易直接發(fā)起扣款,需要驗(yàn)證密碼的交易會(huì)彈出密碼輸入框(如圖5.2所示)。支付成功后微信端會(huì)彈出成功頁(yè)面(如圖5.3所示),支付失敗會(huì)彈出錯(cuò)誤提示。


      img
      img

一張圖看懂整個(gè)SDK的結(jié)構(gòu):

img
img

SDK層級(jí)詳解:

1)通用層

img
img

這里封裝了很多非常基礎(chǔ)的組件,供上層服務(wù)調(diào)用,其中包括以下組件:

  1. 基礎(chǔ)配置組件(Configure
    • 該組件用來(lái)從wxpay.properties里面獲取到跟商戶相關(guān)的幾個(gè)關(guān)鍵配置信息。
  2. HTTPS請(qǐng)求器(HttpsRequest
    • 發(fā)HTTPS請(qǐng)求的底層封裝。
  3. 隨機(jī)數(shù)生成器(RandomStringGenerator
    • 用來(lái)生成指定長(zhǎng)度的隨機(jī)數(shù)。
  4. MD5加密算法(MD5)
  5. XMLParser(XML解析器)
    • 由于API返回的數(shù)據(jù)是XML格式,所以SDK這里也提供了對(duì)返回的XML數(shù)據(jù)進(jìn)行解析成Java對(duì)象的能力,方便大家可以快速處理API返回的數(shù)據(jù)。
  6. 簽名(Signature
    • 為了防止數(shù)據(jù)在傳輸過(guò)程中被篡改,所以這里要對(duì)字段做簽名運(yùn)算。
  7. 基礎(chǔ)工具(Util)
    • 開(kāi)發(fā)過(guò)程中用到的一些基礎(chǔ)工具類函數(shù)。
  8. 日志上報(bào)
    • 這里會(huì)將SDK里面的模塊調(diào)用情況,程序執(zhí)行流程給打好詳細(xì)日志,Log系統(tǒng)用的是SLF4J這套通用解決方案,方便對(duì)接商戶系統(tǒng)自己的日志邏輯。
  9. 性能上報(bào)
    • 這里用的是微信支付統(tǒng)一的API性能上報(bào)接口進(jìn)行上報(bào),可以實(shí)現(xiàn)將每次調(diào)用支付API的耗時(shí)、返回碼等相關(guān)數(shù)據(jù)進(jìn)行上報(bào)。
      (以上講了這么多,只要使用了這個(gè)SDK,這些東西都幫大家解決掉了_,這就是我們?yōu)樯缎枰幸粋€(gè)SDK~)

2)協(xié)議層

img
img

這里跟API文檔定義的字段進(jìn)行一一對(duì)應(yīng),協(xié)議層這里分為兩部分:

  • 第一部分是“請(qǐng)求數(shù)據(jù)”,這里定義了每一個(gè)API請(qǐng)求時(shí)需要傳過(guò)去的具體數(shù)據(jù)字段;
  • 第二部分是“返回?cái)?shù)據(jù)”,這里定義了每一個(gè)API返回時(shí)會(huì)傳的具體數(shù)據(jù)字段;

以上協(xié)議在“服務(wù)層”提供的各種服務(wù)里面已經(jīng)幫忙封裝好,直接使用服務(wù)即可。

3)服務(wù)層

img
img

這里已經(jīng)根據(jù)API文檔封裝好具體服務(wù),供開(kāi)發(fā)者直接調(diào)用。
例如,以下代碼直接調(diào)用PayService.request提交支付請(qǐng)求,商戶只需要從自己的系統(tǒng)生成該服務(wù)提交協(xié)議里面要求的數(shù)據(jù)項(xiàng)即可:

payServiceResponseString = PayService.request(
               authCode,//auth_code:這個(gè)是掃碼終端設(shè)備從用戶手機(jī)上掃取到的支付授權(quán)號(hào),這個(gè)號(hào)是跟用戶用來(lái)支付的銀行卡綁定的,有效期是1分鐘
               body,//body:要支付的商品的描述信息,用戶會(huì)在支付成功頁(yè)面里看到這個(gè)信息
               attach, //attach:支付訂單里面可以填的附加數(shù)據(jù),API會(huì)將提交的這個(gè)附加數(shù)據(jù)原樣返回,有助于商戶自己可以注明該筆消費(fèi)的具體內(nèi)容,方便后續(xù)的運(yùn)營(yíng)和記錄
               outTradeNo,//out_trade_no:商戶系統(tǒng)內(nèi)部的訂單號(hào),32個(gè)字符內(nèi)可包含字母, [確保在商戶系統(tǒng)唯一]
               totalFee,//total_fee:訂單總金額,單位為“分”,只能整數(shù)
               deviceInfo,//device_info:商戶自己定義的掃碼支付終端設(shè)備號(hào),方便追溯這筆交易發(fā)生在哪臺(tái)終端設(shè)備上
               spBillCreateIP,//spBillCreateIP:訂單生成的機(jī)器IP
               timeStart,//time_start:訂單生成時(shí)間
               timeEnd,//time_end:訂單失效時(shí)間
               goodsTag//goods_tag:商品標(biāo)記,微信平臺(tái)配置的商品標(biāo)記,用于優(yōu)惠券或者滿減使用
       );

4)業(yè)務(wù)層

img
img
  • 業(yè)務(wù)層是比服務(wù)更加高級(jí)的封裝。業(yè)務(wù)層通過(guò)服務(wù)層向API提交請(qǐng)求,拿到API的返回?cái)?shù)據(jù)之后會(huì)對(duì)返回?cái)?shù)據(jù)做一些數(shù)據(jù)解析、簽名校驗(yàn)、出錯(cuò)判斷等操作。
  • 對(duì)于像“被掃支付”這種比較復(fù)雜和常用的業(yè)務(wù),這里特別封裝了官方建議的最佳實(shí)踐流程。里面涵蓋了“支付”、“支付查詢”、“撤銷”等幾個(gè)服務(wù)和建議的流程、輪詢次數(shù)、輪詢間隔等。商戶開(kāi)發(fā)可以直接使用,也可以通過(guò)修改里面的配置來(lái)自定義自己的流程。

如何使用該SDK:

請(qǐng)直接下載demo,demo那邊也有詳細(xì)的指引,商戶用demo中完善的代碼進(jìn)行補(bǔ)充流程處理就可以了。點(diǎn)此獲取demo

參考資料

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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