Für eine Anwendung, die ich gerade umsetze, brauche ich unter anderem auch die Möglichkeit SMS Meldungen zu versenden. Dazu geht man am Einfachsten her und sucht sich von den zahlreichen SMS-Providern einen aus, der einem zusagt. Die Provider bieten in der Regel unterschiedliche Schnittstellen an. E-Mail und HTTP sind so die üblichen Schnittstellen. Ich habe mich für Mobilant entschieden und dort für die HTTP-Schnittstelle. Im großen und Ganzen hat man ein einfaches REST-Interface, sprich alle Daten werden über einen HTTP-Aufruf an den Provider übermittelt.
Um nicht mit urlencoding und dem Zusammenbau der URL zu stolpern während der Programmierung des SMS-Versands, habe ich mir eine übersichtliche Komponente erstellt. Für die Kommunikation mit HTTP-Servern bietet CakePHP 1.2 von Haus aus eine HttpSocket Bibliothek an, die recht einfach zu nutzen ist. Für die Dokumenation zu HttpSocket steht im Augenblick nur die API zur Verfügung. Im Book findet sich dazu leider noch nichts. Wird aber sicherlich noch kommen.
HttpSocket wird zunächst mit App::import geladen und im Konstruktor initalisiert. Danach ist es eigentlich ein leichtes die send() zu Schreiben. Für einen GET Aufruf übergibt man an HttpSocket::send() die URL des Anbieters und übergibt im zweiten Parameter als Array die Parameter für den HTTP-Aufruf.
Bei Mobilant liegt die Schnittstelle auf:
Damit die Komponenten später auch einfach auf anderen SMS-Gateways angepasst werden kann, hab ich mir ein kleines Array $service_apis aufgebaut, das die URL enthält und die Beschreibung für die Parameter die erwartet werden. Bei Mobilant und auch bei den anderen Anbietern benötigt man in der Regel Zugangsinformationen oder eben einen Schlüssel (key) der dafür sorgt, dass das Absenden möglich wird und vorallem auch, damit der SMS-Provider mir eine Rechnung über die versandten SMS-Nachrichten stellen kann.
Die Anwendung der Komponente ist recht trivial. Im Controller wird die Komponente über
1
| $var components = array('SmsGateway'); |
eingebunden und dann kann durch einen Aufruf in der Art:
1
2
| $this->SmsGateway->send('01701234567',
'Das ist eine SMS Nachricht mit CakePHP versandt'); |
genutzt werden.
Als dritten Parameter von send() könnte man noch einen anderen SMS-Provider auswählen, wenn die Daten entsprechend in dem Array $service_api hinterlegt wären.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| <?php
App::import('Core', array('HttpSocket'));
/**
* SMS Gateway
* Documentation can be found on:
* http://www.mobilant.de/system/m_navInf.php?infName=documents
* PDF-Document
*/
class SmsGatewayComponent extends Object {
var $Http = null;
var $service_apis = array(
'mobilant'=>array('url'=>'https://gateway2.mobilant.net/index.php',
'params'=>array('key'=>'xxxxxxxxxxxxxxxxxxx',
'message'=>'%message%', // external parameter
'receiver'=>'%receiver%', // external parameter
'service'=>'sms'
),
),
);
/**
* __construc -- constructor to initialize the HttpSocket Object to access the services
*
* @author: SHirsch
* @created: 09.01.2009
*/
function __construct() {
$this->Http =& new HttpSocket();
}
/* function
**
** @created: 05.01.2009 12:54:43
** @param string $message that should be send via Provider
** @param strng $receiver the phone number of the receiving cell phone
** @param string $service_api name of the url shortener to be used by create as in $this->service_apis
** @return the error from the HTTP request if an error was encountered
*/
function send($message = null, $receiver = null, $service_api = 'mobilant')
{
if (!empty($message) && !empty($receiver)) {
if (array_key_exists($service_api, $this->service_apis)) {
$params = $this->service_apis[$service_api]['params'];
$params['message'] = utf8_encode($message);
$params['receiver'] = $receiver;
return $this->Http->get($this->service_apis[$service_api]['url'], $params);
}
}
return false;
}
/* check_phone_number
**
** @created: 15.01.2009 13:53:59
** @param type $var
**
*/
function check_phone_number($phone)
{
return $phone;
}
} |
Ein paar Erweiterungen sind noch notwendig, wie beispielsweise die Prüfung der Telefonnummer mit Hilfe der Funktion check_phone_number() auf gültige Nummern im Inland oder ähnliches.