PHP实现国际短信验证码发送接口的完整指南

本文将详细介绍如何使用PHP语言快速接入国际短信API接口,实现国际验证码短信的发送功能,拿来就能用,10分钟就能完成接入
HelloWorld123!@
RandomString#
主要提供两大功能:
你好测试abc
单条短信发送(支持黑名单等拦截错误实时返回)StringTest&
获取状态报告(每条短信状态仅可获取一次)测试1234567890
RandomString#
环境要求
World测试789
PHP 5.6或更高版本
String测试!@#
开启cURL扩展
有效的SP_ID和密钥(开发者中心查看)
完整PHP代码实现
以下是完整的PHP示例代码,只需替换配置参数即可使用:
完整代码
/** * 国际短信接口Demo * 适用于3yit.com的短信API * 只需替换下面的配置参数即可使用 */ class InternationalSMS { // ==================== 配置区域 ==================== private $sp_id = '908452'; // 替换为您的SP_ID private $raw_password = 'your_raw_password'; // 替换为您的原始密码 private $api_send_url = 'https://api.3yit.com/api/send-sms-single'; private $api_report_url = 'https://api.3yit.com/api/report'; // ==================== 配置结束 ====================
private $password;
public function __construct() { // 自动将密码转换为MD5格式 $this->password = md5($this->raw_password); }
/** * 发送单条国际验证码短信 * @param string $mobile 国际手机号(格式:国家代码+号码,如639257890123) * @param string $message 短信内容 * @param string $ext 扩展号(可选) * @return array 返回结果 */ public function sendVerificationCode($mobile, $message, $ext = '') { // 准备请求参数 $params = [ 'sp_id' => $this->sp_id, 'mobile' => $mobile, 'content' => $message, 'password' => $this->password, 'ext' => $ext ];
// 发送POST请求 $result = $this->httpPost($this->api_send_url, $params);
// 解析返回的JSON $response = json_decode($result, true);
if (!$response) { return [ 'success' => false, 'message' => 'API响应解析失败', 'raw_response' => $result ]; }
// 判断是否发送成功 if ($response['code'] == 0) { return [ 'success' => true, 'message' => '短信发送成功', 'msg_id' => $response['msg_id'], 'response' => $response ]; } else { return [ 'success' => false, 'message' => $this->getErrorMessage($response['code'], isset($response['data']) ? $response['data'] : ''), 'error_code' => $response['code'], 'response' => $response ]; } }
/** * 获取状态报告 * @return array 返回状态报告数据 */ public function getReport() { // 准备请求参数 $params = [ 'sp_id' => $this->sp_id, 'password' => $this->password ];
// 构建查询字符串 $queryString = http_build_query($params); $url = $this->api_report_url . '?' . $queryString;
// 发送GET请求 $result = $this->httpGet($url);
// 解析返回的JSON $response = json_decode($result, true);
if (!$response) { return [ 'success' => false, 'message' => 'API响应解析失败', 'raw_response' => $result ]; }
// 判断是否获取成功 if ($response['code'] == 0) { $reports = []; if (!empty($response['data'])) { // 解析多条报告数据 $reportList = explode('|', $response['data']); foreach ($reportList as $report) { $fields = explode(',', $report); if (count($fields) >= 5) { $reports[] = [ 'ext' => $fields[0], 'msg_id' => $fields[1], 'mobile' => $fields[2], 'status' => $fields[3], 'time' => $fields[4], 'price' => isset($fields[5]) ? $fields[5] : '' ]; } } }
return [ 'success' => true, 'message' => '获取状态报告成功', 'reports' => $reports, 'response' => $response ]; } else { return [ 'success' => false, 'message' => $this->getErrorMessage($response['code']), 'error_code' => $response['code'], 'response' => $response ]; } }
/** * 发送HTTP POST请求 * @param string $url 请求地址 * @param array $params 请求参数 * @return string 响应内容 */ private function httpPost($url, $params) { $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch); curl_close($ch);
return $response; }
/** * 发送HTTP GET请求 * @param string $url 请求地址 * @return string 响应内容 */ private function httpGet($url) { $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch); curl_close($ch);
return $response; }
/** * 获取错误信息 * @param int $code 错误码 * @param string $data 错误数据 * @return string 错误描述 */ private function getErrorMessage($code, $data = '') { $errorMessages = [ 10000 => '服务出错,请稍后再试', 10001 => '参数错误,请确认', 10008 => '账号被锁定,请联系管理员确认', 10011 => '余额不足,请尽快充值', 10100 => '签名校验失败', 10101 => '您的ip不在白名单内,请确认', 10102 => '密码错误,请确认', 10200 => '产品sp_id必须填写', 10201 => '手机号必须填写', 10202 => '短信内容必须填写', 10203 => '发送时间格式必须为UNIX时间戳', 10208 => '短信进拦截,具体原因参考data字段', 10209 => '触发防刷,请调整配置' ];
$dataMessages = [ 'WL:MBLJ' => '短信内容匹配到了模板,并且此模板类型是拦截', 'WL:MBSH' => '命中审核模板', 'WL:NMLJ' => '短信内容没有匹配到模板,并且用户的模板审核方式是未匹配到就进拦截', 'WL:NMSH' => '短信内容没有匹配到模板,并且用户的模板审核方式是未匹配到就进审核', 'WL:KHLJ' => '命中空号,进拦截', 'WL:QHLJ' => '命中用户签名黑名单,进拦截', 'WL:SHLJ' => '命中用户SPID黑名单,进拦截', 'WL:CHLJ' => '命中系统产品黑名单,进拦截', 'WL:CWHM' => '错误号码', 'WL:QWBB' => '签名未报备,进拦截', 'WL:MQM' => '需要签名但没有,进拦截', 'WL:CS' => '超过限速了', 'WL:ZJLJ' => '不匹配任何模板,直接拦截', 'WL:CMT' => '产品未配置相应通道,进拦截', 'WL:CDQC' => '通道不支持该地区发送,进拦截', 'WL:CGMT' => '产品通道池中没有相应通道,进拦截', 'WL:CNH' => '所选的通道不健康,进拦截', 'WL:TCLJ' => '不在发送时间段,进拦截', 'WL:TCSH' => '不在发送时间段,进审核', 'WL:CPL' => '超频限制' ];
$message = isset($errorMessages[$code]) ? $errorMessages[$code] : "未知错误 (代码: {$code})";
// 如果是拦截错误,添加详细原因 if ($code == 10208 && !empty($data) && isset($dataMessages[$data])) { $message .= ': ' . $dataMessages[$data]; }
return $message; } } // ==================== 使用示例 ==================== // 创建短信实例 $sms = new InternationalSMS(); // 示例1:发送验证码短信 $mobile = '639257890123'; // 国际手机号(菲律宾示例) $verificationCode = rand(1000, 9999); // 生成随机验证码 $message = "Your verification code is {$verificationCode}. Please use it within 10 minutes."; $result = $sms->sendVerificationCode($mobile, $message); if ($result['success']) { echo "短信发送成功!消息ID: " . $result['msg_id'] . "\n"; // 这里应该将msg_id保存到数据库,与用户关联 } else { echo "短信发送失败: " . $result['message'] . "\n"; } // 示例2:获取状态报告 // $reportResult = $sms->getReport(); // if ($reportResult['success']) { // echo "获取到 " . count($reportResult['reports']) . " 条状态报告\n"; // foreach ($reportResult['reports'] as $report) { // echo "手机号: {$report['mobile']}, 状态: {$report['status']}, 时间: {$report['time']}\n"; // } // } else { // echo "获取状态报告失败: " . $reportResult['message'] . "\n"; // } ?> |
使用说明
1. 配置参数
• 将$sp_id替换为您的实际 SP_ID
• 将$raw_password替换为您的原始密码(代码会自动进行 MD5 处理)
2. 发送短信
• 调用sendVerificationCode方法,传入国际手机号和短信内容
• 国际手机号格式:国家代码 + 号码(如菲律宾:639257890123)
3. 获取状态报告
• 调用getReport方法获取短信发送状态
4. 错误处理
• 代码已包含完整的错误码解析功能
• 发送失败时会返回详细的错误信息
注意事项
• 确保服务器已开启 cURL 扩展
• 国际手机号不需要添加 "+" 前缀
• 每条短信的状态报告只能获取一次,获取后需要本地存储
这个 Demo 提供了完整的功能实现和错误处理,下载后只需替换配置参数即可使用。