Payment API - Medieninformatik
Payment API - Medieninformatik
Payment API - Medieninformatik
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