Jasmin SMS网关返回200 OK状态DLR送达回执不生效问题排查
Jasmin SMS网关DLR送达回执不生效问题排查修复
核心问题原因
- 响应内容不符合官方要求
官方要求返回的响应体必须严格匹配ACK/Jasmin,你的代码返回了<body>ACK/jasmin</body>,存在两个错误:一是多了HTML的body标签,二是jasmin首字母小写,DLRThrower会做严格的字符串匹配,内容完全一致才会被识别为合法响应。 - Header设置错误
PHP的header()函数第二个参数为是否覆盖同类型头,你写的header('HTTP/1.1 200 OK','Content-Type: text/plain');是错误写法,会导致Content-Type头设置失效,正确写法是分两次设置header。 - 旧队列消息的干扰
从日志可以看到,前序所有报错的DLR推送地址都是http://localhost/php,和你代码里配置的http://localhost/php/ack.php不一致,这些报错消息都是你修改dlr-url配置之前就已经进入DLR队列的旧消息,本身配置的推送地址就是错误的,必然推送失败,重试4次后被清空是正常逻辑,最后16:07分成功的那条才是你配置正确后新发送的短信对应的DLR推送。 - 潜在的PHP报错污染响应体
你的代码直接读取$_POST["id"]和$_POST["level"],如果Jasmin推送的参数没有这两个键,且PHP开启了Notice级错误提示,会在响应体中输出PHP报错信息,导致响应内容不符合要求。
修复后的ack.php代码
<?php // 关闭错误输出,避免报错污染响应体 error_reporting(0); // 正确设置响应头 header('HTTP/1.1 200 OK'); header('Content-Type: text/plain'); // 严格返回要求的响应内容,不要加任何其他输出 echo 'ACK/Jasmin'; ?>
验证方法
配置修复后新发送的短信,查看DLR日志如果直接返回Throwed DLR的INFO级日志,没有报错就说明配置生效。
内容的提问来源于stack exchange,提问作者kaleb teshale
相关产品推荐
相关产品推荐

