前言
最近在開發(fā)國際版APP時需要用到支付,由于資料比較少,所以這里記錄一下Braintree和Stripe的使用埃儿。
常用的國際支付
- Braintree 是 PayPal 旗下的服務(wù)截亦,所以如果要支持 PayPal 賬戶結(jié)算就只能使用 Braintree,可用單獨接入Paypal晶姊,但是單獨接入Paypal的單筆交易費率是比Braintree高很多的扒接。
-
Stripe 是一家做支付的公司。他們的目標(biāo)是们衙,進一步簡化支付流程钾怔。
以下是國外一篇網(wǎng)站上男旗,對strip和braintree的對比!
在我使用這兩種支付時,確實發(fā)現(xiàn)Stripe的集成要比Braintree簡潔蒙挑,集成比較方便和快捷宗侦。公司由于費率的問題還是選擇了Stripe,因為paypal的費率是比較高的忆蚀,Braintree是paypal旗下的原因吧矾利,信用卡支付方式在兩種平臺費率是一樣的,但其他方面可能Stripe更優(yōu)一些馋袜。
Braintree和Stripe對比
建議
如果用戶人群使用Paypal的比例比較高時,最好還是使用Braintree欣鳖。相反察皇,則使用stripe,開發(fā)起來是非常快捷和舒適的,而且還支持支付寶和微信观堂,這點對我們國內(nèi)開發(fā)者也挺友好让网。
Braintree接入步驟
首先我們需要了解一下Braintree的支付流程,Braintree的工作原理如下圖:
- 你的APP會從你的服務(wù)器請求一個client token师痕,用來初始化客戶端的SDK
- 你的服務(wù)器用服務(wù)端SDK可以生成一個client token溃睹,用來發(fā)送給客戶端
- 一旦你的客戶端SDK初始化了,顧客點擊提交了支付信息胰坟,調(diào)用SDK提交支付信息因篇,會返回一個payment method nonce
- 然后你需要把這個payment method nonce發(fā)送給你的服務(wù)器
- 你的服務(wù)器接收到客戶端傳遞過來的payment method nonce,然后用服務(wù)端的SDK創(chuàng)建一筆交易
注冊沙箱賬戶
1. 獲取client key
braintree沙箱賬戶注冊
注冊過程非常簡單笔横,這里只是測試賬戶竞滓,所以比較快。
在沙箱首頁點設(shè)置按鈕吹缔,選擇API進入商佑,這里點擊頁面中的 + Generate New Tokenization Key 可以創(chuàng)建一個上面支付流程里提到的client token(自己的服務(wù)器還未提供這個借口,所以可以自己手動生成一個key用來測試)厢塘。
2. 導(dǎo)入Client SDK
使用 CocoaPods
在pod文件中添加以下代碼導(dǎo)入SDK
pod 'BraintreeDropIn'
使用 Carthage
在Cartfile文件里添加:github "braintree/braintree-ios-drop-in"
需要添加如下framekwork
BraintreeDropIn.framework
BraintreeUIKit.framework
BraintreeCard.framework
BraintreeCore.framework
BraintreePaymentFlow.framework
PayPalOneTouch.framework
PayPalDataCollector.framework
PayPalUtils.framework
3. 獲取payment nonce
我這里是只用了信用卡支付來舉例茶没,其他的可以看官方的案例或文檔肌幽。
#import "BraintreeCore.h"
#import "BraintreeDropIn.h"
#import "BraintreeCard.h"
首先初始化cardClient,下圖的卡號信息是Braintree提供的測試卡號抓半,在官方文檔中可以找到
BTAPIClient *braintreeClient = [[BTAPIClient alloc] initWithAuthorization:clientTokenOrTokenizationKey];
if(!braintreeClient){
//clientToken無效
return;
}
BTCardClient *cardClient = [[BTCardClient alloc] initWithAPIClient:braintreeClient];
BTCard *card = [[BTCard alloc] initWithNumber:@"4111111111111111"
expirationMonth:@"12"
expirationYear:@"2018"
cvv:@"200"];
發(fā)送支付的信息給Braintree獲取payment nonce token
[cardClient tokenizeCard:card
completion:^(BTCardNonce *tokenizedCard, NSError *error) {
// Communicate the tokenizedCard.nonce to your server, or handle error
NSLog(@"error:%@",error);
if(error){
}else{
NSString * nonce = tokenizedCard.nonce;
NSLog(@"nonce:%@",nonce);
}];
總結(jié)
如果在上面中能正確獲取到nonce就說明客戶端測試成功了喂急,上面的流程里,聯(lián)調(diào)的時候需要自己服務(wù)器提供兩個接口:
- 獲取client token
- 發(fā)送payment method nonce給服務(wù)器笛求,然后服務(wù)器創(chuàng)建交易廊移。
以上是用的自定義UI,沒有用Braintree提供的UI探入,其他的支付方式都大同小異狡孔,都是獲取到nonce進行處理,可以參照官方文檔新症,我這里就沒補充了步氏。
Stripe接入步驟
聲明
Stripe最近由于歐洲今年九月SCA的需要,已經(jīng)更新了信用卡支付的Charges API徒爹,其他支付方式會在今年陸續(xù)更新荚醒,所以建議可以看我另外一篇文章關(guān)于Payment Intents API的。iOS Stripe支付升級支持歐洲九月SCA驗證
1. 獲取key
注冊鏈接:
https://dashboard.stripe.com/login
進入控制臺隆嗅,找到如下界面獲取測試的key
2. 初始化sdk
在pod文件中添加以下代碼導(dǎo)入SDK
pod 'Stripe'
在AppDelegate.m中引入并初始化sdk
#import <Stripe.h>
//配置stripe支付
[Stripe setDefaultPublishableKey: StripeKey];
3. 使用STPPaymentCardTextField
我這里使用非常簡單界阁,直接用的stripe自帶的STPPaymentCardTextField,合適的地方添加該控件
//信用卡付款輸入框
@property (weak, nonatomic)STPPaymentCardTextField *paymentTextField;
添加了STPPaymentCardTextField后胖喳,要記得設(shè)置代理
self.paymentTextField.delegate = self;
然后實現(xiàn)代理,這里是用來驗證輸入的信用卡信息是否有效泡躯,還有一些其他的代理,如果有需要可以自己去使用
- (void)paymentCardTextFieldDidChange:(STPPaymentCardTextField *)textField {
// Toggle buy button state
// self.buyButton.enabled = textField.isValid
self.viewModel.cardIsValid = textField.isValid;
}
4. 調(diào)用支付丽焊,獲取token
卡的信息在這個field里可以直接拿较剃,然后獲取到的token發(fā)送給服務(wù)器,完成最后一步支付操作
[[STPAPIClient sharedClient] createTokenWithCard:self.paymentTextField.cardParams
completion:^(STPToken *token, NSError *error) {
if (error) { NSLog(@"error:%@",error.userInfo); }
NSLog(@"token:::%@",token.tokenId);
}];
總結(jié)
stripe的支付文檔比較清晰技健,集成比較快和簡單写穴,控制臺也比較友好。所以如果paypal用戶不多的情況下就可以優(yōu)先使用stripe雌贱,畢竟還支持微信和支付寶啊送。
期待
文章若有些許幫助,請給個喜歡或評論;若沒啥幫助欣孤,請給點建議~
如果有疑問馋没,請在文章底部評論指出,我會火速解決和修正問題降传。