iOS使用Stripe整合支付寶Alipay支付

lucasong發表於2019-06-06

最近在一個海外專案中需要對接支付寶、微信支付,商務對接的同事(產品)要求使用海外支付整合平臺Stripe,Stripe的授權支付流程與我們專案中訂單支付邏輯並不是十分吻合,還是遇到了不少麻煩,這篇文章主要從前端角度講解一下Stripe使用Sources進行第三方支付的授權流程。


我們以支付寶為例,構建一個支付流程

一、建立對應的Source

  1. 建立一個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
}

複製程式碼
  1. 建立 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

螢幕快照2019-06-0616.15.12.png

對此,我們可以根據Alipay相關類方法的實現,使用STPSourceParams例項方法進行自定義構建:

    STPSourceParams *params = [self new];
    params.type = STPSourceTypeUnknown;
    params.currency = currency;
    params.redirect = @{ @"return_url": returnURL };
    params.usage = STPSourceUsageReusable;
複製程式碼

STPSourceType列舉沒有WeChat選項,不過根據web端的文件可以使用其中的rawTypeString進行設定

以上微信支付只是一個思路,沒有經過驗證,僅供參考

相關文章