This 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