Blogserie iOS-Entwicklung - Apple Pay in eigenen Apps nutzenMit der Vorstellung von Apple Pay im Herbst letzten Jahres hat Apple seine bestehende Infrastruktur um einen neuen Service erweitert. Damit ist es mit aktuellen iOS-Geräten und sogar der Apple Watch möglich, Einkäufe direkt über diese Geräte zu tätigen. Es soll eine sichere und stabile Schnittstelle darstellen, mit der Kunden ihre Zahlungsinformationen weitergeben können. Bis dato scheint Apple Pay aus sicherheitstechnischer Sicht auch einwandfrei zu funktionieren, auch wenn natürlich ein gesundes Maß an Skepsis gegenüber derartigen Diensten durchaus angebracht ist. Nichtsdestoweniger ist Apple Pay nicht nur eine feine neue Sache für Endkunden, sondern auch für uns Entwickler, denn wir haben die Möglichkeit, diesen Service in unseren eigenen Apps zu nutzen. So können beispielsweise Shopping-Apps das einfache und bequeme Bezahlen direkt mittels Apple Pay aus der App heraus integrieren.

 

Konfiguration eines Projekts für Apple Pay

Bevor man mit der eigentlichen Implementierung von Apple Pay beginnt, gilt es, das Projekt entsprechend zu konfigurieren und erst einmal für Apple Pay fit zu machen. Erste Station ist dabei das Member Center innerhalb des Apple Developer Portal. Wechseln Sie dann in den Bereich Certificates, Identifiers & Profiles und wählen dort den Punkt Identifiers aus dem Menü. Um Apple Pay in eigenen Apps nutzen zu können, ist zunächst die Erstellung einer sogenannten Merchant ID notwendig. Diese Merchant ID ist in gewisser Weise der Nachweis und Ihre Berechtigung, den Apple Pay-Service nutzen zu dürfen. Klicken Sie daher im Bereich Identifiers auf den gleichnamigen Punkt Merchant IDs. Über die Plus-Schaltfläche am oberen rechten Rand können Sie eine neue Merchant ID erstellen. Dazu ist die Eingabe einer Beschreibung sowie eines eindeutigen Identifiers notwendig. Beim Identifier handelt es sich um einen aus der Apple-Entwicklung bereits bekannten umgedrehten Domain-Namen. Typischerweise setzt sich dieser wie folgt zusammen:

merchant.<Länderkennung>.<Firmen- oder App-Name>.<Apple Pay-Beschreibung>

Eine einfache Merchant ID für allgemeine Einkäufe könnte daher beispielsweise wie folgt aussehen:

merchant.de.thomassillmann.myAppShopping

Die Beschreibung einer Merchant ID können Sie frei festlegen, sie sollte nach Möglichkeit aber leicht und schnell wieder zu erkennen sein.

Ist eine Merchant ID angelegt, muss diese noch um ein passendes Zertifikat Ihrerseits ergänzt werden. Wählen Sie dazu die erstellte Merchant ID aus und klicken Sie auf die Schaltfläche Edit. Es erfolgt die typische Erstellung eines Zertifikats mittels Keychain, so wie man es bereits von den Entwicklerzertifikaten her kennt. Sie werden dabei durch alle Schritte der entsprechenden Einrichtung geführt.

Nach Erstellung des Zertifikats können Sie dieses auch direkt herunterladen und Xcode hinzufügen. Daneben müssen Sie noch zwei weitere Zertifikate einmalig von Apples Website herunterladen und installieren: das Worldwide Developer Relations – G2 Certificate und das Apple Root CA – G2 Root Certificate. Beide finden Sie im Internet unter www.apple.com (siehe Bild 1).

Bild 1: Es müssen weitere Zertifikate von Apples Website heruntergeladen werden, um Apple Pay in eigenen Apps nutzen zu können. Quelle www.apple.com.

Bild 1: Es müssen weitere Zertifikate von Apples Website heruntergeladen werden, um Apple Pay in eigenen Apps nutzen zu können. Quelle www.apple.com.

Ist das erledigt, folgt der einfache Teil. Wechseln Sie dazu in die Capabilities-Area Ihres Targets, für das Apple Pay genutzt werden soll, und aktivieren Sie entsprechend den Schalter im Abschnitt Apple Pay In der erscheinenden Liste mit dem Titel Apple Pay Identifiers wählen Sie sodann die Merchant ID aus, die Sie für diese App verwenden möchten. Damit ist die Konfiguration Ihres Projekts zur Nutzung von Apple Pay abgeschlossen.

 

Verfügbarkeit von Apple Pay prüfen

