Aller au contenu

ApplePay

Apple Pay confirme un PaymentIntent en une seule présentation.

https://stripe.com/docs/apple-payhttps://stripe.com/docs/apple-pay

Image provenant de Gyazo

Prise en charge des plateformes

Plateforme Apple Pay
iOS STPApplePayContext natif
Android Non implémenté
Web Payment Request Button (stripe-pwa-elements)

updateApplePaySheet et les mises à jour du contact de livraison fonctionnent uniquement sur iOS. Sur le Web, updateApplePaySheet lève une erreur indiquant que la méthode n’est pas implémentée. Android rejette isApplePayAvailable, createApplePay et presentApplePay.

Préparer les paramètres

  • Enregistrer un Apple Merchant ID
  • Créer un certificat Apple Pay
  • Activer Apple Pay dans Xcode

https://stripe.com/docs/apple-pay#merchantidhttps://stripe.com/docs/apple-pay#merchantid

Le merchantIdentifier de createApplePay doit être l’identifiant marchand enregistré dans le compte Apple Developer et dans Xcode. Ne passez pas merchantDisplayName ici ; cette option appartient à PaymentSheet et PaymentFlow.

1. isApplePayAvailable

Vérifiez l’appareil avant de créer une demande. La Promise est résolue si Apple Pay est disponible et rejetée sinon.

import { ApplePayEventsEnum, Stripe } from '@capacitor-community/stripe';

try {
  await Stripe.isApplePayAvailable();
} catch {
  return;
}

method isApplePayAvailable()

Se résout lorsqu’Apple Pay est disponible et est rejeté lorsqu’il ne l’est pas.
Apple Pay est pris en charge sur iOS et les navigateurs Web compatibles, mais pas sur Android.

isApplePayAvailable() => Promise<void>

2. createApplePay

Récupérez un secret client de PaymentIntent depuis votre backend. Remplacez /your-intent-endpoint dans l’exemple par l’URL du backend présentée dans Intégration serveur. Passez ensuite paymentIntentClientSecret, paymentSummaryItems, merchantIdentifier, countryCode et currency.

// Remplacez `/your-intent-endpoint` par votre backend décrit dans Intégration serveur.
const response = await fetch('/your-intent-endpoint', {
  method: 'POST',
});
if (!response.ok) {
  throw new Error(`Intent request failed: ${response.status}`);
}
const { paymentIntent } = (await response.json()) as {
  paymentIntent: string;
};

await Stripe.createApplePay({
  paymentIntentClientSecret: paymentIntent,
  paymentSummaryItems: [{
    label: 'Product Name',
    amount: 1099.00
  }],
  merchantIdentifier: 'merchant.com.getcapacitor.stripe',
  countryCode: 'US',
  currency: 'USD',
});

method createApplePay(...)

Crée une demande Apple Pay. Appelez cette méthode avant presentApplePay().

createApplePay(options: CreateApplePayOption) => Promise<void>

interface CreateApplePayOption

Propriété Type Description Depuis
paymentIntentClientSecret string Secret client du PaymentIntent à confirmer avec Apple Pay. 3.1.0
paymentSummaryItems PaymentSummaryItem[] Lignes affichées dans la feuille Apple Pay. 3.1.0
merchantIdentifier string Identifiant de commerçant Apple configuré pour l’application. 3.1.0
countryCode string Code de pays ISO 3166-1 à deux lettres pour la demande de paiement. 3.1.0
currency string Code de devise ISO 4217 à trois lettres pour la demande de paiement. 3.1.0
requiredShippingContactFields ('postalAddress' | 'phoneNumber' | 'emailAddress' | 'name')[] Champs du contact de livraison qu’Apple Pay doit recueillir. iOS uniquement. 4.1.0
allowedCountries string[] Codes de pays à deux lettres acceptés pour la livraison. iOS uniquement. 5.4.3
allowedCountriesErrorDescription string Message affiché lorsque le pays de livraison choisi n’est pas autorisé. iOS uniquement. 5.4.3

requiredShippingContactFields demande à Apple Pay l’adresse postale, le téléphone, l’e-mail ou le nom. allowedCountries refuse les pays de livraison qui ne figurent pas dans la liste.

3. presentApplePay

const result = await Stripe.presentApplePay();
if (result.paymentResult === ApplePayEventsEnum.Completed) {
  // Mettez uniquement l’interface à jour. Confirmez l’Intent par webhook avant d’exécuter la commande.
}

method presentApplePay()

Présente la demande Apple Pay créée par createApplePay().

presentApplePay() => Promise<{ paymentResult: ApplePayResultInterface; }>

type alias ApplePayResultInterface

ApplePayEventsEnum.Completed | ApplePayEventsEnum.Canceled | ApplePayEventsEnum.Failed | ApplePayEventsEnum.DidSelectShippingContact | ApplePayEventsEnum.DidCreatePaymentMethod

Traitez Canceled comme une annulation et Failed comme une erreur.

4. addListener

Enregistrez les écouteurs au démarrage de l’application. Consultez Écouteurs d’événements.

