From 98449004eeb7f83834f5a0b3f9293473c1f74298 Mon Sep 17 00:00:00 2001 From: Yuki Tokuhiro Date: Fri, 1 Nov 2019 16:35:07 -0700 Subject: [PATCH 1/8] Buff up READMEs - Add gif to Basic Integration README - Delete duped examples --- Example/Basic Integration/README.md | 6 +- .../project.pbxproj | 28 +-- .../BrowseExamplesViewController.m | 66 ++----- .../CardAutomaticConfirmationViewController.h | 17 -- .../CardAutomaticConfirmationViewController.m | 167 ----------------- ...dManualConfirmationExampleViewController.h | 17 -- ...dManualConfirmationExampleViewController.m | 166 ----------------- ...dSetupIntentBackendExampleViewController.h | 21 --- ...dSetupIntentBackendExampleViewController.m | 175 ------------------ .../CardSetupIntentExampleViewController.h | 21 --- .../CardSetupIntentExampleViewController.m | 156 ---------------- Example/README.md | 31 +++- README.md | 49 +++-- ui-examples.png | Bin 0 -> 98911 bytes 14 files changed, 78 insertions(+), 842 deletions(-) delete mode 100644 Example/Custom Integration/CardAutomaticConfirmationViewController.h delete mode 100644 Example/Custom Integration/CardAutomaticConfirmationViewController.m delete mode 100644 Example/Custom Integration/CardManualConfirmationExampleViewController.h delete mode 100644 Example/Custom Integration/CardManualConfirmationExampleViewController.m delete mode 100644 Example/Custom Integration/CardSetupIntentBackendExampleViewController.h delete mode 100644 Example/Custom Integration/CardSetupIntentBackendExampleViewController.m delete mode 100644 Example/Custom Integration/CardSetupIntentExampleViewController.h delete mode 100644 Example/Custom Integration/CardSetupIntentExampleViewController.m create mode 100644 ui-examples.png diff --git a/Example/Basic Integration/README.md b/Example/Basic Integration/README.md index 7dac7182df8..31d3aa73c9c 100644 --- a/Example/Basic Integration/README.md +++ b/Example/Basic Integration/README.md @@ -1,8 +1,12 @@ # Basic Integration +

+Basic Integraion Example App +

