stripe-iOS
参考地址:https://stripe.com/docs/payments/accept-a-payment#ios-submit-payment
安装(略)
支付流程
关于publishable key
stripe有两种环境:test(测试环境)和live(正式环境)。
- test环境支付的操作并没有真的执行,只能使用特定的测试账号。(https://stripe.com/docs/testing)
每个环境对应一对key,分别为publishable 和 secret。(https://stripe.com/docs/keys#obtain-api-keys)
- publishable key可以对外公布,用来创建token。客户端使用publishable key对用户的敏感信息(eg:信用卡)进行加密,得到token。并将token发送给自己的服务器使用。token只能使用一次。(https://stripe.com/docs/api/tokens)
- secret key需要保存在服务端,属于机密信息。可以让服务器没有任何限制的访问stripe。
信用卡&借记卡工作流程
- 卡工作流程参考官网地址:(https://stripe.com/docs/payments/cards/overview)
- 客户端支付流程参考官网地址:(https://stripe.com/docs/payments/accept-a-payment?integration=elements
https://stripe.com/docs/payments/integration-builder) - 官网给出的标准支付方式,基本流程就是,去服务器请求一个clientScret:
(https://stripe.com/docs/api/payment_intents/create)
然后加上用户输入的卡信息直接调用SDK的方法。curl https://api.stripe.com/v1/payment_intents \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d amount=2000 \ -d currency=usd \ -d "payment_method_types[]"=card
STPPaymentMethodCardParams *cardParams = paymentCardTextField.cardParams; STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:self.paymentIntentClientSecret]; paymentIntentParams.paymentMethodParams = paymentMethodParams; STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; [paymentHandler confirmPayment:paymentIntentParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPPaymentIntent * _Nullable intent, NSError * _Nullable error) { dispatch_async(dispatch_get_main_queue(), ^{ switch (status) { case STPPaymentHandlerActionStatusFailed: { break; } case STPPaymentHandlerActionStatusCanceled: { break; } case STPPaymentHandlerActionStatusSucceeded: { break; } default: break; } }); }];
但是这种方式需要用户每次都输入信用卡账号的方式,如果需要将卡信息保存下来,方便用户下一次支付的时候,直接选择某种支付方式或某一张卡片,需要添加如下代码:
paymentIntentParams.savePaymentMethod = @(YES);
这个属性可以自动绑定当前卡片信息到用户名下。需要注意的是:这种情况下需要在请求clientSecrete的时候增加一个参数:customer,即最终的请求应该是:
curl https://api.stripe.com/v1/payment_intents \
-u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
-d amount=2000 \
-d currency=usd \
-d "payment_method_types[]"=card
-d customer=cus_wertyuikjhgfd
这样,用户下一次支付的时候,就可以直接获取到之前已经绑定过的卡信息来直接支付。简单说流程就是,拿到用户的paymentMethod列表,展示给用户,用户选择其中一个支付方式后,将paymentMethod的ID和clientSecrete一起赋值给sdk完成支付流程,代码如下:
STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:self.paymentIntentClientSecret];
paymentIntentParams.paymentMethodId = self.paymentMethodID;
paymentIntentParams.savePaymentMethod = @(YES);
除此之外,savePaymentMethod = @(YES)的时候还需要传入需要绑定的paymentMethod,否则会报错。
获取paymentMethod的接口是:
curl https://api.stripe.com/v1/payment_methods \
-u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
-d customer=cus_AJ6bY3VqcaLAEs \
-d type=card \
-G
-
更加详细具体的流程如下:
客户端支付完成后,SDK会返回支付结果给客户端,服务器端可以使用webhook来获取通知,不过收到的event的数据里面只有stripe的数据,如果想走后续流程,比如:更新订单状态,更改账户余额等。此时至少需要订单ID,可以将自己想要的数据放在creatPaymentIntent这个接口中。(https://stripe.com/docs/api/payment_intents/create
https://stripe.com/docs/payments/charges-api#storing-information-in-metadata)
putMetadata('orderID','1234567')
这样webhook的接口收到的event的数据中,metadata里面就会出现订单ID,可以进行下面的操作了。
获取完整的用户支付方式信息
使用上面的方法可以自动绑定用户输入的信用卡信息,获取用户支付方式(卡列表),可以让服务器协助调用API(参考:https://stripe.com/docs/api/payment_methods/list)
或者直接使用stripe的SDK,其核心是STPPaymentContext和STPPaymentOptionsViewController。
SEphemeralKeyProvider *keyProvider = [[SEphemeralKeyProvider alloc] init];
STPCustomerContext *customerContext = [[STPCustomerContext alloc] initWithKeyProvider:keyProvider];
STPPaymentContext *paymentContext = [[STPPaymentContext alloc] initWithCustomerContext:customerContext];
paymentContext.delegate = self;
paymentContext.hostViewController = self;
[paymentContext pushPaymentOptionsViewController];
self.paymentContext = paymentContext;
其中的SEphemeralKeyProvider需要实现
实现方法
- (void)createCustomerKeyWithAPIVersion:(NSString *)apiVersion completion:(STPJSONResponseCompletionBlock)completion {
[SPaymentDataRequst s_createEphemeralKeyFinishBlock:^(SResponse * _Nonnull response) {
if (response.responseObject && [response.responseObject isKindOfClass:[NSDictionary class]]) {
completion(response.responseObject,nil);
}else {
completion(nil, response.error);
}
}];
}
请求API:/api/order/stripe/createEphemeralKey,将返回结果直接回调。确认支付的时候调用
[self.paymentContext requestPayment];
STPPaymentContext的代理方法有:
- (void)paymentContext:(STPPaymentContext *)paymentContext didFailToLoadWithError:(NSError *)error {
//创建失败,此时返回的是上面的createCustomerKeyWithAPIVersion方法中的报错信息
}
- (void)paymentContextDidChange:(STPPaymentContext *)paymentContext {
if (paymentContext.selectedPaymentOption) {
//当用户选择的某一种支付方式后,回调。selectedPaymentOption保存了PMID。此处可以保留PMID准备支付。
}
}
- (void)paymentContext:(STPPaymentContext *)paymentContext
didCreatePaymentResult:(STPPaymentResult *)paymentResult
completion:(STPPaymentStatusBlock)completion {
//新添加了支付用的信用后的回调,此处可以保留PMID准备支付。
}
- (void)paymentContext:(STPPaymentContext *)paymentContext
didFinishWithStatus:(STPPaymentStatus)status
error:(nullable NSError *)error {
//添加信用卡失败的回调
}
之后的支付方式与上面一致:
STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler];
更新中……
信用卡二次确认
取消支付
把资金转给你平台上的商家stripe connect
把资金转到自己的银行户头-提现
辅助工具
CLI(终端联调工具)
安装
参考:https://stripe.com/docs/stripe-cli?platform=ios&lang=objc