Braintree iOS Drop-in SDK
Braintree iOS Drop-in SDK 是一个功能强大的支付集成解决方案,为iOS应用提供了一套完整的支付UI组件。它支持多种支付方式,包括信用卡、PayPal、Venmo和Apple Pay,让开发者能够快速集成安全可靠的支付功能。
功能特性
- 多支付方式支持:集成信用卡、PayPal、Venmo和Apple Pay等多种支付方式
- UI自定义 :通过
BTDropInUICustomization
全面自定义UI样式和颜色方案 - 安全支付处理:支持3D Secure验证和安全的支付信息处理
- 支付管理:提供支付方式的保存、管理和选择功能
- 国际化支持:包含多语言本地化和RTL布局支持
- 无障碍访问:默认支持动态字体大小和无障碍功能
- 现代技术栈:要求Xcode 15.0+和Swift 5.9+,支持iOS 12.0+
安装指南
Swift Package Manager
swift
dependencies: [
.package(url: "https://github.com/braintree/braintree-ios-drop-in", from: "9.14.0")
]
CocoaPods
ruby
pod 'BraintreeDropIn'
系统要求
- iOS 12.0+
- Xcode 15.0+
- Swift 5.9+
使用说明
基本集成
swift
import BraintreeDropIn
// 初始化Drop-in控制器
let dropInRequest = BTDropInRequest()
dropInRequest.cardholderNameSetting = .required
dropInRequest.vaultCard = true
let dropIn = BTDropInController(authorization: "your_client_token",
request: dropInRequest)
{ (controller, result, error) in
if let error = error {
print("Error: \(error.localizedDescription)")
} else if let result = result {
// 处理支付结果
print("Payment method type: \(result.paymentMethodType)")
print("Payment description: \(result.paymentDescription)")
}
controller.dismiss(animated: true)
}
// 呈现Drop-in界面
present(dropIn!, animated: true)
UI自定义示例
swift
let uiCustomization = BTDropInUICustomization(colorScheme: .light)
uiCustomization.fontFamily = "Helvetica"
uiCustomization.boldFontFamily = "Helvetica-Bold"
uiCustomization.tintColor = .systemBlue
let dropInRequest = BTDropInRequest()
dropInRequest.uiCustomization = uiCustomization
获取最近支付方式
swift
BTDropInResult.mostRecentPaymentMethod(forClientToken: clientToken) { result, error in
if let result = result {
// 显示最近使用的支付方式
let paymentIcon = result.paymentIcon
let description = result.paymentDescription
}
}
核心代码
支付表单控制器
swift
// BTCardFormViewController.h
@interface BTCardFormViewController : BTDropInBaseViewController <UITextFieldDelegate>
@property (nonatomic, strong, readonly) BTUIKCardNumberFormField *cardNumberField;
@property (nonatomic, strong, readonly) BTUIKCardholderNameFormField *cardholderNameField;
@property (nonatomic, strong, readonly) BTUIKExpiryFormField *expirationDateField;
@property (nonatomic, strong, readonly) BTUIKSecurityCodeFormField *securityCodeField;
// 如果表单有效,返回BTCardRequest
@property (nonatomic, strong, nullable, readonly) BTCardRequest *cardRequest;
@end
UI定制配置
swift
// BTDropInUICustomization.m
- (instancetype)initWithColorScheme:(BTDropInColorScheme)colorScheme {
if (self = [super init]) {
_useBlurs = YES;
_postalCodeFormFieldKeyboardType = UIKeyboardTypeDefault;
switch(colorScheme) {
case BTDropInColorSchemeLight:
_barBackgroundColor = UIColor.whiteColor;
_formBackgroundColor = [UIColor btuik_colorFromHex:@"EFEFF4" alpha:1.0];
_primaryTextColor = UIColor.blackColor;
_secondaryTextColor = [UIColor btuik_colorFromHex:@"3C3C43" alpha:1.0];
break;
case BTDropInColorSchemeDark:
_barBackgroundColor = [UIColor btuik_colorFromHex:@"222222" alpha:1.0];
_formBackgroundColor = [UIColor btuik_colorFromHex:@"222222" alpha:1.0];
_primaryTextColor = UIColor.whiteColor;
_secondaryTextColor = [UIColor btuik_colorFromHex:@"EBEBF5" alpha:1.0];
break;
default: // dynamic
if (@available(iOS 13, *)) {
_barBackgroundColor = UIColor.systemBackgroundColor;
_formBackgroundColor = UIColor.systemGroupedBackgroundColor;
_primaryTextColor = UIColor.labelColor;
_secondaryTextColor = UIColor.secondaryLabelColor;
}
}
}
return self;
}
支付方式处理
swift
// BTPaymentMethodNonce+DropIn.m
- (NSString *)paymentDescription {
if ([self isKindOfClass:[BTCardNonce class]]) {
return ((BTCardNonce *)self).lastFour;
} else if ([self isKindOfClass:[BTPayPalAccountNonce class]]) {
return ((BTPayPalAccountNonce *)self).email;
} else if ([self isKindOfClass:[BTVenmoAccountNonce class]]) {
return ((BTVenmoAccountNonce *)self).username;
} else if ([self isKindOfClass:[BTApplePayCardNonce class]]) {
return @"Apple Pay";
} else {
return @"";
}
}
基础视图控制器
swift
// BTDropInBaseViewController.m
- (instancetype)initWithAPIClient:(BTAPIClient *)apiClient request:(BTDropInRequest *)request {
if (self = [super init]) {
self.apiClient = apiClient;
_dropInRequest = request;
}
return self;
}
- (void)loadConfiguration {
[self.apiClient fetchOrReturnRemoteConfiguration:^(BTConfiguration *configuration, NSError *error) {
self.configuration = configuration;
[self configurationLoaded:configuration error:error];
}];
}