最近在一個海外專案中需要對接支付寶、微信支付,商務對接的同事(產品)要求使用海外支付整合平臺Stripe,Stripe的授權支付流程與我們專案中訂單支付邏輯並不是十分吻合,還是遇到了不少麻煩,這篇文章主要從前端角度講解一下Stripe使用Sources
進行第三方支付的授權流程。
我們以支付寶為例,構建一個支付流程
一、建立對應的Source
- 建立一個
Source
需要提供一個Source引數
let sourceParams = STPSourceParams.alipayParams(withAmount: UInt(aliMoney), currency: "eur", returnURL: "bentobus://stripe-redirect")
//以下可以通過metadata為source新增自定義的資料
if sourceParams.metadata == nil {
sourceParams.metadata = ["orderNo": 3321]
} else {
sourceParams.metadata?["orderNo"] = 12121
}
複製程式碼
- 建立
Source
STPAPIClient.shared().createSource(with: sourceParams) { (source, error) in
if let s = source, s.flow == .redirect {
//:TODO
}
}
複製程式碼
二、根據建立Source
後回撥的資料,進行下一步操作(支付寶授權支付)
建立Source
以後,根據以上回撥屬性我們需要進行重定向授權(支付)操作
let redirectContext = STPRedirectContext(source: s, completion: { (sourceId, clientSecret, error) in
// 接收授權(支付)回撥
})
redirectContext.startRedirectFlow(from: self)//安裝支付寶的情況下會喚起支付寶支付
//redirectContext.startSafariViewControllerRedirectFlowFromViewControlle(self)
//redirectContext.startSafariAppRedirectFlow
複製程式碼
三、接受授權支付後的回撥
在第二步重定向授權支付後,後端會收到通知並更改Source
的狀態,接下來我們可以根據Source
最終的狀態來校驗支付結果
STPAPIClient.shared().retrieveSource(withId: sourceId, clientSecret: clientSecret, completion: { (source, error) in
switch source!.status {
case .chargeable, .consumed :
break
case .pending :
break
case .canceled :
break
case .failed:
break
default:
break
}
}
複製程式碼
以上是支付寶支付的整個流程:
建立Source
~> 重定向認證支付寶支付 ~> (後端)從支付寶獲取支付款項 ~> 獲取Source
最新狀態 ~> 支付成功\失敗
最後提一下微信支付,截止19年6月初,官方文件中提到Stripe是支援微信支付的,但是客戶端原生SDK中並沒有提供直接建立微信支付Sources
的Api,遂棄。
但是,可以看到文件中web端建立Sources
的方法:
stripe.createSource({
type: 'wechat',
amount: 1099,
currency: 'usd',
}).then(function(result) {
// handle result.error or result.source
});
複製程式碼
這個方法與我們在客戶端SDK中建立AlipaySource
的方法類似,只是客戶端並沒有提供WeChat
這樣一個type
:
對此,我們可以根據Alipay相關類方法的實現,使用STPSourceParams
例項方法進行自定義構建:
STPSourceParams *params = [self new];
params.type = STPSourceTypeUnknown;
params.currency = currency;
params.redirect = @{ @"return_url": returnURL };
params.usage = STPSourceUsageReusable;
複製程式碼
STPSourceType
列舉沒有WeChat
選項,不過根據web端的文件可以使用其中的rawTypeString
進行設定
以上微信支付只是一個思路,沒有經過驗證,僅供參考