閱讀346 返回首頁    go 新東方


消息通知常見問題__FAQ_開發人員指南_消息服務-阿裏雲

  • 強烈建議使用輔助開發工具進行調試,可確定是否是HttpEndpoint接收消息的邏輯有問題。使用輔助開發工具可分別針對鑒權邏輯以及處理消息的邏輯進行調試。
  • 如果通過輔助開發工具確認HttpEndpoint可以正常接收推送請求,但仍然無法接收線上服務的推送消息,建議使用日誌管理功能,能夠獲取消息服務接收發布的消息以及推送消息所有相關的日誌,可通過日誌查看消息服務的推送過程以及結果。也可通過加入MNS旺旺客戶技術支持群(51222373),專業的技術人員會給您提供幫助。

如何確認推送請求中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/即可。
  • 將來可能會考慮將證書放到其他更安全的地方,屆時會通知大家。

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";

HttpEndpoint簽名認證失敗,如何調查?

這裏列舉遇到過的一些問題:

  • 用戶HttpEndpoint使用了某些HttpServer框架,對HttpHeader的Key進行了格式轉化,導致用戶在簽名認證的時候拿到的MNS自定義的HttpHeader的Key已經發生了變化(注:MNS自定義的Header的Key是全小寫的),最常見的是變成了首字母大寫。針對這種情況,隻需要在認證之前,將HttpHeader的Key全部轉為小寫就可以了。比如:sign-error-sample-1.png

使用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的,也可以用來獲取原始數據。所以建議使用這種方法來處理推送請求。

最後更新:2016-11-23 17:16:08

  上一篇:go 常見問題__FAQ_開發人員指南_消息服務-阿裏雲
  下一篇:go 消息服務MNS和消息隊列ONS產品對比__FAQ_開發人員指南_消息服務-阿裏雲