yii2集成阿里云短信服务SDK

yii2集成阿里云短信服务SDK

仓库改为国内的,composer.json文件

php 复制代码
"repositories": [
        {
            "name": "packagist",
            "type": "composer",
            "url": "https://mirrors.aliyun.com/composer/"
        }
    ]

安装阿里云SDK

进入yii2项目根目录

bash 复制代码
composer require alibabacloud/dysmsapi-20170525 4.6.0

或

bash 复制代码
composer require alibabacloud/dysmsapi-20170525 4.6.0 --no-plugins

发短信Demo,以发生日提醒短信为例,定时任务

php 复制代码
namespace app\commands;
use app\models\User;
use Yii;
use yii\console\Controller;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
use AlibabaCloud\Credentials\Credential;
use AlibabaCloud\Dara\Models\RuntimeOptions as ModelsRuntimeOptions;
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 CronBirthdayController extends Controller
{
    /**
     * 执行生日提醒任务
     */
    public function actionIndex()
    {
        Yii::beginProfile('CronBirthdayController');

        $today = new \DateTime();
        $month = $today->format('m');
        $usersQuery = User::find()
            ->andWhere(['<>', 'birthday_sent', $today->format('Y')])
            ->andWhere(['like', 'birthday', "-{$month}-"])
            ->orderBy(['birthday' => SORT_ASC])
            ->select(['id', 'mobile', 'nickname' => 'FROM_BASE64(nickname)']);
        $users = $usersQuery->all();
        // var_dump($users);
        foreach ($users as $user) {
            $nickname = $user['nickname'];
            $sms_aliyun_params = Yii::$app->params['sms_aliyun'];
            $client = self::createClient($sms_aliyun_params);
            // 判断手机号是否正常
            if (strlen($user['mobile']) < 11) {
                continue;
            }
            $sendSmsRequest = new SendSmsRequest([
                "signName" => "{签名}", // 签名需要在阿里平台备案
                "phoneNumbers" => $user['mobile'], // 用户手机号
                "templateCode" => "SMS_XXXXXX", // 生日活动提醒模板
                "templateParam" => json_encode(["name" => "{$nickname}"], JSON_UNESCAPED_UNICODE), // 模板参数
            ]);
            $runtime = new ModelsRuntimeOptions([]);
            try {
                $send_res = $client->sendSmsWithOptions($sendSmsRequest, $runtime);
                // var_dump($send_res);
                if ($send_res->statusCode == 200 && $send_res->body->code == 'OK') {
                    self::updateSentStatus($user);
                    echo "ID:{$user->id}-{$user->mobile}-发送成功" . PHP_EOL;
                } else {
                    echo "ID:{$user->id}发送失败:{$send_res->body->message}" . PHP_EOL;
                }
            } catch (Exception $error) {
                if (!($error instanceof TeaError)) {
                    $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
                }
                echo $error->message . PHP_EOL;
                // 诊断地址
                // var_dump($error->data["Recommend"]);
            }
        }
        Yii::endProfile('CronBirthdayController');
        return 0;
    }

    /**
     * 使用凭据初始化账号Client
     * @param array $sms_aliyun_params
     * @return Dysmsapi Client
     */
    public static function createClient($sms_aliyun_params)
    {
        // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/311677.html。
        $credential = new Credential();
        $config = new Config([
            "credential" => $credential,

        ]);
        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
        $config->endpoint = $sms_aliyun_params['sms_url'];
        $config->accessKeyId = $sms_aliyun_params['access_key_id'];
        $config->accessKeySecret = $sms_aliyun_params['access_key_secret'];
        $config->verify = false;
        return new Dysmsapi($config);
    }

    /**
     * 更新成功发送的数据,标记为当年,用来实现一年发送一次
     * @param object $user
     * @return boolean
     */
    public function updateSentStatus($user)
    {
        $today = new \DateTime();
        $year = $today->format('Y');
        return $user->updateAll(['birthday_sent' => $year], ['id' => $user->id]);
    }
}

执行任务

bash 复制代码
php yii cron-birthday/index
相关推荐
Henry-SAP4 小时前
阿里云大模型份额居首
阿里云·云计算
yyuuuzz1 天前
云服务器安全组规则优先级的机制记录
运维·服务器·网络·安全·阿里云·aws
云-缩影1 天前
我用阿里云 AI 动画方案跑通了剧本→视频流水线:ComfyUI + 百炼模型实测
人工智能·阿里云·云计算
程序员梅雨2 天前
【从零开始学习数据仓库 | 第一篇】:维度建模理论
大数据·数据仓库·学习·阿里云·数据分析
云老大-阿里云国际站代理商2 天前
阿里云国际站渠道代理商:ECS 怎么对接 OSS?权限、域名、网络路径怎么配置?
网络·阿里云·php
薛之谦_2 天前
用 Java 实现阿里云式 IAM 子用户管理:架构设计与表结构详解
java·python·阿里云
大力财经2 天前
山东山大华天软件与阿里云达成合作,旗下产品CrownCAD已接入Qoder
人工智能·阿里云·云计算