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);//执行发送

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

总结

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

相关推荐
Marktowin1 小时前
Mybatis-Plus更新操作时的一个坑
java·后端
赵文宇1 小时前
CNCF Dragonfly 毕业啦!基于P2P的镜像和文件分发系统快速入门,在线体验
后端
程序员爱钓鱼1 小时前
Node.js 编程实战:即时聊天应用 —— WebSocket 实现实时通信
前端·后端·node.js
Libby博仙2 小时前
Spring Boot 条件化注解深度解析
java·spring boot·后端
源代码•宸2 小时前
Golang原理剖析(Map 源码梳理)
经验分享·后端·算法·leetcode·golang·map
小周在成长3 小时前
动态SQL与MyBatis动态SQL最佳实践
后端
瓦尔登湖懒羊羊3 小时前
TCP的自我介绍
后端
小周在成长3 小时前
MyBatis 动态SQL学习
后端
子非鱼9213 小时前
SpringBoot快速上手
java·spring boot·后端
我爱娃哈哈3 小时前
SpringBoot + XXL-JOB + Quartz:任务调度双引擎选型与高可用调度平台搭建
java·spring boot·后端