开发者需提供消息接收通道,接收推送形式为 HTTPS POST 请求。
使用消息服务,需要准备一个接收消息的回调接口。
消息示例 #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" }
建议开发者对收到的消息进行签名校验,以确保消息的合法性。
使用 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(); } }
数据將使用明文传输。