-
Notifications
You must be signed in to change notification settings - Fork 999
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ApplePayContext handles shipping #1561
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,12 +24,17 @@ NS_ASSUME_NONNULL_BEGIN | |
/** | ||
Called after the customer has authorized Apple Pay. Implement this method to call the completion block with the client secret of a PaymentIntent representing the payment. | ||
|
||
@param paymentMethod The PaymentMethod that represents the customer's Apple Pay payment method. | ||
@param paymentMethod The PaymentMethod that represents the customer's Apple Pay payment method. | ||
If you create the PaymentIntent with confirmation_method=manual, pass `paymentMethod.stripeId` as the payment_method and confirm=true. Otherwise, you can ignore this parameter. | ||
@param completion Call this with the PaymentIntent's client secret, or the error that occurred creating the PaymentIntent. | ||
|
||
@param paymentInformation The underlying PKPayment created by Apple Pay. | ||
If you create the PaymentIntent with confirmation_method=manual, you can collect shipping information using its `shippingContact` and `shippingMethod` properties. Otherwise, you can ignore this parameter. | ||
yuki-stripe marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
@param completion Call this with the PaymentIntent's client secret, or the error that occurred creating the PaymentIntent. | ||
*/ | ||
- (void)applePayContext:(STPApplePayContext *)context | ||
didCreatePaymentMethod:(STPPaymentMethod *)paymentMethod | ||
paymentInformation:(PKPayment *)paymentInformation | ||
completion:(STPIntentClientSecretCompletionBlock)completion; | ||
|
||
/** | ||
|
@@ -61,6 +66,8 @@ didSelectShippingMethod:(PKShippingMethod *)shippingMethod | |
/** | ||
Called when the user has selected a new shipping address. You should inspect the | ||
address and must invoke the completion block with an updated array of PKPaymentSummaryItem objects. | ||
|
||
@note This does not contain full contact information - you can only receive that after the user authorizes payment, in the paymentInformation passed to `applePayContext:didCreatePaymentMethod:paymentInformation:completion:` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the distinction here isn't really clear to me. Could we enumerate what is available vs what isn't available here in a little more detail? |
||
*/ | ||
- (void)applePayContext:(STPApplePayContext *)context | ||
didSelectShippingContact:(PKContact *)contact | ||
|
@@ -112,6 +119,11 @@ didSelectShippingMethod:(PKShippingMethod *)shippingMethod | |
*/ | ||
- (instancetype)init NS_UNAVAILABLE; | ||
|
||
/** | ||
Use initWithPaymentRequest:delegate: instead. | ||
*/ | ||
+ (instancetype)new NS_UNAVAILABLE; | ||
|
||
/** | ||
Presents the Apple Pay sheet, starting the payment process. | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,6 +14,8 @@ | |
#import "STPAPIClient+ApplePay.h" | ||
#import "STPPaymentMethod.h" | ||
#import "STPPaymentIntentParams.h" | ||
#import "STPPaymentIntentShippingDetailsParams.h" | ||
#import "STPPaymentIntentShippingDetailsAddressParams.h" | ||
#import "STPPaymentIntent+Private.h" | ||
#import "STPPaymentHandler.h" | ||
#import "NSError+Stripe.h" | ||
|
@@ -124,6 +126,28 @@ - (void)_end { | |
self.viewController = nil; | ||
self.delegate = nil; | ||
} | ||
|
||
- (nullable STPPaymentIntentShippingDetailsParams *)_shippingDetailsFromPKPayment:(PKPayment *)payment { | ||
CNPostalAddress *address = payment.shippingContact.postalAddress; | ||
NSPersonNameComponents *name = payment.shippingContact.name; | ||
if (address.street == nil || name == nil) { | ||
// The shipping address street and name are required parameters for a valid STPPaymentIntentShippingDetailsParams | ||
return nil; | ||
} | ||
|
||
STPPaymentIntentShippingDetailsAddressParams *addressParams = [[STPPaymentIntentShippingDetailsAddressParams alloc] initWithLine1:payment.shippingContact.postalAddress.street]; | ||
addressParams.city = address.city; | ||
addressParams.state = address.state; | ||
addressParams.country = address.ISOCountryCode; | ||
addressParams.postalCode = address.postalCode; | ||
|
||
NSPersonNameComponentsFormatter *formatter = [NSPersonNameComponentsFormatter new]; | ||
formatter.style = NSPersonNameComponentsFormatterStyleLong; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This produces a name like "Dr. Jonathan Maple Appleseed Esq." vs. |
||
STPPaymentIntentShippingDetailsParams *shippingParams = [[STPPaymentIntentShippingDetailsParams alloc] initWithAddress:addressParams name:[formatter stringFromPersonNameComponents:name]]; | ||
shippingParams.phone = payment.shippingContact.phoneNumber.stringValue; | ||
|
||
return shippingParams; | ||
} | ||
|
||
#pragma mark - PKPaymentAuthorizationViewControllerDelegate | ||
|
||
|
@@ -258,7 +282,7 @@ - (void)_completePaymentWithPayment:(PKPayment *)payment completion:(nonnull voi | |
} | ||
|
||
// 2. Fetch PaymentIntent client secret from delegate | ||
[self.delegate applePayContext:self didCreatePaymentMethod:paymentMethod completion:^(NSString * _Nullable paymentIntentClientSecret, NSError * _Nullable paymentIntentCreationError) { | ||
[self.delegate applePayContext:self didCreatePaymentMethod:paymentMethod paymentInformation:payment completion:^(NSString * _Nullable paymentIntentClientSecret, NSError * _Nullable paymentIntentCreationError) { | ||
if (paymentIntentCreationError || !self.viewController) { | ||
handleFinalState(STPPaymentStateError, paymentIntentCreationError); | ||
return; | ||
|
@@ -275,6 +299,7 @@ - (void)_completePaymentWithPayment:(PKPayment *)payment completion:(nonnull voi | |
STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:paymentIntentClientSecret]; | ||
paymentIntentParams.paymentMethodId = paymentMethod.stripeId; | ||
paymentIntentParams.useStripeSDK = @(YES); | ||
paymentIntentParams.shipping = [self _shippingDetailsFromPKPayment:payment]; | ||
|
||
self.paymentState = STPPaymentStatePending; | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would appreciate scrutiny on this API change!