按照文档来就行了。
最低要求 PHP 5.6
安装 SDK 核心库 OpenAPI ,如果已在系统上全局安装 Composer,请直接在项目目录中运行以下内容来安装 Alibaba Cloud SDK for PHP 作为依赖项:
composer require alibabacloud/darabonba-openapi
⚠️注意:执行 composer 安装 SDK 的 PHP 版本要小于或等于实际运行时的 PHP 版本。 例如,在 PHP7.2 环境下安装 SDK 后生成 vendor 目录,只能在 PHP7.2 以上版本使用,如果拷贝到 PHP5.6 环境下使用,会出现依赖版本不兼容问题。
一些用户可能由于网络问题无法安装,可以通过以下命令使用阿里云 Composer 全量镜像。
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
Packagist
composer require alibabacloud/dysmsapi-20170525 2.0.23
最后一步安装不成功可能是因为没有23版本,安装20得也可以,下面是Alibaba_sms.php
<?php
namespace app\common\server;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
use AlibabaCloud\Tea\Utils\Utils;
use AlibabaCloud\Tea\Console\Console;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use think\Env;
class Alibaba_sms {
/**
* 使用AK&SK初始化账号Client
* @param string $accessKeyId
* @param string $accessKeySecret
* @return Dysmsapi Client
*/
public static function createClient($accessKeyId, $accessKeySecret){
$config = new Config([
// 必填,您的 AccessKey ID
"accessKeyId" => $accessKeyId,
// 必填,您的 AccessKey Secret
"accessKeySecret" => $accessKeySecret
]);
// 访问的域名
$config->endpoint = "dysmsapi.aliyuncs.com";
return new Dysmsapi($config);
}
/**
* 使用STS鉴权方式初始化账号Client,推荐此方式。本示例默认使用AK&SK方式。
* @param string $accessKeyId
* @param string $accessKeySecret
* @param string $securityToken
* @return Dysmsapi Client
*/
public static function createClientWithSTS($accessKeyId, $accessKeySecret, $securityToken){
$config = new Config([
// 必填,您的 AccessKey ID
"accessKeyId" => $accessKeyId,
// 必填,您的 AccessKey Secret
"accessKeySecret" => $accessKeySecret,
// 必填,您的 Security Token
"securityToken" => $securityToken,
// 必填,表明使用 STS 方式
"type" => "sts"
]);
// 访问的域名
$config->endpoint = "dysmsapi.aliyuncs.com";
return new Dysmsapi($config);
}
/**
* 发送验证码
* @param $args
* @return \AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsResponse|void
*/
public static function main($args){
extract($args);
$client = self::createClient(Env::get('alibabasms.accessKeyId'), Env::get('alibabasms.accessKeySecret'));
$sendSmsRequest = new SendSmsRequest([
"phoneNumbers" => $phone,
"signName" => Env::get('alibabasms.signName'),
"templateCode" => Env::get('alibabasms.TemplateCode'),
"templateParam" => $templateParam, // 验证码字符串
]);
$runtime = new RuntimeOptions([]); // 可忽略
try {
// 复制代码运行请自行打印 API 的返回值
$resp = $client->sendSmsWithOptions($sendSmsRequest, $runtime);
return $resp;
}
catch (Exception $error) {
if (!($error instanceof TeaError)) {
$error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
}
// 如有需要,请打印 error
Utils::assertAsString($error->message);
}
}
}
Api
/**
* 发送验证码
* @return void
* @throws \think\Exception
*/
public function alidayusms_send(){
$phone = $this->request->param('phone');
$event = $this->request->post("event");
$event = $event ? $event : 'register';
if (!$phone || !\think\Validate::regex($phone, "^1\d{10}$")) {
$this->error(__('手机号不正确'));
}
$last = Smslib::get($phone, $event);
if ($last && time() - $last['createtime'] < 60) {
$this->error(__('发送频繁'));
}
$ipSendTotal = \app\common\model\Sms::where(['ip' => $this->request->ip()])->whereTime('createtime', '-1 hours')->count();
if ($ipSendTotal >= 5) {
$this->error(__('发送频繁'));
}
//生成验证码
$code = Random::numeric(config('captcha.length'));
// 阿里云规定必须json字符串
$templateParam = json_encode(['code'=>$code]);
$data = [
'phone' => $phone, // 手机号
'templateParam' => $templateParam, // 验证码字符串
'event' => $event,
];
$ret = Alibaba_sms::main($data);
$ret = json_decode(json_encode($ret,true),true);
if ($ret['statusCode'] == 200 && $ret['body']['code'] == "OK" && $ret['body']['message'] == "OK") {
$time = time();
$ip = request()->ip();
$sms = \app\common\model\Sms::create(['event' => $event, 'mobile' => $phone, 'code' => $code, 'ip' => $ip, 'createtime' => $time]);
$this->success(__('发送成功'));
} else {
$this->error(__('发送失败'));
}
}
检测验证码有效性
/**
* 验证码有效时长
* @var int
*/
protected static $expire = 300;
/**
* 最大允许检测的次数
* @var int
*/
protected static $maxCheckNums = 10;
/**
* @param $mobile
* @param $code
* @param $event
* @return array|false|mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public static function alisms_check($mobile, $code, $event = 'default'){
$time = time() - self::$expire;
$sms = \app\common\model\Sms::where(['mobile' => $mobile, 'event' => $event])
->order('id', 'DESC')
->find();
if ($sms) {
if ($sms['createtime'] > $time && $sms['times'] <= self::$maxCheckNums) {
$correct = $code == $sms['code'];
if (!$correct) {
$sms->times = $sms->times + 1;
$sms->save();
return false;
} else {
$result = true;
return $result;
}
} else {
// 过期则清空该手机验证码
self::flush($mobile, $event);
return false;
}
} else {
return false;
}
}