mirror of
https://github.com/cwinfo/envayasms.git
synced 2024-11-14 20:30:26 +00:00
557 lines
18 KiB
Twig
Executable File
557 lines
18 KiB
Twig
Executable File
id: serverapi
|
|
title: Server API Reference
|
|
---
|
|
<p>
|
|
EnvayaSMS communicates with the server via HTTP POST requests that expect an XML response.
|
|
</p>
|
|
|
|
<p>
|
|
For convenience, EnvayaSMS includes <a href='https://github.com/youngj/EnvayaSMS/tree/master/server'>server libraries and example code</a>
|
|
for certain languages to simplify handling its POST requests and generating response XML.
|
|
</p>
|
|
|
|
<p>
|
|
Drupal users can also install the <a href='https://drupal.org/project/sms_envaya'>Drupal module</a> (developed by Mark Burdett / VozMob).
|
|
</p>
|
|
|
|
<p>
|
|
If a server library is not yet available for your programming language, you can still use
|
|
EnvayaSMS by implementing code in accordance with the API reference below.
|
|
We encourage you to contribute new libraries and example code back to the EnvayaSMS project!
|
|
</p>
|
|
|
|
<h3>Testing Your Implementation</h3>
|
|
<p>
|
|
The <a href='https://raw.github.com/youngj/EnvayaSMS/master/server/php/example/www/test.html'>EnvayaSMS Request Simulator</a>
|
|
is a standalone HTML file that allows you to simulate EnvayaSMS's HTTP requests entirely in your browser via JavaScript.
|
|
</p>
|
|
|
|
<p>
|
|
Just copy the HTML file somewhere on your site, and open it in a web browser. The URL of the EnvayaSMS Request Simulator
|
|
must be on the same domain as the Server URL.
|
|
</p>
|
|
|
|
<h3>
|
|
HTTP Request Format
|
|
</h3>
|
|
|
|
<h4>Example requests</h4>
|
|
|
|
<p>
|
|
In each of the example requests below, the Server URL is <code style='white-space:nowrap'>http://192.168.70.1:3000/sg/app</code>
|
|
and the phone number of the phone with EnvayaSMS is <code>16505551212</code>.
|
|
</p>
|
|
|
|
<p>An incoming SMS from <code>6505551234</code> with message body "test":</p>
|
|
|
|
<pre>
|
|
POST /sg/app HTTP/1.1
|
|
X-Request-Signature: sAemG31uRllk/K9xck2WRNaF/WI=
|
|
Content-Length: 140
|
|
Content-Type: application/x-www-form-urlencoded
|
|
Host: 192.168.70.1:3000
|
|
Connection: Keep-Alive
|
|
|
|
from=6505551234&message_type=sms&message=test&version=2&phone_number=16505551212
|
|
&action=incoming&age=23&network=WIFI&timestamp=1317506831000
|
|
</pre>
|
|
|
|
<p>An incoming MMS message with an <code>image/jpeg</code> part and a <code>text/plain</code> part with message 'Test':</p>
|
|
|
|
<pre style='white-space:pre-wrap'>
|
|
POST /sg/app HTTP/1.1
|
|
X-Request-Signature: OgpiQet9guVhEp+0klrONR8qGNs=
|
|
Content-Length: 13087
|
|
Content-Type: multipart/form-data; boundary=i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Host: 192.168.70.1:3000
|
|
Connection: Keep-Alive
|
|
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="from"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
+16505551234
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="timestamp"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
1317506831000
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="message"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Test
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="message_type"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
mms
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="mms_parts"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
[{"type":"application/smil","filename":"01smil","cid":"<0000>","name":"part0"},
|
|
{"type":"text/plain","filename":"Text01.txt","cid":"<569>","name":"part1"},
|
|
{"type":"image/jpeg","filename":"Image0001.jpg","cid":"<570>","name":"part2"}]
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="version"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
3
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="phone_number"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
16505551212
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="action"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
incoming
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="part0"; filename="01smil"
|
|
Content-Type: application/smil; charset=UTF-8
|
|
Content-Transfer-Encoding: binary
|
|
|
|
<smil>
|
|
<head>
|
|
<layout>
|
|
<root-layout height="160" width="128"/>
|
|
<region fit="meet" height="70%" id="Image" left="0%" top="30%" width="100%"/>
|
|
<region fit="scroll" height="30%" id="Text" left="0%" top="0%" width="100%"/>
|
|
</layout>
|
|
</head>
|
|
<body>
|
|
<par dur="8000ms">
|
|
<text region="Text" src="cid:569"/>
|
|
<img region="Image" src="cid:570"/>
|
|
</par>
|
|
</body>
|
|
</smil>
|
|
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="part1"; filename="Text01.txt"
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: binary
|
|
|
|
Test
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
|
|
Content-Disposition: form-data; name="part2"; filename="Image0001.jpg"
|
|
Content-Type: image/jpeg
|
|
Content-Transfer-Encoding: binary
|
|
|
|
<em>BINARY IMAGE DATA</em>
|
|
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG--
|
|
</pre>
|
|
|
|
<p>Checking for outgoing SMS messages:</p>
|
|
|
|
<pre>
|
|
POST /sg/app HTTP/1.1
|
|
X-Request-Signature: 139CL71b7r1Zw/E2wcccWFviSlg=
|
|
Content-Length: 50
|
|
Content-Type: application/x-www-form-urlencoded
|
|
Host: 192.168.70.1:3000
|
|
Connection: Keep-Alive
|
|
|
|
action=outgoing&version=2&phone_number=16505551212
|
|
</pre>
|
|
|
|
<p>Notifying the server of the status of a sent message:</p>
|
|
|
|
<pre>
|
|
POST /sg/app HTTP/1.1
|
|
X-Request-Signature: 6uJtI6+QqlVBbUsR4T0WsQomods=
|
|
Content-Length: 80
|
|
Content-Type: application/x-www-form-urlencoded
|
|
Host: 192.168.70.1:3000
|
|
Connection: Keep-Alive
|
|
|
|
id=1536&status=sent&error=&action=send_status&version=2&phone_number=16505551212
|
|
</pre>
|
|
|
|
<h4>Specification</h4>
|
|
|
|
<p>
|
|
The following parameters are sent in all POST requests from EnvayaSMS:
|
|
</p>
|
|
|
|
<dl>
|
|
<dt>"version" ::= <integer></dt>
|
|
<dd>
|
|
EnvayaSMS's version code. This is an integer that will be incremented whenever
|
|
a new version of EnvayaSMS is released. (It is not the same as the version name shown
|
|
on the Help screen.)
|
|
<br />
|
|
<br />
|
|
This allows the server to support phones running different API versions at the same time.
|
|
If a deployment has many phones running with EnvayaSMS, the server should update its code first,
|
|
then the phones can be upgraded to the new version of EnvayaSMS as convenient.
|
|
</dd>
|
|
|
|
<dt>"phone_number" ::= <text></dt>
|
|
<dd>
|
|
The phone number of the phone running EnvayaSMS, as entered under Menu > Settings.
|
|
<br /><br />
|
|
This allows the server to differentiate between EnvayaSMS clients if multiple phones
|
|
are running EnvayaSMS.
|
|
</dd>
|
|
|
|
<dt>"log" ::= <text></dt>
|
|
<dd>
|
|
Log messages printed to the EnvayaSMS console since the last successful HTTP request.
|
|
<br /><br />
|
|
You may wish to append this data to a log file to allow administrators
|
|
to see error details without needing physical access to the phone.
|
|
<br /><br />
|
|
EnvayaSMS does not guarantee that the server receives log messages in order. Occasionally,
|
|
the server may receive the same log message multiple times.
|
|
</dd>
|
|
|
|
<dt>"network" ::= <text></dt>
|
|
<dd>
|
|
The phone's current type of internet connectivity. Typically this is either "MOBILE" or "WIFI".
|
|
</dd>
|
|
|
|
<dt>"action" ::= "outgoing" | "incoming" | "send_status" | "device_status" | "test" </dt>
|
|
<dd>
|
|
The request action determines the purpose of the HTTP request:
|
|
|
|
<dl>
|
|
<dt>"outgoing":</dt>
|
|
<dd>
|
|
Poll the server for outgoing messages
|
|
</dd>
|
|
|
|
<dt>"incoming":</dt>
|
|
<dd>
|
|
Forward an incoming SMS or MMS message to the server
|
|
</dd>
|
|
|
|
<dt>"send_status":</dt>
|
|
<dd>
|
|
Update the server on the status of sending an outgoing message
|
|
</dd>
|
|
|
|
<dt>"device_status":</dt>
|
|
<dd>
|
|
Notify the server of a change in the Android device's state.
|
|
</dd>
|
|
|
|
<dt>"test":</dt>
|
|
<dd>
|
|
Test the server connection.
|
|
</dd>
|
|
|
|
|
|
</dl>
|
|
|
|
The other POST parameters sent depend on the request action.
|
|
</dd>
|
|
</dl>
|
|
|
|
The following HTTP Headers are sent in all POST requests from EnvayaSMS:
|
|
|
|
<dl>
|
|
<dt>"X-Request-Signature" ::= <text></dt>
|
|
<dd>
|
|
A signature of the request to verify the phone and the server share the same password.
|
|
(This doesn't protect against MITM snooping or replay attacks, so it is recommended to
|
|
use the <code>https://</code> protocol.)
|
|
<br />
|
|
<br />
|
|
The signature is calculated by the following algorithm:
|
|
|
|
<ol>
|
|
<li>Sort all POST parameters, not including file uploads,
|
|
by the name of the field (in the usual ASCII order).</li>
|
|
|
|
<li>Generate an input string by concatenating:
|
|
<ul>
|
|
<li>the server URL,</li>
|
|
<li>each of the sorted POST parameters, in the format name=value for each name/value pair,</li>
|
|
<li>the password,</li>
|
|
</ul>
|
|
with a comma in between each element, like so:
|
|
<br />
|
|
<code>"<serverURL>,<name1>=<value1>,<...>,<nameN>=<valueN>,<password>"</code>
|
|
</li>
|
|
|
|
<li>Generate the SHA-1 hash of the input string in UTF-8</li>
|
|
|
|
<li>Encode the SHA-1 hash using Base64 with no line breaks.</li>
|
|
</ol>
|
|
</dd>
|
|
</dl>
|
|
|
|
Additional parameters sent in POST requests with <code>action=incoming</code>:
|
|
|
|
<dl>
|
|
<dt>"from" ::= <text></dt>
|
|
<dd>
|
|
The phone number of the message sender.
|
|
</dd>
|
|
|
|
<dt>"message_type" ::= "sms" | "mms"</dt>
|
|
<dd>
|
|
Whether this message is an SMS or MMS.
|
|
</dd>
|
|
|
|
<dt>"message" ::= <text></dt>
|
|
<dd>
|
|
The message body of the SMS, or the content of the <code>text/plain</code> part of the MMS.
|
|
For multipart SMS messages, this field contains all parts concatenated and may be longer than 160 characters.
|
|
</dd>
|
|
|
|
<dt>"timestamp" ::= <long integer></dt>
|
|
<dd>
|
|
The timestamp of the incoming message, in milliseconds since midnight, January 1, 1970 UTC.
|
|
</dd>
|
|
|
|
<dt>"age" ::= <long integer></dt>
|
|
<dd>
|
|
The length of time between when the incoming message was received by the phone, and when the message was transmitted to the server, in milliseconds.
|
|
</dd>
|
|
|
|
</dl>
|
|
|
|
Additional parameters sent in POST requests with <code>action=incoming</code> and <code>message_type=mms</code>:
|
|
|
|
<dl>
|
|
<dt>"mms_parts" ::= <json_array></dt>
|
|
<dd>
|
|
Metadata for each part of the MMS. Each item in the JSON array is an object
|
|
with the following keys and values:
|
|
|
|
<dl>
|
|
<dt>"name" ::= <text></dt>
|
|
<dd>
|
|
The name of an additional form field where the content of the MMS part
|
|
is sent as an attached file.
|
|
</dd>
|
|
|
|
<dt>"cid" ::= <text></dt>
|
|
<dd>
|
|
The Content ID of the MMS part. This allows the server to resolve
|
|
references in the SMIL part of the MMS
|
|
(e.g. <code><img region="Image" src="cid:805"/></code>).
|
|
</dt>
|
|
|
|
<dt>"type" ::= "application/smil" | "text/plain" | "image/jpeg" | ...</dt>
|
|
<dd>
|
|
The Content Type of the MMS part.
|
|
</dd>
|
|
|
|
<dt>"filename" ::= <text></dt>
|
|
<dd>
|
|
The filename of the MMS part, as sent by the sender phone,
|
|
e.g. <code>"Image001.jpg"</code>.
|
|
</dt>
|
|
</dl>
|
|
|
|
In addition, the request contains form fields with the content of each MMS part,
|
|
with names as listed in the <code>mms_parts</code> field. Text parts are encoded in UTF-8.
|
|
</dt>
|
|
</dl>
|
|
|
|
Additional parameters sent in POST requests with <code>action=outgoing</code>:
|
|
|
|
<dl>
|
|
<dt>
|
|
(None)
|
|
</dt>
|
|
</dl>
|
|
|
|
Additional parameters sent in POST requests with <code>action=send_status</code>:
|
|
|
|
<dl>
|
|
<dt>"id" ::= <text></dt>
|
|
<dd>
|
|
The Server's ID for the outgoing message (from the <code>id</code> attribute
|
|
of an <a href='#sms'>sms</a> tag in a previous XML response from the server).
|
|
</dd>
|
|
|
|
<dt>"status" ::= "queued" | "failed" | "cancelled" | "sent"</dt>
|
|
<dd>
|
|
The current status of the outgoing message.
|
|
</dd>
|
|
|
|
<dt>"error" ::= <text></dt>
|
|
<dd>
|
|
A description of the reason for the error, if the message
|
|
failed to send; or, an empty string if the message
|
|
has been sent successfully.
|
|
</dd>
|
|
</dl>
|
|
|
|
Additional parameters sent in POST requests with <code>action=device_status</code>:
|
|
|
|
<dl>
|
|
<dt>"status" ::= "power_connected" | "power_disconnected" <br />
|
|
| "battery_low" | "battery_okay"</dt>
|
|
<dd>
|
|
This field describes a condition that has changed on the Android device.
|
|
|
|
<dl>
|
|
<dt>"power_connected":</dt>
|
|
<dd>
|
|
The phone is now connected to external power.
|
|
</dd>
|
|
|
|
<dt>"power_disconnected":</dt>
|
|
<dd>
|
|
This phone is no longer connected to external power.
|
|
</dd>
|
|
|
|
<dt>"battery_low":</dt>
|
|
<dd>
|
|
The phone's battery level has dropped below 15%.
|
|
</dd>
|
|
|
|
<dt>"battery_okay":</dt>
|
|
<dd>
|
|
The phone's battery level is now at least 20% (after dropping below 15%).
|
|
</dd>
|
|
|
|
<dt>"send_limit_exceeded":</dt>
|
|
<dd>
|
|
EnvayaSMS is delaying sending outgoing messages because the rate limit for sending messages has been exceeded. (Installing additional expansion packs may be needed.)
|
|
</dd>
|
|
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
|
|
|
|
<h3>
|
|
HTTP Response Format
|
|
</h4>
|
|
|
|
<p>
|
|
For a successful request, the server should return HTTP status code 200.
|
|
Failed requests should return HTTP status codes between 400 and 499 inclusive.
|
|
Failed requests may optionally return an error message to display in the phone logs, as
|
|
a text/xml response like <code><response><error>...</error></response></code>
|
|
</p>
|
|
|
|
<h4>HTTP response for action=incoming and action=outgoing</h4>
|
|
|
|
Example:
|
|
<pre>
|
|
HTTP/1.1 200 OK
|
|
Content-Type: text/xml
|
|
Content-Length: 212
|
|
|
|
<?xml version='1.0' encoding='UTF-8'?>
|
|
<response>
|
|
<messages>
|
|
<sms id='1540' to='16505551213'>This is a test</sms>
|
|
<sms id='1541' to='16505551214'>This is a another test message.</sms>
|
|
</messages>
|
|
</response>
|
|
</pre>
|
|
|
|
Specification:
|
|
<p>
|
|
The <code>Content-Type</code> header should be <code>text/xml</code>, with the content as follows:
|
|
</p>
|
|
<dl>
|
|
<dt><response></dt>
|
|
<dd>
|
|
The root XML element.
|
|
<br /><br />
|
|
Content:
|
|
<dl>
|
|
<dt><messages> (optional if request successful)</dt>
|
|
<dd>The SMS messages to send.</dd>
|
|
</dl>
|
|
<dl>
|
|
<dt><error> (optional if request failed)</dt>
|
|
<dd>An error message.</dd>
|
|
</dl>
|
|
</dd>
|
|
|
|
<dt><messages></dt>
|
|
<dd>
|
|
A container for the messages to send.
|
|
<br />
|
|
<br />
|
|
Attributes:
|
|
<dl><dt>none</dt></dl>
|
|
<br />
|
|
Content:
|
|
<dl>
|
|
<dt><sms>*</dt>
|
|
<dd>The SMS messages to send.</dd>
|
|
</dl>
|
|
</dd>
|
|
<dt id='sms'><sms></dt>
|
|
<dd>
|
|
Describes an outgoing SMS to send.
|
|
<br /><br />
|
|
Attributes:
|
|
<dl>
|
|
<dt>"id" ::= <text> (optional)</dt>
|
|
<dd>
|
|
An ID for this outgoing message. (EnvayaSMS will send this
|
|
back to the server as the id field in a send_status request.)
|
|
</dd>
|
|
<dt>"to" ::= <text> (optional for incoming, required for outgoing)</dt>
|
|
<dd>
|
|
The phone number to send the SMS to. If omitted for
|
|
action=incoming, it will be sent as a reply to the original
|
|
sender.
|
|
</dd>
|
|
<dt>"priority" ::= <integer> (optional)</dt>
|
|
<dd>
|
|
The priority level of the outgoing message. If your server is sending outgoing messages
|
|
faster than the phone can send them out, the priority level allows you to specify
|
|
the order to send them (e.g. so that you can send transactional SMS replies
|
|
before asynchronous notifications).
|
|
<br />
|
|
<br />
|
|
Larger integers represent higher priorities.
|
|
If omitted, the default priority level is 0.
|
|
<br />
|
|
<br />
|
|
Within a priority level, SMS messages are processed and sent in the order
|
|
they were received from the server, and from top to bottom within the XML rsponse.
|
|
</dd>
|
|
</dl>
|
|
<br />
|
|
Content:
|
|
<dl>
|
|
<dt>CDATA</dt>
|
|
<dd>
|
|
The content of the SMS message to send. If the content is longer than the maximum size of a single SMS (typically 160 characters),
|
|
it will automatically be sent as a multipart SMS.
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
|
|
<h4>HTTP Response for action=send_status</h4>
|
|
|
|
Example:
|
|
<pre>
|
|
HTTP/1.1 200 OK
|
|
Content-Type: text/plain
|
|
Content-Length: 2
|
|
|
|
OK
|
|
</pre>
|
|
|
|
<p>
|
|
HTTP status code 200 signifies success, and anything else signifies failure.
|
|
The response content for successful <code>send_status</code> requests is currently ignored, except that
|
|
requests with HTTP code 400-499 may return an error message as text/xml.
|
|
</p>
|