WHMCS Module recieving SMS notification on new Order or Ticket
Posted by Simson on February 22nd, 2009This Module has been tested on WHMCS 3.8.1
First of all you are going to need SMS gateway through HTTP so here i pick Clickatell, and make sure you have working WHMCS on your server
1. first create a file on your WHMCS root directory and named it whatever you want. lets say sms_api.php
and use this code or download files that you need here
http://rapidshare.com/files/197247882/sms.zip :
<?php
/**
* Main SMS-API class
class sms {
/** YOU WILL NEED TO EDIT VARIABLE BELOW
*/
var $api_id = “”;
/**
* Clickatell username
* @var mixed
*/
var $user = “”;
/**
* Clickatell password
* @var mixed
*/
var $password = “”;
/** END OF EDITING
*/
/**
* Use SSL (HTTPS) protocol
* @var bool
*/
var $use_ssl = false;
/**
* Define SMS balance limit below class will not work
* @var integer
*/
var $balace_limit = 0;
/**
* Gateway command sending method (curl,fopen)
* @var mixed
*/
var $sending_method = “curl”;
/**
* Does to use facility for delivering Unicode messages
* @var bool
*/
var $unicode = false;
/**
* Optional CURL Proxy
* @var bool
*/
var $curl_use_proxy = false;
/**
* Proxy URL and PORT
* @var mixed
*/
var $curl_proxy = “http://127.0.0.1:8080″;
/**
* Proxy username and password
* @var mixed
*/
var $curl_proxyuserpwd = “login:secretpass”;
/**
* Callback
* 0 – Off
* 1 – Returns only intermediate statuses
* 2 – Returns only final statuses
* 3 – Returns both intermediate and final statuses
* @var integer
*/
var $callback = 0;
/**
* Session variable
* @var mixed
*/
var $session;
/**
* Class constructor
* Create SMS object and authenticate SMS gateway
* @return object New SMS object.
* @access public
*/
function sms () {
if ($this->use_ssl) {
$this->base = “http://api.clickatell.com/http”;
$this->base_s = “https://api.clickatell.com/http”;
} else {
$this->base = “http://api.clickatell.com/http”;
$this->base_s = $this->base;
}
$this->_auth();
}
/**
* Authenticate SMS gateway
* @return mixed “OK” or script die
* @access private
*/
function _auth() {
$comm = sprintf (“%s/auth?api_id=%s&user=%s&password=%s”, $this->base_s, $this->api_id, $this->user, $this->password);
$this->session = $this->_parse_auth ($this->_execgw($comm));
}
/**
* Query SMS credis balance
* @return integer number of SMS credits
* @access public
*/
function getbalance() {
$comm = sprintf (“%s/getbalance?session_id=%s”, $this->base, $this->session);
return $this->_parse_getbalance ($this->_execgw($comm));
}
/**
* Send SMS message
* @param to mixed The destination address.
* @param from mixed The source/sender address
* @param text mixed The text content of the message
* @return mixed “OK” or script die
* @access public
*/
function send($to=null, $from=null, $text=null) {
/* Check SMS credits balance */
if ($this->getbalance() < $this->balace_limit) {
die (“You have reach the SMS credit limit!”);
};
/* Check SMS $text length */
if ($this->unicode == true) {
$this->_chk_mbstring();
if (mb_strlen ($text) > 210) {
die (“Your unicode message is too long! (Current lenght=”.mb_strlen ($text).”)”);
}
/* Does message need to be concatenate */
if (mb_strlen ($text) > 70) {
$concat = “&concat=3″;
} else {
$concat = “”;
}
} else {
if (strlen ($text) > 459) {
die (“Your message is too long! (Current lenght=”.strlen ($text).”)”);
}
/* Does message need to be concatenate */
if (strlen ($text) > 160) {
$concat = “&concat=3″;
} else {
$concat = “”;
}
}
/* Check $to and $from is not empty */
if (empty ($to)) {
die (“You not specify destination address (TO)!”);
}
if (empty ($from)) {
die (“You not specify source address (FROM)!”);
}
/* Reformat $to number */
$cleanup_chr = array (“+”, ” “, “(“, “)”, “\r”, “\n”, “\r\n”);
$to = str_replace($cleanup_chr, “”, $to);
/* Send SMS now */
$comm = sprintf (“%s/sendmsg?session_id=%s&to=%s&from=%s&text=%s&callback=%s&unicode=%s%s”,
$this->base,
$this->session,
rawurlencode($to),
rawurlencode($from),
$this->encode_message($text),
$this->callback,
$this->unicode,
$concat
);
return $this->_parse_send ($this->_execgw($comm));
}
/**
* Encode message text according to required standard
* @param text mixed Input text of message.
* @return mixed Return encoded text of message.
* @access public
*/
function encode_message ($text) {
if ($this->unicode != true) {
//standard encoding
return rawurlencode($text);
} else {
//unicode encoding
$uni_text_len = mb_strlen ($text, “UTF-8″);
$out_text = “”;
//encode each character in text
for ($i=0; $i<$uni_text_len; $i++) {
$out_text .= $this->uniord(mb_substr ($text, $i, 1, “UTF-8″));
}
return $out_text;
}
}
/**
* Unicode function replacement for ord()
* @param c mixed Unicode character.
* @return mixed Return HEX value (with leading zero) of unicode character.
* @access public
*/
function uniord($c) {
$ud = 0;
if (ord($c{0})>=0 && ord($c{0})<=127)
$ud = ord($c{0});
if (ord($c{0})>=192 && ord($c{0})<=223)
$ud = (ord($c{0})-192)*64 + (ord($c{1})-128);
if (ord($c{0})>=224 && ord($c{0})<=239)
$ud = (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128);
if (ord($c{0})>=240 && ord($c{0})<=247)
$ud = (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128);
if (ord($c{0})>=248 && ord($c{0})<=251)
$ud = (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128);
if (ord($c{0})>=252 && ord($c{0})<=253)
$ud = (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128);
if (ord($c{0})>=254 && ord($c{0})<=255) //error
$ud = false;
return sprintf(“%04x”, $ud);
}
/**
* Spend voucher with sms credits
* @param token mixed The 16 character voucher number.
* @return mixed Status code
* @access public
*/
function token_pay ($token) {
$comm = sprintf (“%s/http/token_pay?session_id=%s&token=%s”,
$this->base,
$this->session,
$token);
return $this->_execgw($comm);
}
/**
* Execute gateway commands
* @access private
*/
function _execgw($command) {
if ($this->sending_method == “curl”)
return $this->_curl($command);
if ($this->sending_method == “fopen”)
return $this->_fopen($command);
die (“Unsupported sending method!”);
}
/**
* CURL sending method
* @access private
*/
function _curl($command) {
$this->_chk_curl();
$ch = curl_init ($command);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER,0);
if ($this->curl_use_proxy) {
curl_setopt ($ch, CURLOPT_PROXY, $this->curl_proxy);
curl_setopt ($ch, CURLOPT_PROXYUSERPWD, $this->curl_proxyuserpwd);
}
$result=curl_exec ($ch);
curl_close ($ch);
return $result;
}
/**
* fopen sending method
* @access private
*/
function _fopen($command) {
$result = ”;
$handler = @fopen ($command, ‘r’);
if ($handler) {
while ($line = @fgets($handler,1024)) {
$result .= $line;
}
fclose ($handler);
return $result;
} else {
die (“Error while executing fopen sending method!Please check does PHP have OpenSSL support and check does PHP version is greater than 4.3.0.”);
}
}
/**
* Parse authentication command response text
* @access private
*/
function _parse_auth ($result) {
$session = substr($result, 4);
$code = substr($result, 0, 2);
if ($code!=”OK”) {
die (“Error in SMS authorization! ($result)”);
}
return $session;
}
/**
* Parse send command response text
* @access private
*/
function _parse_send ($result) {
$code = substr($result, 0, 2);
if ($code!=”ID”) {
die (“Error sending SMS! ($result)”);
} else {
$code = “OK”;
}
return $code;
}
/**
* Parse getbalance command response text
* @access private
*/
function _parse_getbalance ($result) {
$result = substr($result, 8);
return (int)$result;
}
/**
* Check for CURL PHP module
* @access private
*/
function _chk_curl() {
if (!extension_loaded(‘curl’)) {
die (“This SMS API class can not work without CURL PHP module! Try using fopen sending method.”);
}
}
/**
* Check for Multibyte String Functions PHP module – mbstring
* @access private
*/
function _chk_mbstring() {
if (!extension_loaded(‘mbstring’)) {
die (“Error. This SMS API class is setup to use Multibyte String Functions module – mbstring, but module not found. Please try to set unicode=false in class or install mbstring module into PHP.”);
}
}
}
?>
After you edit three variables above that you have gotten from Clickatell, now you need to edit 1 file WHMCS includes/actionhooks.php
add these code right after this line # $vars["Domains"] – Array of Domain IDs from Order
require_once ("smsku.php");
$mysms = new sms();
$vars['Products']);
$message = "Invoice: " . $vars['InvoiceID'] . ".\n Domains: " . implode(', ', $vars['Domains']) . ".\n Products: " . implode(', ', $vars['Products']);
$mysms->send ("32484629030", "Order Hosting", "$message");
you will need to edit Phone number on $mysms->send (“32484629030″, “Order Hosting”, “$message”); to which number you want the sms to be sent make sure you add country code without “+”
Well give a shoot! if you need my help on making this i would give this support just contact me on Live messenger
Yahoo : indonix
Msn : simson_lai1982(at)hotmail.com
Recent Comments