繼上篇《微信和支付寶支付模式詳解及實現》到如今已經有半年時間了,這期間很多朋友在公號留言支付相關的問題,最近正好也在處理公司支付相關的對接,打算寫這篇來作一個更進一步的介紹,同時根據主要的幾個支付方式提供實現案例。但願可以幫助有須要的同窗,內容主要分爲兩個模塊:html
1. 微信和支付寶支付方式細分前端
1) 支付方式的對比git
2)接口實現形式github
2. 案列實現(OSS.PaySdk)json
1) 多方式配置支持小程序
2) 不一樣支付方式接口實現數組
一. 微信和支付寶支付方式細分瀏覽器
在最近半年時間微信新增了 H5支付 和 小程序支付 接口。支付寶的接口沒有什麼太大變化,可是文檔中對接口的描述作了新的調整和歸類(依然比較亂)。因此這裏我會對在《微信和支付寶支付模式詳解及實現》文章中提到的支付方式再次進行細化分類和對比。微信
1. 支付方式的對比app
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) 支付寶實現形式
支付寶則相對減小了請求次數
若是是H五、公號、電腦端支付,則將各自的參數組裝簽名以後,生成一個含有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)