起因
Fastadmin的阿里云短信发送插件需要收费,想着自己用官方SDK开发一下
经过
Fastadmin的官方包里自带了短信发送方法,里面create数据之后直接用一个
Hook::listen('sms_send', $sms, null, true);
进行了发短信的处理,早就听说过不过没有使用过
查看文档和相关文章之后,解决方案如下:
解决方案
1.通过composer安装阿里云短信发送官方包
composer require alibabacloud/sdk
2.新建application\api\hook\Sms.php文件(可以自行用其他路径)
代码大概如下,也没有很复杂的代码,大家可以根据自行需求自己调整,
<?php
/**
* hook钩子触发短信发送
*/
namespace app\api\hook;
//阿里云短信发送相关类 composer安装
//composer require alibabacloud/sdk
use Swoft\Task\Bean\Annotation\Task;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
class Sms
{
//发送验证码
//@sms 验证码发送记录数数据库实例
//$sms->mobile 手机号码
//['event' => $event, 'mobile' => $mobile, 'code' => $code, 'ip' => $ip, 'createtime' => $time]
function smsSend($sms)
{
return $this->sendMsg($sms->mobile,['code'=>$sms->code],'code');
}
/*function smsCheck($sms)
{
return $this->sendMsg($sms->mobile,['code'=>$sms->code],'code');
}*/
//@mobile 手机号码
//@param 短信发送参数
//@template 短信发送模板编号key值
private function sendMsg($mobile,$param,$template){
$config = \config('alisms');
if(empty($param)||!isset($config)||empty($config)){
return false;
}
AlibabaCloud::accessKeyClient($config['accessKeyId'], $config['accessSecret'])
->regionId($config['regionId'])
->asGlobalClient();
$TemplateCode = isset($config['TemplateCode'][$template])?$config['TemplateCode'][$template]:$config['TemplateCode']['code'];
try {
$result = AlibabaCloud::rpcRequest()
->product('Dysmsapi')
->version('2017-05-25')
->action('SendSms')
->method('POST')
->options([
'query' => [
'PhoneNumbers' => $mobile,
'SignName' => $config['SignName'],
'TemplateCode' => $TemplateCode,
'TemplateParam' => json_encode($param)
],
])
->request();
if($result->Code=="OK"){
return true;
}else{
return false;
}
print_r($result->toArray());
} catch (ClientException $e) {
return false;
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
return false;
echo $e->getErrorMessage() . PHP_EOL;
}
}
}
3.新增配置文件
配置文件application\extra\alisms.php的内容如下
<?php
/*
阿里云短信发送配置文件
*/
return [
//短信签名
"SignName"=> "XXX",
//阿里云keyid
"accessKeyId"=>"XXXXXX",
//阿里云密钥
"accessSecret"=>"XXXXXXXXX",
//短信发送地
'regionId' => 'cn-hangzhou',
//短信模板编码
"TemplateCode"=>[
//验证码使用模板
'code'=>"XXXXXXX",
],
];
4.增加Hook触发绑定
查看官方文档可以用Hook的自带方法增加,不过本人比较懒,就直接加在了application\tags.php下,大概这样
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 应用行为扩展定义文件
return [
// 应用初始化
'app_init' => [
],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [
],
// 插件开始
'addon_begin' => [
],
// 操作开始执行
'action_begin' => [],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [],
//自定义发送短信
'sms_send' =>[
'app\\api\\hook\\Sms'
],
//自定义短信验证
'sms_check' =>[
],
];
这样的话,只要在需要的地方加入
Hook::listen('sms_send', $sms, null, true);
就会自动执行到绑定的方法中,具体的执行逻辑和细节问题可以多多参考官方文档。
后续的check,notice等其他方法各位可以自行编写,大概方法就是这样,
tp5.0官方手册