# Apple Pay

* Web
* Native iOS App

## Web Integration[​](#web-integration "Direct link to Web Integration")

You can start accepting Apple Pay payments on the Web using [Hosted Payment Page](https://docs.monei.com/integrations/use-prebuilt-payment-page/.md) or [Payment Request Component](https://docs.monei.com/monei-js/reference/.md#paymentrequest-component). No additional configuration is required to use Apple Pay in Hosted Payment Page.

Our [Payment Request Component](https://docs.monei.com/monei-js/reference/.md#paymentrequest-component) gives you a single integration for Apple Pay and Google Pay. Customers see a Google Pay or an Apple Pay button, depending on what their device and browser combination supports.

info

Open this page in Safari to see the Apple Pay button.

If you prefer to integrate directly against the Apple Pay API, follow the [direct API integration guide](#direct-api-integration) below.

### Register your domain with Apple Pay[​](#register-your-domain-with-apple-pay "Direct link to Register your domain with Apple Pay")

If you are using [WooCommerce Plugin](https://docs.monei.com/e-commerce/woocommerce/.md) or [custom domain](https://dashboard.monei.com/settings/custom-domain) with [MONEI Hosted Payment Page](https://docs.monei.com/integrations/use-prebuilt-payment-page/.md) your domain is verified automatically.

To register your domain with Apple, you will need to first verify your ownership of the domain. Go to your [MONEI Dashboard → Settings → Payment Methods](https://dashboard.monei.com/settings/payment-methods), choose **Register domain with Apple** and follow the instructions in the popup.

You can also verify your domain with Apple using [MONEI REST API](https://docs.monei.com/apis/rest/apple-pay-domain-register/.md).

### Express Checkout[​](#express-checkout "Direct link to Express Checkout")

Use express checkout to collect shipping and billing addresses directly in the Apple Pay payment sheet. See the [Express Checkout guide](https://docs.monei.com/integrations/express-checkout/.md) for setup and examples.

### Direct API Integration[​](#direct-api-integration "Direct link to Direct API Integration")

Before you start, you need to:

* Add a card to your Wallet for Safari.
* Serve your application over HTTPS. This is a requirement both in development and in production. One way to get up and running is to use a service like [ngrok](https://ngrok.com/).
* [Register your domain with Apple Pay](#register-your-domain-with-apple-pay), both in development and production.
* Follow [Apples's instructions](https://developer.apple.com/documentation/apple_pay_on_the_web).

Include `monei.js` on your checkout page by adding the script tag to the `head` of your HTML file.

checkout.html

```
<head>

  <title>Checkout</title>

  <script src="https://js.monei.com/v3/monei.js"></script>

</head>
```

Create Apple Pay Session

```
const session = new window.ApplePaySession(3, request);

session.onvalidatemerchant = async (event: any) => {

  try {

    const merchantSession = await monei.api.createApplePaySession({

      accountId: 'MONEI_ACCOUNT_ID',

      displayName: 'Test Merchant',

      domainName: 'example.com',

      validationUrl: event.validationURL

    });

    session.completeMerchantValidation(merchantSession);

  } catch (error) {

    session.abort();

  }

};
```

Exchange Apple Pay token for MONEI Payment Token that can be used to confirm payment.

```
session.onpaymentauthorized = async (event) => {

  // Encode Apple Pay token as a base64 string

  const paymentToken = JSON.stringify(event.payment.token);

  const token = window.btoa(paymentToken);

  try {

    const result = await monei.api.createToken({

      paymentId: '{{payment_id}}',

      paymentMethod: {

        applePay: {token}

      }

    });

    session.completePayment({

      status: window.ApplePaySession.STATUS_SUCCESS

    });

    return moneiTokenHandler(result.paymentToken);

  } catch (error) {

    session.completePayment({

      status: window.ApplePaySession.STATUS_FAILURE

    });

  }

};

session.begin();
```

### Confirm the Payment[​](#confirm-the-payment "Direct link to Confirm the Payment")

After you have obtained the MONEI Payment Token, you can confirm the payment using the token.

```
async function moneiTokenHandler(token) {

  try {

    const result = await monei.confirmPayment({

      paymentId: '{{payment_id}}',

      paymentToken: token

    });

    // At this moment you can show a customer the payment result

    // But you should always rely on the result passed to the callback endpoint

    // on your server to update the order status

    console.log(result);

  } catch (error) {

    console.error(error);

  }

}
```

## Native iOS App Integration[​](#native-ios-app-integration "Direct link to Native iOS App Integration")

If you're building a native iOS application with Apple Pay, you need to create a custom Apple Pay Payment Processing Certificate. This certificate allows your app to decrypt Apple Pay tokens and process payments through MONEI.

### Create a Custom Certificate[​](#create-a-custom-certificate "Direct link to Create a Custom Certificate")

1. Go to [Apple Pay Certificates Settings](https://dashboard.monei.com/settings/apple-pay-certificates) in your MONEI Dashboard
2. Click **Create certificate** to generate a Certificate Signing Request (CSR)
3. Download the CSR file
4. Go to [Apple Developer Portal - Certificates](https://developer.apple.com/account/resources/certificates/list)
5. Click the **+** button to create a new certificate
6. Select **Apple Pay Payment Processing Certificate**
7. Select your Merchant ID and click Continue
8. Upload the CSR file you downloaded from MONEI
9. Download the generated certificate (.cer file)
10. Return to [MONEI Dashboard](https://dashboard.monei.com/settings/apple-pay-certificates) and upload the certificate to activate it

info

The private key is securely generated and stored by MONEI. You never need to handle private keys directly.

### Initialize Apple Pay[​](#initialize-apple-pay "Direct link to Initialize Apple Pay")

Create your `PKPaymentRequest` in Swift. The `merchantIdentifier` is provided by MONEI - obtain it from the [Get PaymentMethods](https://docs.monei.com/apis/rest/payment-methods-get/.md) API under `metadata.applePay.merchantId` (both test and production: `merchant.com.monei`):

```
let paymentRequest = PKPaymentRequest()

paymentRequest.merchantIdentifier = "merchant.com.monei" // From MONEI API

paymentRequest.countryCode = "ES"

paymentRequest.currencyCode = "EUR"

paymentRequest.supportedNetworks = [.visa, .masterCard, .amex]

paymentRequest.merchantCapabilities = .capability3DS

paymentRequest.paymentSummaryItems = [

    PKPaymentSummaryItem(label: "Your Store Name", amount: NSDecimalNumber(value: 10.00))

]
```

### Process Payments[​](#process-payments "Direct link to Process Payments")

Once the user authorizes the payment, you'll receive a `PKPayment` object. Send the payment token to your backend, then use the MONEI API to process it:

1. Base64 encode the Apple Pay token from `payment.token.paymentData`
2. Create a MONEI payment token using the Create Token API
3. Confirm the payment using the token

```
// In your PKPaymentAuthorizationViewControllerDelegate

func paymentAuthorizationViewController(

    _ controller: PKPaymentAuthorizationViewController,

    didAuthorizePayment payment: PKPayment,

    handler completion: @escaping (PKPaymentAuthorizationResult) -> Void

) {

    // Send payment.token.paymentData to your backend

    let tokenData = payment.token.paymentData.base64EncodedString()

    // Your backend calls MONEI API to process the payment

}
```

On your backend, exchange the Apple Pay token for a MONEI payment token and confirm the payment.

## Before you go live[​](#before-you-go-live "Direct link to Before you go live")

* Make sure that you are using [live (production) mode](https://docs.monei.com/testing/.md) Account ID and API Key.
* Make sure that you have at least one [enabled card processor](https://dashboard.monei.com/settings/payment-methods/card).
* Contact our [Support Team](https://support.monei.com/hc/requests/new) to configure Apple Pay in production.
