28.01.2015 Aufrufe

Payment API - Medieninformatik

Payment API - Medieninformatik

Payment API - Medieninformatik

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Payment</strong> <strong>API</strong><br />

Jan Fleischhauer, Angelika Zelosko<br />

Vertiefungsveranstaltung: Mobile Anwendungen<br />

Fachhochschule Wiesbaden<br />

Studiengang <strong>Medieninformatik</strong><br />

25. Februar 2008


Inhaltsverzeichnis<br />

1 Motivation 1<br />

2 Ablauf aus Benutzersicht 2<br />

3 Aufbau 3<br />

4 Architektur 4<br />

5 <strong>Payment</strong> Informationen 5<br />

6 Ablauf aus Entwicklersicht 8<br />

A JAD-Datei 12<br />

i


<strong>Payment</strong> <strong>API</strong><br />

1 Motivation<br />

Zahlen Sie bar oder mit Karte“ Demnächst könnte die Antwort auf diese Frage lauten:<br />

”<br />

Weder noch. Ich zahle per Handy.“ Das Handy entwickelt sich immer mehr zum Multifunktionsgerät.<br />

Getreu dem Motto: Telefonieren war gestern! Jetzt ist auch Bezahlen per<br />

”<br />

Mobiltelefon möglich.<br />

So kann man bei einigen regionalen Verkehrsbetrieben seine Fahrkarte über eine Software<br />

auf sein Handy laden. Nachdem sich der Kunde registriert hat, ist er berechtigt die von<br />

Handy-Ticket [1] enwickelte Software zu installieren. Die Authentifizierung findet über eine<br />

PIN statt, die beim Kauf eingegeben wird. War diese erfolgreich, bekommt der Fahrgast<br />

die Fahrkarte auf sein Handy geschickt. Dieser Service wird bereits in Hamburg, Dresden,<br />

Düsseldorf und anderen Städten angeboten. Die Vorteile hierbei liegen auf der Hand. Das<br />

ständige Bereithalten von Kleingeld für den Kauf am Automaten entfällt. Ebenso wie die<br />

Wartezeiten vor einem Fahrkartenautomat. Auch auf Seiten der Verkehrsbetriebe lassen<br />

sich Vorzüge verzeichnen. So können die Wartung und Leerung der Automaten durch<br />

vermehrtes Nutzen des Dienstes durch Fahrgäste reduziert werden.<br />

Ein weiteres Beispiel ist das Parken in der Stadt. Es stellt sich jedes Mal aufs neue als<br />

Herausforderung dar. Nach etlichen Runden der vergeblichen Parkplatzsuche schließt sich<br />

die Suche nach Kleingeld an, um beim Versuch einen Parkschein zu ziehen, festzustellen,<br />

dass der Automat defekt ist. In der Wiesbadener Innenstadt wird hierfür eine Alternative<br />

geboten. Dort wird der Park-Service von Schlauer Parken [2] angeboten. Zum Starten und<br />

Beenden eines Parkvorgangs, ruft der registrierte Benutzer eine kostenfreie Telefonnummer<br />

an. Nach dem Start-Anruf erhält der Parkende eine SMS mit der Startzeit. Die SMS<br />

nach dem Beenden-Anruf enthält die Parkdauer und die anfallenden Gebühren, welche<br />

per Lastschrift oder über ein Pre-Paid-Konto abgerechnet werden. Die minutengenaue<br />

Abrechnung erspart das eventuelle Knöllchen bei Überziehung der Parkdauer oder spart<br />

Geld, welches verlorengeht, wenn die Parkdauer kürzer als erwartet war.<br />

Dies sind nur zwei Beispiele, bei denen das Mobiltelefon als Zahlungsmittel eingesetzt<br />

wird. Ob die Abwicklung der Zahlungen per Lastschrift, Kreditkarte oder die Handyrechnung<br />

läuft, ist abhängig von der Anwendung, die sich dahinter verbirgt.<br />

Wie können nun solche mobilen Anwendungen entwickelt werden - Durch Verwendung<br />

der <strong>Payment</strong> <strong>API</strong>. Diese ist ein optionales Paket für JavaME und wird im Java Specification<br />