+ This example app demonstrates how to build a payment flow using our pre-built UI component integration (`STPPaymentContext`). -For a detailed guide, see https://stripe.com/docs/mobile/ios/standard +For a detailed guide, see https://stripe.com/docs/mobile/ios/basic ## To run the example app: diff --git a/Example/Custom Integration.xcodeproj/project.pbxproj b/Example/Custom Integration.xcodeproj/project.pbxproj index 10c53298761..16f6904f30b 100644 --- a/Example/Custom Integration.xcodeproj/project.pbxproj +++ b/Example/Custom Integration.xcodeproj/project.pbxproj @@ -21,15 +21,11 @@ 36B6CB5A234BE3FA00331C38 /* PaymentExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B6CB59234BE3FA00331C38 /* PaymentExampleViewController.m */; }; 36B6CB5D234BEB8400331C38 /* SEPADebitExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B6CB5C234BEB8400331C38 /* SEPADebitExampleViewController.m */; }; 36B6CB64234FD9AA00331C38 /* iDEALExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B6CB63234FD9AA00331C38 /* iDEALExampleViewController.m */; }; - 36D4EA6422DFEF1300619BA8 /* CardSetupIntentBackendExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D4EA6322DFEF1300619BA8 /* CardSetupIntentBackendExampleViewController.m */; }; 8BBD79C6207FD2F900F85BED /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8BBD79C8207FD2F900F85BED /* Localizable.strings */; }; - B3BDCADD20EF03010034F7F5 /* CardAutomaticConfirmationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3BDCADB20EF03010034F7F5 /* CardAutomaticConfirmationViewController.m */; }; B607FFBD2321DA99004203E0 /* MyAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = B607FFBC2321DA99004203E0 /* MyAPIClient.m */; }; B65E8FCC22FA078A0057E64A /* WeChatPayExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B65E8FCB22FA078A0057E64A /* WeChatPayExampleViewController.m */; }; - B66AC61E22CAAB8F0064C551 /* CardSetupIntentExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B66AC61D22CAAB8F0064C551 /* CardSetupIntentExampleViewController.m */; }; B6C1FC832330432E0097FC4C /* AlipayExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C1FC822330432E0097FC4C /* AlipayExampleViewController.swift */; }; C12C50DD1E57B3C800EC6D58 /* BrowseExamplesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C12C50DC1E57B3C800EC6D58 /* BrowseExamplesViewController.m */; }; - C1CACE861E5DE6C3002D0821 /* CardManualConfirmationExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C1CACE851E5DE6C3002D0821 /* CardManualConfirmationExampleViewController.m */; }; C1CACE891E5DF7A9002D0821 /* ApplePayExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C1CACE881E5DF7A9002D0821 /* ApplePayExampleViewController.m */; }; C1CACE941E5E3DF6002D0821 /* SofortExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C1CACE931E5E3DF6002D0821 /* SofortExampleViewController.m */; }; /* End PBXBuildFile section */ @@ -71,8 +67,6 @@ 36B6CB5C234BEB8400331C38 /* SEPADebitExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SEPADebitExampleViewController.m; sourceTree = ""; }; 36B6CB62234FD9AA00331C38 /* iDEALExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iDEALExampleViewController.h; sourceTree = ""; }; 36B6CB63234FD9AA00331C38 /* iDEALExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iDEALExampleViewController.m; sourceTree = ""; }; - 36D4EA6222DFEF1300619BA8 /* CardSetupIntentBackendExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardSetupIntentBackendExampleViewController.h; sourceTree = ""; }; - 36D4EA6322DFEF1300619BA8 /* CardSetupIntentBackendExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardSetupIntentBackendExampleViewController.m; sourceTree = ""; }; 8BBD79C7207FD2F900F85BED /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 8BBD79C9207FD31A00F85BED /* zh-Hans */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 8BBD79CA207FD32100F85BED /* nl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; @@ -83,20 +77,14 @@ 8BBD79CF207FD34200F85BED /* ja */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; 8BBD79D0207FD34A00F85BED /* nb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; 8BBD79D1207FD35200F85BED /* es */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; - B3BDCADB20EF03010034F7F5 /* CardAutomaticConfirmationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CardAutomaticConfirmationViewController.m; sourceTree = ""; }; - B3BDCADC20EF03010034F7F5 /* CardAutomaticConfirmationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CardAutomaticConfirmationViewController.h; sourceTree = ""; }; B607FFBB2321DA99004203E0 /* MyAPIClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyAPIClient.h; sourceTree = ""; }; B607FFBC2321DA99004203E0 /* MyAPIClient.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyAPIClient.m; sourceTree = ""; }; B65E8FCA22FA078A0057E64A /* WeChatPayExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WeChatPayExampleViewController.h; sourceTree = ""; }; B65E8FCB22FA078A0057E64A /* WeChatPayExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WeChatPayExampleViewController.m; sourceTree = ""; }; - B66AC61C22CAAB8F0064C551 /* CardSetupIntentExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardSetupIntentExampleViewController.h; sourceTree = ""; }; - B66AC61D22CAAB8F0064C551 /* CardSetupIntentExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardSetupIntentExampleViewController.m; sourceTree = ""; }; B6C1FC812330432E0097FC4C /* Custom Integration-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Custom Integration-Bridging-Header.h"; sourceTree = ""; }; B6C1FC822330432E0097FC4C /* AlipayExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlipayExampleViewController.swift; sourceTree = ""; }; C12C50DB1E57B3C800EC6D58 /* BrowseExamplesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowseExamplesViewController.h; sourceTree = ""; }; C12C50DC1E57B3C800EC6D58 /* BrowseExamplesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowseExamplesViewController.m; sourceTree = ""; }; - C1CACE841E5DE6C3002D0821 /* CardManualConfirmationExampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CardManualConfirmationExampleViewController.h; sourceTree = ""; }; - C1CACE851E5DE6C3002D0821 /* CardManualConfirmationExampleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CardManualConfirmationExampleViewController.m; sourceTree = ""; }; C1CACE871E5DF7A9002D0821 /* ApplePayExampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplePayExampleViewController.h; sourceTree = ""; }; C1CACE881E5DF7A9002D0821 /* ApplePayExampleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ApplePayExampleViewController.m; sourceTree = ""; }; C1CACE921E5E3DF6002D0821 /* SofortExampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SofortExampleViewController.h; sourceTree = ""; }; @@ -146,18 +134,12 @@ C1CACE881E5DF7A9002D0821 /* ApplePayExampleViewController.m */, C12C50DB1E57B3C800EC6D58 /* BrowseExamplesViewController.h */, C12C50DC1E57B3C800EC6D58 /* BrowseExamplesViewController.m */, - B3BDCADC20EF03010034F7F5 /* CardAutomaticConfirmationViewController.h */, - B3BDCADB20EF03010034F7F5 /* CardAutomaticConfirmationViewController.m */, - C1CACE841E5DE6C3002D0821 /* CardManualConfirmationExampleViewController.h */, - C1CACE851E5DE6C3002D0821 /* CardManualConfirmationExampleViewController.m */, - 36D4EA6222DFEF1300619BA8 /* CardSetupIntentBackendExampleViewController.h */, - 36D4EA6322DFEF1300619BA8 /* CardSetupIntentBackendExampleViewController.m */, - B66AC61C22CAAB8F0064C551 /* CardSetupIntentExampleViewController.h */, - B66AC61D22CAAB8F0064C551 /* CardSetupIntentExampleViewController.m */, 04533F171A688A0A00C7E52E /* Constants.h */, 04533F181A688A0A00C7E52E /* Constants.m */, 31A8934B230F6ABD007ABE37 /* FPXExampleViewController.h */, 31A8934C230F6ABD007ABE37 /* FPXExampleViewController.m */, + 36B6CB62234FD9AA00331C38 /* iDEALExampleViewController.h */, + 36B6CB63234FD9AA00331C38 /* iDEALExampleViewController.m */, 04533E971A687F5D00C7E52E /* Images.xcassets */, 8BBD79C8207FD2F900F85BED /* Localizable.strings */, B607FFBB2321DA99004203E0 /* MyAPIClient.h */, @@ -173,8 +155,6 @@ 04533E8A1A687F5D00C7E52E /* Supporting Files */, B65E8FCA22FA078A0057E64A /* WeChatPayExampleViewController.h */, B65E8FCB22FA078A0057E64A /* WeChatPayExampleViewController.m */, - 36B6CB62234FD9AA00331C38 /* iDEALExampleViewController.h */, - 36B6CB63234FD9AA00331C38 /* iDEALExampleViewController.m */, ); path = "Custom Integration"; sourceTree = ""; @@ -305,11 +285,7 @@ 36B6CB64234FD9AA00331C38 /* iDEALExampleViewController.m in Sources */, 04533F191A688A0A00C7E52E /* Constants.m in Sources */, C1CACE941E5E3DF6002D0821 /* SofortExampleViewController.m in Sources */, - C1CACE861E5DE6C3002D0821 /* CardManualConfirmationExampleViewController.m in Sources */, 04533EB21A68802E00C7E52E /* ShippingManager.m in Sources */, - B3BDCADD20EF03010034F7F5 /* CardAutomaticConfirmationViewController.m in Sources */, - B66AC61E22CAAB8F0064C551 /* CardSetupIntentExampleViewController.m in Sources */, - 36D4EA6422DFEF1300619BA8 /* CardSetupIntentBackendExampleViewController.m in Sources */, 04533E901A687F5D00C7E52E /* AppDelegate.m in Sources */, B65E8FCC22FA078A0057E64A /* WeChatPayExampleViewController.m in Sources */, 36B6CB5A234BE3FA00331C38 /* PaymentExampleViewController.m in Sources */, diff --git a/Example/Custom Integration/BrowseExamplesViewController.m b/Example/Custom Integration/BrowseExamplesViewController.m index b58f825b1d4..e3b94cd2030 100644 --- a/Example/Custom Integration/BrowseExamplesViewController.m +++ b/Example/Custom Integration/BrowseExamplesViewController.m @@ -12,10 +12,6 @@ #import "BrowseExamplesViewController.h" #import "ApplePayExampleViewController.h" -#import "CardAutomaticConfirmationViewController.h" -#import "CardManualConfirmationExampleViewController.h" -#import "CardSetupIntentBackendExampleViewController.h" -#import "CardSetupIntentExampleViewController.h" #import "iDEALExampleViewController.h" #import "SofortExampleViewController.h" #import "FPXExampleViewController.h" @@ -42,43 +38,31 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return 11; + return 7; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [UITableViewCell new]; switch (indexPath.row) { case 0: - cell.textLabel.text = @"Card (Automatic Confirmation)"; - break; - case 1: - cell.textLabel.text = @"Card (Manual Confirmation)"; - break; - case 2: - cell.textLabel.text = @"Card (SetupIntent)"; - break; - case 3: - cell.textLabel.text = @"Card (SetupIntent Backend Confirm)"; - break; - case 4: cell.textLabel.text = @"Apple Pay"; break; - case 5: + case 1: cell.textLabel.text = @"Sofort (Sources)"; break; - case 6: + case 2: cell.textLabel.text = @"WeChat Pay (Sources)"; break; - case 7: + case 3: cell.textLabel.text = @"FPX"; break; - case 8: + case 4: cell.textLabel.text = @"SEPA Debit"; break; - case 9: + case 5: cell.textLabel.text = @"iDEAL"; break; - case 10: + case 6: cell.textLabel.text = @"Alipay"; break; } @@ -88,67 +72,43 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIViewController *viewController; switch (indexPath.row) { - case 0: { - CardAutomaticConfirmationViewController *exampleVC = [CardAutomaticConfirmationViewController new]; - exampleVC.delegate = self; - viewController = exampleVC; - break; - } case 1: { - CardManualConfirmationExampleViewController *exampleVC = [CardManualConfirmationExampleViewController new]; - exampleVC.delegate = self; - viewController = exampleVC; - break; - } - case 2: { - CardSetupIntentExampleViewController *exampleVC = [CardSetupIntentExampleViewController new]; - exampleVC.delegate = self; - viewController = exampleVC; - break; - } - case 3: { - CardSetupIntentBackendExampleViewController *exampleVC = [CardSetupIntentBackendExampleViewController new]; - exampleVC.delegate = self; - viewController = exampleVC; - break; - } - case 4: { ApplePayExampleViewController *exampleVC = [ApplePayExampleViewController new]; exampleVC.delegate = self; viewController = exampleVC; break; } - case 5: { + case 2: { SofortExampleViewController *exampleVC = [SofortExampleViewController new]; exampleVC.delegate = self; viewController = exampleVC; break; } - case 6: { + case 3: { WeChatPayExampleViewController *exampleVC = [WeChatPayExampleViewController new]; exampleVC.delegate = self; viewController = exampleVC; break; } - case 7: { + case 4: { FPXExampleViewController *exampleVC = [FPXExampleViewController new]; exampleVC.delegate = self; viewController = exampleVC; break; } - case 8: { + case 5: { SEPADebitExampleViewController *exampleVC = [SEPADebitExampleViewController new]; exampleVC.delegate = self; viewController = exampleVC; break; } - case 9: { + case 6: { iDEALExampleViewController *exampleVC = [iDEALExampleViewController new]; exampleVC.delegate = self; viewController = exampleVC; break; } - case 10: { + case 7: { AlipayExampleViewController *exampleVC = [AlipayExampleViewController new]; exampleVC.delegate = self; viewController = exampleVC; diff --git a/Example/Custom Integration/CardAutomaticConfirmationViewController.h b/Example/Custom Integration/CardAutomaticConfirmationViewController.h deleted file mode 100644 index 2662c9e632e..00000000000 --- a/Example/Custom Integration/CardAutomaticConfirmationViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// CardAutomaticConfirmationViewController.h -// Custom Integration -// -// Created by Daniel Jackson on 7/5/18. -// Copyright © 2018 Stripe. All rights reserved. -// - -#import - -@protocol ExampleViewControllerDelegate; - -@interface CardAutomaticConfirmationViewController : UIViewController - -@property (nonatomic, weak) id delegate; - -@end diff --git a/Example/Custom Integration/CardAutomaticConfirmationViewController.m b/Example/Custom Integration/CardAutomaticConfirmationViewController.m deleted file mode 100644 index 52fb16f1be0..00000000000 --- a/Example/Custom Integration/CardAutomaticConfirmationViewController.m +++ /dev/null @@ -1,167 +0,0 @@ -// -// CardAutomaticConfirmationViewController.m -// Custom Integration -// -// Created by Daniel Jackson on 7/5/18. -// Copyright © 2018 Stripe. All rights reserved. -// - -@import Stripe; - -#import "CardAutomaticConfirmationViewController.h" -#import "BrowseExamplesViewController.h" - -#import "MyAPIClient.h" - -/** - This example demonstrates using PaymentIntents to accept card payments verified using 3D Secure. - - 1. Collect user's card information via `STPPaymentCardTextField` - 2. Create a `PaymentIntent` on our backend (this can happen concurrently with #1) - 3. Confirm PaymentIntent using the `STPPaymentMethodParams` for the user's card information. - 4. If the user needs to go through the 3D Secure authentication flow, use `STPPaymentHandler` to do so. - 5. When user finishes native authentication, returns to the app, or finishes the SafariVC redirect flow, `STPPaymentHandler` notifies via callback - - See the documentation at https://stripe.com/docs/payments/payment-intents/ios for more information - on using PaymentIntents for dynamic authentication. - */ -@interface CardAutomaticConfirmationViewController () - -@property (weak, nonatomic) STPPaymentCardTextField *paymentTextField; -@property (weak, nonatomic) UILabel *waitingLabel; -@property (weak, nonatomic) UIActivityIndicatorView *activityIndicator; - -@end - -@implementation CardAutomaticConfirmationViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor whiteColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - self.view.backgroundColor = [UIColor systemBackgroundColor]; - } - #endif - self.title = @"Card"; - self.edgesForExtendedLayout = UIRectEdgeNone; - - STPPaymentCardTextField *paymentTextField = [[STPPaymentCardTextField alloc] init]; - STPPaymentMethodCardParams *cardParams = [STPPaymentMethodCardParams new]; - // Only successful 3D Secure transactions on this test card will succeed. - cardParams.number = @"4000000000003063"; - paymentTextField.cardParams = cardParams; - paymentTextField.delegate = self; - paymentTextField.cursorColor = [UIColor purpleColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - paymentTextField.cursorColor = [UIColor systemPurpleColor]; - } - #endif - self.paymentTextField = paymentTextField; - [self.view addSubview:paymentTextField]; - - UILabel *label = [UILabel new]; - label.text = @"Waiting for payment authorization"; - [label sizeToFit]; - label.textColor = [UIColor grayColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - label.textColor = [UIColor secondaryLabelColor]; - } - #endif - - label.alpha = 0; - [self.view addSubview:label]; - self.waitingLabel = label; - - NSString *title = @"Pay"; - UIBarButtonItem *payButton = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleDone target:self action:@selector(pay)]; - payButton.enabled = paymentTextField.isValid; - self.navigationItem.rightBarButtonItem = payButton; - - UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - activityIndicator.hidesWhenStopped = YES; - self.activityIndicator = activityIndicator; - [self.view addSubview:activityIndicator]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [self.paymentTextField becomeFirstResponder]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - CGFloat padding = 15; - CGFloat width = CGRectGetWidth(self.view.frame) - (padding*2); - CGRect bounds = self.view.bounds; - self.paymentTextField.frame = CGRectMake(padding, padding, width, 44); - self.activityIndicator.center = CGPointMake(CGRectGetMidX(bounds), - CGRectGetMaxY(self.paymentTextField.frame) + padding*2); - self.waitingLabel.center = CGPointMake(CGRectGetMidX(bounds), - CGRectGetMaxY(self.activityIndicator.frame) + padding*2); -} - -- (void)updateUIForPaymentInProgress:(BOOL)paymentInProgress { - self.navigationController.navigationBar.userInteractionEnabled = !paymentInProgress; - self.navigationItem.rightBarButtonItem.enabled = !paymentInProgress; - self.paymentTextField.userInteractionEnabled = !paymentInProgress; - [UIView animateWithDuration:0.2 animations:^{ - self.waitingLabel.alpha = paymentInProgress ? 1 : 0; - }]; - if (paymentInProgress) { - [self.activityIndicator startAnimating]; - } else { - [self.activityIndicator stopAnimating]; - } -} - -- (void)paymentCardTextFieldDidChange:(nonnull STPPaymentCardTextField *)textField { - self.navigationItem.rightBarButtonItem.enabled = textField.isValid; -} - -- (void)pay { - if (![self.paymentTextField isValid]) { - return; - } - if (![Stripe defaultPublishableKey]) { - [self.delegate exampleViewController:self didFinishWithMessage:@"Please set a Stripe Publishable Key in Constants.m"]; - return; - } - [self updateUIForPaymentInProgress:YES]; - - // In a more interesting app, you'll probably create your PaymentIntent as soon as you know the - // payment amount you wish to collect from your customer. For simplicity, this example does it once they've - // pushed the Pay button. - // https://stripe.com/docs/payments/dynamic-authentication#create-payment-intent - [[MyAPIClient sharedClient] createPaymentIntentWithCompletion:^(MyAPIClientResult status, NSString *clientSecret, NSError *error) { - if (status == MyAPIClientResultFailure || clientSecret == nil) { - [self.delegate exampleViewController:self didFinishWithError:error]; - return; - } - - STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:clientSecret]; - paymentIntentParams.paymentMethodParams = [STPPaymentMethodParams paramsWithCard:self.paymentTextField.cardParams - billingDetails:nil - metadata:nil]; - paymentIntentParams.returnURL = @"payments-example://stripe-redirect"; - [[STPPaymentHandler sharedHandler] confirmPayment:paymentIntentParams - withAuthenticationContext:self.delegate - completion:^(STPPaymentHandlerActionStatus handlerStatus, STPPaymentIntent * handledIntent, NSError * _Nullable handlerError) { - switch (handlerStatus) { - case STPPaymentHandlerActionStatusFailed: - [self.delegate exampleViewController:self didFinishWithError:handlerError]; - break; - case STPPaymentHandlerActionStatusCanceled: - [self.delegate exampleViewController:self didFinishWithMessage:@"Canceled"]; - break; - case STPPaymentHandlerActionStatusSucceeded: - [self.delegate exampleViewController:self didFinishWithMessage:@"Payment successfully created"]; - break; - } - }]; - } additionalParameters:nil]; -} - -@end diff --git a/Example/Custom Integration/CardManualConfirmationExampleViewController.h b/Example/Custom Integration/CardManualConfirmationExampleViewController.h deleted file mode 100644 index f07f423bdd1..00000000000 --- a/Example/Custom Integration/CardManualConfirmationExampleViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// CardManualConfirmationExampleViewController.h -// Custom Integration -// -// Created by Ben Guo on 2/22/17. -// Copyright © 2017 Stripe. All rights reserved. -// - -#import - -@protocol ExampleViewControllerDelegate; - -@interface CardManualConfirmationExampleViewController : UIViewController - -@property (nonatomic, weak) id delegate; - -@end diff --git a/Example/Custom Integration/CardManualConfirmationExampleViewController.m b/Example/Custom Integration/CardManualConfirmationExampleViewController.m deleted file mode 100644 index ea0260ffd79..00000000000 --- a/Example/Custom Integration/CardManualConfirmationExampleViewController.m +++ /dev/null @@ -1,166 +0,0 @@ -// -// CardManualConfirmationExampleViewController.m -// Custom Integration -// -// Created by Ben Guo on 2/22/17. -// Copyright © 2017 Stripe. All rights reserved. -// - -#import - -#import "CardManualConfirmationExampleViewController.h" - -#import "BrowseExamplesViewController.h" -#import "MyAPIClient.h" - -/** - This example demonstrates creating a payment with a credit/debit card using Manual Integration. - It creates a Payment Method using card information collected with STPPaymentCardTextField, and - then sends the Payment Method ID to our example backend to create and confirm the Payment Intent. - */ -@interface CardManualConfirmationExampleViewController () -@property (weak, nonatomic) STPPaymentCardTextField *paymentTextField; -@property (weak, nonatomic) UIActivityIndicatorView *activityIndicator; -@property (weak, nonatomic) UIScrollView *scrollView; -@end - -@implementation CardManualConfirmationExampleViewController - -- (void)loadView { - UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; - scrollView.delegate = self; - scrollView.alwaysBounceVertical = YES; - scrollView.backgroundColor = [UIColor whiteColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - scrollView.backgroundColor = [UIColor systemBackgroundColor]; - } - #endif - - self.view = scrollView; - self.scrollView = scrollView; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.title = @"Card - Manual Integration"; - self.edgesForExtendedLayout = UIRectEdgeNone; - - UIBarButtonItem *buyButton = [[UIBarButtonItem alloc] initWithTitle:@"Pay" style:UIBarButtonItemStyleDone target:self action:@selector(pay)]; - buyButton.enabled = NO; - self.navigationItem.rightBarButtonItem = buyButton; - - STPPaymentCardTextField *paymentTextField = [[STPPaymentCardTextField alloc] init]; - STPPaymentMethodCardParams *cardParams = [STPPaymentMethodCardParams new]; - // Only successful 3D Secure transactions on this test card will succeed. - cardParams.number = @"4000000000003063"; - paymentTextField.cardParams = cardParams; - paymentTextField.delegate = self; - paymentTextField.cursorColor = [UIColor purpleColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - paymentTextField.cursorColor = [UIColor systemPurpleColor]; - } - #endif - self.paymentTextField = paymentTextField; - [self.view addSubview:paymentTextField]; - - UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - activityIndicator.hidesWhenStopped = YES; - self.activityIndicator = activityIndicator; - [self.view addSubview:activityIndicator]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - CGFloat padding = 15; - CGFloat width = CGRectGetWidth(self.view.frame) - (padding*2); - CGRect bounds = self.view.bounds; - self.paymentTextField.frame = CGRectMake(padding, padding, width, 44); - self.activityIndicator.center = CGPointMake(CGRectGetMidX(bounds), - CGRectGetMaxY(self.paymentTextField.frame) + padding*2); -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [self.paymentTextField becomeFirstResponder]; -} - -- (void)paymentCardTextFieldDidChange:(nonnull STPPaymentCardTextField *)textField { - self.navigationItem.rightBarButtonItem.enabled = textField.isValid; -} - -- (void)pay { - if (![self.paymentTextField isValid]) { - return; - } - if (![Stripe defaultPublishableKey]) { - [self.delegate exampleViewController:self didFinishWithMessage:@"Please set a Stripe Publishable Key in Constants.m"]; - return; - } - [self.activityIndicator startAnimating]; - - STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:self.paymentTextField.cardParams - billingDetails:nil - metadata:nil]; - [[STPAPIClient sharedClient] createPaymentMethodWithParams:paymentMethodParams - completion:^(STPPaymentMethod * _Nullable paymentMethod, NSError * _Nullable error) { - if (error) { - [self.delegate exampleViewController:self didFinishWithError:error]; - } else { - [self _createAndConfirmPaymentIntentWithPaymentMethod:paymentMethod]; - } - }]; -} - - -- (void)_createAndConfirmPaymentIntentWithPaymentMethod:(STPPaymentMethod *)paymentMethod { - STPPaymentHandlerActionPaymentIntentCompletionBlock paymentHandlerCompletion = ^(STPPaymentHandlerActionStatus handlerStatus, STPPaymentIntent * _Nullable paymentIntent, NSError * _Nullable handlerError) { - switch (handlerStatus) { - case STPPaymentHandlerActionStatusFailed: - [self.delegate exampleViewController:self didFinishWithError:handlerError]; - break; - case STPPaymentHandlerActionStatusCanceled: - [self.delegate exampleViewController:self didFinishWithMessage:@"Canceled authentication"]; - break; - case STPPaymentHandlerActionStatusSucceeded: - if (paymentIntent.status == STPPaymentIntentStatusRequiresConfirmation) { - // Manually confirm the PaymentIntent on the backend again to complete the payment. - [[MyAPIClient sharedClient] confirmPaymentIntent:paymentIntent.stripeId completion:^(MyAPIClientResult status, NSError *error) { - if (status == MyAPIClientResultFailure || error) { - [self.delegate exampleViewController:self didFinishWithError:error]; - return; - } - [self.delegate exampleViewController:self didFinishWithMessage:@"Payment successfully created"]; - }]; - break; - } else { - [self.delegate exampleViewController:self didFinishWithMessage:@"Payment successfully created"]; - } - } - }; - STPPaymentIntentCreateAndConfirmHandler createAndConfirmCompletion = ^(MyAPIClientResult status, BOOL requiresAction, NSString *clientSecret, NSError *error) { - if (status == MyAPIClientResultFailure || error) { - [self.delegate exampleViewController:self didFinishWithError:error]; - return; - } - if (requiresAction) { - [[STPPaymentHandler sharedHandler] handleNextActionForPayment:clientSecret - withAuthenticationContext:self.delegate - returnURL:@"payments-example://stripe-redirect" - completion:paymentHandlerCompletion]; - } else { - [self.delegate exampleViewController:self didFinishWithMessage:@"Payment successfully created"]; - } - }; - [[MyAPIClient sharedClient] createAndConfirmPaymentIntentWithPaymentMethod:paymentMethod.stripeId - returnURL:@"payments-example://stripe-redirect" - completion:createAndConfirmCompletion]; -} - -- (void)scrollViewDidScroll:(UIScrollView *)scrollView { - [self.view endEditing:NO]; -} - -@end diff --git a/Example/Custom Integration/CardSetupIntentBackendExampleViewController.h b/Example/Custom Integration/CardSetupIntentBackendExampleViewController.h deleted file mode 100644 index ecabd61e49a..00000000000 --- a/Example/Custom Integration/CardSetupIntentBackendExampleViewController.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// CardSetupIntentBackendExampleViewController.h -// Custom Integration -// -// Created by Cameron Sabol on 7/17/19. -// Copyright © 2019 Stripe. All rights reserved. -// - -#import - -@protocol ExampleViewControllerDelegate; - -NS_ASSUME_NONNULL_BEGIN - -@interface CardSetupIntentBackendExampleViewController : UIViewController - -@property (nonatomic, weak) id delegate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Example/Custom Integration/CardSetupIntentBackendExampleViewController.m b/Example/Custom Integration/CardSetupIntentBackendExampleViewController.m deleted file mode 100644 index 89dd0b0c401..00000000000 --- a/Example/Custom Integration/CardSetupIntentBackendExampleViewController.m +++ /dev/null @@ -1,175 +0,0 @@ -// -// CardSetupIntentBackendExampleViewController.m -// Custom Integration -// -// Created by Cameron Sabol on 7/17/19. -// Copyright © 2019 Stripe. All rights reserved. -// - -#import "CardSetupIntentBackendExampleViewController.h" -#import "BrowseExamplesViewController.h" - -#import "MyAPIClient.h" - -/** - This example demonstrates using SetupIntents to accept card payments verified using 3D Secure confirming with your backend. - - 1. Collect user's card information via `STPPaymentCardTextField` - 2. Create a PaymentMethod with the collected card information - 3. Create a `SetupIntent` on our backend and set confirm=true - 4. Handle any required `nextAction` using `STPPaymentHandler` - */ -@interface CardSetupIntentBackendExampleViewController () - -@property (weak, nonatomic) STPPaymentCardTextField *paymentTextField; -@property (weak, nonatomic) UILabel *waitingLabel; -@property (weak, nonatomic) UIActivityIndicatorView *activityIndicator; - -@end - -@implementation CardSetupIntentBackendExampleViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor whiteColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - self.view.backgroundColor = [UIColor systemBackgroundColor]; - } - #endif - - self.title = @"Card SetupIntent (Backend)"; - self.edgesForExtendedLayout = UIRectEdgeNone; - - STPPaymentCardTextField *paymentTextField = [[STPPaymentCardTextField alloc] init]; - STPPaymentMethodCardParams *cardParams = [STPPaymentMethodCardParams new]; - // Only successful 3D Secure transactions on this test card will succeed. - cardParams.number = @"4000002500003155"; - paymentTextField.cardParams = cardParams; - paymentTextField.delegate = self; - paymentTextField.cursorColor = [UIColor purpleColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - paymentTextField.cursorColor = [UIColor systemPurpleColor]; - } - #endif - self.paymentTextField = paymentTextField; - [self.view addSubview:paymentTextField]; - - UILabel *label = [UILabel new]; - label.text = @"Waiting for payment authorization"; - [label sizeToFit]; - label.textColor = [UIColor grayColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - label.textColor = [UIColor secondaryLabelColor]; - } - #endif - label.alpha = 0; - [self.view addSubview:label]; - self.waitingLabel = label; - - NSString *title = @"Pay"; - UIBarButtonItem *payButton = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleDone target:self action:@selector(pay)]; - payButton.enabled = paymentTextField.isValid; - self.navigationItem.rightBarButtonItem = payButton; - - UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - activityIndicator.hidesWhenStopped = YES; - self.activityIndicator = activityIndicator; - [self.view addSubview:activityIndicator]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [self.paymentTextField becomeFirstResponder]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - CGFloat padding = 15; - CGFloat width = CGRectGetWidth(self.view.frame) - (padding*2); - CGRect bounds = self.view.bounds; - self.paymentTextField.frame = CGRectMake(padding, padding, width, 44); - self.activityIndicator.center = CGPointMake(CGRectGetMidX(bounds), - CGRectGetMaxY(self.paymentTextField.frame) + padding*2); - self.waitingLabel.center = CGPointMake(CGRectGetMidX(bounds), - CGRectGetMaxY(self.activityIndicator.frame) + padding*2); -} - -- (void)updateUIForPaymentInProgress:(BOOL)paymentInProgress { - self.navigationController.navigationBar.userInteractionEnabled = !paymentInProgress; - self.navigationItem.rightBarButtonItem.enabled = !paymentInProgress; - self.paymentTextField.userInteractionEnabled = !paymentInProgress; - [UIView animateWithDuration:0.2 animations:^{ - self.waitingLabel.alpha = paymentInProgress ? 1 : 0; - }]; - if (paymentInProgress) { - [self.activityIndicator startAnimating]; - } else { - [self.activityIndicator stopAnimating]; - } -} - -- (void)paymentCardTextFieldDidChange:(nonnull STPPaymentCardTextField *)textField { - self.navigationItem.rightBarButtonItem.enabled = textField.isValid; -} - -- (void)pay { - - if (![self.paymentTextField isValid]) { - return; - } - if (![Stripe defaultPublishableKey]) { - [self.delegate exampleViewController:self didFinishWithMessage:@"Please set a Stripe Publishable Key in Constants.m"]; - return; - } - [self updateUIForPaymentInProgress:YES]; - - STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:self.paymentTextField.cardParams - billingDetails:nil - metadata:nil]; - [[STPAPIClient sharedClient] createPaymentMethodWithParams:paymentMethodParams - completion:^(STPPaymentMethod * _Nullable paymentMethod, NSError * _Nullable error) { - if (error) { - [self.delegate exampleViewController:self didFinishWithError:error]; - } else { - [self _createAndConfirmSetupIntentWithPaymentMethod:paymentMethod]; - } - }]; - -} - -- (void)_createAndConfirmSetupIntentWithPaymentMethod:(STPPaymentMethod *)paymentMethod { - STPPaymentHandlerActionSetupIntentCompletionBlock paymentHandlerCompletion = ^(STPPaymentHandlerActionStatus handlerStatus, STPSetupIntent * _Nullable setupIntent, NSError * _Nullable handlerError) { - switch (handlerStatus) { - case STPPaymentHandlerActionStatusFailed: - [self.delegate exampleViewController:self didFinishWithError:handlerError]; - break; - case STPPaymentHandlerActionStatusCanceled: - [self.delegate exampleViewController:self didFinishWithMessage:@"Canceled authentication"]; - break; - case STPPaymentHandlerActionStatusSucceeded: - [self.delegate exampleViewController:self didFinishWithMessage:@"SetupIntent successfully created"]; - break; - } - }; - - STPCreateSetupIntentCompletionHandler createCompletion = ^(MyAPIClientResult status, NSString *clientSecret, NSError *error) { - if (status == MyAPIClientResultFailure || error) { - [self.delegate exampleViewController:self didFinishWithError:error]; - return; - } - [[STPPaymentHandler sharedHandler] handleNextActionForSetupIntent:clientSecret - withAuthenticationContext:self.delegate - returnURL:@"payments-example://stripe-redirect" - completion:paymentHandlerCompletion]; - }; - - [[MyAPIClient sharedClient] createAndConfirmSetupIntentWithPaymentMethod:paymentMethod.stripeId - returnURL:@"payments-example://stripe-redirect" - completion:createCompletion]; -} - - -@end diff --git a/Example/Custom Integration/CardSetupIntentExampleViewController.h b/Example/Custom Integration/CardSetupIntentExampleViewController.h deleted file mode 100644 index 1e9eaf44e05..00000000000 --- a/Example/Custom Integration/CardSetupIntentExampleViewController.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// CardSetupIntentExampleViewController.h -// Custom Integration -// -// Created by Yuki Tokuhiro on 7/1/19. -// Copyright © 2019 Stripe. All rights reserved. -// - -#import - -@protocol ExampleViewControllerDelegate; - -NS_ASSUME_NONNULL_BEGIN - -@interface CardSetupIntentExampleViewController : UIViewController - -@property (nonatomic, weak) id delegate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Example/Custom Integration/CardSetupIntentExampleViewController.m b/Example/Custom Integration/CardSetupIntentExampleViewController.m deleted file mode 100644 index 6ddd96394c7..00000000000 --- a/Example/Custom Integration/CardSetupIntentExampleViewController.m +++ /dev/null @@ -1,156 +0,0 @@ -// -// CardSetupIntentExampleViewController.m -// Custom Integration -// -// Created by Yuki Tokuhiro on 7/1/19. -// Copyright © 2019 Stripe. All rights reserved. -// - -@import Stripe; - -#import "CardSetupIntentExampleViewController.h" - -#import "BrowseExamplesViewController.h" -#import "MyAPIClient.h" - -/** - This example demonstrates using SetupIntents to accept card payments verified using 3D Secure. - - 1. Collect user's card information via `STPPaymentCardTextField` - 2. Create a `SetupIntent` on our backend (this can happen concurrently with #1) - 3. Confirm SetupIntent with `STPPaymentHandler`, using the `STPPaymentMethodParams` for the user's card information. - */ -@interface CardSetupIntentExampleViewController () - -@property (weak, nonatomic) STPPaymentCardTextField *paymentTextField; -@property (weak, nonatomic) UILabel *waitingLabel; -@property (weak, nonatomic) UIActivityIndicatorView *activityIndicator; - -@end - -@implementation CardSetupIntentExampleViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor whiteColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - self.view.backgroundColor = [UIColor systemBackgroundColor]; - } - #endif - self.title = @"Card"; - self.edgesForExtendedLayout = UIRectEdgeNone; - - STPPaymentCardTextField *paymentTextField = [[STPPaymentCardTextField alloc] init]; - STPPaymentMethodCardParams *cardParams = [STPPaymentMethodCardParams new]; - // Only successful 3D Secure transactions on this test card will succeed. - cardParams.number = @"4000002500003155"; - paymentTextField.cardParams = cardParams; - paymentTextField.delegate = self; - paymentTextField.cursorColor = [UIColor purpleColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - paymentTextField.cursorColor = [UIColor systemPurpleColor]; - } - #endif - self.paymentTextField = paymentTextField; - [self.view addSubview:paymentTextField]; - - UILabel *label = [UILabel new]; - label.text = @"Waiting for payment authorization"; - [label sizeToFit]; - label.textColor = [UIColor grayColor]; - #ifdef __IPHONE_13_0 - if (@available(iOS 13.0, *)) { - label.textColor = [UIColor secondaryLabelColor]; - } - #endif - label.alpha = 0; - [self.view addSubview:label]; - self.waitingLabel = label; - - NSString *title = @"Pay"; - UIBarButtonItem *payButton = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleDone target:self action:@selector(pay)]; - payButton.enabled = paymentTextField.isValid; - self.navigationItem.rightBarButtonItem = payButton; - - UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; - activityIndicator.hidesWhenStopped = YES; - self.activityIndicator = activityIndicator; - [self.view addSubview:activityIndicator]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [self.paymentTextField becomeFirstResponder]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - CGFloat padding = 15; - CGFloat width = CGRectGetWidth(self.view.frame) - (padding*2); - CGRect bounds = self.view.bounds; - self.paymentTextField.frame = CGRectMake(padding, padding, width, 44); - self.activityIndicator.center = CGPointMake(CGRectGetMidX(bounds), - CGRectGetMaxY(self.paymentTextField.frame) + padding*2); - self.waitingLabel.center = CGPointMake(CGRectGetMidX(bounds), - CGRectGetMaxY(self.activityIndicator.frame) + padding*2); -} - -- (void)updateUIForPaymentInProgress:(BOOL)paymentInProgress { - self.navigationController.navigationBar.userInteractionEnabled = !paymentInProgress; - self.navigationItem.rightBarButtonItem.enabled = !paymentInProgress; - self.paymentTextField.userInteractionEnabled = !paymentInProgress; - [UIView animateWithDuration:0.2 animations:^{ - self.waitingLabel.alpha = paymentInProgress ? 1 : 0; - }]; - if (paymentInProgress) { - [self.activityIndicator startAnimating]; - } else { - [self.activityIndicator stopAnimating]; - } -} - -- (void)paymentCardTextFieldDidChange:(nonnull STPPaymentCardTextField *)textField { - self.navigationItem.rightBarButtonItem.enabled = textField.isValid; -} - -- (void)pay { - if (![self.paymentTextField isValid]) { - return; - } - if (![Stripe defaultPublishableKey]) { - [self.delegate exampleViewController:self didFinishWithMessage:@"Please set a Stripe Publishable Key in Constants.m"]; - return; - } - [self updateUIForPaymentInProgress:YES]; - [[MyAPIClient sharedClient] createSetupIntentWithCompletion:^(MyAPIClientResult status, NSString *clientSecret, NSError *error) { - if (status == MyAPIClientResultFailure || clientSecret == nil) { - [self.delegate exampleViewController:self didFinishWithError:error]; - return; - } - STPSetupIntentConfirmParams *setupIntentConfirmParams = [[STPSetupIntentConfirmParams alloc] initWithClientSecret:clientSecret]; - setupIntentConfirmParams.paymentMethodParams = [STPPaymentMethodParams paramsWithCard:self.paymentTextField.cardParams - billingDetails:nil - metadata:nil]; - setupIntentConfirmParams.returnURL = @"payments-example://stripe-redirect"; - [[STPPaymentHandler sharedHandler] confirmSetupIntent:setupIntentConfirmParams - withAuthenticationContext:self.delegate - completion:^(STPPaymentHandlerActionStatus handlerStatus, STPSetupIntent * _Nullable handledIntent, NSError * _Nullable handlerError) { - switch (handlerStatus) { - case STPPaymentHandlerActionStatusSucceeded: - [self.delegate exampleViewController:self didFinishWithMessage:@"SetupIntent successfully created"]; - break; - case STPPaymentHandlerActionStatusCanceled: - [self.delegate exampleViewController:self didFinishWithMessage:@"Cancelled"]; - break; - case STPPaymentHandlerActionStatusFailed: - [self.delegate exampleViewController:self didFinishWithError:handlerError]; - break; - } - }]; - - }]; -} - -@end diff --git a/Example/README.md b/Example/README.md index cd6c0398fc6..c87ea8efee0 100644 --- a/Example/README.md +++ b/Example/README.md @@ -1,7 +1,32 @@ # Example +Check out [stripe-samples](https://github.com/stripe-samples) for examples to: + +- [Accept a card payment](https://github.com/stripe-samples/accept-a-card-payment) (PaymentIntents API) +- [Accept a card payment](https://github.com/stripe-samples/card-payment-charges-api) (Charges API) +- [Save a card without payment](https://github.com/stripe-samples/mobile-saving-card-without-payment) (SetupIntents API) + There are 3 example apps included in the repository: -- [**UI Examples** Example/UI Examples/README.md ](/Example/UI%20Examples/README.md) -- [**Basic Integration** Example/Basic Integration/README.md](/Example/Basic%20Integration/README.md) -- [**Custom Integration** Example/Custom Integration/README.md](/Example/Custom%20Integration/README.md) +## [**Basic Integration**](/Example/Basic%20Integration/README.md) +

