运营同事发完一批订单通知,回头问技术:“这批到底有多少人收到了?”技术打开日志,满屏都是接口返回的“成功”,却回答不上来。原因很简单,系统只记了提交结果,没接短信回执。

这里要先分清两个概念。调用短信接口时立刻拿到的返回,叫提交结果,只说明平台收下了这条请求;运营商把短信送到手机之后反馈回来的结果,才是短信状态报告,也就是大家常说的短信回执。前者几乎是实时的,后者要等一会儿,用户到底收没收到,看的是后者。

这篇写给要对接短信回执的后端开发。核心就一句话:回执的接收方式只有两种,平台推给你,或者你去平台拉,选哪种取决于你的系统能不能对外提供一个稳定的回调地址。

短信回执里一般有什么

不同平台的字段名不一样,内容大同小异:

字段 含义
消息编号 平台在提交时返回的唯一编号
自定义流水号 你提交时自己传的编号,有的平台支持
手机号 这条回执对应的接收号码
状态 成功、失败或未知
状态码 失败时的具体原因代码
送达时间 运营商反馈的时间

提交时一定要把消息编号存下来,最好再传一个自己的流水号。回执到了靠它们对上是哪一条,没存的话,回执来了也不知道该更新谁。

方式一:平台推送到你的回调地址

这是最常用的短信回执接收方式。你在平台后台填一个回调地址,平台拿到状态报告后,主动请求这个地址把结果推过来。

实现起来有几个讲究。收到推送后先快速返回成功,再把数据丢进队列慢慢处理,别在回调里做一堆数据库操作,处理慢了平台会判定超时,然后重复推送。重复推送本身也很正常,所以处理逻辑要按消息编号去重,同一条回执来两次,结果不能变。

安全也别忽略。回调地址是公开的,任何人都能往里发数据。按平台文档校验签名,或者只接受平台公布的来源 IP,防止有人伪造回执。另外地址要用 HTTPS,服务器换了、域名迁了,记得回平台后台同步改掉,我们见过不少项目迁移服务器后回执断了好几天才发现。

方式二:主动去平台查询短信状态报告

有些系统在内网,没法对外开放回调地址;有些只是偶尔发几条,不想专门做一个接口。这时可以定时调用平台的查询接口,把短信状态报告拉回来。

主动查询要注意频率。查得太勤,可能触发平台的调用限制;查得太疏,状态更新慢,业务那边看到的数据总是滞后。多数平台支持一次批量拉取多条,按固定间隔跑一个定时任务就好。还要看清文档:有的平台一条回执只能被拉取一次,拉走就没了,程序拉到后要先落库再处理,不然中途报错就丢了。

两种方式也可以并用:平时靠推送,再配一个低频的查询任务,把长时间没收到短信回执的消息补查一遍。推送偶尔因为网络抖动漏掉几条,有这道补查,数据就不会出现莫名其妙的缺口。

状态回来了,怎么理解和处理

成功的好办,标记为已送达。失败的要看状态码,常见原因有空号、停机、号码格式错误、手机拦截等,具体代码含义以平台文档为准,建议整理成一张中文对照表,客服和运营查起来也方便。

最让人头疼的是长时间没有回执的“未知”状态。用户关机、在信号不好的地方,或者运营商反馈本身有延迟,都可能导致回执迟迟不来。别急着把它当失败处理,设一个合理的等待时长,超时后统一标记为未知,再决定要不要补发。

短信回执在业务里怎么用

接好回执,不只是为了看报表。几个实用的方向:

  • 验证码发送失败时,页面可以提示用户检查号码或换一种验证方式,减少用户干等;
  • 重要通知送达失败,自动转人工或改用其他渠道提醒;
  • 客户资料里长期失败的空号、停机号做个标记,下次发送前跳过,少花冤枉钱;
  • 按模板、时段统计成功和失败情况,找出内容或发送时间上的问题。

结论

短信回执接收有两种方式:平台推送到你的回调地址,或者你主动定时查询,能开放回调就以推送为主,查询做补充。提交时存好消息编号和流水号,回调里快速响应、按编号去重、校验来源,对未知状态设等待时长。对接短信群发接口时短信回执这块有疑问,可以打 18720919319,和蔚岚科技的技术同事一起调。

常见问题

短信回执一般多久能收到?

大多数情况下发送后很快就会返回,但受运营商和用户手机状态影响,个别回执会延迟较久,系统要允许这种延迟。

回执显示成功,用户说没看到怎么办?

成功代表短信已送达手机,可能被手机里的安全软件归到了拦截或垃圾信息里,可以让用户翻一下这些分类。

回调地址收到重复的短信回执正常吗?

正常。平台在没收到你的成功响应时会重试推送,所以按消息编号去重就行。

没有公网服务器,能接收短信状态报告吗?

可以,用主动查询的方式,定时调用平台的查询接口把状态拉回来。

短信回执的数据要保存多久?

看业务需要。一般至少保留到对账周期结束,涉及纠纷的通知类短信可以保存更久,方便日后核查。