1 方式1-独立包
以thinkphp5为例
1.1 下载包
链接:https://pan.baidu.com/s/1qzESG1-J6OzlIXfbByVbyQ
提取码:k477
1.2 引入
1.使用前要确保
- 有阿里云账号
- 在阿里云上开通短信服务,给账号充值就行。按短信量自动扣费
- 创建子账户AccessKeyId和AccessKeySecret(只在创建时显示),同时,要赋予权限。在不使用时,直接删除子账号。
2.把解压后的alisms放于extend中,同时,可以在extend中创建SmsCode类封装发送短信的方法
use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
class SmsCode
{
function send_sms($to, $model, $code)
{
require_once '../extend/alisms/vendor/autoload.php';
Config::load(); //加载区域结点配置
$config = '根据你的实际情况读取配置文件或读取数据库,本项目是将配置写入数据库实现';
$accessKeyId = '你自己的';
$accessKeySecret = '你自己的';
$templateParam = $code; //验证码,注意传过来的需要是数组如 { ‘code’=> '123456' }
//短信签名
$signName = '你的签名名称';
//短信模板ID
switch ($model) {
case 1:
$templateCode = '你的模板'; // 注册登录短信验证码模板
break;
case 2:
//你可能有多个模板,所以
$templateCode = $config['model_code_reset']; // 重置密码短信验证码模板
break;
}
//短信API产品名(短信产品名固定,无需修改)
$product = "Dysmsapi";
//短信API产品域名(接口地址固定,无需修改)
$domain = "dysmsapi.aliyuncs.com";
//暂时不支持多Region(目前仅支持cn-hangzhou请勿修改)
$region = "cn-hangzhou";
// 初始化用户Profile实例
$profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
// 增加服务结点
DefaultProfile::addEndpoint("cn-hangzhou", "cn-hangzhou", $product, $domain);
// 初始化AcsClient用于发起请求
$acsClient = new DefaultAcsClient($profile);
// 初始化SendSmsRequest实例用于设置发送短信的参数
$request = new SendSmsRequest();
// 必填,设置雉短信接收号码
$request->setPhoneNumbers($to);
// 必填,设置签名名称
$request->setSignName($signName);
// 必填,设置模板CODE
$request->setTemplateCode($templateCode);
// 可选,设置模板参数
if ($templateParam) {
dump(json_encode($templateParam));
$request->setTemplateParam(json_encode($templateParam));
}
//发起访问请求
$acsResponse = $acsClient->getAcsResponse($request);
//返回请求结果
$result = json_decode(json_encode($acsResponse), true);
// 具体返回值参考文档:https://help.aliyun.com/document_detail/55451.html?spm=a2c4g.11186623.6.563.YSe8FK
return $result;
}
}
3.使用实例
namespace app\index\controller;
use think\Controller;
class Sendcode extends Controller
{
public function send()
{
//一定得是数组形式,json编码时针对值;数组形式才能让其带有标识
$code =array('code'=>rand(100000, 999999));
$phone = '电话';
$dx = new \SmsCode();
//第一个参数电话,第二个参数判断使用那种短信模板,第三个参数数组形式验证码,因为阿里云模板中设定了验证码参数
$result = $dx->send_sms($phone, 1, $code);
dump($result);
}
}
4.结果
1.3 注意
1.代码注意
这里老是错误呢!!
2.普及
- extend是放置自定义或者其他类文件的(由此就可能没有命名空间)。
- vendor目录是放置composer类库文件的。
- 实现不用命名空间来加载第三方的类!
我们将类文件放到extend目录下,在控制器中要用到类的话可以通过import(),函数手动引入类文件,引入方法官方手册中有说明。
// 引入 extend/qrcode.php
Loader::import('qrcode', EXTEND_PATH);
// 助手函数
import('qrcode', EXTEND_PATH);
// 引入 extend/wechat-sdk/wechat.class.php
Loader::import('wechat-sdk.wechat', EXTEND_PATH,'.class.php');
// 助手函数
import('wechat-sdk.wechat', EXTEND_PATH,'.class.php');
- 手动引入了类文件后,进行实例化需要特别注意了!
我们需要在 new 类文件()时,在类文件前面加一个 “ \ ” ,即如下:
$obj = new \Test();
加 ‘\’ 的原因是: tp5的命名空间自动加载规则:自动加载的实现由
think\Loader类库完成,自动加载规范符合PHP的。 - 根据对规则的了解,放在extend目录下 没有定义命名空间的类文件,就是全局化的类 。实例化全局化的类的话,即用""放在类名前表示此类是全局类,就new一个全局化的类!
- vender()默认的文件夹是vender
2 方式2-composer
2.1 引入
composer require alibabacloud/sdk
2.2 使用
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
class SendSms
{
/**
* 发送短信验证码
*/
//config要传入accessKeyId和accessSecret和SignName和TemplateCode
public function sendCode($config,$phone,$code)
{
//这里传验证码,注意,此处帮我们组成数组了,所以,只穿码就行
$param = [
'code' => $code
];
//accessKeyId和accessSecret是阿里云上创建子账户
//regionId是地区编号,如值:cn-hangzhou
AlibabaCloud::accessKeyClient($config['accessKeyId'], $config['accessSecret'])
->regionId($config['regionId'])
->asGlobalClient();
try {
$result = AlibabaCloud::rpcRequest()
->product('Dysmsapi')
->version('2017-05-25')
->action('SendSms')
->method('POST')
->options([
'query' => [
'PhoneNumbers' => $phone,
'SignName' => $config['SignName'],
'TemplateCode' => $config['TemplateCode'],
'TemplateParam' => json_encode($param)
],
])
->request();
return $result->toArray();
} catch (ClientException $e) {
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
echo $e->getErrorMessage() . PHP_EOL;
}
}
}