PHP项目如何对接短信通知接口?

wen PHP项目 59

本文目录导读:

PHP项目如何对接短信通知接口?

  1. 第一步:准备工作
  2. 第二步:安装SDK(推荐)
  3. 第三步:编写发送代码(核心)
  4. 第四步:处理异步通知(回执)
  5. 第五步:最佳实践与注意事项

在PHP项目中对接短信通知接口,通常遵循以下几个标准步骤,虽然不同短信服务商(如阿里云、腾讯云、七牛云、Twilio等)的API细节不同,但核心流程是一致的。

以下是详细的对接指南,包含代码示例(以阿里云短信服务为例):

第一步:准备工作

  1. 选择短信服务商
    • 国内:阿里云、腾讯云、华为云、七牛云、梦网科技。
    • 国际:Twilio、Vonage (Nexmo)。
  2. 注册与认证

    注册账号,完成企业/个人实名认证。

  3. 获取密钥
    • AccessKey IDAccessKey Secret(阿里云/腾讯云)。
    • Account SIDAuth Token(Twilio)。
  4. 申请签名和模板
    • 短信签名:你的公司名】,需要审核。
    • 短信模板:您的验证码是${code},5分钟内有效。”,需要审核。
    • 注意:测试阶段可能需要将接收号码加入“测试白名单”。

第二步:安装SDK(推荐)

不要手动写HTTP请求,使用服务商提供的SDK最安全、省事。

# 使用 Composer 安装阿里云短信 SDK
composer require alibabacloud/dysmsapi
# 或安装腾讯云短信 SDK
composer require tencentcloud/sms
# 或安装 Twilio SDK
composer require twilio/sdk

第三步:编写发送代码(核心)

示例1:阿里云短信

<?php
// 引入自动加载
require_once 'vendor/autoload.php';
// 引入阿里云 SDK 命名空间
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
/**
 * 发送短信
 *
 * @param string $phone       接收号码(如 13800138000)
 * @param string $code        验证码内容
 * @return array              发送结果
 */
function sendSms($phone, $code) {
    // 1. 配置全局客户端(建议在项目初始化时只配置一次)
    AlibabaCloud::accessKeyClient(
        '你的AccessKey ID',      // 从阿里云控制台获取
        '你的AccessKey Secret'   // 从阿里云控制台获取
    )->regionId('cn-hangzhou')   // 区域,国内一般都是cn-hangzhou
      ->asDefaultClient();
    try {
        // 2. 调用 SendSms 接口
        $result = AlibabaCloud::rpc()
            ->product('Dysmsapi')                 // 产品名称
            ->version('2017-05-25')               // API版本
            ->action('SendSms')                   // 接口名称
            ->method('POST')                      // 请求方式
            ->host('dysmsapi.aliyuncs.com')       // 服务地址
            ->options([
                'query' => [
                    'RegionId' => 'cn-hangzhou',
                    'PhoneNumbers' => $phone,                // 手机号
                    'SignName' => '【你的公司名】',             // 短信签名(审核通过的)
                    'TemplateCode' => 'SMS_123456789',       // 短信模板CODE(审核通过的)
                    'TemplateParam' => json_encode([         // 模板变量(必须是JSON字符串)
                        'code' => $code
                    ]),
                ],
            ])
            ->request();
        // 3. 解析返回结果
        $response = $result->toArray();
        return $response; // 返回的是数组
    } catch (ClientException $e) {
        // 客户端错误(如配置错误)
        return ['Code' => 'ERROR', 'Message' => $e->getErrorMessage()];
    } catch (ServerException $e) {
        // 服务端错误(如参数错误、触发限流)
        return ['Code' => 'ERROR', 'Message' => $e->getErrorMessage()];
    }
}
// ----- 调用示例 -----
$result = sendSms('13800138000', '123456');
if ($result['Code'] == 'OK') {
    echo "短信发送成功!";
} else {
    echo "发送失败:" . $result['Message'];
}