Request 229 (JSR-229) [3] spezifiziert. An der Entwicklung der <strong>Payment</strong> <strong>API</strong>,<br />

sind Firmen wie Nokia, Siemens, Sony Ericsson, Symbian und andere namhafte Vertreter<br />

der Mobile Industry beteiligt. Die aktuelle Version der P<strong>API</strong>, 1.1.0, ist seit Januar 2006<br />

verfügbar.<br />

Dieses Dokument soll die Funktionsweise der <strong>Payment</strong> <strong>API</strong> veranschaulichen. Hierfür<br />

schauen wir uns zunächst in Abschnitt 2 an, wie der Ablauf eines Kaufvorgangs für den<br />

Benutzer aussehen kann. Anhand von Bildern der Anwendung Bullshit-Bingo wird der<br />

Ablauf erläutert. Damit über eine mobile Anwendung Zahlungen getätigt werden können,<br />

sind neben dem Entwickler weitere Mitwirkende notwendig. Welche Personen dies genau<br />

sind und welche Aufgabe sie übernehmen sehen wir uns in Abschnitt 3 an.<br />

Nachdem klar ist, welche Schnittstellen eine <strong>Payment</strong>-Anwendung nach außen hat, bli-<br />

Jan Fleischhauer, Angelika Zelosko 1


<strong>Payment</strong> <strong>API</strong><br />

cken wir in Abschnitt 4 in das Innere der <strong>Payment</strong> <strong>API</strong>. Dabei werden die Komponenten<br />

der <strong>Payment</strong> <strong>API</strong> vorgestellt, ebenso wie deren Zusammenspiel. Wie bei einem Kauf von<br />

Waren im Supermarkt, ist es auch in der mobilden Welt nicht anders, werden bestimmte<br />

Informationen für den Kauf eines Features benötigt. Genauso wichtig wie der Preis, ist<br />

auch die Zahlungsart, auf deren Wege der Kaufbetrag beglichen werden soll. Welche Informationen<br />

für eine <strong>Payment</strong>-Anwendung vorhanden sein müssen und wie diese beschafft<br />

werden können, wird in Abschnitt 5 beschrieben. Im letzten Abschnitt (Abschnitt 6) befassen<br />

wir uns mit dem Ablauf einer Zahlungstransaktion aus Sicht des Enwicklers. Dabei<br />

wird auf die wesentlichen Schritte, unterstützend durch Codebeispiele eingegangen. Die<br />

Codebeispiele stammen aus der Anwendung Bullshit-Bingo, aus der bereits in Abschnitt<br />

2 Bilder gezeigt werden.<br />

2 Ablauf aus Benutzersicht<br />

Nachfolgend wird der Ablauf einer <strong>Payment</strong>-Transaktion beschrieben. Dies geschieht anhand<br />

von Bildschirmfotos der Anwendung Bullshit-Bingo. Abbildung 1 zeigt welche Screens<br />

der Anwender im Einzelnen angezeigt bekommt, wenn er ein Leben kauft.<br />

1) 2)<br />

Applikation<br />

<strong>Payment</strong> Module<br />

3) 4)<br />

<strong>Payment</strong> Module<br />

Applikation<br />

Abbildung 1: Ablauf Bezahlvorgang<br />

Jan Fleischhauer, Angelika Zelosko 2


<strong>Payment</strong> <strong>API</strong><br />

Der Anwender beabsichtigt ein Feature zu erwerben. Hierzu wählt er dieses in der Applikation<br />

aus. Nun liegt die Kontrolle nicht mehr bei der Anwendung, sondern wurde an die<br />

<strong>Payment</strong> <strong>API</strong> weitergegeben. Diese zeigt dem Benutzer seine Featurewahl und die dadurch<br />

entstehenden Kosten an. Des Weiteren besteht hier die Möglichkeit eine Zahlungsmethode<br />

auszuwählen. Danach bestätigt der User die selektierten Daten und startet damit die<br />

Transaktion. Benötigt die gewählte Zahlungsmethode Daten des Users, wie beispielsweise<br />

