官方文檔地址:https://stripe.com/docs/payments/accept-a-payment
Stripe 一個極簡的國際卡支付,集成流程也是比較清晰。
大概步驟就是 前端 從後臺拿到 client_secret ,將 卡信息 和 client_secret 傳給 Stripe,進行支付,成功後 Stripe 會通知後臺, 後臺更新訂單,前端更新界面。
1、首先導入 Strip 庫
pod 'Stripe'
2、 配置環境
在 AppDelegate.m 的 application:didFinishLaunchingWithOptions: 方法中註冊 Strip 的key, 這個參數 區分正式環境和測試環境。需要到 Stripe 後臺查找
在測試和開發時,請使用測試模式鍵;在發佈應用程序之前,請使用生產模式鍵。
#define Pay_Stripe_Live_Key @"pk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define Pay_Stripe_Test_Key @"pk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#if DEBUG
#define kPayStripeEnviroment Pay_Stripe_Test_Key
#else
#define kPayStripeEnviroment Pay_Stripe_Live_Key
#endif
應用啓動時,請使用Stripe 可發佈密鑰配置SDK,以便它可以向Stripe API發出請求。
#import <Stripe/Stripe.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Stripe setDefaultPublishableKey:kPayStripeEnviroment];
}
3、創建結賬界面,
Stripe 有自帶的界面,我們用自帶的來繪製界面
@property (weak) STPPaymentCardTextField *cardTextField;
/// 更新 輸入框的大小
STPPaymentCardTextField *cardTextField = [[STPPaymentCardTextField alloc] init];
cardTextField.borderColor = kClearColor;
for (UIView *view in cardTextField.subviews) {
if ([view isKindOfClass:[UIImageView class]]) {
CGRect frame = view.frame;
frame.origin.x = 0;
view.frame = frame;
}
}
self.cardTextField = cardTextField;
// self.cardTextField.backgroundColor = kOrangeColor;
[self addSubview:self.cardTextField];
[self.cardTextField mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.top.mas_equalTo(0);
make.left.mas_equalTo(WindowRatioX(18));
make.right.mas_equalTo(WindowRatioX(-15));
}];
Stripe 平臺提供了一些測試卡號
4、客戶端從後臺請求到client_secret
用戶輸入卡號後,先判斷輸入的卡號,過期年月等信息是否有效,再根據order_id 從後臺拿到 client_secret
self.cardParams = self.cardTextField.cardParams;
if (self.cardParams.number.length <= 0 || self.cardParams.expMonth.intValue <= 0 || self.cardParams.expYear.intValue <= 0 || self.cardParams.cvc.integerValue <= 0) {
// 請確認卡號信息
return;
}
5、調起Stripe 庫進行支付
將從後臺拿到的 client_secret 和 用戶輸入的 self.cardTextField.cardParams 值代入後進行支付。
- (void)stripePayAtClientSecret:(NSString *)clientSecret {
// ...
if (!clientSecret) {
// PaymentIntent hasn't been created;
return;
}
HUDShow();
// Collect card details
STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:self.cardParams billingDetails:nil metadata:nil];
STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:clientSecret];
paymentIntentParams.paymentMethodParams = paymentMethodParams;
// Submit the payment
STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler];
[paymentHandler confirmPayment:paymentIntentParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPPaymentIntent *paymentIntent, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
HUDHide();
switch (status) {
case STPPaymentHandlerActionStatusFailed: {
// [self displayAlertWithTitle:@"Payment failed" message:error.localizedDescription ?: @"" restartDemo:NO];
HUDShowMessage(error.localizedDescription);
break;
}
case STPPaymentHandlerActionStatusCanceled: {
HUDShowMessage(error.localizedDescription);
// [self displayAlertWithTitle:@"Payment canceled" message:error.localizedDescription ?: @"" restartDemo:NO];
break;
}
case STPPaymentHandlerActionStatusSucceeded: {
// [self displayAlertWithTitle:@"Payment succeeded" message:paymentIntent.description ?: @"" restartDemo:YES];
[self getOrderStatus];
break;
}
default:
break;
}
});
}];
}
6、檢查訂單
支付成功後 , Stripe 會通知後臺 ,這段時間 ,如果不是實時通訊,我們前端可以通過後臺給到的訂單狀態查詢接口進行輪詢,(不同業務邏輯不同,我這裏是兩次輪詢,分別間隔三秒,成功跳成功頁面,失敗跳失敗頁面,聯繫客服。)