thinkphp5.0整合阿里云短信

时间:2024-04-05 16:17:44

tp 实现短信发送

注册短信秘钥这一部分就省略了
在阿里云短信下载demo 下载链接,找到相对应的demo
thinkphp5.0整合阿里云短信
我们下下来之后发现他的目录结构是这样的
thinkphp5.0整合阿里云短信
如果我们只需要用到发送短信的业务的话,我们只需要用到里面的 api_sdk 这个文件,
官方也给我们准备了demo可以查看.
好我们来打开看看demo吧~
thinkphp5.0整合阿里云短信
进来之后我们看到了getAcsClient()方法,这个里面有几个参数是需要替换成你自己的,
我们发现了阿里云的demo引入了命名空间,所以使我们更加容易操作.

接下来就是最重要的部分了 发送短信
thinkphp5.0整合阿里云短信
我们也看到了里面填写参数,好了demo就看到这里吧~ 开始写代码

我们在框架的扩展目录下边新建一个文件 alisms
thinkphp5.0整合阿里云短信
我们只需要发送短信的业务, 把api_sdk copy 过来即可
thinkphp5.0整合阿里云短信
我们开始配置秘钥,我的是放在配置文件里面 如果你的秘钥发生变化就放在数据库 .
thinkphp5.0整合阿里云短信
因为本人的是以前做的项目 所以目录结构有点不相同,但是这都不影响操作
拷贝过来之后我们在当前文件夹下边仿照阿里云的demo 重写一个方法

<?php
/**
 * Created by  Wang.
 * User:  Wang.
 * Date: 2019/1/8
 * Time: 15:27
 */

namespace alisms;

use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;

//引入autoload.php,EXTEND_PATH就是指tp5根目录下的extend目录,系统自带常量。
//alisms为我们复制api_sdk过来后更改的目录名称

require_once EXTEND_PATH.'alisms/vendor/autoload.php';

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

class SendSms
{
    /*关键的配置,我们用成员属性*/

    //阿里云短信获取的accessKeyId
    private $accessKeyId;
    //阿里云短信获取的accessKeySecret
    private $accessKeySecret;
    //短信签名,要审核通过
    private $signName;
    //短信模板ID,记得要审核通过的
    private $templateCode;

    public function __construct()
    {
    	//使用静态方法读取秘钥 构造函数赋值
        $this->accessKeyId = \config('AliSms.accessKeyId');
        $this->accessKeySecret = \config('AliSms.accessKeySecret');
        $this->signName = \config('AliSms.signName');
        $this->templateCode = \config('AliSms.templateCode');
    }

    public function send($mobile,$templateParam)
    {

        //短信API产品名(短信产品名固定,无需修改)
        $product = "Dysmsapi";
        //短信API产品域名(接口地址固定,无需修改)
        $domain = "dysmsapi.aliyuncs.com";
        //暂时不支持多Region(目前仅支持cn-hangzhou请勿修改)
        $region = "cn-hangzhou";

        // 初始化用户Profile实例
        $profile = DefaultProfile::getProfile($region, $this->accessKeyId, $this->accessKeySecret);
        // 增加服务结点
        DefaultProfile::addEndpoint("cn-hangzhou", "cn-hangzhou", $product, $domain);
        // 初始化AcsClient用于发起请求
        $acsClient= new DefaultAcsClient($profile);

        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendSmsRequest();
        // 必填,设置雉短信接收号码
        $request->setPhoneNumbers($mobile);

        // 必填,设置签名名称
        $request->setSignName($this->signName);

        // 必填,设置模板CODE
        $request->setTemplateCode($this->templateCode);

        // 可选,设置模板参数
        if($templateParam) {
            $request->setTemplateParam(json_encode($templateParam),JSON_UNESCAPED_UNICODE);
        }

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

        //返回请求结果,这里为为数组格式
        $result = json_decode(json_encode($acsResponse),true);
        return $acsResponse;
    }

}

注意引入命名空间
namespace alisms;

这样子就基本上完成了是不是很简单呢~ 我们开始调用它发送短信啦~~

我们在用到他的时候命名空间就起作用咯

	//类前面记得引入SendSms类 
	 use alisms\SendSms;
	//简单的调用
    public function test(Request $request)
    {
        //判断是否ajax提交
        if($request->isAjax())
        {
            //获取mobile参数
            $mobile = $request->param('mobile');
            //新建code
            $templateParam = array('code' => rand(1000,9999));

            //保存在session进行验证
            session('sms_code',['mobile'=>$mobile,'code'=>$templateParam['code']]);

            //实例化类
            $send = new SendSms();
            //调用类里面send方法 send()方法需要俩个参数;
            //发送短信~
            $result = $send->send($mobile,$templateParam);
            //是否成功
            if($result)
            {
                //返回
                return http200('发送成功!');
            }
        }
    }