PHP调用天翼开放平台短信接口实现验证码发送

Chloe
Chloe
发布时间:2026-10-14 | 1人浏览过
原创

在PHP应用中集成电信运营商的短信服务,通常需要通过开放平台API获取鉴权并触发发送。本文以天翼开放平台为例,演示如何使用cURL获取Access Token、构建HMAC签名请求、获取临时Token并发送验证码。

结果与目标

通过PHP脚本完成以下操作:

  1. 向OAuth服务器申请有效的 access_token。
  2. 根据参数排序和密钥生成 HMAC-SHA1 签名。
  3. 调用接口获取用于发送短信的临时 token。
  4. 使用上述凭证下发随机验证码至指定手机号。

准备条件

  • 环境要求: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}&timestamp={$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&timestamp={$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. 每日发送限额限制,建议增加频次控制。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表