首页 > PHP
ThinkPHP6对接阿里云短信
来源:TP课堂 时间:2021-07-07 点击:662

2023年的代码:

一、准备好AccessKey ID、AccessKey Secret

二、composer下载 

      https://next.api.aliyun.com/api-tools/sdk/Dysmsapi?spm=a2c4g.215762.0.0.b2976eb7xzkqQQ&version=2017-05-25&language=php-tea&tab=primer-doc


   composer require alibabacloud/dysmsapi-20170525 2.0.24


三、app\common\lib建立Alicms.php,代码如下:

<?php

namespace app\common\lib;

use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;

class Alicms {

    /**
     * 使用AK&SK初始化账号Client
     * @param string $accessKeyId
     * @param string $accessKeySecret
     * @return Dysmsapi Client
     */
    public static function createClient($accessKeyId, $accessKeySecret){
        $config = new Config([
            // 必填,您的 AccessKey ID
            "accessKeyId" => 'LTAI5tLU8d1utb1amqqXGC',
            // 必填,您的 AccessKey Secret
            "accessKeySecret" => '3xnCK911hkEsFVlBtq7MxRtJho91y'
        ]);
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        $config->endpoint = "dysmsapi.aliyuncs.com";
        return new Dysmsapi($config);
    }

    /**
     * @param string[] $args
     * @return void
     */
    public static function main(){
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html
        $client = self::createClient(getenv("LTAI5tLU8xsmqqXGC"), getenv('3xnttFVlBtq7MxRtwJho91y'));
        $sendSmsRequest = new SendSmsRequest([
            "phoneNumbers" => "18315917852",
            "signName" => "点点商城",
            "templateCode" => "SMS_195720139",
            "templateParam" => "{\"code\":\"1634\"}"
        ]);
        $runtime = new RuntimeOptions([]);
        // true 忽略证书校验;false 设置证书校验
        $runtime->ignoreSSL = true;
        try {
            // 复制代码运行请自行打印 API 的返回值
            $res=$client->sendSmsWithOptions($sendSmsRequest, $runtime);
           
        }
        catch (Exception $error) {
            if (!($error instanceof TeaError)) {
                $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
            }
            // 如有需要,请打印 error
            Utils::assertAsString($error->message);
        }
    }
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}


四、控制器中调用,先use 

use app\common\lib\Alicms;
 $alibaba=new Alicms();
  $res=$alibaba->main([]);

以上是基础代码,需要根据自身业务修改,ssl、随机数生成、存入缓存等。


2020年的代码:

image.png


去官网准备composer一把,结果又改了。调皮啊。

https://help.aliyun.com/document_detail/215762.html?spm=a2c4g.11186623.6.662.5e8d5633ozzcrY#title-v1d-d4d-m4m


composer命令见上面官方文档


缓存不能用数字开头,比如电话号码直接存成缓存,即使已经转字符串,也不行的,至少在阿里云主机不行


来把代码,看看类库都变了……,也可以踹(try)一下子

declare(strict_types = 1);
namespace app\common\lib;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
use think\facade\Cache;
use Redis;
class Alicms{
    public function index(string $phone){
        if(empty($phone)){
            return false;
        }

        $code=rand(1000,9999);
        Cache::store('redis')->set($phone,$code,90);

        $client = $this->createClient("LTAI5tHtHf6TgU7ZygkDn", "bPJIMPnjYn8K2KCmzSRrQtAjkf");
        $sendSmsRequest = new SendSmsRequest([
            "phoneNumbers" => $phone,
            "signName" => "XX育",
            "templateCode" => "SMS_21",
            "templateParam" => "{\"code\":$code}",
        ]);
        // 复制代码运行请自行打印 API 的返回值
        $result=$client->sendSms($sendSmsRequest);
        return "OK";
    }

    public function createClient($accessKeyId,$accessKeySecret){
        $config = new Config([
            // 您的AccessKey ID
            "accessKeyId" => $accessKeyId,
            // 您的AccessKey Secret
            "accessKeySecret" => $accessKeySecret
        ]);
        // 访问的域名
        $config->endpoint = "dysmsapi.aliyuncs.com";
        return new Dysmsapi($config);
    }
}