本文將詳細(xì)介紹如何使用 PHP 語言快速接入國際短信 API 接口,實(shí)現(xiàn)國際驗(yàn)證碼短信的發(fā)送功能,拿來就能用,10 分鐘就能完成接入
以下是完整的 PHP 示例代碼,只需替換配置參數(shù)即可使用:
<?php
/**
* 國際短信接口Demo
* 適用于3yit.com的短信API
* 只需替換下面的配置參數(shù)即可使用
*/
class InternationalSMS {
// ==================== 配置區(qū)域 ====================
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';
// ==================== 配置結(jié)束 ====================
private $password;
public function __construct() {
// 自動將密碼轉(zhuǎn)換為MD5格式
$this->password = md5($this->raw_password);
}
/**
* 發(fā)送單條國際驗(yàn)證碼短信
* @param string $mobile 國際手機(jī)號(格式:國家代碼+號碼,如639257890123)
* @param string $message 短信內(nèi)容
* @param string $ext 擴(kuò)展號(可選)
* @return array 返回結(jié)果
*/
public function sendVerificationCode($mobile, $message, $ext = '') {
// 準(zhǔn)備請求參數(shù)
$params = [
'sp_id' => $this->sp_id,
'mobile' => $mobile,
'content' => $message,
'password' => $this->password,
'ext' => $ext
];
// 發(fā)送POST請求
$result = $this->httpPost($this->api_send_url, $params);
// 解析返回的JSON
$response = json_decode($result, true);
if (!$response) {
return [
'success' => false,
'message' => 'API響應(yīng)解析失敗',
'raw_response' => $result
];
}
// 判斷是否發(fā)送成功
if ($response['code'] == 0) {
return [
'success' => true,
'message' => '短信發(fā)送成功',
'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
];
}
}
/**
* 獲取狀態(tài)報(bào)告
* @return array 返回狀態(tài)報(bào)告數(shù)據(jù)
*/
public function getReport() {
// 準(zhǔn)備請求參數(shù)
$params = [
'sp_id' => $this->sp_id,
'password' => $this->password
];
// 構(gòu)建查詢字符串
$queryString = http_build_query($params);
$url = $this->api_report_url . '?' . $queryString;
// 發(fā)送GET請求
$result = $this->httpGet($url);
// 解析返回的JSON
$response = json_decode($result, true);
if (!$response) {
return [
'success' => false,
'message' => 'API響應(yīng)解析失敗',
'raw_response' => $result
];
}
// 判斷是否獲取成功
if ($response['code'] == 0) {
$reports = [];
if (!empty($response['data'])) {
// 解析多條報(bào)告數(shù)據(jù)
$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' => '獲取狀態(tài)報(bào)告成功',
'reports' => $reports,
'response' => $response
];
} else {
return [
'success' => false,
'message' => $this->getErrorMessage($response['code']),
'error_code' => $response['code'],
'response' => $response
];
}
}
/**
* 發(fā)送HTTP POST請求
* @param string $url 請求地址
* @param array $params 請求參數(shù)
* @return string 響應(yīng)內(nèi)容
*/
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;
}
/**
* 發(fā)送HTTP GET請求
* @param string $url 請求地址
* @return string 響應(yīng)內(nèi)容
*/
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;
}
/**
* 獲取錯(cuò)誤信息
* @param int $code 錯(cuò)誤碼
* @param string $data 錯(cuò)誤數(shù)據(jù)
* @return string 錯(cuò)誤描述
*/
private function getErrorMessage($code, $data = '') {
$errorMessages = [
10000 => '服務(wù)出錯(cuò),請稍后再試',
10001 => '參數(shù)錯(cuò)誤,請確認(rèn)',
10008 => '賬號被鎖定,請聯(lián)系管理員確認(rèn)',
10011 => '余額不足,請盡快充值',
10100 => '簽名校驗(yàn)失敗',
10101 => '您的ip不在白名單內(nèi),請確認(rèn)',
10102 => '密碼錯(cuò)誤,請確認(rèn)',
10200 => '產(chǎn)品sp_id必須填寫',
10201 => '手機(jī)號必須填寫',
10202 => '短信內(nèi)容必須填寫',
10203 => '發(fā)送時(shí)間格式必須為UNIX時(shí)間戳',
10208 => '短信進(jìn)攔截,具體原因參考data字段',
10209 => '觸發(fā)防刷,請調(diào)整配置'
];
$dataMessages = [
'WL:MBLJ' => '短信內(nèi)容匹配到了模板,并且此模板類型是攔截',
'WL:MBSH' => '命中審核模板',
'WL:NMLJ' => '短信內(nèi)容沒有匹配到模板,并且用戶的模板審核方式是未匹配到就進(jìn)攔截',
'WL:NMSH' => '短信內(nèi)容沒有匹配到模板,并且用戶的模板審核方式是未匹配到就進(jìn)審核',
'WL:KHLJ' => '命中空號,進(jìn)攔截',
'WL:QHLJ' => '命中用戶簽名黑名單,進(jìn)攔截',
'WL:SHLJ' => '命中用戶SPID黑名單,進(jìn)攔截',
'WL:CHLJ' => '命中系統(tǒng)產(chǎn)品黑名單,進(jìn)攔截',
'WL:CWHM' => '錯(cuò)誤號碼',
'WL:QWBB' => '簽名未報(bào)備,進(jìn)攔截',
'WL:MQM' => '需要簽名但沒有,進(jìn)攔截',
'WL:CS' => '超過限速了',
'WL:ZJLJ' => '不匹配任何模板,直接攔截',
'WL:CMT' => '產(chǎn)品未配置相應(yīng)通道,進(jìn)攔截',
'WL:CDQC' => '通道不支持該地區(qū)發(fā)送,進(jìn)攔截',
'WL:CGMT' => '產(chǎn)品通道池中沒有相應(yīng)通道,進(jìn)攔截',
'WL:CNH' => '所選的通道不健康,進(jìn)攔截',
'WL:TCLJ' => '不在發(fā)送時(shí)間段,進(jìn)攔截',
'WL:TCSH' => '不在發(fā)送時(shí)間段,進(jìn)審核',
'WL:CPL' => '超頻限制'
];
$message = isset($errorMessages[$code]) ? $errorMessages[$code] : "未知錯(cuò)誤 (代碼: {$code})";
// 如果是攔截錯(cuò)誤,添加詳細(xì)原因
if ($code == 10208 && !empty($data) && isset($dataMessages[$data])) {
$message .= ': ' . $dataMessages[$data];
}
return $message;
}
}
// ==================== 使用示例 ====================
// 創(chuàng)建短信實(shí)例
$sms = new InternationalSMS();
// 示例1:發(fā)送驗(yàn)證碼短信
$mobile = '639257890123'; // 國際手機(jī)號(菲律賓示例)
$verificationCode = rand(1000, 9999); // 生成隨機(jī)驗(yàn)證碼
$message = "Your verification code is {$verificationCode}. Please use it within 10 minutes.";
$result = $sms->sendVerificationCode($mobile, $message);
if ($result['success']) {
echo "短信發(fā)送成功!消息ID: " . $result['msg_id'] . "\n";
// 這里應(yīng)該將msg_id保存到數(shù)據(jù)庫,與用戶關(guān)聯(lián)
} else {
echo "短信發(fā)送失敗: " . $result['message'] . "\n";
}
// 示例2:獲取狀態(tài)報(bào)告
// $reportResult = $sms->getReport();
// if ($reportResult['success']) {
// echo "獲取到 " . count($reportResult['reports']) . " 條狀態(tài)報(bào)告\n";
// foreach ($reportResult['reports'] as $report) {
// echo "手機(jī)號: {$report['mobile']}, 狀態(tài): {$report['status']}, 時(shí)間: {$report['time']}\n";
// }
// } else {
// echo "獲取狀態(tài)報(bào)告失敗: " . $reportResult['message'] . "\n";
// }
?>
這個(gè) Demo 提供了完整的功能實(shí)現(xiàn)和錯(cuò)誤處理,下載后只需替換配置參數(shù)即可使用。
