官网:https://dashboard.stripe.com/test/dashboard
文档:https://stripe.com/docs
1.官网注册账号后,开发者-->API密钥,可以获得两个开发密钥
可发布密钥:pk_test_XXXXXX , 客户端使用
密钥:sk_test_XXXXX , 服务器使用
2.设置支付方式:https://dashboard.stripe.com/settings/payment_methods
开启Apple pay
- 配置Apple pay : https://dashboard.stripe.com/settings/payments/apple_pay
3.1 下载csr,去apple开发者网站配置merchantID证书申请
3.2 添加新证书
至此网站配置简单完成,下面是app配置
1.引入sdk
pod 'Stripe'
2.注册api
@import Stripe;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
///注册api
[StripeAPI setDefaultPublishableKey: @"pk_test_XXXXXX"];
///打开Apple Pay
[[STPPaymentConfiguration sharedConfiguration] setApplePayEnabled:YES];
[[STPPaymentConfiguration sharedConfiguration] setAppleMerchantIdentifier:@"merchant.com.XXXXX"];
return YES;
}
3.构建快捷支付UI
import Foundation
import Stripe
import CloudKit
import UIKit
import SwiftUI
class File: NSObject {
@objc public func showPaymentSheet(target : UIViewController ,publishableKey : String , clientSecret : String){
StripeAPI.defaultPublishableKey = publishableKey
var config = PaymentSheet.Configuration()
config.allowsDelayedPaymentMethods = false
config.merchantDisplayName = "XXXXX"
config.applePay = .init(merchantId: "merchant.com.XXXXX", merchantCountryCode: "CN")
let paymentSheet = PaymentSheet.init(paymentIntentClientSecret: clientSecret, configuration: config)
DispatchQueue.main.async {
paymentSheet.present(from: target) { PaymentSheetResult in
switch PaymentSheetResult {
case .completed:
print("confiremed")
case .canceled:
print("Canceled!")
case .failed(let error):
print("Payment failed: \(error)")
}
}
}
}
}
4.使用
#import "工程名-Swift.h"
-(void)click{
NSString *url = @"http:192.168.100.138:4242/create-payment-intent";
[NetTool requestType:RequestType_Post url:url params:@{} header:@{} isJsonType:NO Success:^(NSDictionary * _Nonnull response) {
NSString *publishableKey = response[@"publishableKey"];
NSString *clientSecret = response[@"clientSecret"];
if (publishableKey.length > 0 && clientSecret.length > 0) {
PaymentSheetTool *file = [PaymentSheetTool new];
[file showPaymentSheetWithTarget:self publishableKey:publishableKey clientSecret:clientSecret];
}
} Fail:^(XHError * _Nonnull error) {
}];
}
-----------------------------------------------------------------------------
使用自定义UI付款步骤
1.根据用户订单,请求服务器,拿到stripe 的 clientSecret
///拿到订单,请求服务器,获取stripe 的 clientSecret
- (IBAction)pay:(id)sender {
[self.view endEditing:YES];
NSString *url = @"http:192.168.100.138:4242/create-payment-intent";
[NetTool requestType:RequestType_Post url:url params:@{} header:@{} isJsonType:NO Success:^(NSDictionary * _Nonnull response) {
NSString *clientSecret = response[@"clientSecret"];
if ( clientSecret.length > 0) {
[self stripePayAtClientSecret:clientSecret];
}
} Fail:^(XHError * _Nonnull error) {
}];
}
2.构建支付对象,发起支付
- (void)stripePayAtClientSecret:(NSString *)clientSecret {
// ...
if (!clientSecret) {
// PaymentIntent hasn't been created;
return;
}
self.statusL.text = @"";
///自定义UI获取到的card信息
STPCardParams *cardPrams = [STPCardParams new];
cardPrams.number = self.numL.text;
cardPrams.expMonth = 11;
cardPrams.expYear = 2022;
cardPrams.cvc = @"111";
///构建支付方法卡片参数对象
STPPaymentMethodCardParams *methodCardParams = [[STPPaymentMethodCardParams alloc] initWithCardSourceParams:cardPrams];
// 构建支付方法参数
STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:methodCardParams billingDetails:nil metadata:nil];
//构建支付对象
STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:clientSecret];
paymentIntentParams.paymentMethodParams = paymentMethodParams;
//提交支付 //设置代理
STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler];
[paymentHandler confirmPayment:paymentIntentParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPPaymentIntent *paymentIntent, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
switch (status) {
case STPPaymentHandlerActionStatusFailed: {
self.statusL.text = error.localizedDescription;
break;
}
case STPPaymentHandlerActionStatusCanceled: {
self.statusL.text = @"用户取消授权";
break;
}
case STPPaymentHandlerActionStatusSucceeded: {
self.statusL.text = @"交易成功";
break;
}
default:
break;
}
});
}];
}
3.实现卡片认证的代理
#pragma mark - STPAuthenticationContext代理
// 必须实现的代理,在哪个控制器上弹出认证窗口,固定写
-(UIViewController *)authenticationPresentingViewController{
return self;
//也可以是下面的
// return self.navigationController.topViewController;
}
///配置认证样式
-(void)configureSafariViewController:(SFSafariViewController *)viewController{
STPThreeDSUICustomization *uiCustomization = [STPPaymentHandler sharedHandler].threeDSCustomizationSettings.uiCustomization;
uiCustomization.textFieldCustomization.keyboardAppearance = UIKeyboardAppearanceDark; //键盘黑色
uiCustomization.navigationBarCustomization.barStyle = UIBarStyleBlack; //导航栏黑色
uiCustomization.navigationBarCustomization.textColor = UIColor.whiteColor; //文本白色
[uiCustomization buttonCustomizationForButtonType:STPThreeDSCustomizationButtonTypeCancel].textColor = UIColor.whiteColor; //取消按钮文字白色
}
有关认证情况的测试卡如下