Kreditkartenangaben, werden diese in einem zusätzlichen Dialog abgefragt. Am Ende<br />

der Transaktion bekommt der User von der Anwendung, an die nun wieder die Kontrolle<br />

übergeben wurde, mitgeteilt, ob der Zahlungsvorgang erfolgreich war oder nicht.<br />

3 Aufbau<br />

Um über das Handy Zahlungen zu tätigen, braucht es neben dem Benutzer, der die Anwendung<br />

bedient, noch weitere Beteiligte.<br />

Abbildung 2: Akteure und Rollen<br />

Dazu gehören, wie in Abbildung 2 zu sehen, der Anwendungsentwickler und der Softwareanbieter<br />

(Händler), von dem die Anwendung und die Features bezogen werden. Sei<br />

es das Erwerben von Leben bei einem Spiel oder der Kauf einer Fahrkarte für den Bus.<br />

Weitere wichtige Rollen übernehmen der Handy-Hersteller und der <strong>Payment</strong> Service Provider<br />

(PSP). Der <strong>Payment</strong> Service Provider kümmert sich stellvertretend für den Händler<br />

um die Abwicklung der Zahlungen, nimmt diese entgegen und prüft sie auf Korrektheit.<br />

PSP und Hersteller einigen sich über die möglichen Zahlungsarten, die über das Mobiltelefon<br />

genutzt werden können. Dementsprechend implementiert der Hersteller die <strong>Payment</strong><br />

Jan Fleischhauer, Angelika Zelosko 3


<strong>Payment</strong> <strong>API</strong><br />

<strong>API</strong>-Komponenten auf dem Gerät. Sobald eine Zahlung erfolgen soll, kommuniziert der<br />

Benutzer nur noch mit der <strong>Payment</strong> <strong>API</strong>. Die Anwendung kann keine Zahlung automatisch<br />

ausführen. Die <strong>Payment</strong> <strong>API</strong> erzwingt immer die Bestätigung durch den User. Dadurch<br />

wird sichergestellt, das der Entwickler den Zahlungsprozess nicht manipulieren kann. Dem<br />

Benutzer wird dadurch garantiert, dass seine Zahlungen korrekt ausgeführt werden.<br />

4 Architektur<br />

Eine <strong>Payment</strong>-Anwendung für ein Mobiltelefon zu entwickeln macht dann Sinn, wenn in<br />

das Gerät bestimmte Komponenten vom Hersteller integriert wurden. Zu diesen zählen<br />

das <strong>Payment</strong> Module, ein oder mehrere <strong>Payment</strong> Adapter sowie die <strong>Payment</strong> <strong>API</strong>. Im<br />

Folgenden werden deren Funktionen und das Zusammenspiel erläutert. Alle Komponenten<br />

sind in Abbildung 3 dargestellt.<br />

Abbildung 3: Architektur<br />

Wer per Kreditkarte bezahlen möchte, hatte im obigen Beispiel (Abschnitt 2) die Wahl<br />

zwischen verschiedenen Instituten. Aus architektonischer Sicht laufen alle Kreditkartenzahlungen<br />

über die selbe Schnittstelle, einen bestimmten <strong>Payment</strong> Adapter. Es obliegt<br />

dem Hersteller mehrere <strong>Payment</strong> Adapter auf dem Handy zu implementieren. Neben dem<br />

Adapter für Kreditkarten, kann es z. B. einen weiteren für Premium Priced SMS geben.<br />

Alle <strong>Payment</strong> Adapter werden im <strong>Payment</strong> Module verwaltet. Die Organisation einer<br />

Transaktion findet ebenfalls im <strong>Payment</strong> Module statt. Ausgelöst wird eine Transaktion<br />

durch einen Aufruf der <strong>Payment</strong> <strong>API</strong>.<br />

Ähnlich der Architektur von UI-Elementen nutzt auch die <strong>Payment</strong> <strong>API</strong> Callbacks.<br />

Jan Fleischhauer, Angelika Zelosko 4


<strong>Payment</strong> <strong>API</strong><br />

TransactionModule<br />

1 1<br />

registers<br />

contains<br />

1 *<br />

<br />

TransactionListener<br />

<br />

