2251e4a53c20d7ddfd71f4fe85629b353b424eb8
[core.git] / inc / classes / third_party / api / primusportal / class_PrimeraApi.php
1 <?php
2 /**
3  * PrimeraApi
4  * -------------------------------------------
5  * Mit dieser Klasse ist ein einfacher Primeratransfer von Ihrem Account
6  * zu dem Account eines bei Primusportal.de registrierten Mitglieds möglich.
7  *
8  * ----------------- Aenderungen durch Roland Haeder 09.08.2008 ---------------
9  * Klasse umbenannt nach PrimeraApi, damit sie in das Framework besser passt.
10  * Zudem sind alle oeffentlichen Attribute nun privat, der Konstruktor hat den
11  * neuen "magischen" Namen __construct() und "normale" Konstanten sind nach
12  * Klassenkonstanten umbenannt. Unsinnige else-Bloecke sind noch umgewandelt.
13  * Methodennamen fangen nun immer mit einem kleinen Buchstaben an. Zudem sind
14  * die Methoden Pay,Query und Parse umbenannt.
15  * ----------------- Aenderungen durch Roland Haeder 09.08.2008 ---------------
16  *
17  * ----------------- Aenderungen durch Roland Haeder 19.04.2011 ---------------
18  * Es ist nun bei allen Methoden- und Feldnamen der erste Buchstabe
19  * kleingeschrieben, damit es besser in meine Namenskonvention passt. Noch mehr
20  * doppelte Anfuehrungszeichen in einfache umgewandelt, damit die Klasse
21  * performanter (wegen sonst doppeltes Parsen) wird.
22  * ----------------- Aenderungen durch Roland Haeder 19.04.2011 ---------------
23  *
24  * ------------ Achtung! Bitte zuerst lesen, bevor Sie weiterlesen: -----------
25  * Das meiste aus der unteren Anleitung sollte auf die hier verwendeten Namen
26  * portiert sein. Falls Sie Fragen haben, bitte melden Sie sich bei Roland
27  * Haeder. Funktionell wurde hier aber nichts geaendert.
28  * ------------ Achtung! Bitte zuerst lesen, bevor Sie weiterlesen: -----------
29  *
30  * Die Einbindung des Interfaces geschieht folgendermaßen:
31  *  1. Einbindung der Klasse in Ihr PHP-Auszahlungsskript:
32  *     CODE:
33  *       $primusUsername = 'username'; // Ihr Username bei Primusportal
34  *       $primusPassword = 'passwort'; // Ihr Passwort bei Primusportal
35  *
36  *       $apiInstance = ObjectFactory::createObjectByName('PrimeraApi', array($primusUsername, $primusPassword));
37  *  2. Durchführen einer Auszahlung:
38  *     CODE:
39  *       $Status = $apiInstance->payPrimera($PayReceiver, $PayAmount, $PayDescription);
40  *
41  *     Wobei $PayReicer der Username des Empfängers bei
42  *     Primusportal.de ist. $PayAmount ist der gerundete( !! ) Betrag an Primera,
43  *     die der Empfänger erhalten soll. $PayDescription ist eine von Ihnen 
44  *     festgelegte kurze Beschreibung. Die Länge dieses Textes darf 100 Zeichen
45  *     nicht überschreiten. Beispiel:
46  *       $status = $apiInstance->payPrimera('garbage', 10000, 'Auszahlung IhreSeite.de - ID: 12345');
47  *  3. Überprüfung des Status (Rückgabecode):
48  *     CODE:
49  *       if ($status === false) {
50  *         // Ein Fehler ist aufgetreten
51  *     // Fehlerbehandlung hier einfügen...
52  *       } else {
53  *         // Auszahlung erfolgreich durchgeführt
54  *         // Führen Sie hier Ihre Datenbankabfragen durch, um die Auszahlung zu
55  *         // bestätigen...
56  *       }
57  *
58  *     Die komplette Rückgabe des Interfaces wird als assoziatives Array in der Klassen-
59  *     variable $data gespeichert:
60  *     $data = array(
61  *           'status' => Rückgabecode (PI_DONE, PI_SENDER_ERROR, ...),
62  *           'statustext' => Status in Worten (z.B.: 'Transaktion erfolgreich durchgeführt'),
63  *     );
64  *
65  *
66  * @author              Andreas Schmidt <xxgarbagexx@web.de>
67  * @author              Roland Haeder <webmaster.ship-simu.org>
68  * @version             1.0 - beta
69  * @copyright   (c) 2007 by Primusportal.de
70  * @copyright   (c) 2008, 2011 by Roland Haeder
71  */
72 class PrimeraApi extends BaseFrameworkSystem {
73         /**
74          * Fehler - Interfacebenutzer
75          */
76         const PI_ERROR = -1;
77
78         /**
79          * Statuscode für erfolgreich ausgeführte Transaktion
80          */
81         const PI_DONE = 200;
82
83         /**
84          * Fehler - User existiert nicht oder ist gesperrt
85          */
86         const PI_RECEIVER_ERROR = 301;
87
88         /**
89          * Sender-Account Fehler (User nicht existent, gesperrt, ...)
90          */
91         const PI_SENDER_ERROR = 401;
92
93         /**
94          * Betrag fehler
95          */
96         const PI_AMOUNT_ERROR = 501;
97
98         /**
99          * Zu wenig Primera
100          */
101         const PI_TOO_LESS_PRIMERA = 502;
102
103         /**
104          * User nicht aktiv oder existiert nicht
105          */
106         const PI_USER_CHECK_ERROR = 601;
107
108         /**
109          * User aktiv
110          */
111         const PI_USER_CHECK_OK = 602;
112
113         /**
114          * Primerastand erfolgreich geholt
115          */
116         const PI_GET_PRIMERA_DONE = 701;
117
118         /**
119          * HTTP-EOL
120          */
121         const HTTP_EOL = "\r\n";
122
123         /**
124          * URL für das Interface auf dem Primusserver:
125          */
126         private $host = 'www.primusportal.de';
127         private $path = '/transfer.interface.2.0.php';
128
129         private $errno = 0;
130         private $err = '';
131
132         private $seperator = ':';
133
134         private $username = '';
135         private $password = '';
136
137         private $data = array();
138
139         /**
140          * Konstruktor
141          */
142         public function __construct ($primusUsername, $primusPassword) {
143                 // Call parent constructor
144                 parent::__construct();
145
146                 // Set data
147                 $this->username = $primusUsername;
148                 $this->password = $primusPassword;
149         }
150
151         /**
152          * Anfrage senden und Rueckgabecode in Variable speichern
153          */
154         private function queryApi ( $data = array() ) {
155                 $fp = fsockopen($this->host, 80, $this->errno, $this->_err);
156                 if (!$fp) return false;
157
158                 $data['PrimusInterface_Username'] = base64_encode($this->username);
159                 $data['PrimusInterface_Password'] = base64_encode(md5($this->password));
160
161                 // POST-Daten uebermitteln:
162                 $queryData = http_build_query($data, '', '&');
163
164                 $request .= 'POST ' . $this->path . 'HTTP/1.1' . self::HTTP_EOL;
165                 $request .= 'Host: ' . $this->host . self::HTTP_EOL;
166                 $request .= 'Content-type: application/x-www-form-urlencoded' . self::HTTP_EOL;
167                 $request .= 'Content-length: '. strlen($queryData) . self::HTTP_EOL;
168                 $request .= 'Connection: close' . self::HTTP_EOL;
169                 $request .= self::HTTP_EOL;
170                 $request .= $queryData;
171
172                 fputs($fp, $request);
173
174                 $return = '';
175                 while (!feof($fp)) {
176                         $return .= fgets($fp, 128);
177                 } // END - while
178
179                 $content = explode('<!-- return-start -->', $return);
180                 return $content[1];
181         }
182
183         /**
184          * Funktion parst die Rückgabe vom Transferskript:
185          */
186         private function parseContent ( $content ) {
187                 $x = explode("\n", $content);
188                 $return = array();
189                 foreach($x as $currentLine) {
190                         $line_exploded = explode($this->seperator, $currentLine,2);
191                         if (count($line_exploded) > 1) {
192                                 $return[$line_exploded[0]] = $line_exploded[1];
193                         } // END - if
194                 } // END - foreach
195                 return $return;
196         }
197
198         /**
199          * @param int/string $Receiver UserID / Username des Empfängers
200          * @param int$Amount Betrag in ganzzahligen Primera
201          * @param string $Description Beschreibung (Sichtbar in Einzelauflistung)
202          */
203         public function payPrimera ($Receiver, $Amount, $Description = '') {
204                 $valid = false;
205                 $postData = array(
206                         'PrimusInterface_Action'      => 'Pay',
207                         'PrimusInterface_Receiver'    => base64_encode($Receiver),
208                         'PrimusInterface_Amount'      => base64_encode($Amount),
209                         'PrimusInterface_Description' => base64_encode($Description)
210                 );
211
212                 $postReturn = $this->parseContent( $this->queryApi($postData) );
213
214                 $this->data = $postReturn;
215                 if ($postReturn['status'] == '200') {
216                         $valid = true;
217                 } // END - if
218                 return $valid;
219         }
220
221         /**
222          * Überprüft den Status eines Primus-Users
223          * - existiert der User
224          * - ist er aktiv
225          * @param string/int $User Userid / Username
226          */
227         public function checkPrimusUser ($userName) {
228                 $valid = false;
229                 $postData = array(
230                         'PrimusInterface_Action'          => 'CheckPrimusUser',
231                         'PrimusInterface_CheckPrimusUser' => $userName
232                 );
233
234                 $postReturn = $this->parseContent( $this->queryApi($postData) );
235
236                 $this->data = $postReturn;
237
238                 if ($postReturn['status'] == self::PI_USER_CHECK_OK) {
239                         $valid = true;
240                 } // END - if
241                 return $valid;
242         }
243
244         /**
245          * Die Funktion liefer den aktuellen Primerastand
246          */
247         public function getPrimera() {
248                 $primera = false;
249                 $postData = array(
250                         'PrimusInterface_Action' => 'GetPrimera'
251                 );
252                 $postReturn = $this->parseContent( $this->queryApi($postData) );
253
254                 $this->data = $postReturn;
255                 if ($postReturn['status'] == self::PI_GET_PRIMERA_DONE) {
256                         $primera = $postReturn['primera'];
257                 } // END - if
258                 return $primera;
259         }
260 }
261
262 // [EOF]
263 ?>