180行代码实现全球短信发送功能(无SKD依赖)

本文提供的代码不依赖官方SDK,为方便读者理解,文章中提供的代码片段包含详细的注释。完整功能代码见文末,删减冗余注释和空行后不足180行。

应用背景

在开发一款跨境电商APP时,产品要求使用短信验证手机号的真实性,开发团队无脑选择了一直在用的腾讯云作为服务商。基于合规要求,分别申请了国内和国际短信签名及模板;这导致发送短信时需要根据国内和国际号码选择对应的签名及模板,才能确保正确下发验证信息。

经PHP开发团队评审,一致认为腾讯云SDK需要导入的代码文件过多,影响项目的可读性和可维护性。于是,决定自己封装一个简单的SDK,以便于项目成员快速上手。

腾讯云短信概述

腾讯云短信(Short Message Service,SMS)沉淀腾讯十多年短信服务技术和经验,为 QQ、微信等亿级平台和10万+客户提供快速灵活接入的高质量的国内短信与国际/港澳台短信服务。

  • 国内短信验证秒级触达,99%到达率。
  • 国际/港澳台短信覆盖全球200+国家/地区,稳定可靠。

封装签名请求类

此基础类签名算法符合腾讯云APIv3规范,不仅适用于本文的短信发送类,也适用于其他腾讯云产品接口。可大大简化脱离官方SDK进行单一产品接口开发的难度。

构造短信发送类

基于less is more原则,该类仅封装了发送短信接口,初始化时应以数组形式传入secretIdsecretKeysdkAppIdsignNametemplateCode 等参数。

/**
 * 腾讯云短信类
 * @author rehiy
 * @url https://www.rehiy.com/post/527/
 */
class QCloudSms extends QCloudBasic
{
    /**
     * @var string
     */
    protected $service = 'sms';

    /**
     * @var string
     */
    protected $version = '2021-01-11';

    /**
     * @var string
     */
    protected $sdkAppId = '';

    /**
     * @var string 短信签名
     */
    protected $signName = '';

    /**
     * @var string 短信模板CODE
     */
    protected $templateCode = '';

    /**
     * 发送短信
     * @param array $phoneNumbers 必填项,手机号码列表
     * @param array $templateParam 假如模板中存在变量需要替换则为必填项
     * @param string $extendCode 可选项,7位上行短信扩展码
     * @param string $sessionContext 可选项,携带上下文信息,server 会原样返回
     */
    public function send($phoneNumbers, $templateParam, $extendCode = '', $sessionContext = '')
    {
        $data = [
            'PhoneNumberSet' => $phoneNumbers,
            'SmsSdkAppId' => $this->sdkAppId,
            'SignName' => $this->signName,
            'TemplateId' => $this->templateCode,
            'TemplateParamSet' => $templateParam,
        ];

        if ($extendCode) {
            $data['ExtendCode'] = $extendCode;
        }
        if ($sessionContext) {
            $data['SessionContext'] = $sessionContext;
        }

        return $this->post('ap-guangzhou', 'SendSms', $data);
    }
}

调用短信发送类

本节代码仅用于演示如何调用短信发送类发送短信,实际业务代码请根据项目需求编写。

  • 请根据前面步骤获取的参数替换伪配置变量$c_china$c_global的值
/**
 * 发送短信
 * @param string $phone 手机号码
 * @param string $code 验证码
 */
function send_sms($phone, $code)
{
    // 国内短信配置
    $c_china = [
        'secretId' => 'AK----------------------',
        'secretKey' => 'SK----------------------',
        'sdkAppId' => '1400000000',
        'signName' =>  '签名',
        'templateCode' => '123456',
    ];

    // 国际短信配置
    $c_global = [
        'secretId' => 'AK----------------------',
        'secretKey' => 'SK----------------------',
        'sdkAppId' => '1400000000',
        'signName' =>  '签名',
        'templateCode' => '654321',
    ];

    // 国内号码去除+86
    $phone = preg_replace('/^\+86(\d{11})$/', '$1', $phone);
    $config = strpos($phone, '+') === 0 ? $c_global : $c_china;

    // 发送短信并返回结果
    return (new QCloudSms($config))->send([$phone], [$code]);
}

// 发送国内短信
print_r(
    send_sms('+8613800000000', '123456')
);

// 发送国际短信
print_r(
    send_sms('+100000000000', '123456')
);

附录

文章作者: 若海; 原文链接: https://www.rehiy.com/post/527/; 转载需声明来自技术写真 - 若海

添加新评论