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