文档中心 > Taobao Global Open Platform

使用 HTTP 接收消息

更新时间:2021/03/24 访问次数:1116

开发者需提供消息接收通道,接收推送形式为 HTTPS POST 请求。

回调

使用消息服务,需要准备一个接收消息的回调接口。

  1. 请使用 https 协议的回调地址;
  2. 请使用 CA 签发的证书,需要 OV/EV 级;
  3. 收到消息后请返回 HTTP 200 状态码,确认签收消息。

消息的处理

  • 请勿在收到消息的同时进行业务处理;
  • 请收到消息后,存储至待处理队列中,并返回 HTTP 200 状态。在此之后异步消费消息;
  • 订单中仅包含必要的标识信息,业务的详细情况请使用对应的查询接口查询。

消息示例 #1.正向交易信息示例(下单,付款,发货,收货等正向交易行为产生)

POST /example/uri HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 1238
Authorization: 34f7b258df045d4ed9341850ca85b866f34828fd7d51862f11137216294a894c

#消息体
{
 "seller_id":"1234567",  #卖家ID
 "message_type":0,
   "data":{
      "order_status":"unpaid", #订单状态
      "trade_order_id":"260422900198363", #主单Id
      "trade_order_line_id":"260422900298363", #子单id
      "status_update_time":1603698638 #订单状态更新时间 时间戳
   },
   "timestamp":1603766859530, #推送时间 时间戳
   "site":"lazada_vn" # 站点信息
}

消息示例 #2.逆向交易信息示例(取消,退货退款,等逆向交易行为产生)

POST /example/uri HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 1238
Authorization: 34f7b258df045d4ed9341850ca85b866f34828fd7d51862f11137216294a894c

#消息体
{
   "seller_id":"1000114855", 
   "message_type":0,
   "data":{
      "order_status":"canceled",
      "reverse_order_id":"501977696648153",    #逆向主单id
      "reverse_order_line_id":"502491640048153", #逆向子单id
      "status_update_time":1603703663,
      "trade_order_id":"252883361348153", #关联正向单id
      "trade_order_line_id":"252883361948153" #关联逆向单id
   },
   "timestamp":1603715010436,
   "site":"lazada_vn"
}

重试及补偿

  • 超过 500ms 服务端未收到 200 确认,服务端则认为消息推送失败;
  • 失败后消息会在半个小时后重试推送,最大重试 12 次;
  • 若系统中断超过 12 次重试,则请通过相关查询接口重新获取数据。

签名

建议开发者对收到的消息进行签名校验,以确保消息的合法性。

使用 AppKey 拼接请求 Body 作为消息体, 以 AppSecret 作为密钥,签名加密算法为 HMAC-SHA256。

签名产生 Sample Code

/*
其中Base = {your_app_key} + "{message_body_you_receieved}"
Secret = {your_app_Secret};
*/
Authorization = HEX_ENCODE(HMAC-SHA256(Base, Secret));

請使用下述代码生成签名与 Header 中的 「Authorization」 进行比较。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

/**
 * 签名工具类
 * @author jianyan
 * @date 2020/12/01
 */
public class SignatureUtil {
    private static final String HMAC_SHA256 = "HmacSHA256";

    private static final Logger LOGGER = LoggerFactory.getLogger(SignatureUtil.class);

    /**
     * 产生基于Hmac-SHA256,并经过16进制编码的签名。
     * @param base {AppKey} + {messageBody}
     * @param secret {AppSecret}
     * E.g.: AppKey = 123456, AppSecret = 3412gyo124goi3124
     * 收到的消息体Json :{"seller_id":"1234567", "message_type":0, "data":{...}..}
     *
     * base = "123456" + "{\"seller_id\":\"1234567\", \"message_type\":0, "data":{...}..}"
     * secret = 3412gyo124goi3124
     * signature = getSignature(base, secret);
     * signature =  f3d2ca947f16a50b577c036adecd18bec126ea19cadedd59816e255d3b6104ab
     * @return 签名
     */
    public static String getSignature(String base, String secret) {
        try {
            Mac sha256Hmac = Mac.getInstance(HMAC_SHA256);
            SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), HMAC_SHA256);
            sha256Hmac.init(secretKey);
            return byteArraytoHexString(sha256Hmac.doFinal(base.getBytes()));
        } catch (Exception e) {
            LOGGER.error("Failed to generate signature");
        }
        return null;

    }

    /**
     * 十六进制Encode
     * @param bytes
     * @return
     */
    private static String byteArraytoHexString(byte[] bytes) {
        if(bytes == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        String stmp;
        for (byte aByte : bytes) {
            stmp = Integer.toHexString(aByte & 0XFF);
            if (stmp.length() == 1) {
                sb.append('0');
            }
            sb.append(stmp);
        }
        return sb.toString().toLowerCase();
    }
}

数据將使用明文传输。

FAQ

关于此文档暂时还没有FAQ
返回
顶部