<?php
namespace App\Controller;
use Think\Controller;
class SgipController extends Controller {
//初始化socket
public function _initialize(){
$this->ip = C('MSG_IP');//ip地址
$this->port = C('MSG_PORT');//端口
$this->sp_code = C('MSG_SP_CODE');//企业代码
$this->user = C('MSG_USER');//登录账号
$this->pwd = C('MSG_PWD');//登录密码
$this->sp_num = C('MSG_SP_NUM');//接入服务号
$this->area_code = C('MSG_AREA_CODE');//长途区号
$create = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//创建socket
if($create){
$this->socket = $create;
}else{
return $this->socket_error();
}
$connect = socket_connect($this->socket, $this->ip, $this->port);//连接socket
if(!$connect){
return $this->socket_error();
}
}
public function test(){
exit();
$tel = '18688888888';
$msg = "你好".rand(0,10000);
$r = $this->send_msg($tel,$msg);
print_r('<pre>');
print_r($r);
}
//发送信息
public function send_msg($tel,$msg){
if($tel == "" || $msg == ""){
return array('error' => 99999,'msg' => 'param error');
}
$bind = $this->sgip_bind();//登录
if(!$bind['code']){
return $this->socket_error();
}
$submit= $this->sgip_submit($tel,$msg);//发送消息
if(!$submit['code']){
return $this->socket_error();
}else{
return array('status' => 1,'msg_number' => $this->SequenceNumber,'data' =>$submit);
}
socket_close($this->socket);//关闭连接
}
//bind
private function sgip_bind(){
//消息体
$body = pack('Ca16a16a8',1,$this->user,$this->pwd,'');
//消息头
$header = $this->get_header($body,1);
$data = $header.$body;
$s_w = socket_write($this->socket, $data, strlen($data));//发送命令
if(!$s_w) {
return $this->socket_error();
}
$out = socket_read($this->socket,1024,PHP_BINARY_READ);//读取
if(!$out){
return $this->socket_error();
}
$out_len = strlen($out);
$out = unpack("C$out_len",$out);
return array('code' => 1,'data' =>$out);
}
//submit
private function sgip_submit($tel,$msg){
$msg_len = strlen($msg);//短信长度
//打包消息体
$body = pack('a21',$this->sp_num);//SPNumber
$body .= pack('a21','000000000000000000000');//ChargeNumber
$body .= pack('C',1);//UserCount
$body .= pack('a21','86'.$tel);//UserNumber
$body .= pack('a5',$this->sp_code);//CorpId
$body .= pack('a10','OpenVPN');//ServiceType
$body .= pack('C',1);//FeeType
$body .= pack('a6','0');//FeeValue
$body .= pack('a6','0');//GivenValue
$body .= pack('C',0);//AgentFlag
$body .= pack('C',2);//MorelatetoMTFlag
$body .= pack('C',9);//Priority
$body .= pack('a16','');//ExpireTime
$body .= pack('a16','');//ScheduleTime
$body .= pack('C',1);//ReportFlag
$body .= pack('C',0);//TP_pid
$body .= pack('C',0);//TP_udhi
$body .= pack('C',15);//MessageCoding
$body .= pack('C',0);//MessageType
$body .= pack('N',$msg_len);//MessageLength
$body .= pack("a$msg_len",$msg);//MessageContent
$body .= pack('a8','');//MessageContent
$header = $this->get_header($body,3);//消息头
$data = $header.$body;
$s_w = socket_write($this->socket, $data, strlen($data));
if(!$s_w) {
return $this->socket_error();
}
$out = socket_read($this->socket,1024,PHP_BINARY_READ);
if(!$out){
return $this->socket_error();
}
$out_len = strlen($out);
$out = unpack("C$out_len",$out);
return array('code' => 1,'data' =>$out);
}
//生成消息头
//body 消息体
//cid 命令id
private function get_header($body,$cid=1){
$CommandId = "3".$this->area_code.$this->sp_code;
$time_str = date('mdHis',time());
$last_code = $this->get_lastcode();
$this->SequenceNumber = $CommandId.$time_str.$last_code;
//消息长度
$body_len =strlen($body)+20;
//消息头
$header = pack('NNNNN',$body_len,$cid,$CommandId*1,$time_str*1,$last_code*1);
return $header;
}
//生成序列号的最后一部分
private function get_lastcode(){
$sp = $this->sp_code;
$code = S($sp."code");
if(isset($code)){
if($code >= 999999){
$code = 1;
S($sp."code",$code);
return $code;
}else{
$code +=1;
S($sp."code",$code);
return $code;
}
}else{
S($sp."code",1);
return 1;
}
}
//返回socket错误信息
private function socket_error(){
return array('error' => socket_last_error(),'msg' => socket_strerror(socket_last_error()));
}
}
- 1
- 2
前往页