stripe-ios/Example/AppClipExample/Shared/ApplePayModel.swift

69 lines
2.9 KiB
Swift

//
// ApplePayModel.swift
// IntegrationTester
//
// Created by David Estes on 2/18/21.
//
import Foundation
import PassKit
import StripeApplePay
class MyApplePayBackendModel: NSObject, ObservableObject, ApplePayContextDelegate {
@Published var paymentStatus: STPApplePayContext.PaymentStatus?
@Published var lastPaymentError: Error?
func pay() {
// Configure a payment request
let pr = StripeAPI.paymentRequest(withMerchantIdentifier: "merchant.com.stripetest.appclipexample", country: "US", currency: "USD")
// You'd generally want to configure at least `.postalAddress` here.
// We don't require anything here, as we don't want to enter an address
// in CI.
pr.requiredShippingContactFields = []
pr.requiredBillingContactFields = []
// Configure shipping methods
let firstClassShipping = PKShippingMethod(label: "First Class Mail", amount: NSDecimalNumber(string: "10.99"))
firstClassShipping.detail = "Arrives in 3-5 days"
firstClassShipping.identifier = "firstclass"
let rocketRidesShipping = PKShippingMethod(label: "Rocket Rides courier", amount: NSDecimalNumber(string: "10.99"))
rocketRidesShipping.detail = "Arrives in 1-2 hours"
rocketRidesShipping.identifier = "rocketrides"
pr.shippingMethods = [
firstClassShipping,
rocketRidesShipping,
]
// Build payment summary items
// (You'll generally want to configure these based on the selected address and shipping method.
pr.paymentSummaryItems = [
PKPaymentSummaryItem(label: "A very nice computer", amount: NSDecimalNumber(string: "19.99")),
PKPaymentSummaryItem(label: "Shipping", amount: NSDecimalNumber(string: "10.99")),
PKPaymentSummaryItem(label: "Stripe Computer Shop", amount: NSDecimalNumber(string: "29.99")),
]
// Present the Apple Pay Context:
let applePayContext = STPApplePayContext(paymentRequest: pr, delegate: self)
applePayContext?.presentApplePay()
}
func applePayContext(_ context: STPApplePayContext, didCreatePaymentMethod paymentMethod: StripeAPI.PaymentMethod, paymentInformation: PKPayment, completion: @escaping STPIntentClientSecretCompletionBlock) {
// When the Apple Pay sheet is confirmed, create a PaymentIntent on your backend from the provided PKPayment information.
BackendModel.shared.fetchPaymentIntent { secret in
if let clientSecret = secret {
// Call the completion block with the PaymentIntent's client secret.
completion(clientSecret, nil)
} else {
completion(nil, NSError()) // swiftlint:disable:this discouraged_direct_init
}
}
}
func applePayContext(_ context: STPApplePayContext, didCompleteWith status: STPApplePayContext.PaymentStatus, error: Error?) {
// When the payment is complete, display the status.
self.paymentStatus = status
self.lastPaymentError = error
}
}