示例2:腾讯云短信(更简洁的写法)

<?php
require_once 'vendor/autoload.php';
use TencentCloud\Common\Credential;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Sms\V20210111\Models\SendSmsRequest;
use TencentCloud\Sms\V20210111\SmsClient;
function sendTencentSms($phone, $code) {
    try {
        // 1. 实例化认证对象
        $cred = new Credential("你的SecretId", "你的SecretKey");
        $client = new SmsClient($cred, "ap-guangzhou"); // 地域
        // 2. 实例化请求对象
        $req = new SendSmsRequest();
        $req->SmsSdkAppId = "你的应用ID"; // 在短信控制台应用管理里
        $req->SignName = "你的签名";
        $req->TemplateId = "模板ID";
        $req->TemplateParamSet = [$code]; // 模板参数列表(注意这里是数组,不是JSON)
        $req->PhoneNumberSet = ["+86".$phone]; // 需要带国际区号
        // 3. 发送请求
        $resp = $client->SendSms($req);
        return json_decode($resp->toJsonString(), true);
    } catch (TencentCloudSDKException $e) {
        return ['SendStatusSet' => [['Code' => 'ERROR', 'Message' => $e->getMessage()]]];
    }
}

第四步:处理异步通知(回执)

大部分短信服务商不会直接让你知道短信是否成功抵达用户手机,而是通过回调URL(也叫状态报告)通知你。

  • 为什么需要?帮助排查手机号是否有效、是否被运营商拦截。
  • 如何配置:在短信服务商的控制台设置一个回调地址,https://yourdomain.com/sms/callback
  • PHP接收示例
// 文件:sms_callback.php
$data = file_get_contents("php://input"); // 获取POST原始数据
$arr = json_decode($data, true);
// 验证签名(重要!防止伪造回调)
// 根据服务商文档验证签名
// 处理回调
foreach ($arr as $item) {
    $phone = $item['phone_number'];   // 手机号
    $status = $item['status'];        // 状态:DELIVERED(成功)或 UNDELIVERED(失败)
    $code = $item['err_code'];        // 失败错误码
    // 写入数据库:更新该条短信的发送状态
}
http_response_code(200); // 务必返回200,否则服务商会重试

第五步:最佳实践与注意事项

  1. 敏感信息保护AccessKey Secret 等敏感信息不要硬编码在PHP文件中,应使用环境变量(.env文件)或配置中心。

    // .env 文件
    SMS_ACCESS_KEY_ID=your_key
    SMS_ACCESS_KEY_SECRET=your_secret
    // PHP 读取
    $key = getenv('SMS_ACCESS_KEY_ID');
  2. 日志记录:每次发送短信,无论成功失败,都记录日志(手机号、发送时间、内容、返回码、IP地址)。

  3. 频率限制

    • 服务商限制:例如单号每天最多10条,每分钟1条。
    • 业务限制:防止用户恶意刷短信,建议加上验证码(60秒后才能再次获取)。
  4. 错误码处理:不要只判断“成功”,要处理常见的错误码:

    • isv.BUSINESS_LIMIT_CONTROL:触发业务限流(频率太快)。
    • isv.MOBILE_NUMBER_ILLEGAL:手机号格式错误。
    • SignatureDoesNotMatch:密钥错误或签名不正确。
  5. 测试环境:使用服务商提供的测试模板白名单号码,避免产生真实费用。

步骤 核心操作 关键文件/代码
准备 获取密钥、申请签名和模板 服务商控制台
安装 composer require ... composer.json
发送 配置客户端,调用API发送 调用函数
回调 配置回调URL,处理状态报告 回调接口文件
优化 使用.env,处理频率限制,写日志 日志中间件,限流逻辑

按照这个流程,你就可以在自己的PHP项目中快速、稳定地对接短信通知接口了。

抱歉,评论功能暂时关闭!