# Apple Pay

Permettez aux clients d’effectuer des paiements en toute sécurité avec Apple Pay sur leur appareil Apple.

Apple Pay est un wallet qui permet aux clients de payer avec une carte bancaire sauvegardée sur leur appareil Apple au lieu de saisir manuellement leurs informations de carte. Les clients peuvent payer avec Apple Pay sur leur iPhone, iPad, Mac ou Apple Watch. Consultez la [documentation d’Apple sur la compatibilité](https://support.apple.com/en-us/HT208531) pour obtenir la liste complète des appareils pris en charge.

Pour Payment Links ou Checkout hébergé, Apple Pay fonctionne sans configuration supplémentaire. Pour Elements ou Checkout intégré, vous devez enregistrer votre domaine pour qu’Apple Pay fonctionne. Les paiements in-app nécessitent des modifications de configuration supplémentaires.

#### Propriétés du moyen de paiement

- **Localisation des clients**

  Dans le monde entier1

- **Devise de présentation**

  Voir [Devises de présentation prises en charge](https://docs.stripe.com/currencies.md#presentment-currencies)

- **Confirmation du paiement**

  Initié par le client

- **Catégorie de moyens de paiement**

  Portefeuille

- **Paiements récurrents**

  [Oui](https://docs.stripe.com/apple-pay.md#recurring-payments)

- **Délai de virement**

  Les délais de virement standard s’appliquent

- **Prise en charge de Connect**

  Oui

- **Prise en charge des litiges**

  [Oui](https://docs.stripe.com/apple-pay/disputes-refunds.md#disputed-payments)

- **Prise en charge des captures manuelles**

  Oui

- **Remboursements complets/partiels**

  [Oui/oui](https://docs.stripe.com/apple-pay/disputes-refunds.md#refunds)

1 La prise en charge des paiements récurrents avec Apple Pay pour les clients indiens sera bientôt disponible.

#### Pays pris en charge

Les comptes Stripe du monde entier peuvent accepter les paiements Apple Pay avec règlement dans la devise locale.

#### Prise en charge des produits

- Connect
- Checkout1

- Payment Links
- Elements
- Subscriptions
- Invoicing

1Lorsque le paramètre [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) de Checkout est défini sur `embedded_page`, cette fonctionnalité est uniquement prise en charge à partir de Safari&nbsp;17 et d’iOS 17.

## Règles d’achat in-app de l’App Store pour Apple Pay

Ce guide explique comment configurer votre application pour accepter directement Apple Pay pour des biens physiques, des services et d’autres articles éligibles. Stripe traite ces paiements, et vous ne payez que les [frais de traitement](https://stripe.com/pricing) Stripe.

Pour les produits numériques, le contenu et les abonnements vendus aux États-Unis ou dans l’Espace économique européen (EEE), votre application iOS peut accepter Apple Pay en redirigeant vers une page de paiement externe. Vous pouvez utiliser les interfaces de paiement suivantes&nbsp;:

- [Stripe Checkout](https://docs.stripe.com/mobile/digital-goods/checkout.md)
- [Web Elements](https://docs.stripe.com/mobile/digital-goods/custom-checkout.md)
- [Payment Links](https://docs.stripe.com/mobile/digital-goods/payment-links.md) (idéal pour un nombre limité de produits et de prix)

Dans les autres régions, votre application iOS ne peut pas accepter Apple Pay pour les produits numériques, le contenu ou les abonnements.

## Accepter Apple Pay

Stripe met à votre disposition différentes méthodes pour ajouter Apple Pay aux moyens de paiement que vous proposez. Pour plus d’informations sur l’intégration à mettre en place, sélectionnez la méthode qui vous intéresse&nbsp;:

# iOS React Native


Utilisez le [SDK React Native](https://github.com/stripe/stripe-react-native) de Stripe pour accepter à la fois Apple Pay et les paiements par carte bancaire classiques. Avant de commencer, inscrivez-vous à l’[Apple Developer Program](https://developer.apple.com/programs/) et [configurez Stripe sur votre serveur et dans votre application](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=react-native#react-native-setup). Ensuite, [enregistrez-vous pour obtenir un identifiant de commerçant Apple](https://docs.stripe.com/apple-pay.md#merchantid) et [créez un nouveau certificat Apple Pay](https://docs.stripe.com/apple-pay.md#csr).

1. [Réaliser une intégration avec Xcode](https://docs.stripe.com/apple-pay.md#xcode-pay)
2. [Configurer votre ID de marchand Apple dans StripeProvider](https://docs.stripe.com/apple-pay.md#set-merchantid)
3. [Vérifier si Apple Pay est pris en charge](https://docs.stripe.com/apple-pay.md#check-if-apple-pay-supported)
4. [Présenter le formulaire de paiement](https://docs.stripe.com/apple-pay.md#present-payment-sheet)
5. [Envoyer le paiement à Stripe](https://docs.stripe.com/apple-pay.md#handle-payment)

> Si vous utilisez React Native et Expo, Expo Go ne prend pas en charge Apple Pay. Pour utiliser Apple Pay avec Expo, vous devez créer une [version de développement](https://docs.expo.dev/get-started/set-up-your-environment/?mode=development-build&platform=ios). Si vous avez déjà un projet Expo Go, vous pouvez le [migrer vers une version de développement](https://docs.expo.dev/develop/development-builds/expo-go-to-dev-build/).

## Demander un ID de marchand Apple

Pour obtenir un ID de marchand Apple, [demandez un nouvel identifiant](https://developer.apple.com/account/resources/identifiers/add/merchant) sur le site Web Apple Developer.

Renseignez le formulaire en indiquant une description et un identifiant. La description n’est destinée qu’à votre propre information et vous pourrez la modifier ultérieurement au besoin. En ce qui concerne l’identifiant, Stripe vous recommande d’utiliser le nom de votre application (par exemple, `merchant.com.{{YOUR_APP_NAME}}`).

## Créer un certificat Apple&nbsp;Pay

Créez un certificat permettant à votre application de chiffrer les données de paiement.

Accédez aux [paramètres des certificats iOS](https://dashboard.stripe.com/settings/ios_certificates) dans le Dashboard, cliquez sur **Ajouter une nouvelle application** et suivez le guide.

Téléchargez un fichier CSR (Certificate Signing Request) pour obtenir d’Apple un certificat sécurisé vous autorisant à utiliser Apple&nbsp;Pay.

Un fichier CSR peut émettre exactement un certificat. Si vous changez d’ID de marchand Apple, vous devez accéder aux [paramètres des certificats iOS](https://dashboard.stripe.com/settings/ios_certificates) dans le Dashboard pour obtenir un nouveau fichier CSR et un nouveau certificat.

## Réaliser une intégration avec Xcode

Ajoutez la fonctionnalité Apple&nbsp;Pay à votre application. Dans Xcode, ouvrez vos paramètres de projet, cliquez sur l’onglet **Signature et fonctionnalités**, puis ajoutez **Apple&nbsp;Pay**. Vous serez peut-être alors invité(e) à vous connecter à votre compte développeur. Sélectionnez l’ID du marchand créé plus tôt. Il est désormais possible d’utiliser Apple&nbsp;Pay sur votre application.
![](https://b.stripecdn.com/docs-statics-srv/assets/xcode.a701d4c1922d19985e9c614a6f105bf1.png)

Activez la fonctionnalité Apple&nbsp;Pay dans Xcode

## Configurer votre ID de marchand Apple dans StripeProvider

Dans le composant `StripeProvider`, spécifiez l’ID de marchand Apple avec lequel vous venez de vous inscrire&nbsp;:

```jsx
import { StripeProvider } from '@stripe/stripe-react-native';

function App() {
  return (
    <StripeProvider
      publishableKey="<<YOUR_PUBLISHABLE_KEY>>"
      merchantIdentifier="merchant.com.{{YOUR_APP_NAME}}"
    >
      {/* Your app code here */}
    </StripeProvider>
  );
}
```

## Vérifier si Apple Pay est pris en charge

Avant d’afficher Apple Pay comme option de paiement dans votre application, déterminez si l’appareil de l’utilisateur prend en charge Apple Pay et s’il a ajouté une carte bancaire à son portefeuille&nbsp;:

```jsx
import { PlatformPayButton, isPlatformPaySupported } from '@stripe/stripe-react-native';

function PaymentScreen() {
  const [isApplePaySupported, setIsApplePaySupported] = useState(false);

  useEffect(() => {
    (async function () {
      setIsApplePaySupported(await isPlatformPaySupported());
    })();
  }, [isPlatformPaySupported]);

  // ...

  const pay = async () => {
    // ...
  };

  // ...

  return (
    <View>
      {isApplePaySupported && (
        <PlatformPayButton
          onPress={pay}
          type={PlatformPay.ButtonType.Order}
          appearance={PlatformPay.ButtonStyle.Black}
          borderRadius={4}
          style={{
            width: '100%',
            height: 50,
          }}
        />
      )}
    </View>
  );
}
```

## Créer le PaymentIntent

### Côté serveur

Créez un endpoint qui génère un PaymentIntent avec un [montant](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount) et une [devise](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-currency). Décidez toujours du montant à débiter côté serveur, un environnement sécurisé, à la différence du côté client. Cette précaution empêchera les éventuels clients malveillants de fixer leurs propres tarifs.

#### curl

```bash
curl https://api.stripe.com/v1/payment_intents \
  -u <<YOUR_SECRET_KEY>>: \
  -d "amount"=1099 \
  -d "currency"="usd"
```

### Côté client

Créez une méthode qui demande un PaymentIntent depuis votre serveur&nbsp;:

```jsx
function PaymentScreen() {
  // ...
  const fetchPaymentIntentClientSecret = async () => {
    const response = await fetch(`${API_URL}/create-payment-intent`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        some: 'value',
      }),
    });
    const { clientSecret } = await response.json();

    return clientSecret;
  };
  // ...
}
```

### Résolution des problèmes

Si l’API Stripe génère des erreurs lors de la tentative de création de tokens, il est probable que votre certificat Apple Pay pose problème. Solution&nbsp;: générer un nouveau certificat et l’envoyer à Stripe, comme expliqué sur cette page. Veillez à utiliser une demande de signature de certificat (CSR) obtenue depuis votre Dashboard et non pas une CSR que vous avez générée vous-même. Xcode met souvent en cache de manière incorrecte d’anciens certificats. En plus de générer un nouveau certificat, Stripe vous recommande donc de créer aussi un nouvel ID de marchand Apple.

Si vous recevez l’erreur&nbsp;:

> Vous n’avez pas ajouté votre compte de marchand Apple à Stripe

Il est probable que votre application envoie des données chiffrées avec une ancienne CSR/un ancien certificat (non générés par Stripe). Vérifiez que tout certificat généré par des CSR autres que Stripe est révoqué pour votre ID de marchand Apple. Si cette mesure ne résout pas le problème, supprimez l’ID de marchand dans votre compte Apple et recréez-le. Ensuite, créez un nouveau certificat basé sur la même CSR (fournie par Stripe) que celle utilisée précédemment. Vous n’avez pas besoin de charger ce nouveau certificat sur Stripe. Une fois ces opérations effectuées, désactivez les identifiants Apple Pay dans votre application et réactivez-les pour vous assurer qu’ils sont bien actualisés.

## Présenter le formulaire de paiement

Dans la propriété `onPress` de [PlatformPayButton](https://stripe.dev/stripe-react-native/api-reference/index.html#PlatformPayButton), appelez `confirmPlatformPayPayment` pour ouvrir une feuille de paiement Apple Pay. Pour afficher les articles du panier du client sur la feuille de paiement, passez les articles en argument. Le dernier article doit représenter votre entreprise et le total&nbsp;; il s’affiche dans la feuille précédé du mot «&nbsp;Payer&nbsp;» (par exemple, «&nbsp;Payer iHats, Inc. 50&nbsp;USD&nbsp;»).

> Dans votre code qui gère l’action du client, n’incluez aucune action complexe ou asynchrone avant d’afficher le formulaire de paiement. Si l’action de l’utilisateur n’invoque pas directement le formulaire de paiement, Apple&nbsp;Pay renvoie une erreur.

```jsx
import { confirmPlatformPayPayment } from '@stripe/stripe-react-native';

function PaymentScreen() {
  // ... see above

  const pay = async () => {
    const clientSecret = await fetchPaymentIntentClientSecret()
    const { error, paymentIntent } = await confirmPlatformPayPayment(
      clientSecret,
      {
        applePay: {
          cartItems: [
            {
              label: 'Example item name',
              amount: '14.00',
              paymentType: PlatformPay.PaymentType.Immediate,
            },
            {
              label: 'Tax',
              amount: '1.60',
              paymentType: PlatformPay.PaymentType.Immediate,
            },
            {
              label: 'iHats, Inc.',
              amount: '15.60',
              paymentType: PlatformPay.PaymentType.Immediate,
            },
          ],
          merchantCountryCode: 'US',
          currencyCode: 'USD',
          requiredShippingAddressFields: [
            PlatformPay.ContactField.PostalAddress,
          ],
          requiredBillingContactFields: [PlatformPay.ContactField.PhoneNumber],
        },
      }
    );
    if (error) {
      // handle error
    } else {
      Alert.alert('Success', 'Check the logs for payment intent details.');
      console.log(JSON.stringify(paymentIntent, null, 2));
    }
  };

  // ... see above
}
```

## Optional: Créer un moyen de paiement [Côté client]

Si vous confirmez votre paiement sur votre serveur, vous pouvez utiliser Apple Pay uniquement pour collecter un `PaymentMethod` au lieu de confirmer un paiement. Pour ce faire, appelez la méthode `createPlatformPayPaymentMethod`&nbsp;:

```javascript
import {PlatformPayButton, isPlatformPaySupported, createPlatformPayPaymentMethod} from '@stripe/stripe-react-native';

function PaymentScreen() {
  const [isApplePaySupported, setIsApplePaySupported] = useState(false);

  useEffect(() => {
    (async function () {
      setIsApplePaySupported(await isPlatformPaySupported());
    })();
  }, [isPlatformPaySupported]);

  const createPaymentMethod = async () => {
    const { error, paymentMethod } = await createPlatformPayPaymentMethod({
      applePay: {
        cartItems: [
          {
            label: 'Example item name',
            amount: '14.00',
            paymentType: PlatformPay.PaymentType.Immediate,
          },
          {
            label: 'Total',
            amount: '12.75',
            paymentType: PlatformPay.PaymentType.Immediate,
          },
        ],
        merchantCountryCode: 'US',
        currencyCode: 'USD',
      },
    });

    if (error) {
      Alert.alert(error.code, error.message);
      return;
    } else if (paymentMethod) {
      Alert.alert(
        'Success',
        `The payment method was created successfully. paymentMethodId: ${paymentMethod.id}`
      );
    }
  };

  return (
    <View >
      {isApplePaySupported && (
        <PlatformPayButton
          onPress={createPaymentMethod}
          type={PlatformPay.ButtonType.SetUp}
          appearance={PlatformPay.ButtonStyle.WhiteOutline}
          style={{
            width: '65%',
            height: 50,
          }}
        />
      )}
    </View>
  );
}
```

## Optional: Paiements récurrents [Côté client]

Sur iOS&nbsp;16 ou les versions ultérieures, vous pouvez adopter des [tokens de marchand](https://developer.apple.com/apple-pay/merchant-tokens/) en définissant le champ `request` dans `confirmPlatformPayPayment()` et et l’objet de paramètres `applePay` de `confirmPlatformPaySetupIntent`.

```js
await confirmPlatformPayPayment(
  clientSecret,
  {
    applePay: {
      // Make sure to include the rest of the necessary fields
      request: {
        type: PlatformPay.PaymentRequestType.Recurring,
        description: 'String describing my payment',
        managementUrl:
          'www.<a URL where the user can update the payment method for the recurring payment>.com',
        billing: {
          paymentType: PlatformPay.PaymentType.Recurring,
          intervalUnit: PlatformPay.IntervalUnit.Month,
          intervalCount: 3,
          label: 'My label',
          amount: '39.00',
        },
      },
    },
  }
);
```

Pour en savoir plus sur l’utilisation des paiements récurrents avec Apple&nbsp;Pay, consultez la [documentation d’Apple sur PassKit](https://developer.apple.com/documentation/passkit/pkpaymentrequest).

## Optional: Suivi des commandes [Côté client]

Pour utiliser le [suivi de commande](https://developer.apple.com/design/human-interface-guidelines/technologies/wallet/designing-order-tracking) sur iOS&nbsp;16 ou les versions ultérieures, utilisez le rappel `setOrderTracking` pour le composant `PlatformPayButton`.

Dans votre implémentation&nbsp;:

1. Récupérez les détails de la commande terminée sur votre serveur.
2. Appelez le gestionnaire d’exécution fourni dans `setOrderTracking` avec les résultats de votre serveur.

```jsx
<PlatformPayButton
  // Make sure to include the rest of the necessary props
  setOrderTracking={(completion) => {
    const { orderIdentifier, orderType, authToken, webServiceUrl } =
      fetchOrderDetailsFromMyBackend();
    completion(orderIdentifier, orderType, authToken, webServiceUrl);
  }}
/>
```

Pour en savoir plus sur le suivi des commandes, consultez la [documentation d’Apple sur les commandes Wallet](https://developer.apple.com/documentation/walletorders).


## Tester Apple&nbsp;Pay

Pour tester Apple Pay, vous devez utiliser un vrai numéro de carte et vos clés [API de test](https://docs.stripe.com/keys.md). Stripe reconnaît que vous êtes en mode test et renvoie un token de carte de test que vous pouvez utiliser afin d’effectuer des paiements de test sur une carte active sans la débiter.

Vous ne pouvez pas enregistrer les [cartes de test Stripe](https://docs.stripe.com/testing.md#use-test-cards) ou les [cartes de test Apple](https://developer.apple.com/apple-pay/sandbox-testing/) dans les wallets Apple Pay pour tester Apple Pay.

## See also

- [Intégration iOS](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios)
- [Apple&nbsp;Pay sur le Web](https://docs.stripe.com/elements/express-checkout-element.md)
- [Bonnes pratiques pour Apple&nbsp;Pay](https://docs.stripe.com/apple-pay/best-practices.md)
