全部产品

消息通知功能说明

KB: 38991

 · 

更新时间:2021-04-15 17:02

本文介绍了如何搭建接收消息服务的操作步骤。

消息通知功能接收消息服务搭建

开启消息通知功能,请参见转码消息通知。

MNS通过发送POST请求将消息推送到指定接收消息的HTTP地址。

  1. 消息推送请求格式。

    Request的构造主要由以下几个部分组成:

    • 请求行

      POST /notifications HTTP/1.1

    • URI参数

    • Request Header

      参数名称

      说明

      备注

      Authorization

      验证字符串,可由此判断跟请求是否是由MNS发出

      Content-Length

      HTTP消息体的长度

      Content-Type

      请求内容的MIME类型,目前请求仅支持text/xml;charset=utf-8格式

      Content-MD5

      HTTP消息体的MD5值

      Date

      请求的构造时间,目前只支持GMT格式,如果和MNS的服务器时间前后差异超过15分钟将返回本次请求非法。

      Host

      接受消息的Http服务端的域名

      HTTP/1.1

      x-mns-request-id

      此次推送的Request编号

      x-mns-version

      调用MNS接口的版本号,当前版本为“2015-06-06”

      x-mns-signing-cert-url

      签名证书的地址(Base64编码过)

      签名证书的地址;Request Body 中的SigningCertURL字段在2016年6月30日后将不再提供。

    • Request Body

      Request Body为XML格式,包括创建消息正文和属性。

      参数名称

      说明

      TopicOwner

      被订阅主题的拥有者

      TopicName

      被订阅主题的名字

      Subscriber

      订阅者

      SubscriptionName

      订阅名称

      MessageId

      消息编号

      Message

      消息正文

      MessageMD5

      消息的MD5

      MessagePublishTime

      消息发布的时间

      SigningCertURL

      签名证书的地址,2016年6月30日后将仅在Request Header中通过x-mns-signing-cert-url提供。

    • Response

      返回消息由返回状态行,HTTP头和消息体三部分组成

    • HTTP Status Code

      HTTP/1.1 204 NoContent

      若确认成功,返回204。

      若请求签名认证不过,返回403。

      若任何其他错误,返回500。

    • Response Header

    • Response Body

    • Special Error

    请求示例:POST /notifications HTTP/1.1
    Host: example.com
    Date: Wed, 08 Mar 2012 12:00:00 GMT
    Content-Length: 300
    Content-Type: text/xml;charset=utf-8
    Content-MD5: YjJjYzgxYzkxODU4NDI0ODJiYTVlNjQ4MmM0MjZiYjY=
    Authorization:MNS 44CF9590006BF252F707:jZNOcbfWmD/A/f3hSvVzXZjM2HU=
    User-Agent: Aliyun Notification Service Agent
    x-mns-request-id:512B2A634403E52B1956133K
    x-mns-version:2015-06-06
    
    
    $TopicOwner
    $TopicName
    $Subscriber
    $SubscriptionName
    $MessageId
    $Message
    $MessageMD5
    $MessagePublishTime
    

    媒体处理消息通知消息体Message结构说明:

    参数名称

    说明

    jobId

    作业ID

    type

    作业类型,值为Transcode、Analysis、Snapshot

    state

    作业状态,值为Success、Fail

    code

    错误码

    msg

    错误信息详情

    消息示例:

    POST /notifications HTTP/1.1
    
    Authorization: dOcgxcXsDU3m6SUHCW/5Ft4yRbzVjrMbhbcQiHeXIg5iLRnI//YhPVvzUY3wTnXikafxnn+UrEC+/vX0FwKnLg==
    
    Content-Length: 643
    
    Content-md5: NjJhMzY0MGM2Y2YxY2RkOTdhZDdlMjUwMjc4MzBiOTY=
    
    Content-Type: text/xml;charset=utf-8
    
    Date: Tue, 22 Sep 2015 03:25:32 GMT
    
    Host: internal.mns.cn-hangzhou.aliyuncs.com:8068
    
    User-Agent: Aliyun Notification Service Agent
    
    x-mns-request-id: 5600CA2B3728290806000010
    
    x-mns-version: 2015-06-06
    
    40000
    
    mts-test
    
    44404
    
    mts-user-notify
    
    52DD3925C2AA589F-1-14FF315BB69-200000003
    
    928EC0A38F2D6BAA0767C0917C1C1C89
    
    {“jobId”:”8a8753a54e6a4a0f9128ccecbefe9948”,”state”:”Success”,”type”:”Transcode”}
    
    1442892331881

    返回头示例:

    HTTP/1.1 204 NoContent
  2. 接收消息服务端对消息推送请求的签名认证。

    HTTP的消息接收地址,用户可以通过SigningCerURL获取签名证书(推送消息的请求中都会携带),并根据相应的方法来验证该请求是否由MNS系统发出,防止恶意请求对用户造成负面影响。

    SigningCerURL:描述了用户提取验证请求是否来自MNS的签名证书的地址。

    HTTP的消息接收地址对应的HTTP Server对请求的合法性进行验证的方法如下:在请求的Header中,Authorization字段的值是MNS根据待签名字符串,用SHA1-RSA签名算法生成签名。用户可以使用公钥对签名进行验证。具体的验证方法如下。

    1. 获取X509证书。

      在MNS发送给消息接收地址对应的HTTP Server的XML格式的Request Body中,SigningCertURL指定了签名证书的地址。用户需要获取该签名文件,从中提取出签名的公钥。

    2. 计算待签名字符串。

      VERB + “\n”
                   + CONTENT-MD5 + “\n”
                   + CONTENT-TYPE + “\n”
                   + DATE + “\n”
                   + CanonicalizedMNSHeaders
                   + CanonicalizedResource
      
      • VERB表示HTTP的Method。

      • Content-Md5表示请求内容数据的MD5值。

      • CONTENT-TYPE表示请求内容的类型。

      • DATE表示此次操作的时间,不能为空,目前只支持GMT格式,如果请求时间和MNS服务器时间相差超过15分钟,MNS会判定此请求不合法,返回400。

      • CanonicalizedMNSHeaders表示http中的x-mns-开始的字段组合。

      • CanonicalizedResource表示http请求的相对地址,不能为空。

      • 采用SHA1算法对待签名字符串进行哈希。请按照RFC3447中的SHA1算法对待签名字符串做哈希运算。

    3. 解码。

      • 对Authorization签名字段Base64解码。Authorization签名字段采用Base64编码方式进行编码,在对比签名前,需要对其进行Base64解码。

      • 用公钥对Authorization签名进行解码。Authorization签名经过Base64 Decode后,再用从X509证书中提取的公钥对其进行解密。

    4. 比较第二、三两步的结果是否一致。如果一致,则表明请求来自MNS,访问合法。

    其他:

    • 用来签名的字符串为utf-8格式。

    • 签名的方法用RFC 3447中定义的sha1WithRSAEncryption方法。

    • base64是指使用base64算法转码文本。