1. 程式人生 > >微信和支付寶支付模式詳解及實現二

微信和支付寶支付模式詳解及實現二

配置 其余 logs https 朋友 一個 target 多租戶 對比

  繼上篇《微信和支付寶支付模式詳解及實現》到現在已經有半年時間了,這期間不少朋友在公號留言支付相關的問題,最近正好也在處理公司支付相關的對接,打算寫這篇來做一個更進一步的介紹,同時根據主要的幾個支付方式提供實現案例。希望能夠幫助有需要的同學,內容主要分為兩個模塊:

1. 微信和支付寶支付方式細分

  1) 支付方式的對比

2)接口實現形式

2. 案列實現(OSS.PaySdk)

  1) 多方式配置支持

  2) 不同支付方式接口實現

一. 微信和支付寶支付方式細分

  在最近半年時間微信新增了 H5支付 和 小程序支付 接口。支付寶的接口沒有什麽太大變化,但是文檔中對接口的描述做了新的調整和歸類(依然比較亂)。所以這裏我會對在《微信和支付寶支付模式詳解及實現》文章中提到的支付方式再次進行細化分類和對比。

  1. 支付方式的對比

  1). 掃碼支付

    在支付寶文檔中現在歸類為當面付(下單接口名稱:交易預創建-alipay.trade.precreate)。

    這裏再介紹下微信的掃碼的兩種模式,第一種:商家先按照規則生成產品相關二維碼,用戶掃碼後,微信發起對商家指定地址的請求,在這個請求中商家系統完成下單,獲取預支付信息返回,用戶端完成支付。第二種:用戶下單後,商家系統獲取預支付信息,生成二維碼給用戶完成支付。

  2). H5支付

    微信的這個接口為新增,並且商家需要申請才能開通。在支付寶中歸類為手機網站支付(下單接口名稱:手機網頁支付-alipay.trade.page.pay)

  3). APP支付

    客戶端發起支付,支付寶下單接口名稱:App支付-alipay.trade.app.pay

  4). 公眾號支付

    手機端平臺內瀏覽器直接喚起支付。在微信內則是 公眾號支付。支付寶則主要是生活號,接口文檔並沒有分類(下單接口名稱:交易創建-alipay.trade.create)

  5). 小程序支付

    內部小程序支付,支付寶下單接口名稱:App支付-alipay.trade.app.pay

  6). 電腦端支付(收銀臺)

    因為歷史原因,支付寶在PC端同時還在提供這種支付方式,直接跳轉到支付寶的收銀臺界面,用戶可以直接通過支付寶密碼支付,或者在收銀臺頁面進行掃碼,個人不再建議這個方式,流程上多了一步。下單接口名稱:支付頁面接口-alipay.trade.page.pay

  7). 刷卡支付

    這個主要是商家發起,掃描用戶條形碼/二維碼/聲波信息。為了不和上邊的掃碼支付產生歧義,並且這個操作類似商家刷用戶銀行卡,叫做刷卡支付。

    微信也叫刷卡支付,接口名稱:提交刷卡支付。支付寶則歸為當面付中的條碼支付,接口名稱:交易支付-alipay.trade.pay

  前六種支付方式,是一般用在線上支付,用戶和商戶無需直接接觸,我將其歸類為線上支付。第七種則主要集中在超市,商場等,我一般歸類為線下支付。

  2.接口實現形式

  上邊的支付方式中,除了前五種微信支付接口名稱都是【統一下單】我沒有列出來之外。支付寶基本都不相同,且名稱歧義較大,給人相對雜亂的感覺。微信則相對有序很多,且下單接口基本都走統一下單接口,除了參數屬性上有些變化。這裏我在接口的實現層面上也做一個簡單的分解,方便大家理解

  1) 微信實現形式

    微信的接口處理邏輯相對簡單,除刷卡支付,其余在喚起支付前需要通過統一下單接口請求微信支付系統獲取預支付信息。

    如果是公號、小程序、APP支付,需要服務端再進一步簽名,交給前端JS調用。

    如果是掃碼支付,預支付信息中會返回二維碼鏈接,商戶通過服務端或者前端生成對應的圖片即可

    如果是H5支付,預支付會返回鏈接地址,瀏覽器跳轉即可

    如果是刷卡支付,讀取附帶條碼上的token信息後,直接請求微信系統完成支付

  2) 支付寶實現形式

    支付寶則相對減少了請求次數

    如果是H5、公號、電腦端支付,則將各自的參數組裝簽名之後,生成一個含有form表單的HTML,其中還附加了form.submit()方法,使得在頁面附加這段html後自動提交並喚起支付。

    如果是APP、小程序支付,都是使用的APP支付接口,依然組裝簽名,但生成的是form內容,類似:k1=v1&k2=v2的內容,交由前端客戶端sdk方法喚起支付。

    如果是掃碼支付,則會請求支付寶系統獲取預支付信息(含二維碼),生成圖片

    如果是刷卡支付,和微信相同,讀取附帶條碼、聲波上的token信息後,直接請求支付寶系統完成支付

  因為查詢,退款等相關接口就是簡單的調用,這裏就不做介紹了。

二. 案例實現

  上邊的實現形式介紹完,基本上思路上就沒什麽障礙了,剩下就是功能代碼,以及接口交互時的加解密實現。兩個平臺在服務端也都提供了相應的SDK,不過兩者都是在.net framework框架下,同時微信端SDK功能相對簡單,支付寶則封裝過於臃腫,具體參數需要調用方生成對應json串的形式傳入。所以在年初我個人把兩個平臺的接口分別進行了封裝,也就是這裏要介紹的OSS.PaySdk。

  當前這個項目是在.Net Standard框架下,也就是同時支持Framework(4.6.1)和Core,基本覆蓋全部支付相關接口,並且提供多租戶的支持。

  下邊主要是針對這個項目下兩個sdk的使用結合上邊的支付方式,做一個示例,所有代碼都在Github可以下載。

  1. 多方式配置支持

  在SDK在實現的過程中,除了接口的功能的實現,考慮到調用方的各種情況,每個SDK在底層我都會提供三種配置的實現方式,並且每個SDK中都提供了一個後綴為ConfigProvider的類:

  1)上下文配置設置方式

  這個方式適用於多租戶的形式,在當前請求上下文中根據請求信息的不同使用不同的商戶號,可以在構造函數中調用ConfigProvider下的SetContextConfig方法,例如:

微信:

技術分享

支付寶:

技術分享

  2) 聲明指定的方式

  這種方式主要是適應某些定制模塊下,不對主系統產生影響,支付至特定的商戶號,可以在接口聲明時通過構造函數傳入,如果在當前請求上下文中沒有找到配置信息,系統會優先使用這個配置信息,以微信舉例:

技術分享

  3) 默認配置設置

  如果你是單一商戶的系統,則只需要在程序入口處設置這個值即可,如果系統未發現上下文和實例聲明的配置,則會使用當前配置。依然以微信舉例:

技術分享

  以上配置優先級依次遞減。

  2. 不同支付方式接口實現

  設置完配置之後,我對以上幾種支付方式的下單接口調用做一個演示,至於退款等接口,比較簡單,這裏就不在特殊演示,源代碼中每個文件都有詳細的註釋可供查找

微信:

技術分享

支付寶:

技術分享

技術分享

具體的代碼可以下載源碼查看sample項目,在Startup中設置一個默認配置即可,前端代碼請查看相應的cshtml文件

如果你還有其他問題,歡迎關註公眾號(OSSCoder)

技術分享

微信和支付寶支付模式詳解及實現二