+STPPaymentCardTextField +

+ +This example app demonstrates how to build a payment flow using our prebuilt UI component integration. + + +## [**Custom Integration** Example/Custom Integration/README.md](/Example/Custom%20Integration/README.md) +This example app demonstrates how to accept various payment methods: + +- Alipay +- Apple Pay +- FPX +- iDEAL +- SEPADebit +- Sofort +- WeChat Pay + + +## [**UI Examples** Example/UI Examples/README.md ](/Example/UI%20Examples/README.md) +This example app lets you quickly try out the SDK's prebuilt UI components. diff --git a/README.md b/README.md index f0951de8fca..3ebe69e6a67 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,9 @@ [![CocoaPods](https://img.shields.io/cocoapods/l/Stripe.svg?style=flat)](https://github.com/stripe/stripe-ios/blob/master/LICENSE) [![CocoaPods](https://img.shields.io/cocoapods/p/Stripe.svg?style=flat)](https://github.com/stripe/stripe-ios#) -The Stripe iOS SDK makes it quick and easy to build an excellent payment experience in your iOS app. We provide powerful and customizable UI screens and elements that can be used out-of-the-box to collect your users' payment details. +The Stripe iOS SDK makes it quick and easy to build an excellent payment experience in your iOS app. We provide powerful and customizable UI screens and elements that can be used out-of-the-box to collect your users' payment details. We also expose the low-level APIs that power those UIs so that you can build fully custom experiences. -

