# Apple Pay

Ermöglichen Sie Kundinnen und Kunden die sichere Zahlungsabwicklung mit Apple Pay auf ihrem Apple-Gerät.

Apple Pay ist ein Digital Wallet, mit dem Kundinnen und Kunden mit einer auf ihrem Apple-Gerät gespeicherten Karte bezahlen können, anstatt ihre Kartenangaben manuell einzugeben. Kundinnen und Kunden können mit Apple Pay auf ihrem iPhone, iPad, Mac oder ihrer Apple Watch bezahlen. Eine vollständige Liste der unterstützten Geräte finden Sie auf der Support-Website [Mit Apple Pay kompatible Geräte](https://support.apple.com/en-us/HT208531) von Apple.

Für Payment Links oder gehostetes Checkout funktioniert Apple Pay ohne zusätzliche Konfiguration. Für Elements oder eingebettetes Checkout müssen Sie Ihre Domain registrieren, damit Apple Pay funktioniert. In-App-Zahlungen erfordern zusätzliche Konfigurationsänderungen.

#### Eigenschaften der Zahlungsmethode

- **Kundenstandorte**

  Weltweit1

- **Transaktionswährung**

  Siehe [unterstützte Transaktionsährungen](https://docs.stripe.com/currencies.md#presentment-currencies)

- **Zahlungsbestätigung**

  Kundenseitig initiiert

- **Art der Zahlungsmethode**

  Wallet

- **Wiederkehrende Zahlungen**

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

- **Auszahlungsintervall**

  Es gilt das Standard-Auszahlungsintervall

- **Connect-Support**

  Ja

- **Unterstützung bei angefochtenen Zahlungen**

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

- **Unterstützung für manuelle Erfassung**

  Ja

- **Komplette/anteilige Rückerstattungen**

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

1 Der Support für wiederkehrende Zahlungen mit Apple Pay für indische Kundinnen und Kunden ist in Kürze verfügbar.

#### Geschäftsstandorte

Stripe-Konten weltweit können Apple Pay-Zahlungen mit Zahlungsabwicklung in lokaler Währung akzeptieren.

#### Produktsupport

- Connect
- Checkout1

- Payment Links
- Elements
- Subscriptions
- Invoicing

1Wenn der [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) des Bezahlvorgangs `embedded_page` lautet, wird nur die Version 17 oder höher von Safari und iOS unterstützt.

## App Store-Regeln für In-App-Käufe mit Apple Pay

Dieser Leitfaden erklärt, wie Sie Ihre App konfigurieren, um Apple Pay direkt für physische Waren, Dienstleistungen und andere berechtigte Artikel zu akzeptieren. Stripe wickelt diese Zahlungen ab und Sie zahlen nur die Stripe-[Bearbeitungsgebühren](https://stripe.com/pricing).

Für digitale Produkte, Inhalte und Abonnements, die in den USA oder im Europäischen Wirtschaftsraum (EWR) verkauft werden, kann Ihre iOS-App Apple Pay akzeptieren, indem sie auf eine externe Zahlungsseite weiterleitet. Sie können die folgenden Zahlungsoberflächen verwenden:

- [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) (am besten geeignet für eine begrenzte Anzahl von Produkten und Preisen)

In anderen Regionen kann Ihre iOS-App Apple Pay nicht für digitale Produkte, Inhalte oder Abonnements akzeptieren.

## Apple Pay akzeptieren

Stripe bietet Ihnen mehrere Möglichkeiten, Apply Pay als Zahlungsmethode hinzuzufügen. Weitere Informationen zur Integration finden Sie unter der jeweiligen Methode:

# React Native iOS


Verwenden Sie das [React Native SDK](https://github.com/stripe/stripe-react-native) von Stripe, um sowohl Apple Pay als auch herkömmliche Kreditkartenzahlungen zu akzeptieren. Melden Sie sich vor dem Start im [Apple Developer Program](https://developer.apple.com/programs/) an und [richten Sie Stripe auf Ihrem Server und in Ihrer App ein](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=react-native#react-native-setup). [Registrieren Sie sich dann für eine Apple-Händler-ID](https://docs.stripe.com/apple-pay.md#merchantid) und [erstellen Sie ein neues Apple Pay-Zertifikat](https://docs.stripe.com/apple-pay.md#csr).

1. [Mit Xcode integrieren](https://docs.stripe.com/apple-pay.md#xcode-pay)
2. [Apple-Händler-ID in StripeProvider festlegen](https://docs.stripe.com/apple-pay.md#set-merchantid)
3. [Prüfen, ob Apple Pay unterstützt wird](https://docs.stripe.com/apple-pay.md#check-if-apple-pay-supported)
4. [Zahlungsformular anzeigen](https://docs.stripe.com/apple-pay.md#present-payment-sheet)
5. [Zahlung an Stripe senden](https://docs.stripe.com/apple-pay.md#handle-payment)

> Wenn Sie React Native und Expo verwenden, wird Apple Pay von Expo Go nicht unterstützt. Um Apple Pay mit Expo zu verwenden, müssen Sie einen [Entwicklungs-Build](https://docs.expo.dev/get-started/set-up-your-environment/?mode=development-build&platform=ios) erstellen. Wenn Sie bereits ein Expo Go-Projekt haben, können Sie es [zu einem Entwicklungs-Build migrieren](https://docs.expo.dev/develop/development-builds/expo-go-to-dev-build/).

## Eine Apple-Händler-ID registrieren

Beantragen Sie eine Apple-Händler-ID, indem Sie sich auf der Apple Developer-Website [für eine neue Kennung registrieren](https://developer.apple.com/account/resources/identifiers/add/merchant).

Tragen Sie eine Beschreibung und eine Kennung in das Formular ein. Die Beschreibung ist nur für Ihre internen Zwecke bestimmt und kann später geändert werden. Stripe empfiehlt, dass Sie den Namen Ihrer App als Kennung verwenden, zum Beispiel `merchant.com.{{YOUR_APP_NAME}}`.

## Neues Apple Pay-Zertifikat erstellen

Erstellen Sie ein Zertifikat für Ihre App, um Zahlungsdaten zu verschlüsseln.

Gehen Sie zu den [iOS-Zertifikateinstellungen](https://dashboard.stripe.com/settings/ios_certificates) im Dashboard, klicken Sie auf **Neue Anwendung hinzufügen** und befolgen Sie die Anleitung.

Laden Sie eine Certificate Signing Request (CSR)-Datei herunter, um ein sicheres Zertifikat von Apple zu erhalten, mit dem Sie Apple Pay verwenden können.

Eine CSR-Datei muss verwendet werden, um genau ein Zertifikat auszustellen. Wenn Sie Ihre Apple-Händler-ID wechseln, müssen Sie zu den [iOS-Zertifikateinstellungen](https://dashboard.stripe.com/settings/ios_certificates) im Dashboard gehen, um eine neue CSR und ein Zertifikat zu erhalten.

## Mit Xcode integrieren

Fügen Sie Ihrer App die **Apple Pay**-Funktion hinzu. Öffnen Sie in Xcode Ihre Projekteinstellungen, klicken Sie auf die Registerkarte **Signing & Capabilities** (Anmeldung und Funktionen) und fügen Sie die **Apple Pay**-Funktion hinzu. Möglicherweise werden Sie an dieser Stelle aufgefordert, sich bei Ihrem Entwicklerkonto anzumelden. Wählen Sie die zuvor erstellte Händler-ID aus. Ihre App sollte nun Apple Pay unterstützen.
![](https://b.stripecdn.com/docs-statics-srv/assets/xcode.a701d4c1922d19985e9c614a6f105bf1.png)

Apple Pay-Funktion in Xcode aktivieren

## Apple-Händler-ID in StripeProvider festlegen

Geben Sie in der Komponente `StripeProvider` die Apple-Händler-ID an, für die Sie sich erfolgreich registriert haben:

```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>
  );
}
```

## Prüfen, ob Apple Pay unterstützt wird

Bevor Sie Apple Pay als Zahlungsoption in Ihrer App anzeigen, sollten Sie prüfen, ob die Geräte der Nutzer/innen Apple Pay unterstützen und ob im Wallet eine Karte hinterlegt ist:

```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>
  );
}
```

## Payment Intent erstellen

### Serverseitig

Erstellen Sie einen Endpoint, der einen PaymentIntent mit einem [Betrag](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-amount) und einer [Währung](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-currency) generiert. Legen Sie den zu bezahlenden Betrag immer serverseitig fest, also in einer vertrauenswürdigen Umgebung, und nicht clientseitig. So wird verhindert, dass böswillige Kund/innen ihre eigenen Preise festlegen können.

#### Curl

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

### Clientseitig

Erstellen Sie eine Methode, die einen PaymentIntent von Ihrem Server anfordert:

```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;
  };
  // ...
}
```

### Fehlerbehebung

Wenn bei der Tokenerstellung Fehler mit der Stripe-API auftreten, liegt höchstwahrscheinlich ein Problem mit Ihrem Apple Pay-Zertifikat vor. In diesem Fall müssen Sie ein neues Zertifikat generieren und bei Stripe hochladen, wie auf dieser Seite beschrieben. Stellen Sie dabei sicher, dass Sie einen CSR verwenden, den Sie vom Dashboard abgerufen und nicht selbst generiert haben. Xcode legt alte Zertifikate oft fälschlicherweise im Zwischenspeicher ab. Stripe empfiehlt daher, zusätzlich zur Erstellung eines neuen Zertifikats auch eine neue Apple-Händler-ID zu erstellen.

Wenn Sie den Fehler erhalten, hat das folgenden Grund:

> Sie haben Ihr Apple-Händler-Konto nicht bei Stripe hinterlegt.

Wahrscheinlich sendet Ihre App Daten, die mit einem früheren (nicht von Stripe stammenden) CSR/Zertifikat verschlüsselt wurden. Stellen Sie sicher, dass alle Zertifikate widerrufen werden, die durch nicht von Stripe stammende CSRs generiert wurden und Ihre Apple-Händler-ID aufweisen. Wenn dadurch das Problem nicht behoben wird, löschen Sie die Händler-ID in Ihrem Apple-Konto und legen Sie eine neue an. Erstellen Sie dann ein neues Zertifikat basierend auf dem zuvor verwendeten (von Stripe bereitgestellten) CSR. Sie müssen dieses neue Zertifikat nicht bei Stripe hochladen. Aktivieren und deaktivieren Sie die Apple Pay-Anmeldedaten in Ihrer App, um sicherzustellen, dass sie korrekt aktualisiert werden.

## Zahlungsformular anzeigen

Rufen Sie in der Eigenschaft `onPress` von [PlatformPayButton](https://stripe.dev/stripe-react-native/api-reference/index.html#PlatformPayButton) `confirmPlatformPayPayment` auf, um ein Apple Pay-Fenster zu öffnen. Um die Posten im Warenkorb der Kundin/des Kunden im Zahlungsfenster anzuzeigen, übergeben Sie die Posten als Argument. Der letzte Posten muss Ihr Unternehmen und den Gesamtbetrag repräsentieren; er wird im Fenster mit dem vorangestellten Wort „Pay“ (Bezahlen) angezeigt (zum Beispiel „Pay iHats, Inc. 50 USD“).

> Fügen Sie in Ihren Code, der die Kundenaktion abwickelt, keine komplexen oder asynchronen Aktionen ein, bevor Sie das Zahlungsformular anzeigen. Wenn die Nutzeraktion das Zahlungsformular nicht direkt aufruft, gibt Apple Pay einen Fehler zurück.

```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: Zahlungsmethode erstellen [Clientseitig]

Wenn Sie Ihre Zahlung auf Ihrem Server bestätigen, können Sie Apple Pay so verwenden, dass nur eine `PaymentMethod` erfasst wird, anstatt eine Zahlung zu bestätigen. Rufen Sie dazu die Methode `createPlatformPayPaymentMethod` auf:

```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: Wiederkehrende Zahlungen [Clientseitig]

In iOS 16 oder höher können Sie [Händler-Token](https://developer.apple.com/apple-pay/merchant-tokens/) übernehmen, indem Sie das Feld `request` in den `applePay`-Parameter-Objekten von `confirmPlatformPayPayment()` und `confirmPlatformPaySetupIntent` festlegen.

```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',
        },
      },
    },
  }
);
```

Weitere Informationen zur Verwendung wiederkehrender Zahlungen mit Apple Pay finden Sie in der [PassKit-Dokumentation von Apple](https://developer.apple.com/documentation/passkit/pkpaymentrequest).

## Optional: Sendungsverfolgung [Clientseitig]

Um die [Bestellverfolgung](https://developer.apple.com/design/human-interface-guidelines/technologies/wallet/designing-order-tracking) in iOS 16 oder höher einzuführen, verwenden Sie den Rückruf `setOrderTracking` für die `PlatformPayButton`-Komponente.

Gehen Sie in Ihrer Implementierung wie folgt vor:

1. Rufen Sie die Bestelldetails für die abgeschlossene Bestellung von Ihrem Server ab.
2. Rufen Sie den angegebenen Abschluss-Handler in `setOrderTracking` mit den Ergebnissen von Ihrem Server auf.

```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);
  }}
/>
```

Weitere Informationen zur Bestellungsnachverfolgung finden Sie in der [Dokumentation zu Wallet-Bestellungen von Apple](https://developer.apple.com/documentation/walletorders).


## Apple Pay testen

Um Apple Pay zu testen, müssen Sie eine echte Kreditkartennummer und Ihre [API-Testschlüssel](https://docs.stripe.com/keys.md) verwenden. Stripe erkennt, dass Sie sich im Test-Modus befinden und gibt ein Testkarten-Token zurück, das Sie verwenden können, sodass Sie Testzahlungen mit einer Live-Karte durchführen können, ohne diese zu belasten.

Sie können [Stripe Testkarten](https://docs.stripe.com/testing.md#use-test-cards) oder [Apple Pay-Testkarten](https://developer.apple.com/apple-pay/sandbox-testing/) nicht in Apple Pay Wallets speichern, um Apple Pay zu testen.

## See also

- [iOS-Integration](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=mobile&platform=ios)
- [Apple Pay on the Web](https://docs.stripe.com/elements/express-checkout-element.md)
- [Best Practices für Apple Pay](https://docs.stripe.com/apple-pay/best-practices.md)
