使用PHP通過移動雲MAS傳送簡訊
背景
客戶端傳送一個請求到伺服器,將資訊通過簡訊告知使用者。這個是很常見的一種訊息推送的方式。這次也需要完成這樣的功能。
我們選擇的移動簡訊平臺為10086的雲MAS的平臺,介面選擇最簡單的HTTP介面。
方案
簡訊平臺 | 資料介面 | 服務端 | 客戶端 |
---|---|---|---|
中國移動雲MAS | 雲MAS提供的HTTP介面 | PHP開發的服務 | Html+JS |
必要的非技術準備
- 需要一箇中國移動雲MAS業務平臺的集團賬號。通常應該是業主方購買,如果乙方購買,自行腦補運維費怎麼弄。
- PHP開發通用的POST請求程式與雲MAS對接。
實戰
步驟 | Subject | 備忘 | 說明 |
---|---|---|---|
1 | 獲得雲MAS介面賬號 | 移動集團賬號登入ofollow,noindex">http://mas.10086.cn/login 開通 | 詳細手冊在網站有下載 |
2 | 下載配套的簽名祕鑰 | 根據移動手冊step by step操作即可,下載的是一個excel檔案中包含 | - |
3 | 使用PHP curl功能 | 製作配套的POST函式,將簡訊傳送出去 | - |
4 | 完成響應客戶端請求的php指令碼 | - | - |
封裝一個Mas Class
- 附送一個程式碼段,不同的需求可以不同的改造。
- 這裡使用了讀取ini獲得配置,這樣不修改程式的情況下,修改ini即可完成資料功能切換。
- 優化餘地:對應簡訊傳送之後的response處理可以根據手冊更加豐富的處理。
<?php /** * ================================================================== * created by YYXOCHEN on 2018.09.27 * Copyright (c) 2017-2027 YYXOCHENAll Rights Reserved * ================================================================== * 適配移動雲MAS系統的http請求傳送普通簡訊功能的類 * 需要配置http請求的介面的相關賬號,資料可以維護到config/config.ini中 * ------------------------------------------------------------------ * 介面引數說明: * @param string $ecName * @param string $apId * @param string $mobiles 逗號分隔手機號碼 * @param string $content * @param string $sign 下載的簽名中有 * @param string $addSerial 擴充套件碼,根據向移動公司申請的通道填寫,如果申請的精確匹配通道,則填寫空字串(""),否則新增移動公司允許的擴充套件碼 * @param string $mac API輸入引數簽名結果,簽名演算法:將ecName,apId,secretKey,mobiles,content ,sign,addSerial按照順序拼接,然後通過md5(32位小寫)計算後得出的值 * 以上資料需要字符集utf8 * POST請求路徑:http://112.35.1.155:1992/sms/norsubmit * ------------------------------------------------------------------ * 使用範例: * require_once "util/mas.10086.class.php"; * $mas = new Mas10086(); * $response = $mas->sendSms('138 XXXX XXXX', 'Hello World!'); * var_dump($response); * ------------------------------------------------------------------ * version 1.0 * 可以通過http介面,傳送sms普通簡訊,介面適配mas的 HTTP2.1 版本 */ class Mas10086 { /** * 專案常量配置,如果有config則可以不用,這裡作為預設值配置 * 更為通用的方式,應該是用config.ini中配置[MAS_10086] */ const AP_ID= 'XXXX'; const SIGN= 'XXXX'; const ADD_SERIAL = ''; const SECRET_KEY= 'XXXX'; const EC_NAME = 'XXXX'; const NORMAL_SMS_URL = 'http://112.35.1.155:1992/sms/norsubmit'; const MAS_VERSION = '2.1'; private $apId = ''; private $sign = ''; private $addSerial = ''; private $secretKey = ''; private $ecName = ''; private $norSmsUrl = ''; /** * 初始化操作:讀取config,設定配置引數 * 如果沒有配置,則使用預設 */ function __construct() { $ini = parse_ini_file("../../Config/config.ini",true); $masKey = 'MAS_10086_'.self::MAS_VERSION; if (!isset($ini[$masKey])) { $this->apId= self::AP_ID; $this->sign= self::SIGN; $this->addSerial = self::ADD_SERIAL; $this->secretKey = self::SECRET_KEY; $this->ecName= self::EC_NAME; $this->norSmsUrl = self::NORMAL_SMS_URL; } else { $this->apId= isset( $ini[$masKey]['AP_ID'])? $ini[$masKey]['AP_ID']: self::AP_ID; $this->sign= isset( $ini[$masKey]['SIGN'])? $ini[$masKey]['SIGN']: self::SIGN; $this->addSerial= isset( $ini[$masKey]['ADD_SERIAL'])? $ini[$masKey]['ADD_SERIAL']: self::ADD_SERIAL; $this->secretKey= isset( $ini[$masKey]['SECRET_KEY'])? $ini[$masKey]['SECRET_KEY']: self::SECRET_KEY; $this->ecName= isset( $ini[$masKey]['EC_NAME'])? $ini[$masKey]['EC_NAME']: self::EC_NAME; $this->norSmsUrl= isset( $ini[$masKey]['NORMAL_SMS_URL']) ? $ini[$masKey]['NORMAL_SMS_URL'] : self::NORMAL_SMS_URL; xlog('I','read mas10086 config from ini file'); } } /** * 根據MAS的介面規範,需要裝配一組mac字串做驗證 * @param string $mobiles 逗號分隔得電話號碼字串 * @param string $content * @return string */ private function makeMacString($mobiles,$content) { $macstr = $this->ecName . $this->apId . $this->secretKey . $mobiles . $content . $this->sign . $this->addSerial; return strtolower( md5($macstr) ); } /** * 內建一個curl定製的傳送請求的函式,專門配置 * @param string $data 傳送的資料 * @return string 請求結果資訊 */ private function post($url, $data) { if (!$url) { return false; } $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $res = curl_exec($curl); curl_close($curl); return $res; } /** * sendSms * 傳送簡訊函式 * @param array $phoneNumberList 電話號碼陣列 * @param string $content 簡訊文字 * @return object Mas10086的標準介面* *@param string $rspcod, 響應碼(根據下面返回值判斷) *@param string $msgGroup, 訊息批次號,由雲MAS平臺生成,用於驗證簡訊提交報告和狀態報告的一致性(取值msgGroup)注:如果資料驗證不通過msgGroup為空 *@param boolean $success */ public function sendSms($phoneList, $content='來自AsieMatrix的資訊') { if (is_array($phoneList)) { if (count($phoneList) == 0) { return false; } $mobiles = implode(',', $phoneList); } else { $mobiles = $phoneList; } $content .= "\n\r".'[系統簡訊,請勿回覆]'; $mobiles = ltrim(rtrim($mobiles, ','),','); $macstr = $this->makeMacString($mobiles,$content); $data = [ 'addSerial' => $this->addSerial, 'apId' => $this->apId, 'content' => $content, 'ecName' => $this->ecName, 'mobiles' => $mobiles, 'sign'=>$this->sign, 'mac' => $macstr ]; $dataContent = base64_encode( json_encode($data) ); $res = json_decode($this->post($this->norSmsUrl, $dataContent)); return $res; } } ?>