本文目录导读:

在PHP项目中对接短信通知接口,通常遵循以下几个标准步骤,虽然不同短信服务商(如阿里云、腾讯云、七牛云、Twilio等)的API细节不同,但核心流程是一致的。
以下是详细的对接指南,包含代码示例(以阿里云短信服务为例):
第一步:准备工作
- 选择短信服务商:
- 国内:阿里云、腾讯云、华为云、七牛云、梦网科技。
- 国际:Twilio、Vonage (Nexmo)。
- 注册与认证:
注册账号,完成企业/个人实名认证。
- 获取密钥:
- AccessKey ID 和 AccessKey Secret(阿里云/腾讯云)。
- 或 Account SID 和 Auth Token(Twilio)。
- 申请签名和模板:
- 短信签名:你的公司名】,需要审核。
- 短信模板:您的验证码是${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,否则服务商会重试
第五步:最佳实践与注意事项
-
敏感信息保护:
AccessKey Secret等敏感信息不要硬编码在PHP文件中,应使用环境变量(.env文件)或配置中心。// .env 文件 SMS_ACCESS_KEY_ID=your_key SMS_ACCESS_KEY_SECRET=your_secret // PHP 读取 $key = getenv('SMS_ACCESS_KEY_ID'); -
日志记录:每次发送短信,无论成功失败,都记录日志(手机号、发送时间、内容、返回码、IP地址)。
-
频率限制:
- 服务商限制:例如单号每天最多10条,每分钟1条。
- 业务限制:防止用户恶意刷短信,建议加上验证码(60秒后才能再次获取)。
-
错误码处理:不要只判断“成功”,要处理常见的错误码:
isv.BUSINESS_LIMIT_CONTROL:触发业务限流(频率太快)。isv.MOBILE_NUMBER_ILLEGAL:手机号格式错误。SignatureDoesNotMatch:密钥错误或签名不正确。
-
测试环境:使用服务商提供的测试模板或白名单号码,避免产生真实费用。
| 步骤 | 核心操作 | 关键文件/代码 |
|---|---|---|
| 准备 | 获取密钥、申请签名和模板 | 服务商控制台 |
| 安装 | composer require ... |
composer.json |
| 发送 | 配置客户端,调用API发送 | 调用函数 |
| 回调 | 配置回调URL,处理状态报告 | 回调接口文件 |
| 优化 | 使用.env,处理频率限制,写日志 | 日志中间件,限流逻辑 |
按照这个流程,你就可以在自己的PHP项目中快速、稳定地对接短信通知接口了。