TransactionRecord<br />

Abbildung 4: <strong>Payment</strong> <strong>API</strong> Klassen<br />

Über eine Instanz des TransactionModules wird eine Transaktion gestartet. Sobald diese<br />

beendet wurde, erfährt der registierte TransactionListener davon. Er bekommt dabei<br />

ein TransactionRecord übergeben, der Informationen über die abgelaufene Transaktion<br />

enthält. Abbildung 4 gibt die Beziehungen zwischen den <strong>Payment</strong> <strong>API</strong>-Klassen wieder.<br />

5 <strong>Payment</strong> Informationen<br />

Wer Produkte oder Dienstleistungen verkaufen will, der muss offen legen was er verkaufen<br />

möchte und zu welchem Preis. Dies ist auch im Bereich des mobilen <strong>Payment</strong>s nichts<br />

anders. Die Frage ist jedoch, woher die Applikation erfährt welche Produkte überhaupt<br />

verkauft werden können und was diese Kosten. Bereits ab Zeitpunkt der Installation der<br />

Anwendung kann man der <strong>Payment</strong> <strong>API</strong> diese Informationen offen legen. Dies passiert<br />

durch Schlüssel-Wert-Paare in der JAD- und manifest.mf-Datei. Nachfolgend soll gezeigt<br />

werden, wie definiert wird welche Features es gibt, wie man diese kaufen kann und<br />

wie man die jeweiligen Preise angibt. Eine vollständige Version der Informationen findet<br />

sich in Anhang A.<br />

1 Pay-Feature-0: 0<br />

2 Pay-Feature-1: 1<br />

Listing 1: Feature-Deklaration<br />

Obiges Listing (Listing 1) zeigt, wie man käuflich erwerbbare Features deklariert. Die<br />

Nummer im Schlüssel wird hierbei genauso wie der Wert von 0 aufsteigend durchnummeriert.<br />

Die Vergabe von Namen oder ähnlichem ist hier nicht vorgesehen.<br />

Jan Fleischhauer, Angelika Zelosko 5


<strong>Payment</strong> <strong>API</strong><br />

1 Pay-Adapters: X-CCARD,PPSMS<br />

2 Pay-Providers: SONERA, VISA, MASTERCARD<br />

3 Pay-MASTERCARD-Info: X-CCARD, EUR, MASTERCARD, https://<br />

localhost<br />

4 Pay-VISA-Info: X-CCARD, EUR, VISA, https://localhost<br />

5 Pay-SONERA-Info: PPSMS, EUR, 928, 99<br />

Listing 2: Pay-Adapter und -Provider<br />

Die Definitionen für ”<br />

wie kann man kaufen“ finden sich in Listing 2. Zuerst definiert man,<br />

welche <strong>Payment</strong> Adapter man nutzen möchte. Pay-Providers hat als Wert eine Kommaseparierte<br />

Liste von Providernamen. Payprovider sind beispielweise Kreditkarteninstitute.<br />

Diese Namen finden sich in den Tags Pay--Info wieder. Die Namen für Pay Provider<br />

sind frei wählbar, sollten aber, da diese dem User angezeigt werden, sinnvoll sein.<br />

Die Werte für Pay--Info deklarieren Informationen über den Provider. Der erste<br />

Wert muss einer der <strong>Payment</strong> Adapter sein, der zweite Wert legt die Währung fest. Alle<br />

weiteren Werte sind Adapter abhängig. Im obigen Beispiel muss für einen Kreditkartenadapter<br />

der Name des Kartenanbieters sowie der Server für die Kommunikation festgelegt<br />

werden. Für den Adapter Premium Prices SMS werden die Werte für Mobile Country<br />

Code und Mobile Network Code angegeben. Mobile Country Code ist ein Code, der das<br />

Land festlegt, der Mobile Network Code legt das Netz fest.<br />

1 Pay-MASTERCARD-Tag-0: 1.45, 1_game<br />

2 Pay-MASTERCARD-Tag-1: 2.95, 3_games<br />

3 Pay-SONERA-Tag-0: 1.40, 5550000, 1_GAME, 1<br />

