Client.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. <?php
  2. require_once(SCRIPT_ROOT.'nusoaplib/nusoap.php');
  3. /**
  4. * 验证流程概要:
  5. *
  6. * 第一次使用时,需使用[序列号]和[密码]进行login(登录操作),并在登录同时产生一个session key
  7. *
  8. * 登录成功后,称为[已登录状态],需要保存此产生的session key,用于以后的相关操作(如发送短信等操作)
  9. *
  10. * logout(注销操作)后, session key将失效,并且不能再发短信了, 除非再进行login(登录操作)
  11. *
  12. *
  13. *
  14. *
  15. *
  16. */
  17. class Client{
  18. /**
  19. * 网关地址
  20. */
  21. var $url;
  22. /**
  23. * 序列号,请通过亿美销售人员获取
  24. */
  25. var $serialNumber;
  26. /**
  27. * 密码,请通过亿美销售人员获取
  28. */
  29. var $password;
  30. /**
  31. * 登录后所持有的SESSION KEY,即可通过login方法时创建
  32. */
  33. var $sessionKey;
  34. /**
  35. * webservice客户端
  36. */
  37. var $soap;
  38. /**
  39. * 默认命名空间
  40. */
  41. var $namespace = 'http://sdkhttp.eucp.b2m.cn/';
  42. /**
  43. * 往外发送的内容的编码,默认为 GBK
  44. */
  45. var $outgoingEncoding = "GBK";
  46. /**
  47. * 往外发送的内容的编码,默认为 GBK
  48. */
  49. var $incomingEncoding = '';
  50. /**
  51. * @param string $url 网关地址
  52. * @param string $serialNumber 序列号,请通过亿美销售人员获取
  53. * @param string $password 密码,请通过亿美销售人员获取
  54. * @param string $sessionKey 登录后所持有的SESSION KEY,即可通过login方法时创建
  55. *
  56. * @param string $proxyhost 可选,代理服务器地址,默认为 false ,则不使用代理服务器
  57. * @param string $proxyport 可选,代理服务器端口,默认为 false
  58. * @param string $proxyusername 可选,代理服务器用户名,默认为 false
  59. * @param string $proxypassword 可选,代理服务器密码,默认为 false
  60. * @param string $timeout 连接超时时间,默认0,为不超时
  61. * @param string $response_timeout 信息返回超时时间,默认30
  62. *
  63. *
  64. */
  65. function Client($url,$serialNumber,$password,$sessionKey='',$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30)
  66. {
  67. $this->url = $url;
  68. $this->serialNumber = $serialNumber;
  69. $this->password = $password;
  70. if ($sessionKey!='')
  71. $this->sessionKey = $sessionKey;
  72. /**
  73. * 初始化 webservice 客户端
  74. */
  75. $this->soap = new nusoap_client($url,false,$proxyhost,$proxyport,$proxyusername,$proxypassword,$timeout,$response_timeout);
  76. $this->soap->soap_defencoding = $this->outgoingEncoding;
  77. $this->soap->decode_utf8 = false;
  78. }
  79. /**
  80. * 设置发送内容 的字符编码
  81. * @param string $outgoingEncoding 发送内容字符集编码
  82. */
  83. function setOutgoingEncoding($outgoingEncoding)
  84. {
  85. $this->outgoingEncoding = $outgoingEncoding;
  86. $this->soap->soap_defencoding = $this->outgoingEncoding;
  87. }
  88. /**
  89. * 设置接收内容 的字符编码
  90. * @param string $incomingEncoding 接收内容字符集编码
  91. */
  92. function setIncomingEncoding($incomingEncoding)
  93. {
  94. $this->incomingEncoding = $incomingEncoding;
  95. $this->soap->xml_encoding = $this->incomingEncoding;
  96. }
  97. function setNameSpace($ns)
  98. {
  99. $this->namespace = $ns;
  100. }
  101. function getSessionKey()
  102. {
  103. return $this->sessionKey;
  104. }
  105. function getError()
  106. {
  107. return $this->soap->getError();
  108. }
  109. /**
  110. *
  111. * 指定一个 session key 并 进行登录操作
  112. *
  113. * @param string $sessionKey 指定一个session key
  114. * @return int 操作结果状态码
  115. *
  116. * 代码如:
  117. *
  118. * $sessionKey = $client->generateKey(); //产生随机6位数 session key
  119. *
  120. * if ($client->login($sessionKey)==0)
  121. * {
  122. * //登录成功,并且做保存 $sessionKey 的操作,用于以后相关操作的使用
  123. * }else{
  124. * //登录失败处理
  125. * }
  126. *
  127. *
  128. */
  129. function login($sessionKey='')
  130. {
  131. if ($sessionKey!='')
  132. {
  133. $this->sessionKey = $sessionKey;
  134. }
  135. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey, 'arg2'=>$this->password);
  136. $result = $this->soap->call("registEx",$params, $this->namespace);
  137. return $result;
  138. }
  139. /**
  140. * 注销操作 (注:此方法必须为已登录状态下方可操作)
  141. *
  142. * @return int 操作结果状态码
  143. *
  144. * 之前保存的sessionKey将被作废
  145. * 如需要,可重新login
  146. */
  147. function logout()
  148. {
  149. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey);
  150. print_r($params);
  151. $result = $this->soap->call("logout", $params ,
  152. $this->namespace
  153. );
  154. return $result;
  155. }
  156. /**
  157. * 获取版本信息
  158. * @return string 版本信息
  159. */
  160. function getVersion()
  161. {
  162. $result = $this->soap->call("getVersion",
  163. array(),
  164. $this->namespace
  165. );
  166. return $result;
  167. }
  168. /**
  169. * 短信发送 (注:此方法必须为已登录状态下方可操作)
  170. *
  171. * @param array $mobiles 手机号, 如 array('159xxxxxxxx'),如果需要多个手机号群发,如 array('159xxxxxxxx','159xxxxxxx2')
  172. * @param string $content 短信内容
  173. * @param string $sendTime 定时发送时间,格式为 yyyymmddHHiiss, 即为 年年年年月月日日时时分分秒秒,例如:20090504111010 代表2009年5月4日 11时10分10秒
  174. * 如果不需要定时发送,请为'' (默认)
  175. *
  176. * @param string $addSerial 扩展号, 默认为 ''
  177. * @param string $charset 内容字符集, 默认GBK
  178. * @param int $priority 优先级, 默认5
  179. * @param int $priority 信息序列ID(唯一的正整数)
  180. * @return int 操作结果状态码
  181. */
  182. function sendSMS($mobiles=array(),$content,$sendTime='',$addSerial='',$charset='GBK',$priority=5,$smsId=8888)
  183. {
  184. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey,'arg2'=>$sendTime,
  185. 'arg4'=>$content,'arg5'=>$addSerial, 'arg6'=>$charset,'arg7'=>$priority,'arg8'=>$smsId
  186. );
  187. /**
  188. * 多个号码发送的xml内容格式是
  189. * <arg3>159xxxxxxxx</arg3>
  190. * <arg3>159xxxxxxx2</arg3>
  191. * ....
  192. * 所以需要下面的单独处理
  193. *
  194. */
  195. foreach($mobiles as $mobile)
  196. {
  197. array_push($params,new soapval("arg3",false,$mobile));
  198. }
  199. $result = $this->soap->call("sendSMS",$params,$this->namespace);
  200. return $result;
  201. }
  202. /**
  203. * 发送语音验证码 (注:此方法必须为已登录状态下方可操作)
  204. *
  205. * @param array $mobiles 手机号, 如 array('159xxxxxxxx'),如果需要多个手机号群发,如 array('159xxxxxxxx','159xxxxxxx2')
  206. * @param string $content 语音验证码内容,最多不要超过6个字符,最少不要小于4个字符;字符必须为0至9的全英文半角数字字符
  207. * @param string $sendTime 定时发送时间,格式为 yyyymmddHHiiss, 即为 年年年年月月日日时时分分秒秒,例如:20090504111010 代表2009年5月4日 11时10分10秒
  208. * 如果不需要定时发送,请为'' (默认)
  209. *
  210. * @param string $addSerial 扩展号, 默认为 '',在此处没有实际意义可填写为''
  211. * @param string $charset 内容字符集, 默认GBK
  212. * @param int $priority 优先级, 默认5
  213. * @param int $priority 语音验证码序列ID(唯一的正整数)
  214. * @return int 操作结果状态码
  215. */
  216. function sendVoice($mobiles=array(),$content,$sendTime='',$addSerial='',$charset='GBK',$priority=5,$smsId=8888)
  217. {
  218. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey,'arg2'=>$sendTime,
  219. 'arg4'=>$content,'arg5'=>$addSerial, 'arg6'=>$charset,'arg7'=>$priority,'arg8'=>$smsId
  220. );
  221. /**
  222. * 单个号码发送的xml内容格式是
  223. * <arg3>159xxxxxxxx</arg3>
  224. * 所以需要下面的单独处理
  225. * 注:实际应用中只用到了单号码语音验证码,即采用单一手机号码发送
  226. */
  227. foreach($mobiles as $mobile)
  228. {
  229. array_push($params,new soapval("arg3",false,$mobile));
  230. }
  231. $result = $this->soap->call("sendVoice",$params,$this->namespace);
  232. return $result;
  233. }
  234. /**
  235. * 余额查询 (注:此方法必须为已登录状态下方可操作)
  236. * @return double 余额
  237. */
  238. function getBalance()
  239. {
  240. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey);
  241. $result = $this->soap->call("getBalance",$params,$this->namespace);
  242. return $result;
  243. }
  244. /**
  245. * 取消短信转发 (注:此方法必须为已登录状态下方可操作)
  246. * @return int 操作结果状态码
  247. */
  248. function cancelMOForward()
  249. {
  250. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey);
  251. $result = $this->soap->call("cancelMOForward",$params,$this->namespace);
  252. return $result;
  253. }
  254. /**
  255. * 短信充值 (注:此方法必须为已登录状态下方可操作)
  256. * @param string $cardId [充值卡卡号]
  257. * @param string $cardPass [密码]
  258. * @return int 操作结果状态码
  259. *
  260. * 请通过亿美销售人员获取 [充值卡卡号]长度为20内 [密码]长度为6
  261. */
  262. function chargeUp($cardId, $cardPass)
  263. {
  264. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey,'arg2'=>$cardId,'arg3'=>$cardPass);
  265. $result = $this->soap->call("chargeUp",$params,$this->namespace);
  266. return $result;
  267. }
  268. /**
  269. * 查询单条费用 (注:此方法必须为已登录状态下方可操作)
  270. * @return double 单条费用
  271. */
  272. function getEachFee()
  273. {
  274. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey);
  275. $result = $this->soap->call("getEachFee",$params,$this->namespace);
  276. return $result;
  277. }
  278. /**
  279. * 得到上行短信 (注:此方法必须为已登录状态下方可操作)
  280. *
  281. * @return array 上行短信列表, 每个元素是Mo对象, Mo对象内容参考最下面
  282. *
  283. *
  284. * 如:
  285. *
  286. * $moResult = $client->getMO();
  287. * echo "返回数量:".count($moResult);
  288. * foreach($moResult as $mo)
  289. * {
  290. * //$mo 是位于 Client.php 里的 Mo 对象
  291. * echo "发送者附加码:".$mo->getAddSerial();
  292. * echo "接收者附加码:".$mo->getAddSerialRev();
  293. * echo "通道号:".$mo->getChannelnumber();
  294. * echo "手机号:".$mo->getMobileNumber();
  295. * echo "发送时间:".$mo->getSentTime();
  296. * echo "短信内容:".$mo->getSmsContent();
  297. * }
  298. *
  299. *
  300. */
  301. /**
  302. * 得到上行短信状态报告 (注:此方法必须为已登录状态下方可操作)
  303. *
  304. * @return array 状态报告列表, 每个元素是StatusReport对象, StatusReport对象内容参考最下面
  305. *
  306. *
  307. * 如:
  308. *
  309. * $reportResult = $client->getReport();
  310. * echo "返回数量:".count($reportResult);
  311. * foreach($reportResult as $report)
  312. * {
  313. //获取状态报告的信息
  314. * }
  315. *
  316. *
  317. */
  318. function getMO()
  319. {
  320. $ret = array();
  321. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey);
  322. $result = $this->soap->call("getMO",$params,$this->namespace);
  323. //print_r($this->soap->response);
  324. //print_r($result);
  325. if (is_array($result) && count($result)>0)
  326. {
  327. if (is_array($result[0]))
  328. {
  329. foreach($result as $moArray)
  330. $ret[] = new Mo($moArray);
  331. }else{
  332. $ret[] = new Mo($result);
  333. }
  334. }
  335. return $ret;
  336. }
  337. /**
  338. * 得到状态报告 (注:此方法必须为已登录状态下方可操作)
  339. * @return array 状态报告列表, 一次最多取5个
  340. */
  341. function getReport()
  342. {
  343. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey);
  344. $result = $this->soap->call("getReport",$params,$this->namespace);
  345. return $result;
  346. }
  347. /**
  348. * 企业注册 [邮政编码]长度为6 其它参数长度为20以内
  349. *
  350. * @param string $eName 企业名称
  351. * @param string $linkMan 联系人姓名
  352. * @param string $phoneNum 联系电话
  353. * @param string $mobile 联系手机号码
  354. * @param string $email 联系电子邮件
  355. * @param string $fax 传真号码
  356. * @param string $address 联系地址
  357. * @param string $postcode 邮政编码
  358. *
  359. * @return int 操作结果状态码
  360. *
  361. */
  362. function registDetailInfo($eName,$linkMan,$phoneNum,$mobile,$email,$fax,$address,$postcode)
  363. {
  364. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey,
  365. 'arg2'=>$eName,'arg3'=>$linkMan,'arg4'=>$phoneNum,
  366. 'arg5'=>$mobile,'arg6'=>$email,'arg7'=>$fax,'arg8'=>$address,'arg9'=>$postcode
  367. );
  368. $result = $this->soap->call("registDetailInfo",$params,$this->namespace);
  369. return $result;
  370. }
  371. /**
  372. * 修改密码 (注:此方法必须为已登录状态下方可操作)
  373. * @param string $newPassword 新密码
  374. * @return int 操作结果状态码
  375. */
  376. function updatePassword($newPassword)
  377. {
  378. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey,
  379. 'arg2'=>$this->password,'arg3'=>$newPassword
  380. );
  381. $result = $this->soap->call("serialPwdUpd",$params,$this->namespace);
  382. return $result;
  383. }
  384. /**
  385. *
  386. * 短信转发
  387. * @param string $forwardMobile 转发的手机号码
  388. * @return int 操作结果状态码
  389. *
  390. */
  391. function setMOForward($forwardMobile)
  392. {
  393. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey,
  394. 'arg2'=>$forwardMobile
  395. );
  396. $result = $this->soap->call("setMOForward",$params,$this->namespace);
  397. return $result;
  398. }
  399. /**
  400. * 短信转发扩展
  401. * @param array $forwardMobiles 转发的手机号码列表, 如 array('159xxxxxxxx','159xxxxxxxx');
  402. * @return int 操作结果状态码
  403. */
  404. function setMOForwardEx($forwardMobiles=array())
  405. {
  406. $params = array('arg0'=>$this->serialNumber,'arg1'=>$this->sessionKey);
  407. /**
  408. * 多个号码发送的xml内容格式是
  409. * <arg2>159xxxxxxxx</arg2>
  410. * <arg2>159xxxxxxx2</arg2>
  411. * ....
  412. * 所以需要下面的单独处理
  413. *
  414. */
  415. foreach($forwardMobiles as $mobile)
  416. {
  417. array_push($params,new soapval("arg2",false,$mobile));
  418. }
  419. $result = $this->soap->call("setMOForwardEx",$params,$this->namespace);
  420. return $result;
  421. }
  422. /**
  423. * 生成6位随机数
  424. */
  425. function generateKey()
  426. {
  427. return rand(100000,999999);
  428. }
  429. }
  430. class Mo{
  431. /**
  432. * 发送者附加码
  433. */
  434. var $addSerial;
  435. /**
  436. * 接收者附加码
  437. */
  438. var $addSerialRev;
  439. /**
  440. * 通道号
  441. */
  442. var $channelnumber;
  443. /**
  444. * 手机号
  445. */
  446. var $mobileNumber;
  447. /**
  448. * 发送时间
  449. */
  450. var $sentTime;
  451. /**
  452. * 短信内容
  453. */
  454. var $smsContent;
  455. function Mo(&$ret=array())
  456. {
  457. $this->addSerial = $ret[addSerial];
  458. $this->addSerialRev = $ret[addSerialRev];
  459. $this->channelnumber = $ret[channelnumber];
  460. $this->mobileNumber = $ret[mobileNumber];
  461. $this->sentTime = $ret[sentTime];
  462. $this->smsContent = $ret[smsContent];
  463. }
  464. function getAddSerial()
  465. {
  466. return $this->addSerial;
  467. }
  468. function getAddSerialRev()
  469. {
  470. return $this->addSerialRev;
  471. }
  472. function getChannelnumber()
  473. {
  474. return $this->channelnumber;
  475. }
  476. function getMobileNumber()
  477. {
  478. return $this->mobileNumber;
  479. }
  480. function getSentTime()
  481. {
  482. return $this->sentTime;
  483. }
  484. function getSmsContent()
  485. {
  486. return $this->smsContent;
  487. }
  488. }
  489. ?>