iOS Stripe 支付

官方文檔地址: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 會通知後臺 ,這段時間 ,如果不是實時通訊,我們前端可以通過後臺給到的訂單狀態查詢接口進行輪詢,(不同業務邏輯不同,我這裏是兩次輪詢,分別間隔三秒,成功跳成功頁面,失敗跳失敗頁面,聯繫客服。)

發佈了78 篇原創文章 · 獲贊 105 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章