You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rawurlencode通过PHP(CodeIgniter)API发送多行OTP短信失败,寻求解决方案

解决CodeIgniter中多行OTP短信发送失败的问题

我来帮你排查这个问题,你遇到的多行OTP短信发送失败,大概率是重复URL编码导致的,咱们一步步解决:

问题根源

你当前代码里,对$message用了rawurlencode处理,然后把$data数组传给CURLOPT_POSTFIELDS——而当curl处理数组类型的POST数据时,会自动对每个参数做URL编码,这就导致你的消息内容被编码了两次:换行符\n先被转成%0A,之后又被转义一次,最终短信里要么显示乱码,要么完全不换行,甚至触发服务商的参数格式校验失败。

修复步骤

1. 移除手动编码,保留原生换行符

直接用\n分隔短信内容,不需要手动调用rawurlencode,curl会自动帮你完成正确的URL编码,服务商那边能正确识别换行:

$message = "Dear User,\nYour OTP for registering with XYZ is " . $otp . ".\nOTPs are secret and should not be shared with anyone.\nRegards,\nTeam XYZ.";

2. 可选:适配服务商的换行要求

部分短信服务商可能要求用\r\n作为换行符,如果上面的方法还是不生效,可以试试替换换行符:

$message = "Dear User,\r\nYour OTP for registering with XYZ is " . $otp . ".\r\nOTPs are secret and should not be shared with anyone.\r\nRegards,\r\nTeam XYZ.";

3. 额外排查点

  • 临时打开echo($response);die;,查看服务商返回的具体错误信息(比如参数格式错误、API密钥无效、余额不足等)
  • 确认$apiKey和sender没有多余空格或错误字符,符合服务商的格式要求
  • 如果服务器环境SSL证书配置不全,可临时添加curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);(生产环境建议配置正确的SSL证书)

修复后的完整代码片段

function smsotp($mobile,$otp) { 
    $mobile_no=array($mobile); 
    // Account details 
    $apiKey = urlencode('XXXXXXXXXXXXXXXXXXXXXXXXXX'); 
    // Message details 
    $numbers = $mobile_no; 
    $sender = urlencode('XXXXXX'); 
    // 直接使用换行符,不手动编码
    $message = "Dear User,\nYour OTP for registering with XYZ is " . $otp . ".\nOTPs are secret and should not be shared with anyone.\nRegards,\nTeam XYZ.";
    $numbers = implode(',', $numbers); 
    // Prepare data for POST request 
    $data = array('apikey' => $apiKey, 'numbers' => $numbers, "sender" => $sender, "message" => $message); 
    // Send the POST request with cURL 
    $ch = curl_init('https://api.textlocal.in/send/'); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    // 调试时可临时启用,排查SSL问题
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $response = curl_exec($ch); 
    // 检查curl执行是否出错
    if(curl_errno($ch)){
        echo 'Curl error: ' . curl_error($ch);
    }
    curl_close($ch); 
    // Process your response here 
    echo($response);die; 
} 

内容的提问来源于stack exchange,提问作者Carwahan Your car partner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:22:31