Stripe.addListener(ApplePayEventsEnum.Completed, () => {
  console.log('ApplePayEventsEnum.Completed');
});

enum ApplePayEventsEnum

Membre Valeur
Loaded 'applePayLoaded'
FailedToLoad 'applePayFailedToLoad'
Completed 'applePayCompleted'
Canceled 'applePayCanceled'
Failed 'applePayFailed'
DidSelectShippingContact 'applePayDidSelectShippingContact'
DidCreatePaymentMethod 'applePayDidCreatePaymentMethod'

5. updateApplePaySheet

Sur iOS, DidSelectShippingContact contient contact et updateId. Recalculez les totaux et appelez updateApplePaySheet avec cet updateId. Si JavaScript ne répond pas, la feuille native revient aux éléments de récapitulatif initiaux au bout de 25 secondes.

Stripe.addListener(ApplePayEventsEnum.DidSelectShippingContact, async (data) => {
  await Stripe.updateApplePaySheet({
    updateId: data.updateId,
    paymentSummaryItems: [
      { label: 'Product Name', amount: 1099.00 },
      { label: 'Shipping', amount: 500.00 },
      { label: 'Total', amount: 1599.00 },
    ],
  });
});

method updateApplePaySheet(...)

Met à jour la feuille Apple Pay native après un callback de contact de livraison.
iOS uniquement ; cette méthode n’est pas prise en charge sur le Web.

updateApplePaySheet(options: UpdateApplePaySheetOption) => Promise<void>

interface DidSelectShippingContact

Données du contact de livraison Apple Pay.

Propriété Type Description Depuis
contact ShippingContact Contact de livraison sélectionné dans Apple Pay. 4.1.0
updateId string Identifiant transmis à updateApplePaySheet() pour ce callback. 4.1.0

interface PaymentSummaryItem

Propriété Type Description Depuis
label string Libellé de la ligne dans la feuille Apple Pay. 3.1.0
amount number Montant décimal dans l’unité principale de la devise, par exemple 10.99. 3.1.0

DidCreatePaymentMethod contient le contact de livraison après la création du moyen de paiement par Apple. Apple ne renvoie l’adresse complète qu’après un paiement réussi.

interface DidCreatePaymentMethod

Propriété Type Description Depuis
contact ShippingContact Contact associé au moyen de paiement Apple Pay. 4.1.0

interface ShippingContact

Propriété Type Description Depuis
givenName string Prénom du contact. Apple Pay uniquement. 4.1.0
familyName string Nom de famille du contact. Apple Pay uniquement. 4.1.0
middleName string Deuxième prénom du contact. Apple Pay uniquement. 4.1.0
namePrefix string Préfixe du nom du contact. Apple Pay uniquement. 4.1.0
nameSuffix string Suffixe du nom du contact. Apple Pay uniquement. 4.1.0
nameFormatted string Nom complet formaté du contact. Apple Pay uniquement. 4.1.0
phoneNumber string Numéro de téléphone du contact. Apple Pay uniquement. 4.1.0
nickname string Surnom du contact. Apple Pay uniquement. 4.1.0
street string Rue dans l’adresse postale du contact. Apple Pay uniquement. 4.1.0
city string Ville dans l’adresse postale du contact. Apple Pay uniquement. 4.1.0
state string État ou province dans l’adresse postale du contact. Apple Pay uniquement. 4.1.0
postalCode string Code postal dans l’adresse du contact. Apple Pay uniquement. 4.1.0
country string Nom du pays ou de la région dans l’adresse du contact. Apple Pay uniquement. 4.1.0
isoCountryCode string Code de pays ISO dans l’adresse du contact. Apple Pay uniquement. 4.1.0
subAdministrativeArea string Subdivision administrative dans l’adresse du contact. Apple Pay uniquement. 4.1.0
subLocality string Sous-localité dans l’adresse du contact. Apple Pay uniquement. 4.1.0

Référence

apple-pay.ts
import { ApplePayEventsEnum, Stripe } from '@capacitor-community/stripe';

(async () => {
  try {
    await Stripe.isApplePayAvailable();
  } catch {
    return;
  }

  await Stripe.addListener(ApplePayEventsEnum.Completed, () => {
    console.log('ApplePayEventsEnum.Completed');
  });

  // Replace `/your-intent-endpoint` with your backend from Server Integration.
  const response = await fetch('/your-intent-endpoint', {
    method: 'POST',
  });
  if (!response.ok) {
    throw new Error(`Intent request failed: ${response.status}`);
  }
  const { paymentIntent } = (await response.json()) as {
    paymentIntent: string;
  };

  // Prepare Apple Pay
  await Stripe.createApplePay({
    paymentIntentClientSecret: paymentIntent,
    paymentSummaryItems: [{
      label: 'Product Name',
      amount: 1099.00
    }],
    merchantIdentifier: 'merchant.com.getcapacitor.stripe',
    countryCode: 'US',
    currency: 'USD',
  });

  // Present Apple Pay
  const result = await Stripe.presentApplePay();
  if (result.paymentResult === ApplePayEventsEnum.Completed) {
    // Update UI only. Fulfill orders from a verified server webhook.
  }
})();