Grundlage zur Nutzung von Apple Pay in eigenen Projekten ist das PassKit Framework. Dieses hängt direkt mit der in iOS integrierten Passbook App zusammen und verwaltet Kreditkarten, Gutscheine, Kundenkarten und mehr. Es dient als Schnittstelle zur Durchführung einer sicheren Transaktion. Zwei Klassen sind dabei besonders für uns interessant: PKPaymentRequest und PKPaymentAuthorizationViewController. Während sich Letztere um eine passende Kaufansicht mit allen relevanten Informationen kümmert, dient PKPaymentRequest zur Konfiguration der gewünschten Transaktion. Betrachten wir diese Klassen einmal im Detail.

Beginnt man mit der Implementierung einer möglichen Bezahlfunktion mit Apple Pay, steht zunächst einmal immer die Frage im Raum, ob das betreffende Gerät überhaupt Apple Pay nutzen kann; schließlich unterstützt bisher nicht jede iOS-Hardware Apple Pay, und selbst wenn, muss der Nutzer natürlich keine Kreditkarteninformationen in Passbook hinterlegen. In beiden Fällen wäre eine Zahlung mittels Apple Play gar nicht erst möglich.

Um diese beiden Faktoren zu prüfen, stellt die Klasse PKPaymentAuthorizationViewController zwei Klassenmethoden zur Verfügung, die in Listing 1 definiert sind.

Listing 1: Deklaration der Methoden zur Prüfung der Verfügbarkeit von Apple Pay

 

// Swift
class func canMakePayments() -> Bool
class func canMakePaymentsUsingNetworks(_ supportedNetworks: [AnyObject]!) -> Bool

// Objective-C
+ (BOOL)canMakePayments
+ (BOOL)canMakePaymentsUsingNetworks:(NSArray *)supportedNetworks

Die Methode canMakePayments prüft die verfügbare Hardware des zugrundeliegenden iOS-Geräts auf Apple Pay-Tauglichkeit. Unterstützt die Hardware Apple Pay, liefert die Methode true zurück, andernfalls false. Diese Aussage alleine ist aber noch nicht ausreichend, um von einer Funktionsfähigkeit von Apple Pay ausgehen zu können, denn es bleibt die Frage offen, ob der Nutzer überhaupt passende Zahlungsinformationen in Passbook zur Nutzung von Apple Pay hinterlegt hat. Genau diese Frage klärt die zweite Klassenmethode canMakePaymentsUsingNetworks:, die als Parameter ein Array entgegennimmt. Dieses Array besteht aus Strings, wobei jeder String ein mögliches Bezahlnetzwerk repräsentiert. Die Methode prüft daraufhin, ob mindestens eines der übergebenen Bezahlnetzwerke innerhalb des Arrays vom Nutzer unterstützt wird, und liefert entsprechend true zurück, wenn das der Fall ist, ansonsten false. Aktuell stehen drei dieser Bezahlnetzwerke als Konstanten zur Verfügung: PKPaymentNetworkAmex für American Express, PKPaymentNetworkMasterCard für MasterCard sowie PKPaymentNetworkVisa für Visa-Kreditkarten.

Nur wenn beide Methoden letzten Endes true zurückliefern, wissen Sie, dass Sie Apple Pay als Bezahloption in Ihrer App anbieten können. Andernfalls sollten Sie die entsprechende Schaltfläche oder Option zum Zahlen mittels Apple Pay in Ihrer App ausblenden oder deaktivieren.

 

Erstellen eines PKPaymentRequest

Sind die Voraussetzungen zur Nutzung von Apple Pay erfüllt, besteht der nächste Schritt in der Erstellung und Konfiguration eines PKPaymentRequest-Objekts. Ein solches Objekt fasst Informationen zu den zu kaufenden Artikeln sowie zur Versand- und Rechnungsadresse zusammen und wird anschließend in einem zweiten Schritt an eine Instanz der bereits genannten Klasse PKPaymentAuthorizationViewController weitergegeben.

Viele der Properties der Klasse PKPaymentRequest sind dabei selbsterklärend. So nehmen billingAddress und shippingAddress die jeweilige Rechnungs- beziehungsweise Versandadresse entgegen während countryCode und currencyCode Informationen zu Land und Währung enthalten.

Besonders wichtig bei der Konfiguration eines PKPaymentRequest ist die Property merchantIdentifier. Diese muss mit einer der in den Capabilities zugewiesenen Merchant IDs übereinstimmen.

