> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mattildapayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Apple Pay on iOS without the SDK

It is possible to use Apple Pay in an iOS app without our SDK. To learn how to integrate
Apple Pay we recommend following Apple's [documentation][documentation].

The steps below will highlight the basics and focus on the interaction with our API. A full [sample
app][documentation] is available in Apple's developer documentation.

## About this integration

Similar to our SDK integration this setup requires you to perform the following steps.

* Enable Apple Pay in your merchant dashboard.
* Sign up for an Apple Pay Developer account and [register a payment processing certificate](/guides/features/apple-pay/ios#register-a-certificate).
* [Add the merchant ID](/guides/features/apple-pay/ios#add-the-certificate-to-your-app) and its processing certificate to your app.

Additionally, you will then need to implement the following.

* Render your own Apple Pay button.
* Create a session with the right merchant ID.
* Catch the Apple Pay token and pass it to our API for processing.

## Enable Apple Pay

To enable Apple Pay, head over to your dashboard and then go to
**Connections** -> **Catalog** -> **Apple Pay**.

Next, complete and submit the form to create a new Apple Pay service.

### Register a certificate

To process Apple Pay in a mobile application you will need to register for an
Apple Pay developer account and join the [Apple developer program](https://developer.apple.com/programs/).

Once set up, you can generate a new Apple Pay processing certificate using the Gr4vy dashboard.

Go to
**Connections** -> **Apple Pay** -> **Certificates** and click on **Add certificate**
to start the process.

<img src="https://mintlify.s3.us-west-1.amazonaws.com/mattilda/assets/images/apple-pay/new-certificate.png" alt="Apple Pay: Add a new certificate" />

You will be prompted to provide a name and download a **Certificate Signing Request** (CSR).

Next, visit the [Apple developer dashboard](https://developer.apple.com/account/resources/identifiers/list/merchant)
to generate a payment processing certificate.

* Create or select a **Merchant ID** to associate a payment processing certificate with.
* In the **Apple Pay Payment Processing Certificate** section click on **Create Certificate**.
* Select **Choose File** to upload the CSR you downloaded from the dashboard, and then Continue.
* Verify the certificate details and **Download** the signed certificate from Apple.

Next, go back to our dashboard and upload the signed certificate.

### Add the certificate to your app

In order for your app to accept Apple Pay, you must set the same Apple **Merchant ID** in your application.
In your Xcode project find the **Signing & Capabilities** in your project editor.

Select the same **Merchant ID** you used to register your payment certificate. Please ensure your provisioning profiles
and signing certificates are updated to contain this ID.

## Integrate Apple Pay

<Tabs>
  <Tab title="Swift">
    ### Display an Apple Pay button

    An Apple Pay button can be displayed in a few different ways. [Apple's guide](https://developer.apple.com/documentation/passkit/apple_pay/offering_apple_pay_in_your_app#3846467)
    shows a code sample that checks if Apple Pay is enabled on the device and then adds the button directly to a view with code.

    ```swift theme={"dark"}
    if let applePayButton = button {
        let constraints = [
            applePayButton.centerXAnchor.constraint(equalTo: applePayView.centerXAnchor),
            applePayButton.centerYAnchor.constraint(equalTo: applePayView.centerYAnchor)
        ]
        applePayButton.translatesAutoresizingMaskIntoConstraints = false
        applePayView.addSubview(applePayButton)
        NSLayoutConstraint.activate(constraints)
    }
    ```

    <Warning>
      The sample app doesn't display the add button if a device can't accept
      payments due to hardware limitations, parental controls, or any other reasons.
    </Warning>

    ### Set the merchant ID

    Once the button is clicked the guide requires you to set up a new payment request. In this step, set the
    `merchantIdentifier` to the merchant ID for the Apple Pay certificate you've [registered in our merchant dashboard](/guides/features/apple-pay/ios#enabling-apple-pay).

    For example, if you registered a certificate for merchant ID `merchant.com.example.demo` in the dashboard then set this same ID in your application code.

    ```swift theme={"dark"}
    let paymentRequest = PKPaymentRequest()
    paymentRequest.paymentSummaryItems = paymentSummaryItems
    paymentRequest.merchantIdentifier = "merchant.com.example.demo"
    ...
    ```

    <Tip>
      Apple's documentation has an [extensive
      guide](https://developer.apple.com/documentation/passkit/apple_pay/setting_up_apple_pay)
      on setting up your iOS app to accept Apple Pay.
    </Tip>

    ### Create a transaction

    Finally, once the Apple Pay transaction has been authorized by Apple, create a transaction with our API.

    <Note>
      This API call could be made in your frontend code in Swift or Objective C, or
      the token could be sent to your backend for processing.
    </Note>

    ```sh theme={"dark"}
    curl -X POST https://api.mattildapayments.com/transactions \
      -H "Authorization: bearer [JWT]"
      -d '{
            amount: 1299,
            currency: "MX",
            currency: "MXN",
            payment_method: {
               method: "applepay",
               token: "[TOKEN]"
            }
       }'
    ```

    <Note>
      In this example, the `[TOKEN]` value is the token from the [PKPayment](https://developer.apple.com/documentation/passkit/pkpayment) object as returned by Apple Pay
      in the `paymentAuthorizationController(_:didAuthorizePayment:handler:)` method.
    </Note>
  </Tab>

  <Tab title="React Native">
    In React Native you can use any Apple Pay integration, together with your merchant identifier.
    One of the easiest solutions is to use a library like [React Native Payments](https://github.com/appfolio/react-native-payments) to get
    an Apple Pay token.

    On initialization, any of these libraries will require you to set the Apple merchant identifier that
    you created in the Apple developer dashboard earlier.

    ```js theme={"dark"}
    const METHOD_DATA = [{
      supportedMethods: ['apple-pay'],
      data: {
        merchantIdentifier: 'merchant.com.your-app.namespace',
        supportedNetworks: ['visa', 'mastercard', 'amex'],
        countryCode: 'AU',
        currencyCode: 'AUD'
      }
    }];
    ```

    Once the user has approved the payment, your application will receive an Apple Pay token from the library.

    You can pass this library to our server for processing.

    ```js theme={"dark"}
    paymentRequest.show()
      .then(paymentResponse => {
        const { paymentData } = paymentResponse.details;

        return fetch('https://api.mattildapayments.com/transactions', {
          method: 'POST',
          headers: {
            "Authorization": "Bearer [TOKEN]"
          },
          body: {
            amount: 1299,
            currency: "MX",
            currency: "MXN",
            payment_method: {
               method: "applepay",
               token: paymentData
            }
          }
        })
        .then(res => res.json())
        .then(successHandler)
        .catch(errorHandler)
        
      });
    ```
  </Tab>
</Tabs>

<Snippet file="apple-pay/common-issues-ios.mdx" />

[documentation]: https://developer.apple.com/documentation/passkit/apple_pay/offering_apple_pay_in_your_app