4 Pay-SONERA-Tag-1: 2.80, 5550000, 3_GAMES, 2<br />

5 Pay-VISA-Tag-0: 1.50, 1_game<br />

6 Pay-VISA-Tag-1: 3.00, 3_games<br />

Listing 3: Provider-Feature-Mapping<br />

In Listing 3 ist das Mapping von <strong>Payment</strong> Providern und Feature Ids zu sehen. Es wird definiert,<br />

was welches Feature beim jeweiligen Provider kostet. Preise für das gleiche Feature<br />

können sich, wie oben ersichtlich, von Provider zu Provider unterschieden. Die Schlüssel<br />

haben die Form Pay--Tag. Der Werte ist der Preis, hinzu kommen<br />

Provider- (oder besser: Adapter-) abhängige Werte. Im Beispiel für Kreditkarten ist dies<br />

ein Name des Features, der bei der Abrechnung mit angegeben wird. Bei der Premium<br />

Priced SMS sind es die Nummer, an die die SMS geschickt wird, der Inhalt der Nachricht<br />

der SMS und die Anzahl der SMS, die verschickt werden. Der Betrag wird dann auf die<br />

angegebene Anzahl an SMS aufgeteilt. Dies ist beispielsweise notwendig, wenn ein Provider<br />

festlegt, dass eine SMS nur maximal 1,99 EUR kosten darf, für das Feature aber 2,80<br />

EUR zu zahlen sind.<br />

Jan Fleischhauer, Angelika Zelosko 6


<strong>Payment</strong> <strong>API</strong><br />

Abbildung 5: <strong>Payment</strong> Informationen<br />

Abbildung 5 zeigt, dass es zwei Möglichkeiten gibt, wie sich das <strong>Payment</strong> Modul die<br />

<strong>Payment</strong> Informationen beschafft.<br />

Zum einen gibt es die Informationen, die bereits zum Zeitpunkt der Installation zur<br />

Verfügung stehen. Diese Informationen finden sich wie bereits erwähnt in der JAD- sowie<br />

in der manifest.mf-Datei wieder.<br />

Die JAD-Datei enthält allgemeine Informationen. Der User erfährt so, dass die Applikation,<br />

die er installieren möchte, sich der <strong>Payment</strong> <strong>API</strong> bedient. In der manifest.mf -Datei<br />

befinden sich die oben beschriebenen Informationen wie <strong>Payment</strong> Provider und Features.<br />

Natürlich ist es auch möglich alle <strong>Payment</strong> Informationen in der JAD-Datei zu halten.<br />

Preise unterliegen meist einem Wandel. Um diesem Fakt Rechnung zu tragen gibt es die<br />

Möglichkeit die <strong>Payment</strong> Informationen zu aktualisieren. Wie in Abbildung 5 zu sehen,<br />

stellt das Aktualisieren der <strong>Payment</strong> Informationen die zweite Variante dar, wie das <strong>Payment</strong><br />

Module an die Daten gelangt. Die <strong>Payment</strong> <strong>API</strong> sieht für das Aktualisieren drei<br />

Strategien vor:<br />

Vor jeder Transaktion wird versucht, die <strong>Payment</strong> Informationen zu aktualisieren<br />

Über einen Update-Button bekommt der User die Möglichkeit die Aktualisierung<br />

selbst anzustoßen (vlg. Abbildung 1)<br />

In den <strong>Payment</strong> Informationen ist ein Verfallsdatum angegeben. Transaktionen, die<br />

nach diesem Datum angestoßen werden sorgen dafür, dass vor Ausführung versucht<br />

wird, die <strong>Payment</strong> Informationen zu aktualisieren<br />

Welche der drei genannten Methoden verwendet werden soll, wird erstmals beim Veröffentlichen<br />

der Applikation bestimmt. Sie kann jedoch jederzeit auf eine Andere gewechselt werden.<br />

Jan Fleischhauer, Angelika Zelosko 7


<strong>Payment</strong> <strong>API</strong><br />

1 Pay-Update-Stamp: 2004-08-12T13:30:00Z<br />

2 Pay-Update-URL: http://localhost/Bullshit<strong>Payment</strong>/bin/bullshit<br />

