风雨十年,感恩同行

[原创] 阔别两年再度发力,通达短信发送自定义补丁(GSM、飞信、API、网关统统都可以)

    [复制链接]
发表于 2011-9-7 14:22:28 | 显示全部楼层 |阅读模式
本帖最后由 nature_ryo 于 2011-9-7 14:31 编辑

        先述一下我和通达的前世今生,没兴趣的请直接跳过:        两年前公司OA选型试用了一段时间通达,为了和公司RTX做集成,实现了不使用通达RTX插件的集成,因为代码需要整理所以在某论坛上发布了一个消息提醒的集成的补丁,前段时间看到有人一年多前“转发”的此贴现在还有人在顶,遗憾的是当时公司没有选择通达,所以开发的代码最后也遗失了,真是很抱歉。
      上个月公司重新采购OA,最后确定了通达,所以我今后应该有大把的时间来研究这个东西,相信大家很多还是在同时使用RTX和通达,找机会我在把这两个的集成重新搞起来。
      公司现在用的是bigant,使用1年感觉还不错,就是提供的接口比较少,但是经过我初步研究的结果也是可以和通达做集成的,搞好了我也会发上来共享给大家。
PS。我说的“集成”可是不需要在即时通客户端做任何设置和安装任何插件,登陆即时通的用户同时就登陆OA,当年就是看通达的rtx插件图标恶心,而且还要每个客户端设置OA网址和登陆账号、密码,受不鸟了,才出手的

——————废话完了,下面是这次的重头戏,Enjoy—————————
短信发送模块自定义补丁(2010版试用)
1.补丁文件结构说明
webroot
    inc
         utility_sms2_gate.php                              替换通达默认的接口文件
    module
         send_sms                                                自定义补丁代码目录
         PHPfetion.php                                         飞信发送类库,感谢quanhengzhuang的贡献
         send_sms.php                                         飞信发送接口文件
         send_sms_config.php                              补丁配置文件
         send_sms_interface_01.php                    开发其他发送接口的示例文件            

2.补丁目的
       通达的短信提醒提供两种发送方式,内部消息或GSM短信。如果要实现其他接口方式,比如飞信,则需要替换通达的GSM发送接口文件(即utility_sms2_gsm.php)。
       这个补丁实现在保留通达GSM发送逻辑的情况下,实现任意多个接口之间的切换。
       比如我们可以事先在系统中定义好多个接口方法,1个?10个?100个?1000个?统统没有问题。平常我们使用飞信发送短信,如果哪一天突然飞信不能用了,我们可以马上切换到这么多个接口中的任意一个,切换方式也很简单,修改补丁配置文件中的一个参数就行了。

3.补丁特色功能
多种发送模式,原创混合发送模式,使用接口模式更可以使用自己的发送方法
飞信模式:只对飞信好友发送短信,非移动手机号或飞信好友不发送短信
GSM模式:调用通达原装的GSM发送短信,完全原装
混合模式:非移动手机号直接使用GSM发送,移动手机号先尝试使用飞信发送,飞信发送失败则提交GSM发送
接口模式:自行开发接口实现其他发送方式,提供开发示例文件
需要说明的是飞信发送使用的是quanhengzhuang开发的PHP飞信类库,此类库不支持定时发送,所以我在混合模式中对所有发送日期大于当前日期的短信会根据发送模式选择丢弃(飞信模式)或提交GSM发送(GSM模式或混合模式),但是好处就是使用的10086的官方wap平台,全开源,全免费,移动不搞鬼就永远可用。当然也有缺点,就是如果跟10086的wap网站响应比较慢,点击发送后会有段时间卡在页面提交的进度条上。请诸位克服吧。

4.配置文件说明
//发送飞信的手机号码
$FETION_MOBILE="13800000000";
//飞信登陆密码
$FETION_PASSWORD="password";      
//飞信发送成功区别字符串,请wap登陆f.10086.cn发送一条短信试试,找出能区别成功发送的词句写在这里$FETION_SUCCESS="发送消息成功";        
//发送模式,10 飞信模式;20 ***模式;30 混合模式;99 接口模式,默认飞信模式
$SEND_MOD="10";        
//手机号码的匹配规则,正则式
$MATCH="/^13[0-9]{1}[0-9]{8}$|15[0189]{1}[0-9]{8}$|189[0-9]{8}$/";        
//移动号码的匹配规则
$CMCC="/^13[4-9]{1}[0-9]{8}$|15[01789]{1}[0-9]{8}|18[78]{1}[0-9]{8}$/";
//接口模式下,选择使用的接口方法名称,接口文件位置在下面设置,接口方法名称除php限制外没有要求,可以自行增加,但请务必同时定义接口文件位置,如方法名称为sendgate,则使用$sendgate定义文件位置。$INTERFACE_INUSE="INTERFACE_01";        
//99接口模式下的接口文件位置,可自行修改
$INTERFACE_01="module/send_sms/send_sms_interface_01.php"; $INTERFACE_02="module/send_sms/send_sms_interface_02.php";

