PHP调用天翼开放平台短信接口实现验证码发送
在PHP应用中集成电信运营商的短信服务,通常需要通过开放平台API获取鉴权并触发发送。本文以天翼开放平台为例,演示如何使用cURL获取Access Token、构建HMAC签名请求、获取临时Token并发送验证码。
结果与目标
通过PHP脚本完成以下操作:
- 向OAuth服务器申请有效的
access_token。 - 根据参数排序和密钥生成
HMAC-SHA1签名。 - 调用接口获取用于发送短信的临时
token。 - 使用上述凭证下发随机验证码至指定手机号。
准备条件
- 环境要求:PHP运行环境(建议7.0+),需启用
curl扩展。 - 天翼开放平台账号:拥有合法的
app_id和app_secret。 - 网络权限:服务器可访问
https://oauth.api.189.cn及http://api.189.cn(注意接口协议差异)。 - 备份提醒:生产环境中请勿硬编码密钥,建议使用环境变量管理
app_secret。
真实操作顺序
第1步:配置基础环境与时区
确保时间同步,避免签名因时间戳偏差被拒。
<?php
date_default_timezone_set('PRC'); // 设置中国标准时区
// 实际使用时应从配置文件或环境变量读取,此处仅示意
$app_id = 'your_app_id';
$app_secret = 'your_app_secret';
?
第2步:获取 Access Token
向天翼 OAuth2 服务端提交应用凭证,获取后续接口的鉴权令牌。
$data = "app_id={$app_id}&app_secret={$app_secret}&grant_type=client_credentials";
$ch = curl_init("https://oauth.api.189.cn/emp/oauth2/v2/access_token");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// 测试环境下禁用SSL验证,生产环境请确保证书有效
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
$token_data = json_decode($response, true);
if (!$token_data || !isset($token_data['access_token'])) {
die('Failed to get access token');
}
$access_token = $token_data['access_token'];
第3步:生成随机验证码 Token
根据天翼接口要求,需对请求参数进行字典序排序,拼接后使用 app_secret 计算 HMAC-SHA1 签名。
$timestamp = date('Y-m-d H:i:s');
// 构建待签名字符串的参数数组
$params = [
'app_id' => "app_id={$app_id}",
'access_token' => "access_token={$access_token}",
'timestamp' => "timestamp={$timestamp}"
];
krsort($params); // 注意:原逻辑使用ksort升序,但通常API签名需按特定规则(如ASCII升序),此处保留原意
$plaintext = implode('&', $params);
// 计算签名: HMAC-SHA1 -> Base64 -> URL Encode
$sign = rawurlencode(base64_encode(hash_hmac('sha1', $plaintext, $app_secret, true)));
// 请求获取随机码Token
$url = "http://api.189.cn/v2/dm/randcode/token?app_id={$app_id}&access_token={$access_token}×tamp={$timestamp}&sign={$sign}";
$code_resp = file_get_contents($url);
$code_data = json_decode($code_resp, true);
$sms_token = $code_data['token'];
第4步:下发验证码短信
使用上一步获得的 sms_token 及签名,向指定手机发送验证码。
// 构建下发短信参数
$params_send = [
'app_id' => "app_id={$app_id}",
'access_token' => "access_token={$access_token}",
'token' => "token={$sms_token}",
'phone' => '15091421612', // 替换为目标手机号
'url' => 'http://example.com/callback.php', // 状态回调地址
'exp_time' => '2', // 有效期分钟数
'timestamp' => "timestamp={$timestamp}"
];
krsort($params_send);
$plaintext_send = implode('&', $params_send);
$sign_send = rawurlencode(base64_encode(hash_hmac('sha1', $plaintext_send, $app_secret, true)));
$data_send = "app_id={$app_id}&access_token={$access_token}&token={$sms_token}&phone=15091421612&url=http://example.com/callback.php&exp_time=2×tamp={$timestamp}&sign={$sign_send}";
$ch_send = curl_init("http://api.189.cn/v2/dm/randcode/send");
curl_setopt($ch_send, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_send, CURLOPT_POST, true);
curl_setopt($ch_send, CURLOPT_POSTFIELDS, $data_send);
curl_setopt($ch_send, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch_send, CURLOPT_SSL_VERIFYHOST, false);
$state = curl_exec($ch_send);
curl_close($ch_send);
echo $state; // 输出发送结果JSON
完成判断
检查 $state 的输出内容。若返回包含成功标识的 JSON(如 status=0 或类似成功字段),且用户手机收到验证码,则接口调用成功。若返回错误信息,请检查 sign 签名是否正确、access_token 是否过期或余额不足。
简要总结
本示例展示了PHP对接天翼开放平台短信接口的核心链路:OAuth鉴权 → 参数签名 → Token获取 → 短信下发。实际项目中请注意:
1. app_secret 的安全存储与脱敏。
2. 每日发送限额限制,建议增加频次控制。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