.jpp<br />

3 Pay-Cache: no<br />

Listing 4: Update Informationen<br />

Listing 4 stammt aus der manifest.mf-Datei. Diese Felder dienen dazu den vorgestellten<br />

Aktualisierungsvorgang mit Hilfe einer JPP-Datei zu ermöglichen. Eine JPP-Datei hat<br />

die gleiche Struktur und die gleichen Felder wie die JAD- / manifest.mf-Datei.<br />

Der Wert von Pay-Update-Stamp definiert den Zeitpunkt, zu dem die Informationen dieser<br />

Datei aktuell sind. Bei einem Update wird er mit mit dem timestamp der JPP-Datei verglichen<br />

um festzustellen, ob die <strong>Payment</strong> Informationen aktualisiert werden müssen. Unter<br />

der Pay-Update-URL muss das <strong>Payment</strong> Modul diese JPP-Datei empfangen können.<br />

Das dritte Feld, Pay-Cache definiert eine der bereits vorgestellten Aktualisierungsstrategien.<br />

Der Wert ”<br />

no“ sorgt dafür, dass automatisch vor jeder Transaktion ein Update der<br />

<strong>Payment</strong> Informationen probiert wird, ”<br />

yes“ lässt dem User die freie Wahl, wann er die<br />

<strong>Payment</strong> Informationen aktualisiert. Die dritte Möglichkeit ist, einen Timestamp einzutragen,<br />

das ”<br />

expiry date“. Der Inhalt der JPP-Datei ersetzt im Falle eines Updates alle<br />

<strong>Payment</strong>felder der Midletsuite. Sie muss also alle nötigen Felder enthalten, selbst wenn<br />

sich diese Felder nicht ändern. Felder, die im Vergleich zu den bisherigen <strong>Payment</strong> Informationen<br />

nicht mehr auftauchen, werden dementsprechend gelöscht. Will man also keine<br />

Bezahlung über Mastercard mehr zulassen, so löscht man in der JPP-Datei einfach den<br />

Provider MASTERCARD und alle zugehörigen Felder.<br />

1 Pay-Certificate-1-1: MIICFTCCAX6g[...]AbVE5mC28ciGmhjT<br />

2 Pay-Signature-RSA-SHA1: Cg45RTqqU[...]iJpqqJFbSt5MA=<br />

Listing 5: Signatur<br />

Da der Updatevorgang von <strong>Payment</strong> Informationen sensitiv ist, muss die JPP-Datei signiert<br />

sein (s. Listing 5). Die Felder Pay-Certificate--und Pay-Signature-RSA-<br />

SHA1 sind äquivalent zu den jad Feldern MIDlet-Certificate--und MIDlet-Jar-<br />

RSA-SHA1.<br />

6 Ablauf aus Entwicklersicht<br />

Bisher ist bekannt, worauf eine <strong>Payment</strong> Applikation aufbaut, woher sie ihre Preisinformationen<br />

bezieht und wie der Ablauf aus Benutzersicht aussieht. Was fehlt, ist die Sicht des<br />

Entwicklers. Um diese zu beleuchten dient das Sequenzdiagramm in Abbildung 6 und die<br />

nachfolgenden Codebeispiele. Ebenfalls in diesem Kapitel befindet sich ein vollständiges<br />

Klassendiagramm der <strong>Payment</strong> <strong>API</strong> (Abbildung 7), angesprochen werden die Teile, die<br />

typischerweise gebraucht werden.<br />

Jan Fleischhauer, Angelika Zelosko 8


<strong>Payment</strong> <strong>API</strong><br />

Midlet<br />

TransactionListener<br />

new()<br />

TransactionModule<br />

setListener()<br />

process()<br />

processed()<br />

Abbildung 6: Sequenzdiagramm Zahlungsprozess<br />

Kern in einer Applikation die das JSR 229 nutzt ist das TransactionModule. Der Code<br />

in Listing 6 erstellt eine Instanz des TransactionModules. Im Konstruktor übergeben<br />

werden muss das Midlet, dass das TransactionModule benutzt. Danach wird der TransactionListener<br />

