bnbweb/includes/cls_sms.php
2023-06-28 04:27:57 +08:00

384 lines
10 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
if (!defined('IN_ECS'))
{
die('Hacking attempt');
}
define('SOURCE_TOKEN', '814d4852d74f5914b41695ee7fa8508c');
define('SOURCE_ID', '863180');
require_once(ROOT_PATH . 'includes/cls_transport.php');
require_once(ROOT_PATH . 'includes/shopex_json.php');
/* 短信模块主类 */
class sms
{
/**
* 存放提供远程服务的URL。
*
* @access private
* @var array $api_urls
*/
var $api_urls = array(
'info' => 'http://api.sms.shopex.cn',
'send' => 'http://api.sms.shopex.cn',
'servertime' => 'http://webapi.sms.shopex.cn'
);
/**
* 存放MYSQL对象
*
* @access private
* @var object $db
*/
var $db = null;
/**
* 存放ECS对象
*
* @access private
* @var object $ecs
*/
var $ecs = null;
/**
* 存放transport对象
*
* @access private
* @var object $t
*/
var $t = null;
/**
* 存放程序执行过程中的错误信息,这样做的一个好处是:程序可以支持多语言。
* 程序在执行相关的操作时error_no值将被改变可能被赋为空或大等0的数字.
* 为空或0表示动作成功大于0的数字表示动作失败该数字代表错误号。
*
* @access public
* @var array $errors
*/
var $errors = array('api_errors' => array('error_no' => -1, 'error_msg' => ''),
'server_errors' => array('error_no' => -1, 'error_msg' => ''));
/**
* 构造函数
*
* @access public
* @return void
*/
function __construct()
{
$this->sms();
}
/**
* 构造函数
*
* @access public
* @return void
*/
function sms()
{
/* 由于要包含init.php所以这两个对象一定是存在的因此直接赋值 */
$this->db = $GLOBALS['db'];
$this->ecs = $GLOBALS['ecs'];
/* 此处最好不要从$GLOBALS数组里引用防止出错 */
$this->t = new transport(-1, -1, -1, false);
$this->json = new Services_JSON;
}
/* 发送短消息
*
* @access public
* @param string $phone 要发送到哪些个手机号码,传的值是一个数组
* @param string $msg 发送的消息内容
*/
function send($phones,$msg,$send_date = '', $send_num = 1,$sms_type='',$version='1.0')
{
/* 检查发送信息的合法性 */
$contents=$this->get_contents($phones, $msg);
if(!$contents)
{
$this->errors['server_errors']['error_no'] = 3;//发送的信息有误
return false;
}
$login_info = $this->getSmsInfo();
if (!$login_info)
{
$this->errors['server_errors']['error_no'] = 5;//无效的身份信息
return false;
}
else
{
if($login_info['info']['account_info']['active']!='1')
{
$this->errors['server_errors']['error_no'] = 11;//短信功能没有激活
return false;
}
}
/* 获取API URL */
$sms_url = $this->get_url('send');
if (!$sms_url)
{
$this->errors['server_errors']['error_no'] = 6;//URL不对
return false;
}
$send_str['contents']= $this->json->encode($contents);
$send_str['certi_app']='sms.send';
$send_str['entId']=$GLOBALS['_CFG']['ent_id'];
$send_str['entPwd']=$GLOBALS['_CFG']['ent_ac'];
$send_str['license']=$GLOBALS['_CFG']['certificate_id'];
$send_str['source']=SOURCE_ID;
$send_str['sendType'] = 'notice';
$send_str['use_backlist'] = '1';
$send_str['version'] = $version;
$send_str['format']='json';
$send_str['timestamp'] = $this->getTime();
$send_str['certi_ac']=$this->make_shopex_ac($send_str,SOURCE_TOKEN);
$sms_url= $this->get_url('send');
/* 发送HTTP请求 */
$response = $this->t->request($sms_url, $send_str,'POST');
$result = $this->json->decode($response['body'], true);
if($result['res'] == 'succ')
{
return true;
}
elseif($result['res'] == 'fail')
{
return false;
}
}
/**
* 检测启用短信服务需要的信息
*
* @access private
* @param string $email 邮箱
* @param string $password 密码
* @return boolean 如果启用信息格式合法就返回true否则返回false。
*/
function check_enable_info($email, $password)
{
if (empty($email) || empty($password))
{
return false;
}
return true;
}
//查询是否已有通行证
function has_registered()
{
$sql = 'SELECT `value`
FROM ' . $this->ecs->table('shop_config') . "
WHERE `code` = 'ent_id'";
$result = $this->db->getOne($sql);
if (empty($result))
{
return false;
}
return true;
}
function get_site_info()
{
/* 获得当前处于会话状态的管理员的邮箱 */
$email = $this->get_admin_email();
$email = $email ? $email : '';
/* 获得当前网店的域名 */
$domain = $this->ecs->get_domain();
$domain = $domain ? $domain : '';
/* 赋给smarty模板 */
$sms_site_info['email'] = $email;
$sms_site_info['domain'] = $domain;
return $sms_site_info;
}
function get_site_url()
{
$url = $this->ecs->url();
$url = $url ? $url : '';
return $url;
}
/**
* 获得当前处于会话状态的管理员的邮箱
*
* @access private
* @return string or boolean 成功返回管理员的邮箱否则返回false。
*/
function get_admin_email()
{
$sql = 'SELECT `email` FROM ' . $this->ecs->table('admin_user') . " WHERE `user_id` = '" . $_SESSION['admin_id'] . "'";
$email = $this->db->getOne($sql);
if (empty($email))
{
return false;
}
return $email;
}
//用户短信账户信息获取
function getSmsInfo($certi_app='sms.info',$version='1.0', $format='json'){
$send_str['certi_app'] = $certi_app;
$send_str['entId'] = $GLOBALS['_CFG']['ent_id'];
$send_str['entPwd'] = $GLOBALS['_CFG']['ent_ac'];
$send_str['source'] = SOURCE_ID;
$send_str['version'] = $version;
$send_str['format'] = $format;
$send_str['timestamp'] = $this->getTime();
$send_str['certi_ac'] = $this->make_shopex_ac($send_str,SOURCE_TOKEN);
$sms_url = $this->get_url('info');
$response = $this->t->request($sms_url, $send_str,'POST');
$result = $this->json->decode($response['body'],true);
if($result['res'] == 'succ')
{
return $result;
}
elseif($result['res'] == 'fail')
{
return false;
}
}
//检查手机号和发送的内容并生成生成短信队列
function get_contents($phones,$msg)
{
if (empty($phones) || empty($msg))
{
return false;
}
$phone_key=0;
$phones=explode(',',$phones);
foreach($phones as $key => $value)
{
if($i<200)
{
$i++;
}
else
{
$i=0;
$phone_key++;
}
if($this->is_moblie($value))
{
$phone[$phone_key][]=$value;
}
else
{
$i--;
}
}
if(!empty($phone))
{
foreach($phone as $phone_key => $val)
{
if (EC_CHARSET != 'utf-8')
{
$phone_array[$phone_key]['phones']=implode(',',$val);
$phone_array[$phone_key]['content']=iconv('gb2312','utf-8',$msg);
}
else
{
$phone_array[$phone_key]['phones']=implode(',',$val);
$phone_array[$phone_key]['content']=$msg;
}
}
return $phone_array;
}
else
{
return false;
}
}
//获得服务器时间
function getTime(){
$Tsend_str['certi_app'] = 'sms.servertime';
$Tsend_str['version'] = '1.0' ;
$Tsend_str['format'] = 'json' ;
$Tsend_str['certi_ac'] = $this->make_shopex_ac($Tsend_str,'SMS_TIME');
$sms_url = $this->get_url('servertime');
$response = $this->t->request($sms_url, $Tsend_str,'POST');
$result = $this->json->decode($response['body'], true);
return $result['info'];
}
/**
* 返回指定键名的URL
*
* @access public
* @param string $key URL的名字即数组的键名
* @return string or boolean 如果由形参指定的键名对应的URL值存在就返回该URL否则返回false。
*/
function get_url($key)
{
$url = $this->api_urls[$key];
if (empty($url))
{
return false;
}
return $url;
}
/**
* 检测手机号码是否正确
*
*/
function is_moblie($moblie)
{
return preg_match("/^0?1((3|8)[0-9]|5[0-35-9]|4[57])\d{8}$/", $moblie);
}
//加密算法
function make_shopex_ac($temp_arr,$token)
{
ksort($temp_arr);
$str = '';
foreach($temp_arr as $key=>$value)
{
if($key!=' certi_ac')
{
$str.= $value;
}
}
return strtolower(md5($str.strtolower(md5($token))));
}
function base_encode($str)
{
$str = base64_encode($str);
return strtr($str, $this->pattern());
}
function pattern()
{
return array(
'+'=>'_1_',
'/'=>'_2_',
'='=>'_3_',
);
}
}
?>