如何使用Clickatell REST API在PHP中发送阿拉伯语短信?
解决Clickatell API发送阿拉伯语短信的常见问题
从你提供的代码来看,大概率是在发送阿拉伯语短信时遇到了编码问题、JSON格式错误,或者API请求验证类的问题。我帮你拆解下可能的问题点,以及对应的修正方案:
1. 手动拼接JSON的潜在风险
你当前手动构造$to和POST请求体的方式很容易出现转义错误,比如$to="[\"<mobile number>\"]";这种写法如果号码格式不对或者转义处理不当,会直接导致API无法解析请求。推荐用json_encode自动生成合规的JSON格式,彻底避免手动拼接的失误:
// 正确构造目标号码数组(记得带国家代码,比如+966开头的沙特号码) $to = ["966123456789"];
2. 阿拉伯语文本编码的优化
你用unpack转码的逻辑是可行的,但可以用更简洁直观的bin2hex替代,同时确保编码转换过程中没有字符丢失:
$text = "غثس هفس خن"; // 将UTF-8转成Clickatell要求的UCS-2BE编码 $ucs2Text = iconv('UTF-8', 'UCS-2BE', $text); // 转成十六进制并统一大写 $message = strtoupper(bin2hex($ucs2Text));
3. 不安全的SSL设置需调整
你关闭了SSL证书验证(CURLOPT_SSL_VERIFYHOST=0和CURLOPT_SSL_VERIFYPEER=0),这在生产环境不仅存在安全风险,还可能被服务器拒绝请求。建议直接移除这两行,让CURL自动验证SSL证书。
4. 完整修正后的代码
把以上优化点整合后,完整的可运行代码如下:
<?php $to = ["966123456789"]; // 替换为实际目标号码(带国家代码) $text = "غثس هفس خن"; // 处理阿拉伯语文本编码 $ucs2Text = iconv('UTF-8', 'UCS-2BE', $text); $message = strtoupper(bin2hex($ucs2Text)); $authToken = "3fUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.clickatell.com/rest/message"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); // 用json_encode生成请求体,彻底避免手动拼接的格式错误 $postData = [ "text" => $message, "to" => $to ]; curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "X-Version: 1", "Content-Type: application/json", "Accept: application/json", "Authorization: Bearer $authToken" )); $response = curl_exec($ch); $err = curl_error($ch); curl_close($ch); // 调试输出,快速定位问题 if ($err) { echo "cURL错误: " . $err; } else { $responseArray = json_decode($response, true); print_r($responseArray); } ?>
5. 快速排查问题的技巧
如果还是发送失败,一定要查看API返回的响应内容:
- 若返回
401错误,说明你的authToken无效或者权限不足; - 若返回
400错误,大概率是请求体格式错误(比如号码格式不符合要求); - 若返回
500错误,可能是Clickatell服务器端临时故障,稍后重试即可。
内容的提问来源于stack exchange,提问作者Muhammed Shihabudeen Labba A
相关产品推荐
相关产品推荐

