zoukankan      html  css  js  c++  java
  • PHP 之阿里云短信插件

    一、函数封装

    //阿里云短信插件 dtmoban.com
    function ali_sms($mobile,$id,$data){
       
        //引入短信类
        include DT_ROOT.'/api/aliyun/sendsms.class.php';
       
        $params = array ();
        $accessKeyId = ''; //AccessKey ID
        $accessKeySecret = ''; //Access Key Secret
        $params["PhoneNumbers"] = $mobile;
        $params["SignName"] = ""; //短信签名
        $params["TemplateCode"] = $id;
        $params['TemplateParam'] = $data;
         // *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
        if(!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
            $params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
        }
    
        // 初始化SignatureHelper实例用于设置参数,签名以及发送请求
        $helper = new SignatureHelper();
    
        // 此处可能会抛出异常,注意catch
        $res = $helper->request(
            $accessKeyId,
            $accessKeySecret,
            "dysmsapi.aliyuncs.com",
            array_merge($params, array(
                "RegionId" => "cn-hangzhou",
                "Action" => "SendSms",
                "Version" => "2017-05-25",
            ))
        );
        $res = json_decode( json_encode( $res),true);
        $code = $res['Code'];
    
        return $code;
    }

    二、调用

    $id='SMS_209197388';
    $mobilecode = random(6, '0123456789');
    $code = ali_sms($mobile, $id, array('code' => $mobilecode)); //OK

    三、短信类

    sendsms.class.php

    <?php
    /**
     * 签名助手 2017/11/19
     *
     * Class SignatureHelper
     */
    class SignatureHelper {
    
        /**
         * 生成签名并发起请求
         *
         * @param $accessKeyId string AccessKeyId (https://ak-console.aliyun.com/)
         * @param $accessKeySecret string AccessKeySecret
         * @param $domain string API接口所在域名
         * @param $params array API具体参数
         * @param $security boolean 使用https
         * @return bool|stdClass 返回API接口调用结果,当发生错误时返回false
         */
        public function request($accessKeyId, $accessKeySecret, $domain, $params, $security=false) {
            $apiParams = array_merge(array (
                "SignatureMethod" => "HMAC-SHA1",
                "SignatureNonce" => uniqid(mt_rand(0,0xffff), true),
                "SignatureVersion" => "1.0",
                "AccessKeyId" => $accessKeyId,
                "Timestamp" => gmdate("Y-m-dTH:i:s"),
                "Format" => "JSON",
            ), $params);
            ksort($apiParams);
    
            $sortedQueryStringTmp = "";
            foreach ($apiParams as $key => $value) {
                $sortedQueryStringTmp .= "&" . $this->encode($key) . "=" . $this->encode($value);
            }
    
            $stringToSign = "GET&%2F&" . $this->encode(substr($sortedQueryStringTmp, 1));
    
            $sign = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&",true));
    
            $signature = $this->encode($sign);
    
            $url = ($security ? 'https' : 'http')."://{$domain}/?Signature={$signature}{$sortedQueryStringTmp}";
    
            try {
                $content = $this->fetchContent($url);
                return json_decode($content);
            } catch( Exception $e) {
                return false;
            }
        }
    
        private function encode($str)
        {
            $res = urlencode($str);
            $res = preg_replace("/+/", "%20", $res);
            $res = preg_replace("/*/", "%2A", $res);
            $res = preg_replace("/%7E/", "~", $res);
            return $res;
        }
    
        private function fetchContent($url) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                "x-sdk-client" => "php/2.0.0"
            ));
    
            if(substr($url, 0,5) == 'https') {
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            }
    
            $rtn = curl_exec($ch);
    
            if($rtn === false) {
                trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
            }
            curl_close($ch);
    
            return $rtn;
        }
    }
  • 相关阅读:
    初步学习css 从css手册看起———text
    IE6双倍margin间距两大解决方案转载
    div+css的基本 常用到语法(一) 。
    初步学习css 从css手册看起———Font
    行内宽高设置无效的解决
    C++面对对象基础
    C++继承和派生
    基于MATLAB的FIR滤波器的设计
    C++多态
    C++中的静态成员和静态函数
  • 原文地址:https://www.cnblogs.com/yang-2018/p/15079905.html
Copyright © 2011-2022 走看看