Was uns nun noch fehlt, sind die zu beziehenden Produkte und deren Preise. Zu diesem Zweck stellt das PassKit Framework die Klasse PKPaymentSummaryItem zur Verfügung. Eine Instanz dieser Klasse setzt sich schlicht und ergreifend aus einem Label mitsamt zugeordnetem Betrag zusammen. So kann man darüber das eigene Produkt mitsamt Preis abbilden, aber auch die dazukommende Steuer, eventuelle Vergünstigungen sowie den Gesamtbetrag. Jedes dieser Elemente stellt jeweils eine Instanz von PKPaymentSummaryItem dar; pro Angabe eines Preises ein Objekt von PKPaymentSummaryItem. Die Klasse bringt dazu passend einen eigenen Initializer namens summaryItemWithLabel:amount: mit, dem direkt das passende Label (wie zum Beispiel Produktname, Steuer oder Gesamtbetrag) sowie der dazugehörige Preis übergeben werden können.

Am Ende werden alle erstellten Instanzen von PKPaymentSummaryItem in Form eines Arrays der Property paymentSummaryItems von PKPaymentRequest übergeben. Ebenfalls übergeben werden der Instanz von PKPaymentRequest die zur Verfügung stehenden Bezahlnetzwerke (die sinnigerweise zuvor mittels der Methode canMakePaymentsUsingNetworks: der Klasse PKPaymentAuthorizationViewController auf Verfügbarkeit abgefragt wurden). Dazu dient die Property supportedNetworks. Diese erhält genau wie die Methode canMakePaymentsUsingNetworks: ein Array mit den Konstanten der unterstützten Bezahlnetzwerke.

PKPaymentRequest verfügt noch über weitere individuelle Einstellungsmöglichkeiten, beispielsweise die Festlegung von Pflichtfeldern wie E-Mail-Adresse bei der Rechnungs- beziehungsweise Lieferadresse. Hier lohnt ein Blick in die Dokumentation der Klasse, um einen Überblick über alle spezifischen Konfigurationsmöglichkeiten zu erhalten (siehe https://developer.apple.com).

 

Bezahlung durchführen

Nach der Konfiguration des gewünschten PKPaymentRequest geht es weiter ans Bezahlen. Dazu übergeben wir das erstellte und konfigurierte Objekt der Klasse PKPaymentRequest an eine neue Instanz von PKPaymentAuthorizationViewController. Dazu können wir direkt den passenden Initializer initWithPaymentRequest: nutzen, der eben jenes Objekt direkt bei der Initialisierung entgegennimmt. Da PKPaymentAuthorizationViewController mit Delegation arbeitet, muss nach der Initialisierung eines Objekts der Klasse noch für die entsprechende delegate-Property ein passendes Objekt gesetzt werden. Dieses wird dann über den Zahlungsvorgang mithilfe passender Methoden auf dem Laufenden gehalten. Das Delegate-Objekt muss dazu konform zum Protokoll PKPaymentAuthorizationViewControllerDelegate sein.

Ist die Instanz von PKPaymentAuthorizationViewController mitsamt PKPaymentRequest und Delegate erstellt, geht es an die Anzeige dieses View-Controllers. Dazu können Sie die bekannten Methoden zur Anzeige von View-Controllern verwenden, beispielsweise presentViewController:anmiated:completion: der Klasse UIViewController. Die Anzeige wird anhand der übergebenen Informationen des PKPaymentRequest automatisch passend erstellt, ohne dass wir an dieser Stelle in irgendeiner Form eingreifen müssen (oder können). Dafür wird unser Delegate-Objekt über Aktionen des Nutzers informiert, beispielsweise wenn dieser eine gewünschte Versandmethode auswählt oder die Lieferadresse ändert. Startet der Nutzer den Bezahlvorgang, so wird die Methode paymentAuthorizationViewControllerWillAuthorizePayment: gefeuert, gefolgt von paymentAuthorizationViewController:didAuthorizePayment:completion: und paymentAuthorizationViewControllerDidFinish:. Diese Methoden können Sie nutzen, um beispielsweise Ihr User Interface zu aktualisieren und den Nutzer nach erfolgreichem Kauf zu einer passenden Ansicht weiterzuleiten.

 

Die Zukunft von Apple Pay

Die Integration von Apple Pay in eigenen Apps ist erstaunlich übersichtlich und einfach gehalten, weshalb man nach kurzer Einarbeitungszeit in das entsprechende SDK schnell mit den zugehörigen Klassen zurechtkommt und eine erste Implementierung umsetzen kann. So schön das auch ist, kann zum jetzigen Zeitpunkt noch nicht gesagt werden, wie sich Apple Pay in Zukunft weiterentwickelt und gerade hierzulande verbreiten wird. Selbst bei relativ geringem Entwicklungsaufwand bleibt da die Frage, ob eine entsprechende Implementierung von Apple Pay in eigenen Apps zum jetzigen Zeitpunkt lohnt. Letzten Endes wird diese Frage von Projekt zu Projekt individuell geklärt werden müssen. Sicher dürfte einzig und allein sein, dass Apple versuchen wird, den Dienst weiter zu pushen und weiter zu verbreiten. Ob das gelingt, wird die Zukunft zeigen.