全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
消息服务

消息通知常见问题

更新时间:2017-06-07 13:26:11

1. HttpEndpoint接收不到消息怎么办?如何进行快速调试?

  • 强烈建议使用辅助开发工具进行调试,可确定是否是HttpEndpoint接收消息的逻辑有问题。使用辅助开发工具可分别针对鉴权逻辑以及处理消息的逻辑进行调试。
  • 如果通过辅助开发工具确认HttpEndpoint可以正常接收推送请求,但仍然无法接收线上服务的推送消息,建议使用日志管理功能,能够获取消息服务接收发布的消息以及推送消息所有相关的日志,可通过日志查看消息服务的推送过程以及结果。也可通过加入MNS旺旺客户技术支持群(51222373),专业的技术人员会给您提供帮助。

2. 如何确认推送请求中x-mns-signing-cert-url所标识的证书地址是MNS官方给出的?

  • 确认这点后才能保证推送请求是MNS发出的。
  • 目前MNS是将公钥证书放到OSS的固定Bucket(mnstest)中的,地址为:https://mnstest.oss-cn-hangzhou.aliyuncs.com/x509_public_certificate.pem,考虑到安全性,证书会定期更换,文件名也会发生变化,但一定还是放在Bucket(mnstest)中的。所以在判断证书地址的有效性时可通过前缀匹配的方式进行,即判断证书地址的前缀是否为:https://mnstest.oss-cn-hangzhou.aliyuncs.com/即可。
  • 将来可能会考虑将证书放到其他更安全的地方,届时会通知大家。

3. HttpEndpoint端验权时每次远程请求公钥证书会比较耗时,如果提高性能?

  • 强烈建议根据公钥证书地址,按Key-Value的方式缓存证书,这样就可以从内存中直接获取证书。MNS的每个推送请求中都会携带公钥证书地址,如果证书更换,那对应的地址也会更新(文件名会更新,比如加上版本号),只要地址没有更新,就可以一直拿缓存的证书进行鉴权。所以在处理推送请求时,可以根据x-mns-signing-cert-url描述的地址从缓存中直接获取证书,获取不到再远程访问,并存到缓存中以便下次使用。
  • 例:证书地址为:https://mnstest.oss-cn-hangzhou.aliyuncs.com/x509_public_certificate.pem,最简单的就可以使用如下方式缓存:
    1. typedef map<string, string> cache;
    2. cache["x509_public_certificate.pem"] = "$content";
    3. cache["x509_public_certificate.pem.version2"] = "$content2";

4. HttpEndpoint签名认证失败,如何调查?

这里列举遇到过的一些问题:

  • 用户HttpEndpoint使用了某些HttpServer框架,对HttpHeader的Key进行了格式转化,导致用户在签名认证的时候拿到的MNS自定义的HttpHeader的Key已经发生了变化(注:MNS自定义的Header的Key是全小写的),最常见的是变成了首字母大写。针对这种情况,只需要在认证之前,将HttpHeader的Key全部转为小写就可以了。比如:sign-error-sample-1.png

5. 订阅成功后,没有收到消息,并且日志中也查不到相关记录,怎么查?

这里列举下可能的一些问题:

  • 确认下在订阅时,是否制定了FilterTag,如果制定了,在PublsihMessage时,不指定MessageTag的话,该消息是会被过滤掉的,从而不会被推送(消息日志中也查不到该记录)。

6. 使用PHP编写HttpEndpoint时接收不到消息体,怎么玩?

确认下您的处理逻辑中,是否是直接使用 $POST 来获取HttpBody的,如果是的话,需要改成这种方式:

  1. file_get_contents("php://input");

原因:最常见的$_POST[‘fieldname’]方法,只能接收Content-Type: application/x-www-form-urlencoded提交的数据,也就是表单POST过来的数据。而MNS推送请求中的Content-Type的类型仅支持:

  1. text/xml;charset=utf-8
  2. text/plain;charset=utf-8
  3. application/json;charset=utf-8

file_get_contents(“php://input”)这种方法允许读取POST的原始数据,对于不同Content-Type的POST数据都可以使用,甚至对于未指定Type的,也可以用来获取原始数据。所以建议使用这种方法来处理推送请求。

本文导读目录