微信和支付宝支付模式详解及实现(.Net标准库)
支付基本上是很多產(chǎn)品都必須的一個(gè)模塊,大家最熟悉的應(yīng)該就是微信和支付寶支付了,不過(guò)更多的可能還是停留在直接sdk的調(diào)用上,甚至和業(yè)務(wù)系統(tǒng)高度耦合,網(wǎng)上也存在各種解決方案,但大多形式各異,東拼西湊而成。所以這里我介紹下OSS.PayCenter開(kāi)源跨平臺(tái)支付組件 及其框架設(shè)計(jì)。并對(duì)常用支付模式進(jìn)行一個(gè)全面介紹,方便大家開(kāi)發(fā)以及跨平臺(tái)使用。這篇文章主要圍繞以下幾個(gè)模塊:
1. 微信和支付寶對(duì)比
2. 支付模式介紹
3.OSS.PayCenter框架設(shè)計(jì)
4. 調(diào)用示例
5. 注意事項(xiàng)
一. 微信和支付寶對(duì)比
這兩者現(xiàn)在已經(jīng)占領(lǐng)了移動(dòng)支付的90%市場(chǎng),支付形式也都大抵相同,只是在實(shí)現(xiàn)細(xì)節(jié)上略微不同。這里之所以要專門對(duì)比,是因?yàn)橛行┙涌诘牟煌诤筮叺目蚣艿脑O(shè)計(jì)中也會(huì)有所影響。主要集中在以下幾個(gè)方面:
1. 支付方式上:
a.支付寶多了一個(gè)聲波支付
b. 手機(jī)端H5支付方式中, 微信只支持微信內(nèi)部瀏覽器
c. 微信用戶掃碼方式中除了正常下單返回支付二維碼,還提提供了回調(diào)下單模式(即掃描的二維碼并不是支付二維碼,而是商品二維碼,微信會(huì)回調(diào)商戶指定地址才真實(shí)下單)
2. 接口安全
a. 微信不同接口安全等級(jí)不一樣,涉及付款等接口加密相對(duì)簡(jiǎn)單(MD5,SHA1),涉及到退款,發(fā)送紅包等接口需要使用雙向證書驗(yàn)證
b. 支付寶所有接口統(tǒng)一使用RSA加密驗(yàn)證,需要公私鑰驗(yàn)證。
3. 接口協(xié)議
a. 微信使用的xml協(xié)議,所有參數(shù)基本都在同一層級(jí)。
b. 支付寶使用json協(xié)議,核心參數(shù)放在biz_content字段中。
二. 支付模式介紹
1. 完整支付的流程
隨著時(shí)間的發(fā)展,線上線下的支付場(chǎng)景都已經(jīng)比較完善,各支付平臺(tái)雖然接口不同,但是兩者在業(yè)務(wù)流程都有著相似之處。這里我用一個(gè)流程圖來(lái)展示核心的業(yè)務(wù)流程(線上線下主要是指在用戶在線下單還是線下商戶輔助下單):
以上流程圖將線上和線下集中支付形式做了一個(gè)概要的說(shuō)明,兩個(gè)支付平臺(tái)在具體的細(xì)節(jié)上可能或有略微不同,不過(guò)基本上都在這個(gè)流程范圍之內(nèi)。
注:其中微信的掃碼支付中,除了正常的返回支付二維碼支付,還可以直接掃描商品二維碼,通過(guò)微信后臺(tái)回調(diào)商家接口,在回調(diào)中完成支付請(qǐng)求,喚起客戶端支付。
2. 支付方式介紹
首先:線上支付
1). 用戶掃碼支付
這個(gè)一般應(yīng)用在在線PC網(wǎng)站支付中,用戶在商戶系統(tǒng)下單后,選擇自己方便的支付平臺(tái),由商戶系統(tǒng)向支付平臺(tái)發(fā)起支付請(qǐng)求,返回對(duì)應(yīng)的支付二維碼,完成支付。(微信提供兩種形式,其中可以直接掃描商品二維碼,回調(diào)處理,這個(gè)可以方便應(yīng)用在線下活動(dòng)推廣中,由微信后臺(tái)間接幫助完成下單。
2). 手機(jī)端支付
這個(gè)一般應(yīng)用在H5站點(diǎn)或者app中,商戶系統(tǒng)下單后后臺(tái)直接發(fā)起下單請(qǐng)求,喚起手機(jī)支付平臺(tái)客戶端,完成支付。(微信的H5支付只能在微信內(nèi)部瀏覽器中喚起。
其次:線下支付,這個(gè)主要集中在超市,商場(chǎng)等。常見(jiàn)的如:
1). 商戶發(fā)起掃碼支付
這個(gè)基本在餐飲,超市,商場(chǎng)等。客流量較大,服務(wù)員需要快速完成收付操作,商戶后臺(tái)下單后直接掃碼。如果用戶掃碼在多人同時(shí)操作時(shí)容易出現(xiàn)錯(cuò)單錯(cuò)誤等問(wèn)題
2). 聲波支付(支付寶)
這個(gè)一般出現(xiàn)自動(dòng)販?zhǔn)蹤C(jī),或者聚會(huì)相互付款等,不需要用戶掃來(lái)掃去,按住開(kāi)關(guān)就可發(fā)現(xiàn)周邊設(shè)備。暫時(shí)只有支付提供
3. 支付結(jié)果及后續(xù)處理
上述介紹了支付主要流程,線上支付時(shí)由于是客戶端同步返回支付結(jié)果,且是在頁(yè)面直接跳轉(zhuǎn)完成,所以這個(gè)支付結(jié)果不能作為實(shí)際的支付結(jié)果,以防止前端的惡意攻擊或者支付平臺(tái)內(nèi)部處理異常導(dǎo)致的支付失敗。 正確的支付結(jié)果需要以后臺(tái)的異步通知為準(zhǔn)。
如果當(dāng)前訂單在一定時(shí)間內(nèi)一直未支付,建議調(diào)用取消支付請(qǐng)求訂單接口,以防止后續(xù)出現(xiàn)錯(cuò)誤支付或者訂單支付異常問(wèn)題。
三.OSS.PayCenter框架設(shè)計(jì)
1. 框架流程
了解了以上的幾種支付方式之后,那么具體的調(diào)用什么接口其實(shí)已經(jīng)比較清晰了,那么我們縱向的來(lái)看一下接口調(diào)用的流程。如果把一個(gè)請(qǐng)求當(dāng)做一個(gè)生命周期,以發(fā)起一個(gè)POST請(qǐng)求為例,在OSS.PayCenter中主要流程如下:
在這個(gè)框架中,分為兩個(gè)部分:
下層為基類,完成 簽名=》內(nèi)容協(xié)議格式化=》請(qǐng)求=》響應(yīng)內(nèi)容協(xié)議格式化=》全局錯(cuò)誤處理。其中提供了兩個(gè)基本請(qǐng)求方法,PostApiAsync-為當(dāng)前請(qǐng)求簽名,封裝xml內(nèi)容調(diào)用網(wǎng)絡(luò)請(qǐng)求。 RestCommonAsync-執(zhí)行當(dāng)前請(qǐng)求,并對(duì)結(jié)果格式化和全局錯(cuò)誤處理。
上層為子類,具體各個(gè)接口名稱和對(duì)應(yīng)的請(qǐng)求內(nèi)容參數(shù)。(注:退款,付款在單獨(dú)的子類中,和其他接口做了物理隔離)
2. 框架介紹
當(dāng)前項(xiàng)目都基于.Net標(biāo)準(zhǔn)庫(kù)項(xiàng)目,也就是說(shuō)同步支持.Net Framework和.Net Core,每個(gè)項(xiàng)目中都會(huì)有SysTools文件夾,主要存放當(dāng)前類庫(kù)的輔助類。
1). 基礎(chǔ)配置
兩個(gè)類庫(kù)中最底層基類中,都提供了DefaultConfig 靜態(tài)屬性,可以方便在程序全局入口中就設(shè)置好對(duì)應(yīng)的支付平臺(tái)配置信息。
同時(shí)如果你存在多租戶情況,可以在具體的接口類構(gòu)造函數(shù)中傳入不同租戶支付平臺(tái)配置信息。
2). 命名規(guī)則
當(dāng)前項(xiàng)目中主要接口都已經(jīng)實(shí)現(xiàn)完畢,但是如果你需要自己重新實(shí)現(xiàn),或者個(gè)別特殊未實(shí)現(xiàn)的接口,可以參照各個(gè)子類的實(shí)現(xiàn)
實(shí)體的命名規(guī)則: 平臺(tái)名稱+動(dòng)作名稱 + 接口名稱 +Req/Resp (如微信下單接口:WxAddPayUniOrderReq),實(shí)體都會(huì)繼承至對(duì)應(yīng)的BaseReq/BaseResp,具體可參見(jiàn)源碼。
在當(dāng)前的框架中,分為OSS.PayCenter.WX(微信)和OSS.PayCenter.ZFB(支付寶)兩個(gè)項(xiàng)目,兩者在接口協(xié)議,和參數(shù)格式上都完全不同,所以對(duì)應(yīng)底層基類細(xì)節(jié)也會(huì)有所不同,詳情請(qǐng)閱讀具體代碼。
四. 調(diào)用示例
這里以支付寶回調(diào)結(jié)果解析為例:
這個(gè)示例展示了主要個(gè)三個(gè)步驟,當(dāng)前僅僅是解析回調(diào)結(jié)果,沒(méi)有發(fā)起網(wǎng)絡(luò)請(qǐng)求,下邊再給出一個(gè)發(fā)起支付請(qǐng)求的示例:
凡是涉及到網(wǎng)絡(luò)請(qǐng)求的接口都會(huì)返回一個(gè)異步Task對(duì)象,如果需要同步使用,使用.WaitResult()擴(kuò)展方法即可,這個(gè)我在OSS.Http文章中已經(jīng)介紹。
五. 注意事項(xiàng)
1. 在微信項(xiàng)目中同時(shí)提供有發(fā)送紅包,企業(yè)付款,代金券等接口,詳情可參見(jiàn)具體類。
2. 由于.net standard類庫(kù)當(dāng)前還并不是十分完整,有兩個(gè)地方需要注意一下。(下個(gè)月.net standard 2.0版本發(fā)布后估計(jì)應(yīng)該會(huì)完善了)
a。在wx項(xiàng)目中使用到了請(qǐng)求的雙向證書綁定,.net core 和.net frameword中已經(jīng)實(shí)現(xiàn),標(biāo)準(zhǔn)庫(kù)中暫時(shí)還沒(méi)有,所以在微信配置實(shí)體中我公開(kāi)了一個(gè)SetCertificata屬性,調(diào)用時(shí)只需要如下賦值即可:
config.SetCertificata = (handler, cert) =>
{
handler.ServerCertificateCustomValidationCallback =
(msg, c, chain, sslErrors) => true;
handler.ClientCertificates.Add(cert);
};
b. 支付寶的加解密使用的RSA,本身提供的方法依賴于Windows系統(tǒng)的“crypt32.dll”和“advapi32.dll”兩個(gè)組件,所以我重寫了整個(gè)簽名加密模塊,隔離系統(tǒng)的依賴。但是在當(dāng)前標(biāo)準(zhǔn)庫(kù)版本下RSACryptoServiceProvider類內(nèi)部的linux平臺(tái)版本依然沒(méi)有具體實(shí)現(xiàn),也就是說(shuō)支付寶當(dāng)前項(xiàng)目可以運(yùn)行windows系統(tǒng)中.net core下,linux下暫時(shí)不可以
總結(jié)
以上是生活随笔為你收集整理的微信和支付宝支付模式详解及实现(.Net标准库)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 摘棉花是什么意思?抖音摘棉花梗介绍
- 下一篇: 微信 Mac 3.7.1 最新官方正式版