thinkPHP6如何接通阿里云短信服务?

概述

短信发送是我们开发中都会用到的,发送验证码、通知类消息之类的都需要短信服务。市场上的短信服务有很多,像容联云、乐讯通、创蓝、未来无限等。由于公司大部分业务都使用的阿里云资源,所以我这里就以阿里云短信服务来说。

短信服务

  • 进入阿里云控制台,开通短信服务,按照流程添加签名、模板即可;这个根据自己的需求来定,如有不懂的可以咨询阿里的客服。
  • 开通完成后,我们要拿到的有以下三个参数:
  1. AccessKey ID
  2. AccessKey Secret
  3. templateCode

其中AccessKey IDAccessKey Secret 是您访问阿里云 API 的密钥,具有该账户完全的权限,在阿里云账号开通就应该有了,自己可以拿到的;至于templateCode,是我们上面添加签名、添加自己的短信模版时生成的模版CODE

  • 拿到上面的那些参数后,我们就可以开启编辑代码之旅了。

发送短信的实现

  1. 安装阿里云提供的SDK,我们直接在thinkphp中的composer.json中的require中添加"alibabacloud/dysmsapi-20170525": "2.0.15",这个,然后执行composer update就可以成功安装了。如果项目根目录有composer.lock文件,先删掉在执行更新,否则不会更新成功。当然也可以直接用composer require进行安装。
  2. 在扩展类目录(extend目录)中定义一个AlibabaCloud类,里面用到的AccessKey IDAccessKey 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;
    }
}
  1. 我们要在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);//执行发送

这样我们的短信发送基本功能就能实现了,记得在业务代码中记录下发送日志、接口返回日志哦,养成记录日志的好习惯有助于后面的问题排查。

总结

短信服务应用非常广泛,不同服务商用法可能不一样,但基本上都是大同小异,我们在选择时首先考虑的就是费用问题,技术开发之类的都不是很难,因此需要从成本方面考虑,根据自己公司的情况决定吧,希望能够帮到你。

相关推荐
Gy-1-__5 分钟前
【springcloud】快速搭建一套分布式服务springcloudalibaba(一)
后端·spring·spring cloud
硬件人某某某13 分钟前
基于Django的手办交易平台~源码
后端·python·django
闲猫6 小时前
go orm GORM
开发语言·后端·golang
丁卯4046 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
bing_15810 小时前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式
天上掉下来个程小白10 小时前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
Asthenia041211 小时前
基于Jackson注解的JSON工具封装与Redis集成实战
后端
编程星空11 小时前
css主题色修改后会多出一个css吗?css怎么定义变量?
开发语言·后端·rust
程序员侠客行12 小时前
Spring事务原理 二
java·后端·spring
dmy12 小时前
docker 快速构建开发环境
后端·docker·容器