@stripe/stripe-react-native 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/android/src/main/java/com/reactnativestripesdk/Mappers.kt +46 -0
- package/android/src/main/java/com/reactnativestripesdk/PaymentLauncherFragment.kt +15 -8
- package/android/src/main/java/com/reactnativestripesdk/PaymentMethodCreateParamsFactory.kt +1 -1
- package/ios/.DS_Store +0 -0
- package/ios/Errors.swift +9 -35
- package/ios/Mappers.swift +105 -2
- package/ios/PaymentMethodFactory.swift +46 -1
- package/ios/StripeSdk.m +14 -0
- package/ios/StripeSdk.swift +284 -103
- package/lib/commonjs/NativeStripeSdk.js.map +1 -1
- package/lib/commonjs/functions.js +1 -1
- package/lib/commonjs/functions.js.map +1 -1
- package/lib/commonjs/hooks/useStripe.js +1 -1
- package/lib/commonjs/hooks/useStripe.js.map +1 -1
- package/lib/commonjs/types/NextAction.js +2 -0
- package/lib/commonjs/types/NextAction.js.map +1 -0
- package/lib/commonjs/types/PaymentIntents.js.map +1 -1
- package/lib/commonjs/types/PaymentMethods.js.map +1 -1
- package/lib/commonjs/types/SetupIntent.js.map +1 -1
- package/lib/commonjs/types/index.js.map +1 -1
- package/lib/module/NativeStripeSdk.js.map +1 -1
- package/lib/module/functions.js +1 -1
- package/lib/module/functions.js.map +1 -1
- package/lib/module/hooks/useStripe.js +1 -1
- package/lib/module/hooks/useStripe.js.map +1 -1
- package/lib/module/types/NextAction.js +2 -0
- package/lib/module/types/NextAction.js.map +1 -0
- package/lib/module/types/PaymentIntents.js.map +1 -1
- package/lib/module/types/PaymentMethods.js.map +1 -1
- package/lib/module/types/SetupIntent.js.map +1 -1
- package/lib/module/types/index.js.map +1 -1
- package/lib/typescript/e2e/helpers.d.ts +1 -0
- package/lib/typescript/e2e/screenObject/BasicPaymentScreen.d.ts +1 -0
- package/lib/typescript/e2e/screenObject/HomeScreen.d.ts +1 -1
- package/lib/typescript/example/src/App.d.ts +2 -0
- package/lib/typescript/example/src/screens/ACHPaymentScreen.d.ts +1 -0
- package/lib/typescript/example/src/screens/ACHSetupScreen.d.ts +1 -0
- package/lib/typescript/src/NativeStripeSdk.d.ts +3 -1
- package/lib/typescript/src/functions.d.ts +5 -1
- package/lib/typescript/src/hooks/useStripe.d.ts +5 -1
- package/lib/typescript/src/types/NextAction.d.ts +32 -0
- package/lib/typescript/src/types/PaymentIntents.d.ts +2 -0
- package/lib/typescript/src/types/PaymentMethods.d.ts +28 -2
- package/lib/typescript/src/types/SetupIntent.d.ts +4 -2
- package/lib/typescript/src/types/index.d.ts +15 -1
- package/package.json +3 -3
- package/src/NativeStripeSdk.tsx +12 -0
- package/src/functions.ts +146 -0
- package/src/hooks/useStripe.tsx +50 -0
- package/src/types/NextAction.ts +44 -0
- package/src/types/PaymentIntents.ts +2 -0
- package/src/types/PaymentMethods.ts +31 -2
- package/src/types/SetupIntent.ts +9 -2
- package/src/types/index.ts +24 -1
- package/stripe-react-native.podspec +3 -2
package/ios/StripeSdk.swift
CHANGED
|
@@ -72,7 +72,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
72
72
|
configuration.applePay = .init(merchantId: merchantIdentifier,
|
|
73
73
|
merchantCountryCode: merchantCountryCode)
|
|
74
74
|
} else {
|
|
75
|
-
resolve(Errors.createError(
|
|
75
|
+
resolve(Errors.createError(ErrorType.Failed, "Either merchantIdentifier or merchantCountryCode is missing"))
|
|
76
76
|
return
|
|
77
77
|
}
|
|
78
78
|
}
|
|
@@ -113,7 +113,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
113
113
|
if let customerId = params["customerId"] as? String {
|
|
114
114
|
if let customerEphemeralKeySecret = params["customerEphemeralKeySecret"] as? String {
|
|
115
115
|
if (!Errors.isEKClientSecretValid(clientSecret: customerEphemeralKeySecret)) {
|
|
116
|
-
resolve(Errors.createError(
|
|
116
|
+
resolve(Errors.createError(ErrorType.Failed, "`customerEphemeralKeySecret` format does not match expected client secret formatting."))
|
|
117
117
|
return
|
|
118
118
|
}
|
|
119
119
|
configuration.customer = .init(id: customerId, ephemeralKeySecret: customerEphemeralKeySecret)
|
|
@@ -129,7 +129,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
129
129
|
func handlePaymentSheetFlowControllerResult(result: Result<PaymentSheet.FlowController, Error>, stripeSdk: StripeSdk?) {
|
|
130
130
|
switch result {
|
|
131
131
|
case .failure(let error):
|
|
132
|
-
resolve(Errors.createError(
|
|
132
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError))
|
|
133
133
|
case .success(let paymentSheetFlowController):
|
|
134
134
|
self.paymentSheetFlowController = paymentSheetFlowController
|
|
135
135
|
if let paymentOption = stripeSdk?.paymentSheetFlowController?.paymentOption {
|
|
@@ -146,7 +146,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
146
146
|
|
|
147
147
|
if let paymentIntentClientSecret = params["paymentIntentClientSecret"] as? String {
|
|
148
148
|
if (!Errors.isPIClientSecretValid(clientSecret: paymentIntentClientSecret)) {
|
|
149
|
-
resolve(Errors.createError(
|
|
149
|
+
resolve(Errors.createError(ErrorType.Failed, "`secret` format does not match expected client secret formatting."))
|
|
150
150
|
return
|
|
151
151
|
}
|
|
152
152
|
|
|
@@ -161,7 +161,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
161
161
|
}
|
|
162
162
|
} else if let setupIntentClientSecret = params["setupIntentClientSecret"] as? String {
|
|
163
163
|
if (!Errors.isSetiClientSecretValid(clientSecret: setupIntentClientSecret)) {
|
|
164
|
-
resolve(Errors.createError(
|
|
164
|
+
resolve(Errors.createError(ErrorType.Failed, "`secret` format does not match expected client secret formatting."))
|
|
165
165
|
return
|
|
166
166
|
}
|
|
167
167
|
|
|
@@ -175,7 +175,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
175
175
|
resolve([])
|
|
176
176
|
}
|
|
177
177
|
} else {
|
|
178
|
-
resolve(Errors.createError(
|
|
178
|
+
resolve(Errors.createError(ErrorType.Failed, "You must provide either paymentIntentClientSecret or setupIntentClientSecret"))
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
}
|
|
@@ -191,14 +191,14 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
191
191
|
resolve([])
|
|
192
192
|
self.paymentSheetFlowController = nil
|
|
193
193
|
case .canceled:
|
|
194
|
-
resolve(Errors.createError(
|
|
194
|
+
resolve(Errors.createError(ErrorType.Canceled, "The payment has been canceled"))
|
|
195
195
|
case .failed(let error):
|
|
196
|
-
resolve(Errors.createError(
|
|
196
|
+
resolve(Errors.createError(ErrorType.Failed, error.localizedDescription))
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
}
|
|
200
200
|
} else {
|
|
201
|
-
resolve(Errors.createError(
|
|
201
|
+
resolve(Errors.createError(ErrorType.Failed, "No payment sheet has been initialized yet"))
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
}
|
|
@@ -231,13 +231,13 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
231
231
|
resolve([])
|
|
232
232
|
self.paymentSheet = nil
|
|
233
233
|
case .canceled:
|
|
234
|
-
resolve(Errors.createError(
|
|
234
|
+
resolve(Errors.createError(ErrorType.Canceled, "The payment has been canceled"))
|
|
235
235
|
case .failed(let error):
|
|
236
|
-
resolve(Errors.createError(
|
|
236
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError))
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
} else {
|
|
240
|
-
resolve(Errors.createError(
|
|
240
|
+
resolve(Errors.createError(ErrorType.Failed, "No payment sheet has been initialized yet"))
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
243
|
}
|
|
@@ -245,13 +245,13 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
245
245
|
@objc(createTokenForCVCUpdate:resolver:rejecter:)
|
|
246
246
|
func createTokenForCVCUpdate(cvc: String?, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
247
247
|
guard let cvc = cvc else {
|
|
248
|
-
resolve(Errors.createError(
|
|
248
|
+
resolve(Errors.createError(ErrorType.Failed, "You must provide CVC"))
|
|
249
249
|
return;
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
STPAPIClient.shared.createToken(forCVCUpdate: cvc) { (token, error) in
|
|
253
253
|
if error != nil || token == nil {
|
|
254
|
-
resolve(Errors.createError(
|
|
254
|
+
resolve(Errors.createError(ErrorType.Failed, error?.localizedDescription ?? ""))
|
|
255
255
|
} else {
|
|
256
256
|
let tokenId = token?.tokenId
|
|
257
257
|
resolve(["tokenId": tokenId])
|
|
@@ -265,26 +265,33 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
265
265
|
rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
266
266
|
let type = Mappers.mapToPaymentMethodType(type: params["type"] as? String)
|
|
267
267
|
guard let paymentMethodType = type else {
|
|
268
|
-
resolve(Errors.createError(
|
|
268
|
+
resolve(Errors.createError(ErrorType.Failed, "You must provide paymentMethodType"))
|
|
269
269
|
return
|
|
270
270
|
}
|
|
271
|
-
var paymentMethodParams: STPPaymentMethodParams?
|
|
272
|
-
let factory = PaymentMethodFactory.init(params: params, cardFieldView: cardFieldView, cardFormView: cardFormView)
|
|
273
271
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
272
|
+
var err: NSDictionary? = nil
|
|
273
|
+
let setupIntentParams: STPSetupIntentConfirmParams = {
|
|
274
|
+
if (paymentMethodType == .USBankAccount && params["accountNumber"] == nil) { // Payment method is assumed to be already attached
|
|
275
|
+
return STPSetupIntentConfirmParams(clientSecret: setupIntentClientSecret, paymentMethodType: .USBankAccount)
|
|
276
|
+
} else {
|
|
277
|
+
let parameters = STPSetupIntentConfirmParams(clientSecret: setupIntentClientSecret)
|
|
278
|
+
let factory = PaymentMethodFactory.init(params: params, cardFieldView: cardFieldView, cardFormView: cardFormView)
|
|
279
|
+
do {
|
|
280
|
+
let paymentMethodParams = try factory.createParams(paymentMethodType: paymentMethodType)
|
|
281
|
+
parameters.paymentMethodParams = paymentMethodParams
|
|
282
|
+
} catch {
|
|
283
|
+
err = Errors.createError(ErrorType.Failed, error as NSError?)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return parameters
|
|
287
|
+
}
|
|
288
|
+
}()
|
|
289
|
+
|
|
290
|
+
if (err != nil) {
|
|
291
|
+
resolve(err)
|
|
282
292
|
return
|
|
283
293
|
}
|
|
284
|
-
|
|
285
|
-
let setupIntentParams = STPSetupIntentConfirmParams(clientSecret: setupIntentClientSecret)
|
|
286
|
-
setupIntentParams.paymentMethodParams = paymentMethodParams
|
|
287
|
-
|
|
294
|
+
|
|
288
295
|
if let urlScheme = urlScheme {
|
|
289
296
|
setupIntentParams.returnURL = Mappers.mapToReturnURL(urlScheme: urlScheme)
|
|
290
297
|
}
|
|
@@ -293,20 +300,20 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
293
300
|
paymentHandler.confirmSetupIntent(setupIntentParams, with: self) { status, setupIntent, error in
|
|
294
301
|
switch (status) {
|
|
295
302
|
case .failed:
|
|
296
|
-
resolve(Errors.createError(
|
|
303
|
+
resolve(Errors.createError(ErrorType.Failed, error))
|
|
297
304
|
break
|
|
298
305
|
case .canceled:
|
|
299
306
|
if let lastError = setupIntent?.lastSetupError {
|
|
300
|
-
resolve(Errors.createError(
|
|
307
|
+
resolve(Errors.createError(ErrorType.Canceled, lastError))
|
|
301
308
|
} else {
|
|
302
|
-
resolve(Errors.createError(
|
|
309
|
+
resolve(Errors.createError(ErrorType.Canceled, "The payment has been canceled"))
|
|
303
310
|
}
|
|
304
311
|
break
|
|
305
312
|
case .succeeded:
|
|
306
313
|
let intent = Mappers.mapFromSetupIntent(setupIntent: setupIntent!)
|
|
307
314
|
resolve(Mappers.createResult("setupIntent", intent))
|
|
308
315
|
@unknown default:
|
|
309
|
-
resolve(Errors.createError(
|
|
316
|
+
resolve(Errors.createError(ErrorType.Unknown, error))
|
|
310
317
|
break
|
|
311
318
|
}
|
|
312
319
|
}
|
|
@@ -315,7 +322,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
315
322
|
@objc(updateApplePaySummaryItems:errorAddressFields:resolver:rejecter:)
|
|
316
323
|
func updateApplePaySummaryItems(summaryItems: NSArray, errorAddressFields: [NSDictionary], resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
317
324
|
if (shippingMethodUpdateHandler == nil && shippingContactUpdateHandler == nil) {
|
|
318
|
-
resolve(Errors.createError(
|
|
325
|
+
resolve(Errors.createError(ErrorType.Failed, "You can use this method only after either onDidSetShippingMethod or onDidSetShippingContact events emitted"))
|
|
319
326
|
return
|
|
320
327
|
}
|
|
321
328
|
var paymentSummaryItems: [PKPaymentSummaryItem] = []
|
|
@@ -349,7 +356,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
349
356
|
library.openPaymentSetup()
|
|
350
357
|
resolve([])
|
|
351
358
|
} else {
|
|
352
|
-
resolve(Errors.createError(
|
|
359
|
+
resolve(Errors.createError(ErrorType.Failed, "Cannot open payment setup"))
|
|
353
360
|
}
|
|
354
361
|
}
|
|
355
362
|
|
|
@@ -396,22 +403,22 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
396
403
|
break
|
|
397
404
|
case .error:
|
|
398
405
|
let message = "Payment not completed"
|
|
399
|
-
applePayCompletionRejecter?(
|
|
400
|
-
applePayRequestRejecter?(
|
|
406
|
+
applePayCompletionRejecter?(ErrorType.Failed, message, nil)
|
|
407
|
+
applePayRequestRejecter?(ErrorType.Failed, message, nil)
|
|
401
408
|
applePayCompletionRejecter = nil
|
|
402
409
|
applePayRequestRejecter = nil
|
|
403
410
|
break
|
|
404
411
|
case .userCancellation:
|
|
405
412
|
let message = "The payment has been canceled"
|
|
406
|
-
applePayCompletionRejecter?(
|
|
407
|
-
applePayRequestRejecter?(
|
|
413
|
+
applePayCompletionRejecter?(ErrorType.Canceled, message, nil)
|
|
414
|
+
applePayRequestRejecter?(ErrorType.Canceled, message, nil)
|
|
408
415
|
applePayCompletionRejecter = nil
|
|
409
416
|
applePayRequestRejecter = nil
|
|
410
417
|
break
|
|
411
418
|
@unknown default:
|
|
412
419
|
let message = "Payment not completed"
|
|
413
|
-
applePayCompletionRejecter?(
|
|
414
|
-
applePayRequestRejecter?(
|
|
420
|
+
applePayCompletionRejecter?(ErrorType.Unknown, message, nil)
|
|
421
|
+
applePayRequestRejecter?(ErrorType.Unknown, message, nil)
|
|
415
422
|
applePayCompletionRejecter = nil
|
|
416
423
|
applePayRequestRejecter = nil
|
|
417
424
|
}
|
|
@@ -446,7 +453,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
446
453
|
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
447
454
|
rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
448
455
|
if (merchantIdentifier == nil) {
|
|
449
|
-
reject(
|
|
456
|
+
reject(ErrorType.Failed, "You must provide merchantIdentifier", nil)
|
|
450
457
|
return
|
|
451
458
|
}
|
|
452
459
|
|
|
@@ -455,15 +462,15 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
455
462
|
}
|
|
456
463
|
|
|
457
464
|
guard let summaryItems = params["cartItems"] as? NSArray else {
|
|
458
|
-
reject(
|
|
465
|
+
reject(ErrorType.Failed, "You must provide the items for purchase", nil)
|
|
459
466
|
return
|
|
460
467
|
}
|
|
461
468
|
guard let country = params["country"] as? String else {
|
|
462
|
-
reject(
|
|
469
|
+
reject(ErrorType.Failed, "You must provide the country", nil)
|
|
463
470
|
return
|
|
464
471
|
}
|
|
465
472
|
guard let currency = params["currency"] as? String else {
|
|
466
|
-
reject(
|
|
473
|
+
reject(ErrorType.Failed, "You must provide the payment currency", nil)
|
|
467
474
|
return
|
|
468
475
|
}
|
|
469
476
|
|
|
@@ -504,7 +511,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
504
511
|
applePayContext.presentApplePay(completion: nil)
|
|
505
512
|
}
|
|
506
513
|
} else {
|
|
507
|
-
reject(
|
|
514
|
+
reject(ErrorType.Failed, "Payment not completed", nil)
|
|
508
515
|
}
|
|
509
516
|
}
|
|
510
517
|
|
|
@@ -524,7 +531,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
524
531
|
) -> Void {
|
|
525
532
|
let type = Mappers.mapToPaymentMethodType(type: params["type"] as? String)
|
|
526
533
|
guard let paymentMethodType = type else {
|
|
527
|
-
resolve(Errors.createError(
|
|
534
|
+
resolve(Errors.createError(ErrorType.Failed, "You must provide paymentMethodType"))
|
|
528
535
|
return
|
|
529
536
|
}
|
|
530
537
|
|
|
@@ -534,18 +541,18 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
534
541
|
do {
|
|
535
542
|
paymentMethodParams = try factory.createParams(paymentMethodType: paymentMethodType)
|
|
536
543
|
} catch {
|
|
537
|
-
resolve(Errors.createError(
|
|
544
|
+
resolve(Errors.createError(ErrorType.Failed, error.localizedDescription))
|
|
538
545
|
return
|
|
539
546
|
}
|
|
540
547
|
|
|
541
548
|
guard let params = paymentMethodParams else {
|
|
542
|
-
resolve(Errors.createError(
|
|
549
|
+
resolve(Errors.createError(ErrorType.Unknown, "Unhandled error occured"))
|
|
543
550
|
return
|
|
544
551
|
}
|
|
545
552
|
|
|
546
553
|
STPAPIClient.shared.createPaymentMethod(with: params) { paymentMethod, error in
|
|
547
554
|
if let createError = error {
|
|
548
|
-
resolve(Errors.createError(
|
|
555
|
+
resolve(Errors.createError(ErrorType.Failed, createError.localizedDescription))
|
|
549
556
|
return
|
|
550
557
|
}
|
|
551
558
|
|
|
@@ -563,7 +570,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
563
570
|
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
564
571
|
) -> Void {
|
|
565
572
|
guard let type = params["type"] as? String else {
|
|
566
|
-
resolve(Errors.createError(
|
|
573
|
+
resolve(Errors.createError(ErrorType.Failed, "type parameter is required"))
|
|
567
574
|
return
|
|
568
575
|
}
|
|
569
576
|
|
|
@@ -574,7 +581,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
574
581
|
case "Card":
|
|
575
582
|
createTokenFromCard(params: params, resolver: resolve, rejecter: reject)
|
|
576
583
|
default:
|
|
577
|
-
resolve(Errors.createError(
|
|
584
|
+
resolve(Errors.createError(ErrorType.Failed, type + " type is not supported yet"))
|
|
578
585
|
}
|
|
579
586
|
}
|
|
580
587
|
|
|
@@ -603,7 +610,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
603
610
|
if let token = token {
|
|
604
611
|
resolve(Mappers.createResult("token", Mappers.mapFromToken(token: token)))
|
|
605
612
|
} else {
|
|
606
|
-
resolve(Errors.createError(
|
|
613
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError?))
|
|
607
614
|
}
|
|
608
615
|
}
|
|
609
616
|
}
|
|
@@ -614,7 +621,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
614
621
|
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
615
622
|
) -> Void {
|
|
616
623
|
guard let cardParams = cardFieldView?.cardParams ?? cardFormView?.cardParams else {
|
|
617
|
-
resolve(Errors.createError(
|
|
624
|
+
resolve(Errors.createError(ErrorType.Failed, "Card details not complete"))
|
|
618
625
|
return
|
|
619
626
|
}
|
|
620
627
|
|
|
@@ -632,7 +639,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
632
639
|
if let token = token {
|
|
633
640
|
resolve(Mappers.createResult("token", Mappers.mapFromToken(token: token)))
|
|
634
641
|
} else {
|
|
635
|
-
resolve(Errors.createError(
|
|
642
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError?))
|
|
636
643
|
}
|
|
637
644
|
}
|
|
638
645
|
}
|
|
@@ -647,13 +654,13 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
647
654
|
paymentHandler.handleNextAction(forPayment: paymentIntentClientSecret, with: self, returnURL: nil) { status, paymentIntent, handleActionError in
|
|
648
655
|
switch (status) {
|
|
649
656
|
case .failed:
|
|
650
|
-
resolve(Errors.createError(
|
|
657
|
+
resolve(Errors.createError(ErrorType.Failed, handleActionError))
|
|
651
658
|
break
|
|
652
659
|
case .canceled:
|
|
653
660
|
if let lastError = paymentIntent?.lastPaymentError {
|
|
654
|
-
resolve(Errors.createError(
|
|
661
|
+
resolve(Errors.createError(ErrorType.Canceled, lastError))
|
|
655
662
|
} else {
|
|
656
|
-
resolve(Errors.createError(
|
|
663
|
+
resolve(Errors.createError(ErrorType.Canceled, "The payment has been canceled"))
|
|
657
664
|
}
|
|
658
665
|
break
|
|
659
666
|
case .succeeded:
|
|
@@ -662,11 +669,95 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
662
669
|
}
|
|
663
670
|
break
|
|
664
671
|
@unknown default:
|
|
665
|
-
resolve(Errors.createError(
|
|
672
|
+
resolve(Errors.createError(ErrorType.Unknown, "Cannot complete payment"))
|
|
666
673
|
break
|
|
667
674
|
}
|
|
668
675
|
}
|
|
669
676
|
}
|
|
677
|
+
|
|
678
|
+
@objc(collectBankAccount:clientSecret:params:resolver:rejecter:)
|
|
679
|
+
func collectBankAccount(
|
|
680
|
+
intentType: String,
|
|
681
|
+
clientSecret: NSString,
|
|
682
|
+
params: NSDictionary,
|
|
683
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
684
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
685
|
+
) -> Void {
|
|
686
|
+
let type = Mappers.mapToPaymentMethodType(type: params["type"] as? String)
|
|
687
|
+
if (type == nil || type != STPPaymentMethodType.USBankAccount) {
|
|
688
|
+
resolve(Errors.createError(ErrorType.Failed, "collectBankAccount currently only accepts the USBankAccount payment method type."))
|
|
689
|
+
return
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
guard let billingDetails = params["billingDetails"] as? [String: Any?], let name = billingDetails["name"] as? String else {
|
|
693
|
+
resolve(Errors.createError(ErrorType.Canceled, "You must provide a name when collecting US bank account details."))
|
|
694
|
+
return
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
if (name.isEmpty) {
|
|
698
|
+
resolve(Errors.createError(ErrorType.Canceled, "You must provide a name when collecting US bank account details."))
|
|
699
|
+
return
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
let collectParams = STPCollectBankAccountParams.collectUSBankAccountParams(
|
|
703
|
+
with: name,
|
|
704
|
+
email: billingDetails["email"] as? String
|
|
705
|
+
)
|
|
706
|
+
|
|
707
|
+
switch intentType {
|
|
708
|
+
case "payment":
|
|
709
|
+
DispatchQueue.main.async {
|
|
710
|
+
STPBankAccountCollector().collectBankAccountForPayment(
|
|
711
|
+
clientSecret: clientSecret as String,
|
|
712
|
+
params: collectParams,
|
|
713
|
+
from: findViewControllerPresenter(from: UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController())
|
|
714
|
+
) { intent, error in
|
|
715
|
+
if let error = error {
|
|
716
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError))
|
|
717
|
+
return
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
if let intent = intent {
|
|
721
|
+
if (intent.status == .requiresPaymentMethod) {
|
|
722
|
+
resolve(Errors.createError(ErrorType.Canceled, "Bank account collection was canceled."))
|
|
723
|
+
}
|
|
724
|
+
resolve(
|
|
725
|
+
Mappers.createResult("paymentIntent", Mappers.mapFromPaymentIntent(paymentIntent: intent))
|
|
726
|
+
)
|
|
727
|
+
} else {
|
|
728
|
+
resolve(Errors.createError(ErrorType.Unknown, "There was unexpected error while collecting bank account information."))
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
case "setup":
|
|
733
|
+
DispatchQueue.main.async {
|
|
734
|
+
STPBankAccountCollector().collectBankAccountForSetup(
|
|
735
|
+
clientSecret: clientSecret as String,
|
|
736
|
+
params: collectParams,
|
|
737
|
+
from: findViewControllerPresenter(from: UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController())
|
|
738
|
+
) { intent, error in
|
|
739
|
+
if let error = error {
|
|
740
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError))
|
|
741
|
+
return
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
if let intent = intent {
|
|
745
|
+
if (intent.status == .requiresPaymentMethod) {
|
|
746
|
+
resolve(Errors.createError(ErrorType.Canceled, "Bank account collection was canceled."))
|
|
747
|
+
}
|
|
748
|
+
resolve(
|
|
749
|
+
Mappers.createResult("setupIntent", Mappers.mapFromSetupIntent(setupIntent: intent))
|
|
750
|
+
)
|
|
751
|
+
} else {
|
|
752
|
+
resolve(Errors.createError(ErrorType.Unknown, "There was unexpected error while collecting bank account information."))
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
default:
|
|
757
|
+
resolve(Errors.createError(ErrorType.Failed, "Received unexpected intent type: " + intentType))
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
}
|
|
670
761
|
|
|
671
762
|
@objc(confirmPayment:data:options:resolver:rejecter:)
|
|
672
763
|
func confirmPayment(
|
|
@@ -678,55 +769,71 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
678
769
|
) -> Void {
|
|
679
770
|
self.confirmPaymentResolver = resolve
|
|
680
771
|
self.confirmPaymentClientSecret = paymentIntentClientSecret
|
|
681
|
-
|
|
682
|
-
let paymentMethodId = params["paymentMethodId"] as? String
|
|
683
|
-
let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret)
|
|
684
|
-
if let setupFutureUsage = params["setupFutureUsage"] as? String {
|
|
685
|
-
paymentIntentParams.setupFutureUsage = Mappers.mapToPaymentIntentFutureUsage(usage: setupFutureUsage)
|
|
686
|
-
}
|
|
687
|
-
|
|
772
|
+
|
|
688
773
|
let type = Mappers.mapToPaymentMethodType(type: params["type"] as? String)
|
|
689
774
|
guard let paymentMethodType = type else {
|
|
690
|
-
resolve(Errors.createError(
|
|
775
|
+
resolve(Errors.createError(ErrorType.Failed, "You must provide paymentMethodType"))
|
|
691
776
|
return
|
|
692
777
|
}
|
|
693
778
|
|
|
694
|
-
if (paymentMethodType ==
|
|
779
|
+
if (paymentMethodType == .FPX) {
|
|
695
780
|
let testOfflineBank = params["testOfflineBank"] as? Bool
|
|
696
781
|
if (testOfflineBank == false || testOfflineBank == nil) {
|
|
697
782
|
payWithFPX(paymentIntentClientSecret)
|
|
698
783
|
return
|
|
699
784
|
}
|
|
700
785
|
}
|
|
701
|
-
|
|
702
|
-
|
|
786
|
+
|
|
787
|
+
let (error, paymentIntentParams) = createPaymentIntentParams(paymentIntentClientSecret: paymentIntentClientSecret, paymentMethodType: paymentMethodType, params: params, options: options)
|
|
788
|
+
|
|
789
|
+
if (error != nil) {
|
|
790
|
+
resolve(error)
|
|
703
791
|
} else {
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
792
|
+
STPPaymentHandler.shared().confirmPayment(paymentIntentParams, with: self, completion: onCompleteConfirmPayment)
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
func createPaymentIntentParams(
|
|
797
|
+
paymentIntentClientSecret: String,
|
|
798
|
+
paymentMethodType: STPPaymentMethodType,
|
|
799
|
+
params: NSDictionary,
|
|
800
|
+
options: NSDictionary
|
|
801
|
+
) -> (NSDictionary?, STPPaymentIntentParams) {
|
|
802
|
+
let factory = PaymentMethodFactory.init(params: params, cardFieldView: cardFieldView, cardFormView: cardFormView)
|
|
803
|
+
var err: NSDictionary? = nil
|
|
804
|
+
|
|
805
|
+
let paymentIntentParams: STPPaymentIntentParams = {
|
|
806
|
+
if (paymentMethodType == .USBankAccount && params["accountNumber"] == nil) { // Payment method is assumed to be already attached
|
|
807
|
+
return STPPaymentIntentParams(clientSecret: paymentIntentClientSecret, paymentMethodType: .USBankAccount)
|
|
808
|
+
} else {
|
|
809
|
+
let paymentMethodId = params["paymentMethodId"] as? String
|
|
810
|
+
let parameters = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret)
|
|
811
|
+
|
|
812
|
+
if paymentMethodId != nil {
|
|
813
|
+
parameters.paymentMethodId = paymentMethodId
|
|
814
|
+
} else {
|
|
815
|
+
do {
|
|
816
|
+
let paymentMethodParams = try factory.createParams(paymentMethodType: paymentMethodType)
|
|
817
|
+
let paymentMethodOptions = try factory.createOptions(paymentMethodType: paymentMethodType)
|
|
818
|
+
parameters.paymentMethodParams = paymentMethodParams
|
|
819
|
+
parameters.paymentMethodOptions = paymentMethodOptions
|
|
820
|
+
} catch {
|
|
821
|
+
err = Errors.createError(ErrorType.Failed, error as NSError?)
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
return parameters
|
|
718
825
|
}
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
826
|
+
}()
|
|
827
|
+
|
|
828
|
+
if let setupFutureUsage = params["setupFutureUsage"] as? String {
|
|
829
|
+
paymentIntentParams.setupFutureUsage = Mappers.mapToPaymentIntentFutureUsage(usage: setupFutureUsage)
|
|
722
830
|
}
|
|
723
|
-
|
|
724
|
-
if let urlScheme = urlScheme {
|
|
831
|
+
if let urlScheme = urlScheme {
|
|
725
832
|
paymentIntentParams.returnURL = Mappers.mapToReturnURL(urlScheme: urlScheme)
|
|
726
833
|
}
|
|
834
|
+
paymentIntentParams.shipping = Mappers.mapToShippingDetails(shippingDetails: params["shippingDetails"] as? NSDictionary)
|
|
727
835
|
|
|
728
|
-
|
|
729
|
-
paymentHandler.confirmPayment(paymentIntentParams, with: self, completion: onCompleteConfirmPayment)
|
|
836
|
+
return (err, paymentIntentParams)
|
|
730
837
|
}
|
|
731
838
|
|
|
732
839
|
@objc(retrievePaymentIntent:resolver:rejecter:)
|
|
@@ -738,9 +845,9 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
738
845
|
STPAPIClient.shared.retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent, error) in
|
|
739
846
|
guard error == nil else {
|
|
740
847
|
if let lastPaymentError = paymentIntent?.lastPaymentError {
|
|
741
|
-
resolve(Errors.createError(
|
|
848
|
+
resolve(Errors.createError(ErrorType.Unknown, lastPaymentError))
|
|
742
849
|
} else {
|
|
743
|
-
resolve(Errors.createError(
|
|
850
|
+
resolve(Errors.createError(ErrorType.Unknown, error?.localizedDescription))
|
|
744
851
|
}
|
|
745
852
|
|
|
746
853
|
return
|
|
@@ -749,7 +856,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
749
856
|
if let paymentIntent = paymentIntent {
|
|
750
857
|
resolve(Mappers.createResult("paymentIntent", Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)))
|
|
751
858
|
} else {
|
|
752
|
-
resolve(Errors.createError(
|
|
859
|
+
resolve(Errors.createError(ErrorType.Unknown, "Failed to retrieve the PaymentIntent"))
|
|
753
860
|
}
|
|
754
861
|
}
|
|
755
862
|
}
|
|
@@ -763,9 +870,9 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
763
870
|
STPAPIClient.shared.retrieveSetupIntent(withClientSecret: clientSecret) { (setupIntent, error) in
|
|
764
871
|
guard error == nil else {
|
|
765
872
|
if let lastSetupError = setupIntent?.lastSetupError {
|
|
766
|
-
resolve(Errors.createError(
|
|
873
|
+
resolve(Errors.createError(ErrorType.Unknown, lastSetupError))
|
|
767
874
|
} else {
|
|
768
|
-
resolve(Errors.createError(
|
|
875
|
+
resolve(Errors.createError(ErrorType.Unknown, error?.localizedDescription))
|
|
769
876
|
}
|
|
770
877
|
|
|
771
878
|
return
|
|
@@ -774,13 +881,87 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
774
881
|
if let setupIntent = setupIntent {
|
|
775
882
|
resolve(Mappers.createResult("setupIntent", Mappers.mapFromSetupIntent(setupIntent: setupIntent)))
|
|
776
883
|
} else {
|
|
777
|
-
resolve(Errors.createError(
|
|
884
|
+
resolve(Errors.createError(ErrorType.Unknown, "Failed to retrieve the SetupIntent"))
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
@objc(verifyMicrodeposits:clientSecret:params:resolver:rejecter:)
|
|
890
|
+
func verifyMicrodeposits(
|
|
891
|
+
intentType: String,
|
|
892
|
+
clientSecret: String,
|
|
893
|
+
params: NSDictionary,
|
|
894
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
895
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
896
|
+
) -> Void {
|
|
897
|
+
let amounts = params["amounts"] as? NSArray
|
|
898
|
+
let descriptorCode = params["descriptorCode"] as? String
|
|
899
|
+
|
|
900
|
+
if (amounts != nil && descriptorCode != nil || amounts == nil && descriptorCode == nil) {
|
|
901
|
+
resolve(Errors.createError(ErrorType.Failed, "You must provide either amounts OR descriptorCode, not both."))
|
|
902
|
+
return
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
if let amounts = amounts {
|
|
906
|
+
if (amounts.count != 2) {
|
|
907
|
+
resolve(Errors.createError(ErrorType.Failed, "Expected 2 integers in the amounts array, but received " + String(amounts.count)))
|
|
908
|
+
return
|
|
909
|
+
}
|
|
910
|
+
switch intentType {
|
|
911
|
+
case "payment":
|
|
912
|
+
STPAPIClient.shared.verifyPaymentIntentWithMicrodeposits(
|
|
913
|
+
clientSecret: clientSecret,
|
|
914
|
+
firstAmount: amounts[0] as! Int,
|
|
915
|
+
secondAmount: amounts[1] as! Int,
|
|
916
|
+
completion: onCompletePaymentVerification
|
|
917
|
+
)
|
|
918
|
+
case "setup":
|
|
919
|
+
STPAPIClient.shared.verifySetupIntentWithMicrodeposits(
|
|
920
|
+
clientSecret: clientSecret,
|
|
921
|
+
firstAmount: amounts[0] as! Int,
|
|
922
|
+
secondAmount: amounts[1] as! Int,
|
|
923
|
+
completion: onCompleteSetupVerification
|
|
924
|
+
)
|
|
925
|
+
default:
|
|
926
|
+
resolve(Errors.createError(ErrorType.Failed, "Received unexpected intent type: " + intentType))
|
|
927
|
+
}
|
|
928
|
+
} else if let descriptorCode = descriptorCode {
|
|
929
|
+
switch intentType {
|
|
930
|
+
case "payment":
|
|
931
|
+
STPAPIClient.shared.verifyPaymentIntentWithMicrodeposits(
|
|
932
|
+
clientSecret: clientSecret,
|
|
933
|
+
descriptorCode: descriptorCode,
|
|
934
|
+
completion: onCompletePaymentVerification
|
|
935
|
+
)
|
|
936
|
+
case "setup":
|
|
937
|
+
STPAPIClient.shared.verifySetupIntentWithMicrodeposits(
|
|
938
|
+
clientSecret: clientSecret,
|
|
939
|
+
descriptorCode: descriptorCode,
|
|
940
|
+
completion: onCompleteSetupVerification
|
|
941
|
+
)
|
|
942
|
+
default:
|
|
943
|
+
resolve(Errors.createError(ErrorType.Failed, "Received unexpected intent type: " + intentType))
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
func onCompletePaymentVerification(intent: STPPaymentIntent?, error: Error?) {
|
|
948
|
+
if (error != nil) {
|
|
949
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError?))
|
|
950
|
+
} else {
|
|
951
|
+
resolve(Mappers.createResult("paymentIntent", Mappers.mapFromPaymentIntent(paymentIntent:intent!)))
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
func onCompleteSetupVerification(intent: STPSetupIntent?, error: Error?) {
|
|
955
|
+
if (error != nil) {
|
|
956
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError?))
|
|
957
|
+
} else {
|
|
958
|
+
resolve(Mappers.createResult("setupIntent", Mappers.mapFromSetupIntent(setupIntent:intent!)))
|
|
778
959
|
}
|
|
779
960
|
}
|
|
780
961
|
}
|
|
781
962
|
|
|
782
963
|
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
|
|
783
|
-
confirmPaymentResolver?(Errors.createError(
|
|
964
|
+
confirmPaymentResolver?(Errors.createError(ErrorType.Canceled, "FPX Payment has been canceled"))
|
|
784
965
|
}
|
|
785
966
|
|
|
786
967
|
func payWithFPX(_ paymentIntentClientSecret: String) {
|
|
@@ -798,7 +979,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
798
979
|
|
|
799
980
|
func bankSelectionViewController(_ bankViewController: STPBankSelectionViewController, didCreatePaymentMethodParams paymentMethodParams: STPPaymentMethodParams) {
|
|
800
981
|
guard let clientSecret = confirmPaymentClientSecret else {
|
|
801
|
-
confirmPaymentResolver?(Errors.createError(
|
|
982
|
+
confirmPaymentResolver?(Errors.createError(ErrorType.Failed, "Missing paymentIntentClientSecret"))
|
|
802
983
|
return
|
|
803
984
|
}
|
|
804
985
|
let paymentIntentParams = STPPaymentIntentParams(clientSecret: clientSecret)
|
|
@@ -816,14 +997,14 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
816
997
|
self.confirmPaymentClientSecret = nil
|
|
817
998
|
switch (status) {
|
|
818
999
|
case .failed:
|
|
819
|
-
confirmPaymentResolver?(Errors.createError(
|
|
1000
|
+
confirmPaymentResolver?(Errors.createError(ErrorType.Failed, error))
|
|
820
1001
|
break
|
|
821
1002
|
case .canceled:
|
|
822
1003
|
let statusCode: String
|
|
823
1004
|
if (paymentIntent?.status == STPPaymentIntentStatus.requiresPaymentMethod) {
|
|
824
|
-
statusCode =
|
|
1005
|
+
statusCode = ErrorType.Failed
|
|
825
1006
|
} else {
|
|
826
|
-
statusCode =
|
|
1007
|
+
statusCode = ErrorType.Canceled
|
|
827
1008
|
}
|
|
828
1009
|
if let lastPaymentError = paymentIntent?.lastPaymentError {
|
|
829
1010
|
confirmPaymentResolver?(Errors.createError(statusCode, lastPaymentError))
|
|
@@ -838,7 +1019,7 @@ class StripeSdk: RCTEventEmitter, STPApplePayContextDelegate, STPBankSelectionVi
|
|
|
838
1019
|
}
|
|
839
1020
|
break
|
|
840
1021
|
@unknown default:
|
|
841
|
-
confirmPaymentResolver?(Errors.createError(
|
|
1022
|
+
confirmPaymentResolver?(Errors.createError(ErrorType.Unknown, "Cannot complete the payment"))
|
|
842
1023
|
break
|
|
843
1024
|
}
|
|
844
1025
|
}
|