gesetzt. In diesem Fall implementiert die Klasse, die das TransactionModule<br />

erstellt, auch gleich das Interface TransactionListener.<br />

1 private TransactionModule txModule ;<br />

2 . . . . . .<br />

3 try {<br />

4 txModule = new TransactionModule ( this . bingo ) ;<br />

5 txModule . setListener ( this ) ;<br />

6 } catch ( TransactionModuleException tme) {<br />

7 }<br />

Listing 6: TransactionModule<br />

Beim Erstellen des TransactionModules kann eine TransactionModuleException geworfen<br />

werden. Dies geschieht typischerweise dann, wenn die <strong>Payment</strong> Informationen korrupt<br />

oder unvollständig sind oder aus einem anderen Grund das <strong>Payment</strong> Module eine Verbindung<br />

zum TransactionModule verhindert. Geht alles gut steht das TransactionModule<br />

bereit um Transaktionen auszuführen.<br />

Jan Fleischhauer, Angelika Zelosko 9


<strong>Payment</strong> <strong>API</strong><br />

1 public void start<strong>Payment</strong> ( int featureId ) {<br />

2 try {<br />

3 String text = ”” ;<br />

4 if ( featureId == FEATURE 1 GAME) {<br />

5 text=”Buy one BullShitBingo game” ;<br />

6 } else if ( featureId == FEATURE 3 GAMES) {<br />

7 text=”Buy three BullShitBingo games” ;<br />

8 }<br />

9 txModule . process ( featureId , ”BullShitGame Purchasing” , text ) ;<br />

10 } catch ( TransactionModuleException e ) {<br />

11<br />

12 } catch ( TransactionFeatureException e ) {<br />

13<br />

14 } catch ( TransactionListenerException e ) {<br />

15<br />

16 }<br />

17 }<br />

Listing 7: Transaktion starten<br />

Wie eine Transaktion gestartet wird findet sich in Listing 7. Vor dem Starten hat man<br />

den User auswählen lassen welches Feature er kaufen möchte. Mit Hilfe der ID wird herausgefunden,<br />

um welches Feature es sich handelt und dementsprechend wird ein String<br />

erstellt. Dieser wird auf dem nachfolgenden Screen (den die <strong>Payment</strong> <strong>API</strong> erzeugt) angezeigt<br />

und macht dem User noch einmal klar, was er hier kauft. Die Methode process stößt<br />

die Transaktion dann an. Hier wird neben der Feature ID eine Überschrift für den nun<br />

erscheinende Screen sowie eben angesprochener String übergeben. Welche Methoden die<br />

<strong>Payment</strong> <strong>API</strong> insgesamt zur Verfügung stellt ist in Abbildung 7 dargestellt.<br />

TransactionModule<br />

+TransactionModule(object: Object)<br />

+setListener(listener: TransactionListener): void<br />

+process(featureID: int, featureTitle:String, featureDescription: String):int<br />

+process(featureID: int, featureTitle:String, featureDescription: String, payload: byte[]):int<br />

+getPastTransactions(max:int):TransactionRecord[]<br />

+deliverMissedTransactions():void<br />

1 1<br />

registers<br />

contains<br />

TransactionListener<br />

1 *<br />

TransactionRecord<br />

+processed(record:TransactionRecord):void<br />

-TRANSACTION_SUCCESSFUL:int = 0<br />

-TRANSACTION_FAILED:int = 1<br />

-TRANSACTION_REJECTED:int = 2<br />

+getFeatureID():int<br />

+getTransactionID():int<br />

+getFinishedTimestamp():long<br />

+getState():int<br />

+wasMissed():boolean<br />

Abbildung 7: <strong>Payment</strong> <strong>API</strong><br />

Jan Fleischhauer, Angelika Zelosko 10


<strong>Payment</strong> <strong>API</strong><br />

In Listing 8 sieht man die Methode processed. Sie muss im TransactionListener implementiert<br />

sein und dient als Callback aus dem <strong>Payment</strong> Modul. Sobald die Transaktion<br />

beendet ist, wird processed gerufen, ihr Transaktionsergebnis als TransactionRecord<br />

