概述
短信发送是我们开发中都会用到的,发送验证码、通知类消息之类的都需要短信服务。市场上的短信服务有很多,像容联云、乐讯通、创蓝、未来无限等。由于公司大部分业务都使用的阿里云资源,所以我这里就以阿里云短信服务来说。
短信服务
- 进入阿里云控制台,开通短信服务,按照流程添加签名、模板即可;这个根据自己的需求来定,如有不懂的可以咨询阿里的客服。
- 开通完成后,我们要拿到的有以下三个参数:
AccessKey ID
AccessKey Secret
templateCode
其中AccessKey ID
和 AccessKey Secret
是您访问阿里云 API 的密钥,具有该账户完全的权限,在阿里云账号开通就应该有了,自己可以拿到的;至于templateCode
,是我们上面添加签名、添加自己的短信模版时生成的模版CODE
- 拿到上面的那些参数后,我们就可以开启编辑代码之旅了。
发送短信的实现
- 安装阿里云提供的SDK,我们直接在thinkphp中的composer.json中的
require
中添加"alibabacloud/dysmsapi-20170525": "2.0.15",
这个,然后执行composer update
就可以成功安装了。如果项目根目录有composer.lock
文件,先删掉在执行更新,否则不会更新成功。当然也可以直接用composer require
进行安装。 - 在扩展类目录(extend目录)中定义一个
AlibabaCloud
类,里面用到的AccessKey ID
和AccessKey Secret
你可以定义在env配置中。类的具体代码如下(仅供参考,可以自己完善下):
php
<?php
declare(strict_types=1);
// This file is auto-generated, don't edit it. Thanks.
namespace AlibabaCloud;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
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;
use think\facade\Env;
class AlibabaCloud {
/**
* 使用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);
}
/**
* @param array $params
* @return void
*/
public static function sendSms($params){
$accessKeyId=Env::get('map.accessKeyId','你的AccessKey ID');
$accessKeySecret=Env::get('map.accessKeySecret','你的AccessKey Secret');
$client = self::createClient( $accessKeyId, $accessKeySecret);
$sendSmsRequest = new SendSmsRequest($params);
$runtime = new RuntimeOptions([]);
$res=$client->sendSmsWithOptions($sendSmsRequest, $runtime);
return $res;
}
}
- 我们要在
app\common.php
公共函数文件中定义一个公共函数,以便于项目中多处调用:
php
/**
*发送阿里云短信
*/
function sendAliyunSms($phone, $code)
{
$params = [
"signName" => "你的短信签名-即短信内容开头部分",
"templateCode" => "你的短信模版CODE",
"phoneNumbers" => $phone,
"templateParam" => json_encode(['code' => $code])
];
$res = \alibabaCloud\AlibabaCloud::sendSms($params);
$reponse = get_object_vars($res->body);
return $reponse;
}
这样我们的发送短信基本完成了,剩下的就是调用该公共函数,下面是使用示例:
ini
$code = rand(1000, 9999);
$data = array(
'phone' => 1xxxxxxxxxx,#手机号
'code' => $code #短信内容
);
sendAliyunSms($phone, $code);//执行发送
这样我们的短信发送基本功能就能实现了,记得在业务代码中记录下发送日志、接口返回日志哦,养成记录日志的好习惯有助于后面的问题排查。
总结
短信服务应用非常广泛,不同服务商用法可能不一样,但基本上都是大同小异,我们在选择时首先考虑的就是费用问题,技术开发之类的都不是很难,因此需要从成本方面考虑,根据自己公司的情况决定吧,希望能够帮到你。