5.全开源,有能力的欢迎指导、改进,但是也希望能把研究成果拿出来和大家分享

6.改进思考:1.下一步打算把参数设置做到通达的系统设置界面里去,这样接口切换起来就会更加方便了。
2.关于定时飞信的发送问题,比如日程安排的提醒,考虑解决方法有二,
1)用通达自带的定时任务功能,写个间隔执行的任务对定时飞信调用接口进行发送,同时也实现尝试发送N次后失败才放弃;
2)直接开发一个短信服务器程序代替通达自带的,实现短信和飞信自动切换发送。
两种方法,1比较通用,自定义开发的接口都可以用来发短信,但是发送间隔收到定时任务模块的限制,起码是1分钟;2的话间隔可以做到更短,但是可能就只能用来发短信和飞信了。
有更好想法的欢迎交流,nature_ryo@yahoo.com.cn

sms_path.zip (9.77 KB, 下载次数: 177, 售价: 10 享银)

点评

欢迎兄弟回归通达,与兄弟们一起其乐无穷!  发表于 2011-9-7 21:29
 楼主| 发表于 2011-9-7 14:35:05 | 显示全部楼层
看了一下2011的utility_sms2_gsm.php的源码,发送函数基本没有变化,只是加了返回值,稍微改改应该可以两个版本通用
发表于 2011-9-7 14:42:35 | 显示全部楼层
支持, 自由程度高。
发表于 2011-9-7 14:44:14 | 显示全部楼层
很好,很强大!谢谢啰!~                                                      
发表于 2011-9-7 14:52:43 | 显示全部楼层
呵呵看着还不错!!!~~~~~~~~~~
发表于 2011-9-7 15:00:05 | 显示全部楼层
非常感谢!希望能指导一下。不知道这个能否自己修改
发表于 2011-9-7 15:19:55 | 显示全部楼层
看样子又是高手出山了 可惜我看不懂                        
发表于 2011-9-8 09:38:34 | 显示全部楼层
欢迎高手回来了。真好。
 楼主| 发表于 2011-9-8 12:39:43 | 显示全部楼层
在手机号码判断这一块,因为各个地区可能号码段不一样,所以我的原始配置文件中的$MATCH可能没有包含当地的一些号码段,比如156、182会报手机格式不正确,这个情况需要补充$MATCH的正则式,移动号码判断亦同。
这里简单说明一下修改方法,顺便科普正则式

比如说151、153、155要定义属于手机号段,这几个号码前面都是15,第三位不一样,或1或3或5,后面就是8位的数字了
那么正则式这样写
^15[135]{1}[0-9]{8}$
意思就是15后面跟1、3、5中间的1个,后面跟0-9的数字8个。^、$表示开头和结尾,以免允许1151XXXXXXXX、151XXXXXXXX1这样的号码通过有效性验证。

还有个182的号段怎么办,写法和上面一样。再把两个正则用|连接起来,表示或者,就是这样
^15[135]{1}[0-9]{8}$|182[0-9]{8}$
有这个问题的,看懂了就可以自己扩充号码段了
发表于 2011-9-8 13:04:38 | 显示全部楼层
不错,很可以的创意!!!!!!!!!!
发表于 2011-9-8 14:22:44 | 显示全部楼层
谢谢提供,看一看。  学习学习。   
发表于 2011-9-9 01:08:30 | 显示全部楼层
我觉得还是发出来分享下好:

存在一个编码bug。

你可以试试异体字,会造成截断。

我查了下,虽然不晓得你编码那块代码怎么写的,不过,
$result = $fetion->send( $MY_ARRAY[$I], iconv( $ENCODING, "utf-8", $CONTENT ) );
这句话中原来的$ENCODING应该换成"gbk",用最多的gbk字符集转到utf-8。这貌似是iconv的一个bug。
$result = $fetion->send( $MY_ARRAY[$I], iconv( "gbk", "utf-8", $CONTENT ) );

或者可以试试:mb_convert_encoding
这个我没测试,但是它好像效率低了些。
 楼主| 发表于 2011-9-9 07:18:48 | 显示全部楼层
zhouc 发表于 2011-9-9 01:08
我觉得还是发出来分享下好:

存在一个编码bug。

这个原因已经找到了,是通达默认设置使用gb2312编码造成的
修正方法:将sms_send.php中
$ENCODING = $ENCODING == "" ? "gbk" : $ENCODING;
改为
$ENCODING = $ENCODING == "" || $ENCODING == "gb2312" ? "gbk" : $ENCODING;

发表于 2011-9-10 09:50:43 | 显示全部楼层
谢谢提供,看一看。  学习学习。  
发表于 2011-9-10 11:48:10 | 显示全部楼层
谢谢提供,看一看。  学习学习。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:592439202

服务时间 9:00-22:00

金蝶用友易助管家婆深度服务
 
QQ在线咨询
售前咨询热线
592439202
售后服务热线
243998158
快速回复 返回顶部 返回列表