天天看点

ThinkPHP5 集成阿里云短信服务-验证码发送

一:下载并集成PHP-SDK

1、自行下载(忽略)

2、ThinkPHP5 集成

a. sdk目录中包含:api_demo、api_sdk、msg_demo、msg_sdk 四个目录。

b.在 thinkphp5 的 extend 目录下新建ali目录,将api_sdk包复制进去

二:配置文件

在extra目录下面新建aliyun.php,请自行填入你自己的key数据

<?php
/**
 * 阿里云相关配置
 * Created by PhpStorm.
 * User: Administrator
 */
return [
    'product' => 'Dysmsapi',   // 短信API产品名,唯一
    'domain' => 'dysmsapi.aliyuncs.com',   // 短信API产品域名,唯一
    'region' => 'cn-hangzhou',   // 暂时不支持多Region,唯一
    'endPointName' => '',   // 服务结点,唯一
    'accessKeyId' => '',   // AccessKeyId
    'accessKeySecret' => '',   // AccessKeySecret
    'signName' => '',   // 签名名称
    'templateCode' => '',   // 短信模板Code
    'valid_time' => '300',   // 验证码有效时间,单位为秒
];
           

三.封装发送短信的单例类

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 */
namespace app\common\lib;
use think\Cache;
use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
require_once EXTEND_PATH.'ali/api_sdk/vendor/autoload.php';

// 加载区域结点配置
Config::load();

class Alidayu{
    /**
     * 短信验证码单例
     * Created by
     * User:
     * Date:
     * Time:
     */

    public $acsClient = '';
    /**
     * 静态变量保存全局实例
     */
    private static $_instance = null;

    /**
     * 私有构造方法
     */
    private function __construct(){}

    /**
     * 获取单例实例
     */
    public static function getInstance(){
        if(empty(self::$_instance)){
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    /**
     * 发送短信验证码
     * $phone :手机号码
     */
    public function sendSMS($phone) {
        // 短信API产品名
        $product = config('aliyun.product');

        // 短信API产品域名
        $domain = config('aliyun.domain');

        // 暂时不支持多Region
        $region = config('aliyun.region');

        // 服务结点
        $endPointName = config('aliyun.endPointName');

        // 初始化用户Profile实例
        $profile = DefaultProfile::getProfile($region, config('aliyun.accessKeyId'), config('aliyun.accessKeySecret'));

        // 增加服务结点
        DefaultProfile::addEndpoint($endPointName, $region, $product, $domain);

        // 初始化AcsClient用于发起请求
        $this->acsClient = new DefaultAcsClient($profile);

        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendSmsRequest();

        // 必填,设置雉短信接收号码
        $request->setPhoneNumbers($phone);

        // 必填,设置签名名称
        $request->setSignName(config('aliyun.signName'));

        // 必填,设置模板CODE
        $request->setTemplateCode(config('aliyun.templateCode'));

        //随机数
        $random = rand(1000,9999);

        //模板参数数组
        $send_info = [
            'code' => $random,
            
        ];
        // 可选,设置模板参数

        $request->setTemplateParam(json_encode($send_info));

        // 发起访问请求
        $acsResponse = $this->acsClient->getAcsResponse($request);

        // 打印请求结果
        // var_dump($acsResponse);
        if(!$acsResponse->Code == "OK"){
            return false;
        }
        //设置手机号码有效期为 5 分钟
        Cache::set($phone,$random,config('ali.valid_time'));

        return true;
    }

    /**
     * 检查短信验证码是否失效
     * @param $phone
     * @return 返回验证码
     */
    public static function checkValidPhone($phone) {
        if(!$phone){
            return false;
        }
        return Cache::get($phone);
    }
}
           

四:测试效果,在控制器下面新建一个Test.php.输入自己的手机号码

public  function sendSms() {
    Alidayu::getInstance()->sendSMS("1234567890");
}      

然后在浏览器把x.com换为你的虚拟域名或者网址 打开http://x.com/test/sendSms

然后你的手机就能收到来自阿里云的短信了