übergeben. Aus diesem TransactionRecord lassen sich viele Informationen über die Transaktion<br />

abrufen. Das wichtigste ist die Frage, ob die Transaktion erfolgreich (TRANSAC-<br />

TION SUCCESSFUL) war oder nicht. Im Falle einer erfolgreichen Transaktion lässt sich<br />

über getFeatureID herausfinden, welches Feature denn hier erfolgreich gekauft wurde um<br />

dementsprechend z.B. dem User ein neues Leben gutzuschreiben.<br />

1 public void processed ( TransactionRecord record ) {<br />

2 switch ( record . getState () ) {<br />

3 case TransactionRecord .TRANSACTION SUCCESSFUL:<br />

4 switch ( record . getFeatureID () ) {<br />

5 case FEATURE 1 GAME:<br />

6 bingo . increaseGamesPurchased (1) ;<br />

7 bingo . setLast<strong>Payment</strong>State ( BullShit<strong>Payment</strong> .<br />

FEATURE 1 GAME) ;<br />

8 break ;<br />

9 case FEATURE 3 GAMES:<br />

10 bingo . increaseGamesPurchased (3) ;<br />

11 bingo . setLast<strong>Payment</strong>State ( BullShit<strong>Payment</strong> .<br />

FEATURE 3 GAMES) ;<br />

12 break ;<br />

13 }<br />

14 break ;<br />

15 case TransactionRecord .TRANSACTION REJECTED:<br />

16 bingo . setLast<strong>Payment</strong>State ( BullShit<strong>Payment</strong> .TRANSACTION REJECTED)<br />

;<br />

17 break ;<br />

18 case TransactionRecord .TRANSACTION FAILED:<br />

19 bingo . setLast<strong>Payment</strong>State ( BullShit<strong>Payment</strong> .TRANSACTION FAILED) ;<br />

20 break ;<br />

21 }<br />

22 bingo . paymentDone () ;<br />

23 }<br />

Listing 8: Transaktion abgeschlossen<br />

Jan Fleischhauer, Angelika Zelosko 11


<strong>Payment</strong> <strong>API</strong><br />

A JAD-Datei<br />

1 Pay-Version: 1.1<br />

2 Pay-Adapters: X-CCARD,PPSMS<br />

3 Pay-Update-Stamp: 2004-08-12T13:30:00Z<br />

4 Pay-Update-URL: http://localhost/Bullshit<strong>Payment</strong>/bin/bullshit<br />

.jpp<br />

5 Pay-Cache: no<br />

6 Pay-Providers: SONERA, VISA, MASTERCARD<br />

7 Pay-Feature-0: 0<br />

8 Pay-Feature-1: 1<br />

9 Pay-MASTERCARD-Info: X-CCARD, EUR, MASTERCARD, https://<br />

localhost<br />

10 Pay-MASTERCARD-Tag-0: 1.45, 1\_game<br />

11 Pay-MASTERCARD-Tag-1: 2.95, 3\_games<br />

12 Pay-SONERA-Info: PPSMS, EUR, 928, 99<br />

13 Pay-SONERA-Tag-0: 1.40, 5550000, 1\_GAME, 1<br />

14 Pay-SONERA-Tag-1: 2.80, 5550000, 3\_GAMES, 2<br />

15 Pay-VISA-Info: X-CCARD, EUR, VISA, https://localhost<br />

16 Pay-VISA-Tag-0: 1.50, 1_game<br />

17 Pay-VISA-Tag-1: 3.00, 3_games<br />

Listing 9: Beispiel einer JAD-Datei<br />

Jan Fleischhauer, Angelika Zelosko 12


<strong>Payment</strong> <strong>API</strong><br />

Literatur<br />

[1] Das Handy-Ticket,<br />

www.dashandyticket.de<br />

[2] Schlauer Parken“ in Wiesbaden,<br />

”<br />

www.wiesbadener-kurier.de/region/objekt.php3artikel id=2065451, 04.10.2005<br />

[3] Java Specification Request 229,<br />

http://jcp.org/aboutJava/communityprocess/final/jsr229/<br />

Jan Fleischhauer, Angelika Zelosko 13

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!