本文目录导读:

我来为您详细说明PHP项目对接语音验证码接口的完整流程:
选择语音验证码服务商
常见的选择:
- 阿里云 - 语音服务
- 腾讯云 - 语音验证码
- 容联云 - 语音验证码
- 云片网 - 语音验证码
接口对接流程
1 准备工作
// 创建配置文件
class VoiceConfig {
// 以阿里云为例
const ACCESS_KEY_ID = 'your_access_key_id';
const ACCESS_KEY_SECRET = 'your_access_key_secret';
const CALLED_SHOW_NUMBER = '0571xxxxxx'; // 显号号码
const VOICE_TEMPLATE_CODE = 'TTS_xxxxxx'; // 语音模板ID
const DOMAIN = 'dyvmsapi.aliyuncs.com';
}
2 发送语音验证码接口
<?php
class VoiceCodeService {
/**
* 发送语音验证码
* @param string $phone 手机号码
* @param string $code 验证码
* @return array
*/
public function sendVoiceCode($phone, $code) {
// 阿里云示例
return $this->aliyunSend($phone, $code);
}
/**
* 阿里云语音验证码
*/
private function aliyunSend($phone, $code) {
require_once 'aliyun-php-sdk-core/Config.php';
$iClientProfile = DefaultProfile::getProfile("cn-hangzhou",
VoiceConfig::ACCESS_KEY_ID,
VoiceConfig::ACCESS_KEY_SECRET);
$client = new DefaultAcsClient($iClientProfile);
$request = new \Dyvmsapi\Request\V20170525\SingleCallByTtsRequest();
// 设置被叫号码
$request->setCalledNumber($phone);
// 设置显号号码
$request->setCalledShowNumber(VoiceConfig::CALLED_SHOW_NUMBER);
// 设置语音模板CODE
$request->setTtsCode(VoiceConfig::VOICE_TEMPLATE_CODE);
// 设置模板变量
$request->setTtsParam(json_encode(['code' => $code]));
try {
$response = $client->getAcsResponse($request);
return [
'success' => true,
'data' => [
'callId' => $response->CallId,
'message' => '语音验证码发送成功'
]
];
} catch (Exception $e) {
return [
'success' => false,
'message' => '发送失败:' . $e->getMessage()
];
}
}
/**
* 腾讯云语音验证码
*/
private function tencentSend($phone, $code) {
require_once 'vendor/autoload.php';
$cred = new \TencentCloud\Common\Credential(
VoiceConfig::SECRET_ID,
VoiceConfig::SECRET_KEY
);
$client = new \TencentCloud\Vms\V20200902\VmsClient($cred, "ap-guangzhou");
$req = new \TencentCloud\Vms\V20200902\Models\SendTtsVoiceRequest();
$req->TemplateId = VoiceConfig::VOICE_TEMPLATE_CODE;
$req->CalledNumber = "+86" . $phone;
$req->VoiceSdkAppid = VoiceConfig::APP_ID;
$req->TemplateParamSet = [$code];
try {
$resp = $client->SendTtsVoice($req);
return [
'success' => true,
'data' => [
'callId' => $resp->SendStatus->CallId,
'message' => '语音验证码发送成功'
]
];
} catch (Exception $e) {
return [
'success' => false,
'message' => '发送失败:' . $e->getMessage()
];
}
}
}
3 生成和验证验证码
class CodeManager {
/**
* 生成验证码
* @param int $length 验证码长度
* @return string
*/
public static function generateCode($length = 6) {
$code = '';
for ($i = 0; $i < $length; $i++) {
$code .= mt_rand(0, 9);
}
return $code;
}
/**
* 保存验证码到Redis/数据库
*/
public static function saveCode($phone, $code, $expire = 300) {
// 使用Redis保存
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = "voice_code:{$phone}";
$redis->setex($key, $expire, $code);
return true;
}
/**
* 验证验证码
*/
public static function verifyCode($phone, $code) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = "voice_code:{$phone}";
$storedCode = $redis->get($key);
if ($storedCode === false) {
return ['valid' => false, 'message' => '验证码已过期'];
}
if ($storedCode === $code) {
// 验证成功后删除
$redis->del($key);
return ['valid' => true, 'message' => '验证成功'];
}
return ['valid' => false, 'message' => '验证码错误'];
}
}
4 完整的调用示例
<?php
// 发送语音验证码
function sendVoiceCode($phone) {
// 1. 生成验证码
$code = CodeManager::generateCode(6);
// 2. 保存验证码
CodeManager::saveCode($phone, $code);
// 3. 发送语音验证码
$voiceService = new VoiceCodeService();
$result = $voiceService->sendVoiceCode($phone, $code);
if ($result['success']) {
return json_encode([
'code' => 200,
'message' => '语音验证码已发送',
'data' => [
'callId' => $result['data']['callId']
]
]);
} else {
return json_encode([
'code' => 400,
'message' => '发送失败:' . $result['message']
]);
}
}
// 验证验证码
function checkVoiceCode($phone, $code) {
$result = CodeManager::verifyCode($phone, $code);
if ($result['valid']) {
return json_encode([
'code' => 200,
'message' => '验证成功'
]);
} else {
return json_encode([
'code' => 400,
'message' => $result['message']
]);
}
}
注意事项
1 接口安全性
// 添加频率限制
class RateLimiter {
public static function checkLimit($phone, $maxPerDay = 5) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = "voice_code_limit:{$phone}:" . date('Ymd');
$count = $redis->incr($key);
if ($count == 1) {
$redis->expire($key, 86400); // 24小时过期
}
return $count <= $maxPerDay;
}
}
2 错误处理
try {
$result = $voiceService->sendVoiceCode($phone, $code);
} catch (\Exception $e) {
// 记录日志
error_log('Voice code error: ' . $e->getMessage());
// 返回友好提示
return json_encode([
'code' => 500,
'message' => '系统繁忙,请稍后重试'
]);
}
最佳实践建议
- 使用队列处理:异步发送语音验证码
- 合理设置过期时间:通常5分钟
- 限制发送频率:防止滥用
- 记录发送日志:便于排查问题
- 号码白名单:测试环境使用白名单号码
这样的对接方案既安全又可靠,您可以根据实际需求选择合适的服务商进行对接。