-STPPaymentCardTextField -

- -We also expose the low-level APIs that power those UIs so that you can build fully custom experiences. See our [iOS Integration Guide](https://stripe.com/docs/mobile/ios/setup) to get started! +See our [📚 integration guides](https://stripe.com/docs/payments/new-overview#start-with-a-guide) to get started, or [📘 browse the SDK reference](https://stripe.dev/stripe-ios/docs/index.html). > Updating to a newer version of the SDK? See our [migration guide](https://github.com/stripe/stripe-ios/blob/master/MIGRATING.md) and [changelog](https://github.com/stripe/stripe-ios/blob/master/CHANGELOG.md). @@ -35,21 +31,29 @@ Table of contents **Simplified Security**: We make it simple for you to collect sensitive data such as credit card numbers and remain [PCI compliant](https://stripe.com/docs/security#pci-dss-guidelines). This means the sensitive data is sent directly to Stripe instead of passing through your server. For more information, see our [Integration Security Guide](https://stripe.com/docs/security). -**Apple Pay**: We provide a seamless integration with [Apple Pay](https://stripe.com/apple-pay). After [installing the SDK](https://stripe.com/docs/mobile/ios/setup), see our full guide to [accept Apple Pay in your iOS app](https://stripe.com/docs/apple-pay#native). +**Apple Pay**: We provide a [seamless integration with Apple Pay](https://stripe.com/docs/apple-pay). -**Native UI**: We provide out-of-the-box native screens and elements so that you can get started quickly without having to think about designing the right interfaces. For example, [STPPaymentCardTextField](https://stripe.com/docs/mobile/ios/custom#stppaymentcardtextfield) is a UIView that collects and validates card details. [STPAddCardViewController](https://stripe.com/docs/mobile/ios/custom#stpaddcardviewcontroller) is a UIViewController that also creates the Stripe API payment object for you. See our [Custom Integration Guide](https://stripe.com/docs/mobile/ios/custom). +**Stripe API**: We provide [low-level APIs](https://stripe.dev/stripe-ios/docs/Classes/STPAPIClient.html) that correspond to objects and methods in the Stripe API. You can build your own entirely custom UI on top of this layer, while still taking advantage of utilities like [STPCardValidator](https://stripe.dev/stripe-ios/docs/Classes/STPCardValidator.html) to validate your user’s input. + +**Native UI**: We provide native screens and elements to collect payment and shipping details. For example, [STPPaymentCardTextField](https://stripe.dev/stripe-ios/docs/Classes/STPPaymentCardTextField.html) is a UIView that collects and validates card details: + +

+STPPaymentCardTextField +

+ +You can use these individually, or take all of the prebuilt UI in one flow by following the [Basic Integration guide](https://stripe.com/docs/mobile/ios/basic) to learn more.

STPAddCardViewControllerSTPPaymentOptionsViewControllerSTPShippingAddressViewController

-We also offer all of our UI components bundled into an all-in-one class designed to handle collecting, saving, and reusing your user’s payment details, as well as collecting shipping info. Take our entire checkout flow at once by following the [STPPaymentContext guide](https://stripe.com/docs/mobile/ios/standard). +From left to right: [STPAddCardViewController](https://stripe.dev/stripe-ios/docs/Classes/STPAddCardViewController.html), [STPPaymentOptionsViewController](https://stripe.dev/stripe-ios/docs/Classes/STPPaymentOptionsViewController.html), [STPShippingAddressViewController](https://stripe.dev/stripe-ios/docs/Classes/STPShippingAddressViewController.html) **Card Scanning**: We support card scanning capabilities using card.io. See our [Card IO](#card-io) section. ## Releases -We recommend that you install the Stripe iOS SDK using a package manager such as [Cocoapods or Carthage](https://stripe.com/docs/mobile/ios#getting-started). If you prefer to link the library manually, please use a version from our [releases](https://github.com/stripe/stripe-ios/releases) page because we consider the master branch to be unstable. +We recommend installing the Stripe iOS SDK using a package manager such as Cocoapods or Carthage. If you link the library manually, use a version from our [releases](https://github.com/stripe/stripe-ios/releases) page. If you're reading this on GitHub.com, please make sure you are looking at the [tagged version](https://github.com/stripe/stripe-ios/tags) that corresponds to the release you have installed. Otherwise, the instructions and example code may be mismatched with your copy. You can read the latest tagged version of this README and browse the associated code on GitHub using [this link](https://github.com/stripe/stripe-ios/tree/v18.2.0). @@ -62,24 +66,31 @@ The Stripe iOS SDK requires Xcode 10.1 or later and is compatible with apps targ ### Integration -Please see our [iOS Integration Guide](https://stripe.com/docs/mobile/ios/setup) which explains SDK installation, collecting payment information, Apple Pay integration, and more. For more fine-grained documentation for all of the classes and methods, please see our full [Stripe iOS SDK Reference](http://stripe.github.io/stripe-ios/docs/index.html). +See our [📚 integration guides](https://stripe.com/docs/payments/new-overview#start-with-a-guide) to get started, or [browse the 📘 SDK reference](https://stripe.dev/stripe-ios/docs/index.html) for fine-grained documentation of all the classes and methods in the SDK. ### Examples There are 3 example apps included in the repository: -- [**UI Examples** Example/UI Examples/README.md ](/Example/UI%20Examples/README.md). - - This example lets you try out the pre-built UI components we provide. -- [**Custom Integration** Example/Custom Integration/README.md](/Example/Custom%20Integration/README.md) - - This example demonstrates how to uset push `STPAPIClient` to accept various payment methods. -- [**Basic Integration** Example/Basic Integration/README.md](/Example/Basic%20Integration/README.md) - - This example demonstrates how to build a payment flow using our pre-built UI component integration (`STPPaymentContext`). +- [UI Examples](/Example/UI%20Examples). + - This example lets you quickly try out the SDK's prebuilt UI components using a mock backend—just build and run! +- [Custom Integration](/Example/Custom%20Integration) + - This example demonstrates how to use `STPAPIClient` to accept various payment methods. +- [Basic Integration](/Example/Basic%20Integration) + - This example demonstrates how to build a payment flow using our prebuilt UI component integration (`STPPaymentContext`). + +Check out [stripe-samples](https://github.com/stripe-samples/) for more, including: + +- [Accepting a card payment](https://github.com/stripe-samples/accept-a-card-payment) (PaymentIntents API) +- [Saving a card without payment](https://github.com/stripe-samples/mobile-saving-card-without-payment) (SetupIntents API) +- [Accepting a card payment](https://github.com/stripe-samples/card-payment-charges-api) (Charges API) + ## Card IO -To add card scanning capabilities to our prebuilt UI components, you can simply [install card.io](https://github.com/card-io/card.io-iOS-SDK#setup) alongside our SDK. You'll also need to set `NSCameraUsageDescription` in your application's plist, and provide a reason for accessing the camera (e.g. "To scan cards"). +To add card scanning capabilities to our prebuilt UI components, [install card.io](https://github.com/card-io/card.io-iOS-SDK#setup) alongside our SDK. You'll also need to set `NSCameraUsageDescription` in your application's plist, and provide a reason for accessing the camera (e.g. "To scan cards"). -To try this out, you can run `./install_cardio.rb`, which will download and install card.io in the Basic Integration project. Now, when you run the example app on a device, you'll see a "Scan Card" button when adding a new card. +Demo this in our [Basic Integration example app](/Example/Basic&20Integration) by running `./install_cardio.rb`, which will download and install card.io in the project. Now, when you run the example app on a device, you'll see a "Scan Card" button when adding a new card. ## Contributing diff --git a/ui-examples.png b/ui-examples.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad38a5bee42b401fc238cf9968d3f89c7862469 GIT binary patch literal 98911 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 z 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 literal 0 HcmV?d00001 From 11251de5502bfd68a0dd132861e8c3cb043cc4d8 Mon Sep 17 00:00:00 2001 From: Yuki Tokuhiro Date: Tue, 5 Nov 2019 12:15:04 -0800 Subject: [PATCH 2/8] Whoops. STPRedirectContext always returns the clientSecret. You need to check the error to determine if it errored --- Example/Custom Integration/AlipayExampleViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/Custom Integration/AlipayExampleViewController.swift b/Example/Custom Integration/AlipayExampleViewController.swift index 0cd8c2a8d34..f62f38a8ce3 100644 --- a/Example/Custom Integration/AlipayExampleViewController.swift +++ b/Example/Custom Integration/AlipayExampleViewController.swift @@ -76,7 +76,7 @@ extension AlipayExampleViewController { // If the customer has the Alipay app installed, we open it. // Otherwise, we open alipay.com. self.redirectContext = STPRedirectContext(source: source) { sourceID, clientSecret, error in - guard let clientSecret = clientSecret else { + guard error == nil else { self.delegate?.exampleViewController(self, didFinishWithError: error) return } From 20cb69b3cfd8459285c2723731820f402141fb5b Mon Sep 17 00:00:00 2001 From: Yuki Tokuhiro Date: Tue, 5 Nov 2019 14:18:15 -0800 Subject: [PATCH 3/8] Rename Custom Integration to Non-Card Payment Examples --- .../project.pbxproj | 44 ++++++++++--------- .../contents.xcworkspacedata | 0 .../xcschemes/Custom Integration.xcscheme | 40 ++++++++--------- .../AlipayExampleViewController.swift | 2 +- .../AppDelegate.h | 2 +- .../AppDelegate.m | 0 .../ApplePayExampleViewController.h | 2 +- .../ApplePayExampleViewController.m | 2 +- .../BrowseExamplesViewController.h | 2 +- .../BrowseExamplesViewController.m | 4 +- .../Constants.h | 0 .../Constants.m | 0 .../FPXExampleViewController.h | 2 +- .../FPXExampleViewController.m | 2 +- .../AppIcon.appiconset/Contents.json | 0 .../Images.xcassets/Contents.json | 0 .../LaunchImage.launchimage/Contents.json | 0 .../Info.plist | 0 .../MyAPIClient.h | 2 +- .../MyAPIClient.m | 2 +- ...n-Card Payment Examples-Bridging-Header.h} | 0 .../PaymentExampleViewController.h | 2 +- .../PaymentExampleViewController.m | 2 +- .../README.md | 8 ++-- .../SEPADebitExampleViewController.h | 2 +- .../SEPADebitExampleViewController.m | 2 +- .../ShippingManager.h | 0 .../ShippingManager.m | 0 .../SofortExampleViewController.h | 2 +- .../SofortExampleViewController.m | 2 +- .../WeChatPayExampleViewController.h | 2 +- .../WeChatPayExampleViewController.m | 2 +- .../de.lproj/Localizable.strings | 0 .../en.lproj/Localizable.strings | 0 .../es.lproj/Localizable.strings | 0 .../fi.lproj/Localizable.strings | 0 .../fr.lproj/Localizable.strings | 0 .../iDEALExampleViewController.h | 2 +- .../iDEALExampleViewController.m | 2 +- .../it.lproj/Localizable.strings | 0 .../ja.lproj/Localizable.strings | 0 .../main.m | 2 +- .../nb.lproj/Localizable.strings | 0 .../nl.lproj/Localizable.strings | 0 .../zh-Hans.lproj/Localizable.strings | 0 Example/README.md | 9 ++-- Example/UI Examples/README.md | 2 +- README.md | 4 +- Stripe.xcworkspace/contents.xcworkspacedata | 2 +- 49 files changed, 76 insertions(+), 77 deletions(-) rename Example/{Custom Integration.xcodeproj => Non-Card Payment Examples.xcodeproj}/project.pbxproj (93%) rename Example/{Custom Integration.xcodeproj => Non-Card Payment Examples.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) rename Example/{Custom Integration.xcodeproj => Non-Card Payment Examples.xcodeproj}/xcshareddata/xcschemes/Custom Integration.xcscheme (78%) rename Example/{Custom Integration => Non-Card Payment Examples}/AlipayExampleViewController.swift (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/AppDelegate.h (89%) rename Example/{Custom Integration => Non-Card Payment Examples}/AppDelegate.m (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/ApplePayExampleViewController.h (91%) rename Example/{Custom Integration => Non-Card Payment Examples}/ApplePayExampleViewController.m (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/BrowseExamplesViewController.h (94%) rename Example/{Custom Integration => Non-Card Payment Examples}/BrowseExamplesViewController.m (98%) rename Example/{Custom Integration => Non-Card Payment Examples}/Constants.h (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/Constants.m (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/FPXExampleViewController.h (91%) rename Example/{Custom Integration => Non-Card Payment Examples}/FPXExampleViewController.m (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/Images.xcassets/Contents.json (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/Images.xcassets/LaunchImage.launchimage/Contents.json (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/Info.plist (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/MyAPIClient.h (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/MyAPIClient.m (99%) rename Example/{Custom Integration-Bridging-Header.h => Non-Card Payment Examples/Non-Card Payment Examples-Bridging-Header.h} (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/PaymentExampleViewController.h (95%) rename Example/{Custom Integration => Non-Card Payment Examples}/PaymentExampleViewController.m (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/README.md (63%) rename Example/{Custom Integration => Non-Card Payment Examples}/SEPADebitExampleViewController.h (91%) rename Example/{Custom Integration => Non-Card Payment Examples}/SEPADebitExampleViewController.m (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/ShippingManager.h (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/ShippingManager.m (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/SofortExampleViewController.h (91%) rename Example/{Custom Integration => Non-Card Payment Examples}/SofortExampleViewController.m (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/WeChatPayExampleViewController.h (92%) rename Example/{Custom Integration => Non-Card Payment Examples}/WeChatPayExampleViewController.m (99%) rename Example/{Custom Integration => Non-Card Payment Examples}/de.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/en.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/es.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/fi.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/fr.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/iDEALExampleViewController.h (90%) rename Example/{Custom Integration => Non-Card Payment Examples}/iDEALExampleViewController.m (98%) rename Example/{Custom Integration => Non-Card Payment Examples}/it.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/ja.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/main.m (91%) rename Example/{Custom Integration => Non-Card Payment Examples}/nb.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/nl.lproj/Localizable.strings (100%) rename Example/{Custom Integration => Non-Card Payment Examples}/zh-Hans.lproj/Localizable.strings (100%) diff --git a/Example/Custom Integration.xcodeproj/project.pbxproj b/Example/Non-Card Payment Examples.xcodeproj/project.pbxproj similarity index 93% rename from Example/Custom Integration.xcodeproj/project.pbxproj rename to Example/Non-Card Payment Examples.xcodeproj/project.pbxproj index 16f6904f30b..6174c522c34 100644 --- a/Example/Custom Integration.xcodeproj/project.pbxproj +++ b/Example/Non-Card Payment Examples.xcodeproj/project.pbxproj @@ -45,7 +45,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 04533E871A687F5D00C7E52E /* Custom Integration.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Custom Integration.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 04533E871A687F5D00C7E52E /* Non-Card Payment Examples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Non-Card Payment Examples.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 04533E8B1A687F5D00C7E52E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 04533E8C1A687F5D00C7E52E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 04533E8E1A687F5D00C7E52E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -60,7 +60,7 @@ 04533F181A688A0A00C7E52E /* Constants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Constants.m; sourceTree = ""; }; 31A8934B230F6ABD007ABE37 /* FPXExampleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FPXExampleViewController.h; sourceTree = ""; }; 31A8934C230F6ABD007ABE37 /* FPXExampleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FPXExampleViewController.m; sourceTree = ""; }; - 366F93AF225FF2A2005CFBF6 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = "Custom Integration/README.md"; sourceTree = ""; }; + 366F93AF225FF2A2005CFBF6 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = "Non-Card Payment Examples/README.md"; sourceTree = ""; }; 36B6CB58234BE3FA00331C38 /* PaymentExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PaymentExampleViewController.h; sourceTree = ""; }; 36B6CB59234BE3FA00331C38 /* PaymentExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PaymentExampleViewController.m; sourceTree = ""; }; 36B6CB5B234BEB8400331C38 /* SEPADebitExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SEPADebitExampleViewController.h; sourceTree = ""; }; @@ -81,7 +81,7 @@ B607FFBC2321DA99004203E0 /* MyAPIClient.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyAPIClient.m; sourceTree = ""; }; B65E8FCA22FA078A0057E64A /* WeChatPayExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WeChatPayExampleViewController.h; sourceTree = ""; }; B65E8FCB22FA078A0057E64A /* WeChatPayExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WeChatPayExampleViewController.m; sourceTree = ""; }; - B6C1FC812330432E0097FC4C /* Custom Integration-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Custom Integration-Bridging-Header.h"; sourceTree = ""; }; + B6C1FC812330432E0097FC4C /* Non-Card Payment Examples-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Non-Card Payment Examples-Bridging-Header.h"; sourceTree = ""; }; B6C1FC822330432E0097FC4C /* AlipayExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlipayExampleViewController.swift; sourceTree = ""; }; C12C50DB1E57B3C800EC6D58 /* BrowseExamplesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowseExamplesViewController.h; sourceTree = ""; }; C12C50DC1E57B3C800EC6D58 /* BrowseExamplesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowseExamplesViewController.m; sourceTree = ""; }; @@ -108,23 +108,22 @@ 04533E7E1A687F5D00C7E52E = { isa = PBXGroup; children = ( - 04533E891A687F5D00C7E52E /* Custom Integration */, + 04533E891A687F5D00C7E52E /* Non-Card Payment Examples */, 04533F0E1A68813100C7E52E /* Frameworks */, 04533E881A687F5D00C7E52E /* Products */, 366F93AF225FF2A2005CFBF6 /* README.md */, - B6C1FC812330432E0097FC4C /* Custom Integration-Bridging-Header.h */, ); sourceTree = ""; }; 04533E881A687F5D00C7E52E /* Products */ = { isa = PBXGroup; children = ( - 04533E871A687F5D00C7E52E /* Custom Integration.app */, + 04533E871A687F5D00C7E52E /* Non-Card Payment Examples.app */, ); name = Products; sourceTree = ""; }; - 04533E891A687F5D00C7E52E /* Custom Integration */ = { + 04533E891A687F5D00C7E52E /* Non-Card Payment Examples */ = { isa = PBXGroup; children = ( B6C1FC822330432E0097FC4C /* AlipayExampleViewController.swift */, @@ -136,6 +135,7 @@ C12C50DC1E57B3C800EC6D58 /* BrowseExamplesViewController.m */, 04533F171A688A0A00C7E52E /* Constants.h */, 04533F181A688A0A00C7E52E /* Constants.m */, + B6C1FC812330432E0097FC4C /* Non-Card Payment Examples-Bridging-Header.h */, 31A8934B230F6ABD007ABE37 /* FPXExampleViewController.h */, 31A8934C230F6ABD007ABE37 /* FPXExampleViewController.m */, 36B6CB62234FD9AA00331C38 /* iDEALExampleViewController.h */, @@ -156,7 +156,7 @@ B65E8FCA22FA078A0057E64A /* WeChatPayExampleViewController.h */, B65E8FCB22FA078A0057E64A /* WeChatPayExampleViewController.m */, ); - path = "Custom Integration"; + path = "Non-Card Payment Examples"; sourceTree = ""; }; 04533E8A1A687F5D00C7E52E /* Supporting Files */ = { @@ -181,9 +181,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 04533E861A687F5D00C7E52E /* Custom Integration */ = { + 04533E861A687F5D00C7E52E /* Non-Card Payment Examples */ = { isa = PBXNativeTarget; - buildConfigurationList = 04533EAA1A687F5E00C7E52E /* Build configuration list for PBXNativeTarget "Custom Integration" */; + buildConfigurationList = 04533EAA1A687F5E00C7E52E /* Build configuration list for PBXNativeTarget "Non-Card Payment Examples" */; buildPhases = ( 04533E831A687F5D00C7E52E /* Sources */, 04533E841A687F5D00C7E52E /* Frameworks */, @@ -195,9 +195,9 @@ ); dependencies = ( ); - name = "Custom Integration"; - productName = "Custom Integration (ObjC)"; - productReference = 04533E871A687F5D00C7E52E /* Custom Integration.app */; + name = "Non-Card Payment Examples"; + productName = "Non-Card Payment Examples"; + productReference = 04533E871A687F5D00C7E52E /* Non-Card Payment Examples.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -216,7 +216,7 @@ }; }; }; - buildConfigurationList = 04533E821A687F5D00C7E52E /* Build configuration list for PBXProject "Custom Integration" */; + buildConfigurationList = 04533E821A687F5D00C7E52E /* Build configuration list for PBXProject "Non-Card Payment Examples" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -238,7 +238,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 04533E861A687F5D00C7E52E /* Custom Integration */, + 04533E861A687F5D00C7E52E /* Non-Card Payment Examples */, ); }; /* End PBXProject section */ @@ -446,6 +446,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -456,12 +457,12 @@ "$(inherited)", "$(PROJECT_DIR)/**", ); - INFOPLIST_FILE = "$(SRCROOT)/Custom Integration/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Non-Card Payment Examples/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.stripe.CustomSDKExample; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Custom Integration-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Non-Card Payment Examples/Non-Card Payment Examples-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -475,6 +476,7 @@ CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -485,12 +487,12 @@ "$(inherited)", "$(PROJECT_DIR)/**", ); - INFOPLIST_FILE = "$(SRCROOT)/Custom Integration/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Non-Card Payment Examples/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.stripe.CustomSDKExample; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Custom Integration-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Non-Card Payment Examples/Non-Card Payment Examples-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -499,7 +501,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 04533E821A687F5D00C7E52E /* Build configuration list for PBXProject "Custom Integration" */ = { + 04533E821A687F5D00C7E52E /* Build configuration list for PBXProject "Non-Card Payment Examples" */ = { isa = XCConfigurationList; buildConfigurations = ( 04533EA81A687F5E00C7E52E /* Debug */, @@ -508,7 +510,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 04533EAA1A687F5E00C7E52E /* Build configuration list for PBXNativeTarget "Custom Integration" */ = { + 04533EAA1A687F5E00C7E52E /* Build configuration list for PBXNativeTarget "Non-Card Payment Examples" */ = { isa = XCConfigurationList; buildConfigurations = ( 04533EAB1A687F5E00C7E52E /* Debug */, diff --git a/Example/Custom Integration.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Non-Card Payment Examples.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Example/Custom Integration.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Example/Non-Card Payment Examples.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Example/Custom Integration.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme b/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme similarity index 78% rename from Example/Custom Integration.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme rename to Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme index 6e881c5ff41..05c38ff3a67 100644 --- a/Example/Custom Integration.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme +++ b/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme @@ -15,9 +15,9 @@ + BuildableName = "Non-Card Payment Examples.app" + BlueprintName = "Non-Card Payment Examples" + ReferencedContainer = "container:Non-Card Payment Examples.xcodeproj"> @@ -27,6 +27,15 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> + + + + @@ -39,17 +48,6 @@ - - - - - - + BuildableName = "Non-Card Payment Examples.app" + BlueprintName = "Non-Card Payment Examples" + ReferencedContainer = "container:Non-Card Payment Examples.xcodeproj"> - - + BuildableName = "Non-Card Payment Examples.app" + BlueprintName = "Non-Card Payment Examples" + ReferencedContainer = "container:Non-Card Payment Examples.xcodeproj"> diff --git a/Example/Custom Integration/AlipayExampleViewController.swift b/Example/Non-Card Payment Examples/AlipayExampleViewController.swift similarity index 99% rename from Example/Custom Integration/AlipayExampleViewController.swift rename to Example/Non-Card Payment Examples/AlipayExampleViewController.swift index f62f38a8ce3..9dc143ec021 100644 --- a/Example/Custom Integration/AlipayExampleViewController.swift +++ b/Example/Non-Card Payment Examples/AlipayExampleViewController.swift @@ -1,6 +1,6 @@ // // AlipayExampleViewController.swift -// Custom Integration +// Non-Card Payment Examples // // Created by Yuki Tokuhiro on 9/16/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/AppDelegate.h b/Example/Non-Card Payment Examples/AppDelegate.h similarity index 89% rename from Example/Custom Integration/AppDelegate.h rename to Example/Non-Card Payment Examples/AppDelegate.h index 8dac9f4497a..69b857e6050 100644 --- a/Example/Custom Integration/AppDelegate.h +++ b/Example/Non-Card Payment Examples/AppDelegate.h @@ -1,6 +1,6 @@ // // AppDelegate.h -// Custom Integration +// Non-Card Payment Examples // // Created by Jack Flintermann on 1/15/15. // Copyright (c) 2015 Stripe. All rights reserved. diff --git a/Example/Custom Integration/AppDelegate.m b/Example/Non-Card Payment Examples/AppDelegate.m similarity index 100% rename from Example/Custom Integration/AppDelegate.m rename to Example/Non-Card Payment Examples/AppDelegate.m diff --git a/Example/Custom Integration/ApplePayExampleViewController.h b/Example/Non-Card Payment Examples/ApplePayExampleViewController.h similarity index 91% rename from Example/Custom Integration/ApplePayExampleViewController.h rename to Example/Non-Card Payment Examples/ApplePayExampleViewController.h index 256b6598260..1fcfc926c24 100644 --- a/Example/Custom Integration/ApplePayExampleViewController.h +++ b/Example/Non-Card Payment Examples/ApplePayExampleViewController.h @@ -1,6 +1,6 @@ // // ApplePayExampleViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by Ben Guo on 2/22/17. // Copyright © 2017 Stripe. All rights reserved. diff --git a/Example/Custom Integration/ApplePayExampleViewController.m b/Example/Non-Card Payment Examples/ApplePayExampleViewController.m similarity index 99% rename from Example/Custom Integration/ApplePayExampleViewController.m rename to Example/Non-Card Payment Examples/ApplePayExampleViewController.m index 3ba5b4b5f67..657bcd5f850 100644 --- a/Example/Custom Integration/ApplePayExampleViewController.m +++ b/Example/Non-Card Payment Examples/ApplePayExampleViewController.m @@ -1,6 +1,6 @@ // // ApplePayExampleViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by Ben Guo on 2/22/17. // Copyright © 2017 Stripe. All rights reserved. diff --git a/Example/Custom Integration/BrowseExamplesViewController.h b/Example/Non-Card Payment Examples/BrowseExamplesViewController.h similarity index 94% rename from Example/Custom Integration/BrowseExamplesViewController.h rename to Example/Non-Card Payment Examples/BrowseExamplesViewController.h index e9c90b4a760..8b1f0e73d14 100644 --- a/Example/Custom Integration/BrowseExamplesViewController.h +++ b/Example/Non-Card Payment Examples/BrowseExamplesViewController.h @@ -1,6 +1,6 @@ // // BrowseExamplesViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by Ben Guo on 2/17/17. // Copyright © 2017 Stripe. All rights reserved. diff --git a/Example/Custom Integration/BrowseExamplesViewController.m b/Example/Non-Card Payment Examples/BrowseExamplesViewController.m similarity index 98% rename from Example/Custom Integration/BrowseExamplesViewController.m rename to Example/Non-Card Payment Examples/BrowseExamplesViewController.m index e3b94cd2030..fce4f0d1c3b 100644 --- a/Example/Custom Integration/BrowseExamplesViewController.m +++ b/Example/Non-Card Payment Examples/BrowseExamplesViewController.m @@ -1,13 +1,13 @@ // // BrowseExamplesViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by Ben Guo on 2/17/17. // Copyright © 2017 Stripe. All rights reserved. // #import -#import "Custom_Integration-Swift.h" +#import "Non_Card_Payment_Examples-Swift.h" #import "BrowseExamplesViewController.h" diff --git a/Example/Custom Integration/Constants.h b/Example/Non-Card Payment Examples/Constants.h similarity index 100% rename from Example/Custom Integration/Constants.h rename to Example/Non-Card Payment Examples/Constants.h diff --git a/Example/Custom Integration/Constants.m b/Example/Non-Card Payment Examples/Constants.m similarity index 100% rename from Example/Custom Integration/Constants.m rename to Example/Non-Card Payment Examples/Constants.m diff --git a/Example/Custom Integration/FPXExampleViewController.h b/Example/Non-Card Payment Examples/FPXExampleViewController.h similarity index 91% rename from Example/Custom Integration/FPXExampleViewController.h rename to Example/Non-Card Payment Examples/FPXExampleViewController.h index d849e4aeb04..e06a9124969 100644 --- a/Example/Custom Integration/FPXExampleViewController.h +++ b/Example/Non-Card Payment Examples/FPXExampleViewController.h @@ -1,6 +1,6 @@ // // FPXExampleViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by David Estes on 8/26/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/FPXExampleViewController.m b/Example/Non-Card Payment Examples/FPXExampleViewController.m similarity index 99% rename from Example/Custom Integration/FPXExampleViewController.m rename to Example/Non-Card Payment Examples/FPXExampleViewController.m index b32429c643e..24115dada17 100644 --- a/Example/Custom Integration/FPXExampleViewController.m +++ b/Example/Non-Card Payment Examples/FPXExampleViewController.m @@ -1,6 +1,6 @@ // // FPXExampleViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by David Estes on 8/26/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Non-Card Payment Examples/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Example/Custom Integration/Images.xcassets/AppIcon.appiconset/Contents.json rename to Example/Non-Card Payment Examples/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Example/Custom Integration/Images.xcassets/Contents.json b/Example/Non-Card Payment Examples/Images.xcassets/Contents.json similarity index 100% rename from Example/Custom Integration/Images.xcassets/Contents.json rename to Example/Non-Card Payment Examples/Images.xcassets/Contents.json diff --git a/Example/Custom Integration/Images.xcassets/LaunchImage.launchimage/Contents.json b/Example/Non-Card Payment Examples/Images.xcassets/LaunchImage.launchimage/Contents.json similarity index 100% rename from Example/Custom Integration/Images.xcassets/LaunchImage.launchimage/Contents.json rename to Example/Non-Card Payment Examples/Images.xcassets/LaunchImage.launchimage/Contents.json diff --git a/Example/Custom Integration/Info.plist b/Example/Non-Card Payment Examples/Info.plist similarity index 100% rename from Example/Custom Integration/Info.plist rename to Example/Non-Card Payment Examples/Info.plist diff --git a/Example/Custom Integration/MyAPIClient.h b/Example/Non-Card Payment Examples/MyAPIClient.h similarity index 99% rename from Example/Custom Integration/MyAPIClient.h rename to Example/Non-Card Payment Examples/MyAPIClient.h index c3e053135a1..7469008e847 100644 --- a/Example/Custom Integration/MyAPIClient.h +++ b/Example/Non-Card Payment Examples/MyAPIClient.h @@ -1,6 +1,6 @@ // // ExampleAPIClient.h -// Custom Integration +// Non-Card Payment Examples // // Created by Yuki Tokuhiro on 9/5/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/MyAPIClient.m b/Example/Non-Card Payment Examples/MyAPIClient.m similarity index 99% rename from Example/Custom Integration/MyAPIClient.m rename to Example/Non-Card Payment Examples/MyAPIClient.m index 81ad6551ca4..3d9727b8366 100644 --- a/Example/Custom Integration/MyAPIClient.m +++ b/Example/Non-Card Payment Examples/MyAPIClient.m @@ -1,6 +1,6 @@ // // ExampleAPIClient.m -// Custom Integration +// Non-Card Payment Examples // // Created by Yuki Tokuhiro on 9/5/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration-Bridging-Header.h b/Example/Non-Card Payment Examples/Non-Card Payment Examples-Bridging-Header.h similarity index 100% rename from Example/Custom Integration-Bridging-Header.h rename to Example/Non-Card Payment Examples/Non-Card Payment Examples-Bridging-Header.h diff --git a/Example/Custom Integration/PaymentExampleViewController.h b/Example/Non-Card Payment Examples/PaymentExampleViewController.h similarity index 95% rename from Example/Custom Integration/PaymentExampleViewController.h rename to Example/Non-Card Payment Examples/PaymentExampleViewController.h index a5dd95630d5..c6aba2721cc 100644 --- a/Example/Custom Integration/PaymentExampleViewController.h +++ b/Example/Non-Card Payment Examples/PaymentExampleViewController.h @@ -1,6 +1,6 @@ // // PaymentExampleViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by Cameron Sabol on 10/7/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/PaymentExampleViewController.m b/Example/Non-Card Payment Examples/PaymentExampleViewController.m similarity index 99% rename from Example/Custom Integration/PaymentExampleViewController.m rename to Example/Non-Card Payment Examples/PaymentExampleViewController.m index e1a34264084..7f013b9accc 100644 --- a/Example/Custom Integration/PaymentExampleViewController.m +++ b/Example/Non-Card Payment Examples/PaymentExampleViewController.m @@ -1,6 +1,6 @@ // // PaymentExampleViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by Cameron Sabol on 10/7/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/README.md b/Example/Non-Card Payment Examples/README.md similarity index 63% rename from Example/Custom Integration/README.md rename to Example/Non-Card Payment Examples/README.md index b60efe7156f..09c05e89a8d 100644 --- a/Example/Custom Integration/README.md +++ b/Example/Non-Card Payment Examples/README.md @@ -1,12 +1,12 @@ -# Custom Integration +# Non-Card Payment Examples -This example app demonstrates how to use `STPAPIClient` to accept various payment methods. This may be a useful reference if you're building your own payment flow and not using `STPPaymentContext`. +This example app demonstrates how to use `STPAPIClient` to accept various non-card payment methods. This may be a useful reference if you're building your own payment flow and not using `STPPaymentContext`. For examples of accepting cards, check out [stripe-samples](https://github.com/stripe-samples/accept-a-card-payment). -For a detailed guide, see https://stripe.com/docs/mobile/ios/custom +To run this app: 1. If you haven't already, sign up for a [Stripe account](https://dashboard.stripe.com/register) (it takes seconds). 2. Open `./Stripe.xcworkspace` (not `./Stripe.xcodeproj`) with Xcode -3. Fill in the `stripePublishableKey` constant in `./Example/Custom Integration/Constants.m` with your Stripe [test "Publishable key"](https://dashboard.stripe.com/account/apikeys.). This key should start with `pk_test`. +3. Fill in the `stripePublishableKey` constant in `./Example/Non-Card Payment Examples/Constants.m` with your Stripe [test "Publishable key"](https://dashboard.stripe.com/account/apikeys.). This key should start with `pk_test`. 4. Head to [example-ios-backend](https://github.com/stripe/example-ios-backend/tree/v18.1.0) and click "Deploy to Heroku". Provide your [Stripe test "Secret key"](https://dashboard.stripe.com/account/apikeys.) as the `STRIPE_TEST_SECRET_KEY` environment variable. This key should start with `sk_test`. 5. Fill in the `backendBaseURL` constant in `Constants.m` with the app URL Heroku provides (e.g. "https://my-example-app.herokuapp.com") diff --git a/Example/Custom Integration/SEPADebitExampleViewController.h b/Example/Non-Card Payment Examples/SEPADebitExampleViewController.h similarity index 91% rename from Example/Custom Integration/SEPADebitExampleViewController.h rename to Example/Non-Card Payment Examples/SEPADebitExampleViewController.h index 1a4de4de291..4adbc4d0aa9 100644 --- a/Example/Custom Integration/SEPADebitExampleViewController.h +++ b/Example/Non-Card Payment Examples/SEPADebitExampleViewController.h @@ -1,6 +1,6 @@ // // SEPADebitExampleViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by Cameron Sabol on 10/7/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/SEPADebitExampleViewController.m b/Example/Non-Card Payment Examples/SEPADebitExampleViewController.m similarity index 99% rename from Example/Custom Integration/SEPADebitExampleViewController.m rename to Example/Non-Card Payment Examples/SEPADebitExampleViewController.m index 4b5c466963c..8ced4162660 100644 --- a/Example/Custom Integration/SEPADebitExampleViewController.m +++ b/Example/Non-Card Payment Examples/SEPADebitExampleViewController.m @@ -1,6 +1,6 @@ // // SEPADebitExampleViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by Cameron Sabol on 10/7/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/ShippingManager.h b/Example/Non-Card Payment Examples/ShippingManager.h similarity index 100% rename from Example/Custom Integration/ShippingManager.h rename to Example/Non-Card Payment Examples/ShippingManager.h diff --git a/Example/Custom Integration/ShippingManager.m b/Example/Non-Card Payment Examples/ShippingManager.m similarity index 100% rename from Example/Custom Integration/ShippingManager.m rename to Example/Non-Card Payment Examples/ShippingManager.m diff --git a/Example/Custom Integration/SofortExampleViewController.h b/Example/Non-Card Payment Examples/SofortExampleViewController.h similarity index 91% rename from Example/Custom Integration/SofortExampleViewController.h rename to Example/Non-Card Payment Examples/SofortExampleViewController.h index 478f509cbc1..cfec17f730b 100644 --- a/Example/Custom Integration/SofortExampleViewController.h +++ b/Example/Non-Card Payment Examples/SofortExampleViewController.h @@ -1,6 +1,6 @@ // // SofortExampleViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by Ben Guo on 2/22/17. // Copyright © 2017 Stripe. All rights reserved. diff --git a/Example/Custom Integration/SofortExampleViewController.m b/Example/Non-Card Payment Examples/SofortExampleViewController.m similarity index 99% rename from Example/Custom Integration/SofortExampleViewController.m rename to Example/Non-Card Payment Examples/SofortExampleViewController.m index dd3915095e8..d0d3e30cf7b 100644 --- a/Example/Custom Integration/SofortExampleViewController.m +++ b/Example/Non-Card Payment Examples/SofortExampleViewController.m @@ -1,6 +1,6 @@ // // SofortExampleViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by Ben Guo on 2/22/17. // Copyright © 2017 Stripe. All rights reserved. diff --git a/Example/Custom Integration/WeChatPayExampleViewController.h b/Example/Non-Card Payment Examples/WeChatPayExampleViewController.h similarity index 92% rename from Example/Custom Integration/WeChatPayExampleViewController.h rename to Example/Non-Card Payment Examples/WeChatPayExampleViewController.h index 87555bf9258..27a93597310 100644 --- a/Example/Custom Integration/WeChatPayExampleViewController.h +++ b/Example/Non-Card Payment Examples/WeChatPayExampleViewController.h @@ -1,6 +1,6 @@ // // WeChatPayExampleViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by Yuki Tokuhiro on 8/6/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/WeChatPayExampleViewController.m b/Example/Non-Card Payment Examples/WeChatPayExampleViewController.m similarity index 99% rename from Example/Custom Integration/WeChatPayExampleViewController.m rename to Example/Non-Card Payment Examples/WeChatPayExampleViewController.m index 7a00fb912b9..dd5118546d9 100644 --- a/Example/Custom Integration/WeChatPayExampleViewController.m +++ b/Example/Non-Card Payment Examples/WeChatPayExampleViewController.m @@ -1,6 +1,6 @@ // // WeChatPayExampleViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by Yuki Tokuhiro on 8/6/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/de.lproj/Localizable.strings b/Example/Non-Card Payment Examples/de.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/de.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/de.lproj/Localizable.strings diff --git a/Example/Custom Integration/en.lproj/Localizable.strings b/Example/Non-Card Payment Examples/en.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/en.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/en.lproj/Localizable.strings diff --git a/Example/Custom Integration/es.lproj/Localizable.strings b/Example/Non-Card Payment Examples/es.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/es.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/es.lproj/Localizable.strings diff --git a/Example/Custom Integration/fi.lproj/Localizable.strings b/Example/Non-Card Payment Examples/fi.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/fi.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/fi.lproj/Localizable.strings diff --git a/Example/Custom Integration/fr.lproj/Localizable.strings b/Example/Non-Card Payment Examples/fr.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/fr.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/fr.lproj/Localizable.strings diff --git a/Example/Custom Integration/iDEALExampleViewController.h b/Example/Non-Card Payment Examples/iDEALExampleViewController.h similarity index 90% rename from Example/Custom Integration/iDEALExampleViewController.h rename to Example/Non-Card Payment Examples/iDEALExampleViewController.h index 90aa71522a1..ff2b3313e06 100644 --- a/Example/Custom Integration/iDEALExampleViewController.h +++ b/Example/Non-Card Payment Examples/iDEALExampleViewController.h @@ -1,6 +1,6 @@ // // iDEALExampleViewController.h -// Custom Integration +// Non-Card Payment Examples // // Created by Cameron Sabol on 10/10/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/iDEALExampleViewController.m b/Example/Non-Card Payment Examples/iDEALExampleViewController.m similarity index 98% rename from Example/Custom Integration/iDEALExampleViewController.m rename to Example/Non-Card Payment Examples/iDEALExampleViewController.m index a7694600416..c301a52045e 100644 --- a/Example/Custom Integration/iDEALExampleViewController.m +++ b/Example/Non-Card Payment Examples/iDEALExampleViewController.m @@ -1,6 +1,6 @@ // // iDEALExampleViewController.m -// Custom Integration +// Non-Card Payment Examples // // Created by Cameron Sabol on 10/10/19. // Copyright © 2019 Stripe. All rights reserved. diff --git a/Example/Custom Integration/it.lproj/Localizable.strings b/Example/Non-Card Payment Examples/it.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/it.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/it.lproj/Localizable.strings diff --git a/Example/Custom Integration/ja.lproj/Localizable.strings b/Example/Non-Card Payment Examples/ja.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/ja.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/ja.lproj/Localizable.strings diff --git a/Example/Custom Integration/main.m b/Example/Non-Card Payment Examples/main.m similarity index 91% rename from Example/Custom Integration/main.m rename to Example/Non-Card Payment Examples/main.m index 9bbf5b705a8..84c237af315 100644 --- a/Example/Custom Integration/main.m +++ b/Example/Non-Card Payment Examples/main.m @@ -1,6 +1,6 @@ // // main.m -// Custom Integration +// Non-Card Payment Examples // // Created by Jack Flintermann on 1/15/15. // Copyright (c) 2015 Stripe. All rights reserved. diff --git a/Example/Custom Integration/nb.lproj/Localizable.strings b/Example/Non-Card Payment Examples/nb.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/nb.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/nb.lproj/Localizable.strings diff --git a/Example/Custom Integration/nl.lproj/Localizable.strings b/Example/Non-Card Payment Examples/nl.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/nl.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/nl.lproj/Localizable.strings diff --git a/Example/Custom Integration/zh-Hans.lproj/Localizable.strings b/Example/Non-Card Payment Examples/zh-Hans.lproj/Localizable.strings similarity index 100% rename from Example/Custom Integration/zh-Hans.lproj/Localizable.strings rename to Example/Non-Card Payment Examples/zh-Hans.lproj/Localizable.strings diff --git a/Example/README.md b/Example/README.md index c87ea8efee0..5b52cb88c24 100644 --- a/Example/README.md +++ b/Example/README.md @@ -8,6 +8,10 @@ Check out [stripe-samples](https://github.com/stripe-samples) for examples to: There are 3 example apps included in the repository: +## [**UI Examples** Example/UI Examples/README.md ](/Example/UI%20Examples/README.md) +This example app lets you quickly try out the SDK's prebuilt UI components. + + ## [**Basic Integration**](/Example/Basic%20Integration/README.md)

STPPaymentCardTextField @@ -16,7 +20,7 @@ There are 3 example apps included in the repository: This example app demonstrates how to build a payment flow using our prebuilt UI component integration. -## [**Custom Integration** Example/Custom Integration/README.md](/Example/Custom%20Integration/README.md) +## [**Non-Card Payment Examples**](/Example/Non-Card%20Payment%20Examples) This example app demonstrates how to accept various payment methods: - Alipay @@ -27,6 +31,3 @@ This example app demonstrates how to accept various payment methods: - Sofort - WeChat Pay - -## [**UI Examples** Example/UI Examples/README.md ](/Example/UI%20Examples/README.md) -This example app lets you quickly try out the SDK's prebuilt UI components. diff --git a/Example/UI Examples/README.md b/Example/UI Examples/README.md index 8834537a698..aa5954135fa 100644 --- a/Example/UI Examples/README.md +++ b/Example/UI Examples/README.md @@ -2,7 +2,7 @@ This example app lets you try out the pre-built UI components we provide. -You can run it without any initial setup and it's a great place to start if you're evaluating whether you want to use our [Basic Integration](/Example/Basic%20Integration/README.md) or build your own [Custom Integration](/Example/Custom%20Integration/README.md). +You can run it without any initial setup and it's a great place to start if you're evaluating whether you want to use our [Basic Integration](/Example/Basic%20Integration/README.md) or use the UI components individually. 1. Open `./Stripe.xcworkspace` (not `./Stripe.xcodeproj`) with Xcode 2. Build and run the "UI Examples" scheme diff --git a/README.md b/README.md index 3ebe69e6a67..ad950316979 100644 --- a/README.md +++ b/README.md @@ -74,10 +74,10 @@ There are 3 example apps included in the repository: - [UI Examples](/Example/UI%20Examples). - This example lets you quickly try out the SDK's prebuilt UI components using a mock backend—just build and run! -- [Custom Integration](/Example/Custom%20Integration) - - This example demonstrates how to use `STPAPIClient` to accept various payment methods. - [Basic Integration](/Example/Basic%20Integration) - This example demonstrates how to build a payment flow using our prebuilt UI component integration (`STPPaymentContext`). +- [Non-Card Payment Examples](/Example/Non-Card%20Payment%20Examples) + - This example demonstrates how to use `STPAPIClient` to accept various non-card payment methods. Check out [stripe-samples](https://github.com/stripe-samples/) for more, including: diff --git a/Stripe.xcworkspace/contents.xcworkspacedata b/Stripe.xcworkspace/contents.xcworkspacedata index 37ae3e5eb22..2058916e514 100644 --- a/Stripe.xcworkspace/contents.xcworkspacedata +++ b/Stripe.xcworkspace/contents.xcworkspacedata @@ -11,6 +11,6 @@ location = "group:Example/Basic Integration.xcodeproj"> + location = "group:/Users/yuki/stripe/ios/stripe-ios/Example/Non-Card Payment Examples.xcodeproj"> From f72421cae4437faf458491dce72aa57a596e59ae Mon Sep 17 00:00:00 2001 From: Yuki Tokuhiro Date: Wed, 6 Nov 2019 14:54:54 -0800 Subject: [PATCH 4/8] Fix typo, links --- README.md | 6 +++--- STYLEGUIDE.md | 2 +- ci_scripts/run_builds.sh | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ad950316979..10d74a3fd16 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ The Stripe iOS SDK makes it quick and easy to build an excellent payment experience in your iOS app. We provide powerful and customizable UI screens and elements that can be used out-of-the-box to collect your users' payment details. We also expose the low-level APIs that power those UIs so that you can build fully custom experiences. -See our [📚 integration guides](https://stripe.com/docs/payments/new-overview#start-with-a-guide) to get started, or [📘 browse the SDK reference](https://stripe.dev/stripe-ios/docs/index.html). +See our [📚 integration guides](https://stripe.com/docs/payments) to get started, or [📘 browse the SDK reference](https://stripe.dev/stripe-ios/docs/index.html). > Updating to a newer version of the SDK? See our [migration guide](https://github.com/stripe/stripe-ios/blob/master/MIGRATING.md) and [changelog](https://github.com/stripe/stripe-ios/blob/master/CHANGELOG.md). @@ -41,7 +41,7 @@ Table of contents STPPaymentCardTextField

-You can use these individually, or take all of the prebuilt UI in one flow by following the [Basic Integration guide](https://stripe.com/docs/mobile/ios/basic) to learn more. +You can use these individually, or take all of the prebuilt UI in one flow by following the [Basic Integration guide](https://stripe.com/docs/mobile/ios/basic).

STPAddCardViewControllerSTPPaymentOptionsViewControllerSTPShippingAddressViewController @@ -66,7 +66,7 @@ The Stripe iOS SDK requires Xcode 10.1 or later and is compatible with apps targ ### Integration -See our [📚 integration guides](https://stripe.com/docs/payments/new-overview#start-with-a-guide) to get started, or [browse the 📘 SDK reference](https://stripe.dev/stripe-ios/docs/index.html) for fine-grained documentation of all the classes and methods in the SDK. +See our [📚 integration guides](https://stripe.com/docs/payments) to get started, or [browse the 📘 SDK reference](https://stripe.dev/stripe-ios/docs/index.html) for fine-grained documentation of all the classes and methods in the SDK. ### Examples diff --git a/STYLEGUIDE.md b/STYLEGUIDE.md index 9f3ccc698b3..91917ee5616 100644 --- a/STYLEGUIDE.md +++ b/STYLEGUIDE.md @@ -113,7 +113,7 @@ static NSString * const STPSDKVersion = @"11.0.0"; - `stripe-ios/Stripe/` - `stripe-ios/Tests/Tests/` - `stripe-ios/Example/Basic Integration/` - - `stripe-ios/Example/Custom Integration/` + - `stripe-ios/Example/Non-Card Payment Examples/` - Save public header files in `stripe-ios/Stripe/PublicHeaders/` for Cocoapods compatibility diff --git a/ci_scripts/run_builds.sh b/ci_scripts/run_builds.sh index 22d18aff708..e6d80242b5d 100755 --- a/ci_scripts/run_builds.sh +++ b/ci_scripts/run_builds.sh @@ -37,7 +37,7 @@ fi xcodebuild build \ -workspace "Stripe.xcworkspace" \ - -scheme "Custom Integration" \ + -scheme "Non-Card Payment Examples" \ -sdk "iphonesimulator" \ -destination "platform=iOS Simulator,name=iPhone 7,OS=12.2" \ | xcpretty From 8d29b18652ecfba6826362fbf4da63abb2e9d6f9 Mon Sep 17 00:00:00 2001 From: Yuki Tokuhiro Date: Wed, 6 Nov 2019 17:04:58 -0800 Subject: [PATCH 5/8] Try again --- ...om Integration.xcscheme => Non-Card Payment Examples.xcscheme} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/{Custom Integration.xcscheme => Non-Card Payment Examples.xcscheme} (100%) diff --git a/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme b/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme similarity index 100% rename from Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Custom Integration.xcscheme rename to Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme From 7e38d953421bd45d14326cd71973d996a4c4e750 Mon Sep 17 00:00:00 2001 From: Yuki Tokuhiro Date: Wed, 6 Nov 2019 17:40:51 -0800 Subject: [PATCH 6/8] Move scheme to workspace container? --- .../Non-Card Payment Examples.xcscheme | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme b/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme index 05c38ff3a67..8f687d66c0a 100644 --- a/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme +++ b/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme @@ -1,6 +1,6 @@ - - - - - - - - Date: Thu, 7 Nov 2019 11:12:25 -0800 Subject: [PATCH 7/8] Try again.. --- .../Non-Card Payment Examples.xcscheme | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme b/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme index 8f687d66c0a..9e3ddb40bbd 100644 --- a/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme +++ b/Example/Non-Card Payment Examples.xcodeproj/xcshareddata/xcschemes/Non-Card Payment Examples.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + + + + Date: Thu, 7 Nov 2019 11:39:46 -0800 Subject: [PATCH 8/8] Dangit. --- Stripe.xcworkspace/contents.xcworkspacedata | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Stripe.xcworkspace/contents.xcworkspacedata b/Stripe.xcworkspace/contents.xcworkspacedata index 2058916e514..35c313e2ac8 100644 --- a/Stripe.xcworkspace/contents.xcworkspacedata +++ b/Stripe.xcworkspace/contents.xcworkspacedata @@ -11,6 +11,6 @@ location = "group:Example/Basic Integration.xcodeproj"> + location = "group:Example/Non-Card Payment Examples.xcodeproj">