之前发布了一个短信的自定义模块补丁以后,经常有些坛友咨询他那边的短信网关应该怎么改,让我一个一个的帮改代码不是要累死我啊,所以就计划完成这个补丁了。
这次换了个思路,使用通达OA自带的定时任务功能在后台通过网关发送短信,只要你的短信网关提供了HTTP接口的POST方式,稍微按照对方的接口参数修改一下代码就OK了。
理论上只要是http接口就全兼容,当然,也有待测试。
这个补丁的优点是完全使用通达自带的模块,没有对通达的源文件进行任何修改。
发送原理:使用定时任务模块,每隔1分钟读取原GSM猫使用的短信发送列表,提交短信网关发送端口进行发送,提交成功则标识发送记录为“发送成功”,此轮发送失败则标识为“发送中”并等待下一轮再次尝试发送,若经过5轮发送(这个次数可以自行修改)仍然失败则标识为“发送超时”不再重试。因为是提交后台发送,所以没有之前的自定义补丁在点击发送之后可能会有短时间停顿的问题。
使用方法:
1.下载附件,解压,建议不要直接解压到OA目录覆盖,因为我们还要根据自己的网关修改一下参数设置。
2.用记事本打开解压后webroot\task\send_sms_through_gate.php,修改代码开头的这样一段
//网关HTTP地址
$SMS_GATE_URL='http://网关地址:网关端口/接口页面.php';
//网关接口参数,按照对方接口标准自行修改
$DATA_STRING = '
$POST_DATA = array
(
"userid"=>"11",
"password"=>"22",
"action"=>"send",
"phone"=>"$PHONE",
"message"=>"$CONTENT",
"sendtime"=>"$SEND_TIME"
);';
//发送成功返回的标识正则式匹配
$SMS_SEND_SUCCESS = "/^1$/";
//5次发送失败则放弃尝试
$TIME_OUT = 5;
$SMS_GATE_URL的值修改为使用的网关http接口页面地址
"userid"=>"11",
"password"=>"22",
"action"=>"send",
"phone"=>"$PHONE",
"message"=>"$CONTENT",
"sendtime"=>"$SEND_TIME"
这部分是网关的参数设置,按照网关的接口调用说明进行修改,比如有一个网关使用如下的http地址进行发送
http://www.72dns.com/smsadmin/Sms_Api.aspx?UserID=15&PassWord=E10ADC3949BA59ABBE56E057F20F883E&mobile=13513331133&message=sdcsdcd&action=SendSms
那这部分就修改为
"UserID"="15",
"PassWord"="E10ADC3949BA59ABBE56E057F20F883E",
"mobile"="$PHONE",
"message"="$CONTENT",
"action"="SendSms"
其中mobile是要接收的手机号,赋值为$PHONE,要发送的消息内容message赋值为$CONTENT,如果是预先定时发送的短信则把网关的发送时间参数赋值为$SEND_TIME,$SMS_GATE_URL为"http://www.72dns.com/smsadmin/Sms_Api.aspx"
$SEND_SMS_SUCCESS为返回内容的成功提示,按照接口说明,发送成功会返回
code=200&msg=发送成功
使用正则式则$SEND_SMS_SUCCESS="/^code=200/",若发送成功返回1,那就赋值为“/^1$/”
$TIME_OUT=5,5轮发送后仍然失败则放弃重试。
3.修改完成后,将整个webroot文件夹覆盖通达同名目录
4.打开OA登陆界面,按提示升级
5.升级完成后,进入系统设置,定时任务管理,会看到多了一个“网关发送短信”,点击编辑,设置为启用。
6.到此全部设置完毕。
PS:
1.使用此补丁,首先要保证通达定时任务模块能够正常运行,正版应该没有问题,使用破解的应该要正确设置好officetask替代品。
2.启用此补丁的时候建议关闭通达的短信服务器,以免造成冲突。
3.其实依靠同样的思路,用PHP代码直接调用串口通讯的话,就可以完全抛弃通达的短信服务器程序了,就这个东西通达还标价5000大洋,还要注册,真是坑爹。
最后还是那句话,完全开源,欢迎修改和传播,修改后的成果建议大家能拿出来分享
webroot.zip
(2.58 KB, 下载次数: 96)
补充内容 (2011-10-27 09:51):
用这个收到短信是乱码的,尝试把 $CONTENT = iconv( $ENCODING, "utf-8", $ROW['CONTENT'] ); 改为 $CONTENT = $ROW['CONTENT']; 再试试 |