美文网首页程序员
使用PHP通过移动云MAS发送短信

使用PHP通过移动云MAS发送短信

作者: xiaoou22 | 来源:发表于2018-09-28 15:00 被阅读0次

背景

客户端发送一个请求到服务器,将信息通过短信告知用户。这个是很常见的一种消息推送的方式。这次也需要完成这样的功能。
我们选择的移动短信平台为10086的云MAS的平台,接口选择最简单的HTTP接口。

方案

短信平台 数据接口 服务端 客户端
中国移动云MAS 云MAS提供的HTTP接口 PHP开发的服务 Html+JS

必要的非技术准备

  1. 需要一个中国移动云MAS业务平台的集团账号。通常应该是业主方购买,如果乙方购买,自行脑补运维费怎么弄。
  2. PHP开发通用的POST请求程序与云MAS对接。

实战

步骤 Subject 备忘 说明
1 获得云MAS接口账号 移动集团账号登录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 YYXOCHEN  All 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;
    }
}

?>

相关文章

  • 使用PHP通过移动云MAS发送短信

    背景 客户端发送一个请求到服务器,将信息通过短信告知用户。这个是很常见的一种消息推送的方式。这次也需要完成这样的功...

  • 我与移动云mas短信接口二三事

    最近公司有个项目需要使用到发送短信验证码的功能,由于时间紧迫我们直接使用第三方服务——移动的云mas短信接口...

  • php发送短信验证码

    业务: 手机端点击发送验证码,请求发送到php端,由php调用第三方平台(我们使用的是榛子云短信http://sm...

  • 使用阿里云的短信服务发送短信

    原文地址使用阿里云的短信服务发送短信 在给客户开发一个信息发送功能的时候,需要涉及到短信的发送,短信发送一般不同的...

  • 阿里云短信发送【PHP版】

    最近公司切换阿里云短信服务,只能用新的sdk,官方的api接口说明太简单了,sdk太乱了 官方提供的属实太乱太冗余...

  • PHP发送短信

    1、首先本人使用的是卡洛思短信平台,用了2年了,感觉很好600元10000条。2、官网网址:http://www....

  • 跟我学微信小程序之五(云短信篇)

    发送短信在小程序中是一个常见功能,比如注册账号时发送验证码,发送短信通知等等,这些都需要用到云短信功能。使用腾讯云...

  • PhpSms

    PhpSms 可能是目前最聪明、优雅的php短信发送库了。从此不再为各种原因造成的个别短信发送失败而烦忧! php...

  • 阿里大于发送短信验证码demo

    使用阿里云的短信服务进行短信发送 1.在阿里的短信服务申请短信签名以及短信模板 短信签名:image.png 短信...

  • 使用阿里云短信服务发送短信

    如今互联网流量都在向手机App应用倾斜,但是邮件和短信营销依然是必不可少的。流量永远都是稀缺的,任何一家商业公司,...

网友评论

    本文标题:使用PHP通过移动云MAS发送短信

    本文链接:https://www.haomeiwen.com/subject/twhpoftx.html