PayPal Spec --- If a merchant wants to integrate with the PayPal module, these are the steps they would take. 1. Import `PayPalPayments` at the top of their file 2. Create a `PaymentsConfig` object using their client Id and return Url 3. Create a `PayPalClient` object using that configuration 4. Set the delegate of the `PayPalClient` to an object that should receive messages from the SDK, and handle the events (approval, cancellation, errors, and shipping updates) 5. Start the checkout experience using an `orderId` (which would have been retrieved by the merchant outside the SDK) #### Swift Interface ```swift= public protocol PayPalClientDelegate { // Invoked when a transaction is approved by the // user and ready for authorization or capture by // the merchant func paypalDidApprove(client: PayPalClient, data: ApprovalData) // Invoked when the checkout experience has been canceled func paypalDidCancel(client: PayPalClient) // Invoked when the SDK encounters an unrecoverable error func paypalDidError(client: PayPalClient, error: PayPalError) // Invoked when the user wants to change the shipping or // pickup information. Requires merchant response to // confirm the new selection func paypalShippingChange(client: PayPalClient, ...) } public class PayPalClient { public weak var delegate: PayPalClientDelegate? public init(config: PaymentsConfig) { ... } public func checkout(orderId: String) { } public func checkout(billingAgreement: String) { } } let config = PaymentsConfig(clientId: "", returnUrl: "") let client = PayPalClient(config: config) client.delegate = self client.checkout(orderId) ``` #### Kotlin Interface ```kotlin= interface PayPalClientListener { fun onPayPalApprove(data: ApprovalData) fun onPayPalCancel() fun onPayPalError(error: PayPalError) fun onPayPalShippingChange(...) } class PayPalClient(val config: PaymentsConfig) { var listener: PayPalClientListener? = null fun checkout(orderId: String) { } fun checkout(billingAgreement: String) { } } val config = PaymentsConfig(clientId = "", returnUrl = "") val client = PayPalClient(config = config) ``` ### Improvements - Fetch merchant configuration from a PayPal backend and infer `returnUrl` to reduce the number of parameters needed when constructing a `PayPalClient` ----