阿里云短信发送【PHP版】

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

官方提供的属实太乱太冗余了

虽然使用composer看似简单,但是包真的很大,本人不才,查了很多资料,总结了一下,简单明了,100多行代码,解决阿里云短信发送问题,与大家共勉


使用步骤

1. 开通短信服务

         这个就不用多说了,自行解决吧

2. 申请短信签名

   

短信服务发送的短信中包括短信签名和短信模板。短信签名是短信发送者的署名,表示发送方的身份;短信模板是发送的短信内容。

使用短信签名和短信模板前必须提交短信服务审核,审核通过的签名和模板才能使用在短信中。

申请短信签名,请参考以下文档在控制台签名管理页面操作:

  • 添加签名

  • 签名规范

    • 个人用户签名规范

    • 企业用户签名规范

    • 签名审核


    3. 申请短信模板

        

    短信模板是发送的短信内容。短信分为国内短信和国际港澳台短信,其中国内短信包括验证码短信、短信通知和推广短信,不同类型的短信使用不同的短信模板,遵循不同的模板规范。

    申请短信模板,请参考以下文在控制台模板管理页面档操作:

  • 添加文本短信模板

  • 添加国际/港澳台短信模板(企业用户)

  • 签名规范

    • 文本短信模板规范

    • 国际/港澳台短信模板规范

    • 模板审核流程


    4. 发送短信

        最重要的步骤来啦,看完官方文档后,还是直接copy下面的代码使用吧

    /**

    * 阿里云短信发送类

    * @author Arrow

    * 参考:https://www.cnblogs.com/zxf100/archive/2019/09/06/11473662.html

    */

    class aliyunsms{

    // 保存错误信息

        public $error;

        // Access Key ID

        private $accessKeyId = '';

        // Access Access Key Secret

        private $accessKeySecret = '';

        // 签名

        private $signName = '';

        // 模版ID

        private $templateCode = '';

        public function __construct($signName) {

    $config = array (

    'accessKeyId' => '',

                'accessKeySecret' => '',

                'signName' => $signName,

            );

            // 配置参数

            $this->accessKeyId= $config['accessKeyId'];

            $this->accessKeySecret= $config['accessKeySecret'];

            $this->signName= $config['signName'];

        }

    private function percentEncode($string) {

    $string = urlencode ($string );

            $string = preg_replace ('/\+/', '%20', $string );

            $string = preg_replace ('/\*/', '%2A', $string );

            $string = preg_replace ('/%7E/', '~', $string );

            return $string;

        }

    /**

    * 签名

    *

    * @param unknown $parameters

    * @param unknown $accessKeySecret

    * @return string

    */

        private function computeSignature($parameters, $accessKeySecret) {

    ksort ($parameters );

            $canonicalizedQueryString = '';

            foreach ($parameters as $key => $value ) {

    $canonicalizedQueryString .= '&' . $this->percentEncode ($key ). '=' . $this->percentEncode ($value );

            }

    $stringToSign = 'GET&%2F&' . $this->percentencode ( substr ($canonicalizedQueryString, 1 ) );

            $signature = base64_encode ( hash_hmac ('sha1', $stringToSign, $accessKeySecret . '&', true ) );

            return $signature;

        }

    /**

    * Notes:发送模板消息

    * User: Arrow

    * Date: 2019-11-13

    * Time: 15:16

    *

    * @param $templateCode        短信模板ID

    * @param $mobile              接收短信的手机号码

    * @param array $templateParam  短信模板变量对应的实际值,数组格式

    * @return bool

    */

        public function send_message($templateCode,$mobile, $templateParam=array()) {

    $params = array (//此处作了修改

                'SignName' => $this->signName,

                'Format' => 'JSON',

                'Version' => '2017-05-25',

                'AccessKeyId' => $this->accessKeyId,

                'SignatureVersion' => '1.0',

                'SignatureMethod' => 'HMAC-SHA1',

                'SignatureNonce' => uniqid (),

                'Timestamp' => gmdate ('Y-m-d\TH:i:s\Z' ),

                'Action' => 'SendSms',

                'TemplateCode' => $templateCode,

                'PhoneNumbers' => $mobile,

                'TemplateParam' => json_encode($templateParam)//更换为自己的实际模版

            );

            //var_dump($params);die;

    // 计算签名并把签名结果加入请求参数

            $params ['Signature']= $this->computeSignature ($params, $this->accessKeySecret );

            // 发送请求(此处作了修改)

            $url = 'https://dysmsapi.aliyuncs.com?' . http_build_query ($params );

            $ch = curl_init ();

            curl_setopt ($ch, CURLOPT_URL, $url );

            curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE );

            curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE );

            curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1 );

            curl_setopt ($ch, CURLOPT_TIMEOUT, 10 );

            $result = curl_exec ($ch );

            curl_close ($ch );

            $result = json_decode ($result, true );

            log_message('debug',__METHOD__.' '.__LINE__.'行,发送短信结果为=》'.var_export($result,true));

            //var_dump($result);die;

            if (isset ($result ['Code'] )) {

    $this->error= $this->getErrorMessage ($result ['Code'] );

                log_message('debug',__METHOD__.' '.__LINE__.'行,发送短信结果error为=》'.var_export($this->error,true));

                return false;

            }

    return true;

        }

    /**

    * 获取详细错误信息

    *

    * @param unknown $status

    */

        public function getErrorMessage($status) {

    // 阿里云的短信 乱八七糟的(其实是用的阿里大于)

    // https://api.alidayu.com/doc2/apiDetail?spm=a3142.7629140.1.19.SmdYoA&apiId=25450

            $message = array (

    'InvalidDayuStatus.Malformed' => '账户短信开通状态不正确',

                'InvalidSignName.Malformed' => '短信签名不正确或签名状态不正确',

                'InvalidTemplateCode.MalFormed' => '短信模板Code不正确或者模板状态不正确',

                'InvalidRecNum.Malformed' => '目标手机号不正确,单次发送数量不能超过100',

                'InvalidParamString.MalFormed' => '短信模板中变量不是json格式',

                'InvalidParamStringTemplate.Malformed' => '短信模板中变量与模板内容不匹配',

                'InvalidSendSms' => '触发业务流控',

                'InvalidDayu.Malformed' => '变量不能是url,可以将变量固化在模板中'

            );

            if (isset ($message [$status] )) {

    return $message [$status];

            }

    return $status;

        }

    }

    遇到的坑之点滴:


    你以为按照官方给出的步骤就能成了吗,too young to simple

    反正我这个不行,一直提示:isp.RAM_PERMISSION_DENY


    原因:RAM权限不足。                              

    解决方案:请为当前使用的AK对应子账号进行授权:AliyunDysmsFullAccess(管理权限)。具体操作请参考:访问权限控制。  链接还打不开,醉了

    去RAM中把该用户的权限添加上短信相关的权限                    

    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 203,456评论 5 477
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 85,370评论 2 381
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 150,337评论 0 337
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 54,583评论 1 273
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 63,596评论 5 365
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 48,572评论 1 281
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 37,936评论 3 395
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 36,595评论 0 258
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 40,850评论 1 297
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 35,601评论 2 321
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 37,685评论 1 329
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 33,371评论 4 318
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 38,951评论 3 307
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 29,934评论 0 19
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 31,167评论 1 259
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 43,636评论 2 349
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 42,411评论 2 342