Skip to content

ADX 平台对外接口规范 v3.3.0

文档面向对象:SSP(供应方平台)移动端开发人员 协议版本:3.3.8 生效日期:2026-05-26 传输协议:HTTPS + JSON(application/json)


1. 概述

本文档定义 SSP(供应方平台)移动端应用与 优聚智汇 ADX 之间的标准化通信接口。

1.1 核心特征

特征说明
适用终端仅限移动端(iOS / Android),不支持 PC Web
传输编码JSON(UTF-8),Content-Type 为 application/json
安全机制AES-256-GCM 加密 + HKDF 密钥派生 + HMAC-SHA256 签名,三重保护
认证方式AccessKey(AK)+ SecretKey(SK)密钥对,AK 携带在请求体的 uuid 字段中
数据模型来源Proto 文件定义结构,各语言通过 Protobuf 编译器生成 PB 类,序列化为 JSON 后加密传输
请求体结构外层明文 JSON(AdxRequest)包裹内层加密的 BidRequest JSON
响应体结构AdxResponse JSON,包含完整的广告素材、事件追踪配置、深度链接等
事件上报分布式 URL 模式,响应中的 BidExt.events[] 提供各事件的追踪 URL 列表

1.2 整体流程

┌──────────┐  构造BidRequest   ┌──────────┐  ProtoJSON    ┌──────────┐
│ 按Proto   │  (使用PB类)      │ 序列化为  │  字符串        │ AES-GCM  │
│ 定义构造  │ ──────────────→  │ JSON字符串│ ──────────→   │ 加密     │
│ 对象      │                  │          │               │          │
└──────────┘                   └────┬─────┘               └────┬─────┘
                                    │                          │
                           Base64编码                    Base64编码
                                    │                         │
┌──────────┐  HMAC-SHA256     ┌─────▼─────┐  组装JSON    ┌────▼─────┐
│ 拼接签名字 │ ─────────────→  │ 计算签名  │ ──────────→  │AdxRequest│
│ 符串      │                 │signature  │              │JSON对象  │
└──────────┘                 └───────────┘              └────┬─────┘

                                                     POST JSON (application/json)

                                                    ┌─────────▼─────────┐
                                                    │  ADX服务端解析验签  │
                                                    └─────────┬─────────┘

                                                    ┌─────────▼─────────┐
                                                    │ 返回AdxResponse    │
                                                    └─────────┬─────────┘

                                          ┌───────────────────▼───────────────────┐
                                          │ 渲染广告 → 触发事件                     │
                                          │ (按events[].urls上报)                  │
                                          └───────────────────────────────────────┘

1.3 基础信息

项目
环境地址https://api.ujuadx.cn/api/v3/bid
HTTP 方法POST
Content-Typeapplication/json(必须)
字符集UTF-8
适用终端仅移动端(iOS / Android)
加密算法AES-256-GCM
密钥派生HKDF-SHA256(salt=nonce, info="aes-key")
签名算法HMAC-SHA256
Base64 编码URL-safe(base64.URLEncoding
协议版本"3.3.0"
时间戳精度毫秒(UnixMilli)
Nonce 长度24 字符
请求超时建议200ms(RTB 全链路 P99 < 150ms,预留网络延迟)

2. 接入准备

2.1 获取密钥对

联系 ADX 运营团队完成注册后,获取以下凭证:

凭证说明示例
AccessKey (UUID)广告位标识。每个广告位唯一"111111"
SecretKey (SK)加密密钥运营人员下发。用于 HKDF 密钥派生和 HMAC 签名"111111111"

⚠️ 安全提醒

  • SecretKey 是唯一密钥,同时用于加密和签名
  • 移动端不可硬编码 SK,应通过安全渠道动态获取或使用安全存储(iOS Keychain / Android Keystore)
  • 切勿将 SK 提交至代码仓库或日志中输出

2.2 Proto 文件

SSP 需要使用以下 Proto 文件生成对应语言的 pb 类/结构体:

2.2.1 BidRequest 消息定义

proto
syntax = "proto3";

package ujuadxapi;

option go_package = "./ujuadxapi;ujuadxapi";


// 竞价请求根消息
message BidRequest {
  string id = 1;                              // 请求唯一ID。必填
  repeated Imp imp = 2;                       // 广告位列表。正常是一个,必填
  optional App app = 3;                       // 媒体应用信息。必填
  optional Device device = 4;                 // 设备信息。必填
  optional User user = 5;                     // 用户信息。推荐
  optional ReqExt ext = 15;                   // 扩展字段。推荐
}

// 广告位定义
message Imp {
  string id = 1;                              // 广告位唯一ID
  optional SlotAttribute slot_attribute = 2;  // 广告位属性。必填
  optional double bidfloor = 10;              // 最低出价(CPM)底价,单位:千次元(CNY)。必填
  optional ImpExt ext = 15;                   // 广告位扩展。当前版本忽略
}

// 广告位属性
message SlotAttribute{
  optional int32 width = 1;                    // 可展示宽度,像素单位。必填
  optional int32 height = 2;                   // 可展示高度,像素单位。必填
  repeated string mimes = 3;                   // 支持的MIME类型(e.g., "video/mp4"、"image/jpeg" 和 "image/gif")。不设置不限
  optional int32 min_duration = 5;             // 最短时长(秒)。需要视频类时必填
  optional int32 max_duration = 6;             // 最长时长(秒)。需要视频类时必填
  optional int32 deeplink = 10;                // 支持落地页:1-支持,2-不支持。默认1
}

// 媒体应用信息
message App {
  optional string name = 2;                    // 应用名称。必填
  optional string bundle = 3;                  // application bundle 或package name。必填
  optional string domain = 4;                  // 应用域名。可选
  optional string ver = 9;                     // 应用版本。必填
  optional int32 paid = 11;                    // 是否付费应用:1=付费。可选
  optional string keywords = 13;               // 关键词列表。推荐
}

// 设备信息
// 当设备为android时:imei,imeimd5,oaid 三个中至少存在一个
// 当设备为ios时,idfamd5,idfa 至少存在一个;caid、paid及其相关参数的正确填写对广告填充有很大帮助
message Device {
  optional string ua = 1;                      // 用户代理(User-Agent)。必填
  optional Geo geo = 2;                        // 地理位置。可选
  optional int32 dnt = 3;                      // 浏览器设置的 "Do Not Track"(请勿跟踪)标准标志,0 表示不限制跟踪,1 表示请勿跟踪。推荐
  optional int32 lmt = 4;                      // 商业认可的 "Limit Ad Tracking"(限制广告跟踪)信号(例如 iOS、Android),0 表示不限制,1 表示必须限制。推荐
  optional string ip = 5;                      // IPv4地址。推荐
  optional string ipv6 = 6;                    // IPv6地址。推荐
  optional int32 device_type = 7;              // 设备类型:1=手机/2=平板/3=PC/4=TV/5=OTT。推荐
  optional string make = 8;                    // 设备制造商(例如 "Apple")。推荐
  optional string model = 9;                   // 设备型号(例如 "iPhone")。推荐
  optional string os = 10;                     // 操作系统(例如 "iOS")。推荐
  optional string osv = 11;                    // 操作系统版本(例如 "3.1.2")。推荐
  optional string hwv = 12;                    // 硬件版本(例如 iPhone 5S 的 "5S")。可选
  optional int32 h = 13;                       // 屏幕高度(物理像素)。可选
  optional int32 w = 14;                       // 屏幕宽度(物理像素)。可选
  optional int32 ppi = 15;                     // 像素密度(Pixels per inch)。可选
  optional double px_ratio = 16;               // 像素比例,物理像素与设备无关的像素的比率。(设备像素/CSS像素)。可选
  optional int32 orientation = 17;             // 屏幕方向,1=横屏,2=竖屏。默认竖屏
  optional int32 js = 18;                      // 是否支持JavaScript,0 表示不支持,1 表示支持。可选
  optional int32 geo_fetch = 19;               // 运行在广告位中的JavaScript代码是否可以使用地理位置API,0 表示不可以,1 表示可以。js==1时可选
  optional string flash_ver = 20;              // 浏览器支持的Flash版本。可选
  optional string language = 21;               // 浏览器语言,使用 ISO-639-1-alpha-2 标准。可选
  optional string carrier = 22;                // 运营商或ISP(例如 "VERIZON")。应使用交易所维护的、事先向买方公布的字符串名称。可选
  optional string mcc_mnc = 23;                // 移动运营商,格式为 MCC-MNC 拼接码(例如 "310-005" 代表美国Verizon Wireless CDMA)。MCC和MNC之间必须有破折号以消除歧义。可选
  optional int32 connection_type = 24;         // 网络连接类型。1=有线网络/2=WiFi/3=2G/4=3G/5=4G/6=5G。推荐
  optional string ifa = 25;                    // 经过授权,可供广告主明文使用的ID(即未经哈希处理,苹果IDFA/海外安卓GAID/国内安卓OAID)。推荐
  optional string did = 26;                    // 硬件设备ID(IMEI)。推荐
  optional string did_sha1 = 27;               // 硬件设备ID(IMEI),经过SHA1哈希处理。推荐
  optional string did_md5 = 28;                // 硬件设备ID(IMEI),经过MD5哈希处理。推荐
  optional string dpid = 29;                   // 平台设备ID(例如Android ID)。推荐
  optional string dpid_sha1 = 30;              // 平台设备ID(例如Android ID),经过SHA1哈希处理。推荐
  optional string dpid_md5 = 31;               // 平台设备ID(例如Android ID),经过MD5哈希处理。推荐
  optional string mac = 32;                    // 设备MAC地址。推荐
  optional string mac_sha1 = 33;               // 设备MAC地址,经过SHA1哈希处理。推荐
  optional string mac_md5 = 34;                // 设备MAC地址,经过MD5哈希处理。推荐
  optional string os_boot_time = 35;           // 系统启动时间,秒级时间戳,示例:1665369347。可选,IOS 14+必填
  optional string os_update_time = 36;         // 系统最近一次更新时间,秒级时间戳小数点后保留6位,示例:1620542856.785738。可选,IOS 14+必填
  optional string os_birth_time = 37;          // 设备初始化时间,示例:1647545718.125795458。可选,IOS 14+必填
  optional string name_md5 = 38;               // 设备名称,经过MD5哈希处理。可选,IOS 14+必填
  optional string memory_size = 39;            // 手机内存大小,单位KB; 例如:3955589120。可选,IOS 14+必填
  optional string disk_size = 40;              // 手机容量大小,单位KB; 例如:63900340224。可选,IOS 14+必填
  optional string model_code = 41;             // 设备型号码,例如:D22AP。可选,IOS 14+必填
  optional string time_zone = 42;              // 设备时区,例如:Asia/Shanghai。可选,IOS 14+必填
  optional DeviceExt ext = 43;                 // 扩展字段
}

// 地理位置
message Geo {
  optional double lat = 1;                     // 纬度
  optional double lon = 2;                     // 经度
  optional int32 type = 3;                     // 定位类型:1=GPS/2=IP/3=用户提供
  optional int32 accuracy = 4;                 // 精度(米)
  optional string country = 5;                 // 国家代码(ISO 3166-1 alpha-2)
  optional string region = 6;                  // 省份/州代码(ISO 3166-2)
  optional string metro = 7;                   // 大都市区代码(Nielsen)
  optional string city = 8;                    // 城市名称
  optional string zip = 9;                     // 邮政编码
  optional int32 utc_offset = 10;              // UTC偏移量(分钟)
}

// 用户信息
message User {
  optional string id = 1;                      // 用户唯一ID
  optional int32 yob = 3;                      // 出生年份
  optional string gender = 4;                  // 性别:M=男/F=女/O=其他
  optional string keywords = 5;                // 用户兴趣关键词
}

// 请求顶层扩展
message ReqExt {
  optional string version = 1;                 // API版本
  optional string ver_sdk = 2;                 // SDK版本
  repeated string installed_app = 4;           // 安装的应用列表(例如["com.tencent.mm","com.qiyi.video"])
}

// 广告位扩展(用于非标样式)
message ImpExt {
}

// 设备信息扩展
message DeviceExt{
  optional string boot_mark = 1;               // 阿里预算反作弊字段,阿里预算必填
  optional string update_mark = 2;             // 阿里预算反作弊字段,阿里预算必填
  optional string ver_code_hms = 10;           // 华为设备HMS版本号,华为设备必填
  optional string ver_code_ag = 11;            // 华为设备AG版本号,华为设备必填
  optional string ver_rom = 20;                // 设备rom版本号,vivo、oppo预算必填

}

// ==================== 请求响应结构体 ====================

// AdxRequest 请求结构体
message AdxRequest  {
  string version = 1;                   // 协议版本
  string uuid = 2;                      // 广告位ID
  int64 timestamp = 3;                  // 请求时间戳(毫秒)
  string signature = 4;                 // 请求签名
  string nonce = 5;                     // 随机数
  string data = 6;                      // 入参数据
}

2.2.2 BidResponse 消息定义

proto
syntax = "proto3";

package ujuadxapi;

option go_package = "./ujuadxapi;ujuadxapi";


// ==================== 响应结构体 ====================
// AdxResponse 响应结构体
message AdxResponse  {
  optional string version = 1;                   // 协议版本
  optional string trace_id = 2;                   // 响应时间戳(毫秒)
  optional int64 timestamp = 3;                  // 响应时间戳(毫秒)
  optional uint32 lengthy = 4;                   // 耗时(毫秒)
  optional uint32 code = 5;                      // 响应码
  optional string message = 6;                   // 响应消息
  BidResponse data = 7;                 // 竞价响应
}
// 竞价响应
message BidResponse {
    string id = 1;                      // 请求ID
    optional string bidid = 2;          // DSP 生成的竞价ID
    repeated SeatBid seatbid = 3;       // 席位出价列表
    optional string adx_ext = 4;        // adx上报扩展
    optional Ext ext = 5;               // 扩展字段
}

// 席位出价
message SeatBid {
    optional string seat = 1;           // DSP标识或媒体席位名
    repeated Bid bid = 2;               // 出价列表
}

// 单个出价
message Bid {
    string id = 1;                      // 出价唯一ID
    double price = 3;                   // 出价价格(CPM)元
    string currency = 4;                // 币种
    repeated string adomain = 5;        // 广告主域名
    optional string cid = 6;            // 广告系列ID
    optional string crid = 7;           // 素材ID
    string adm = 8;                     // 广告物料(HTML/XML/JSON字符串)
    optional string nurl = 9;           // 胜出通知URL
    optional string lurl = 10;          // 竞败
    optional BidExt ext = 11;           // 出价扩展
}

// 出价扩展(核心扩展字段)
message BidExt {
    string title = 1;                           // 标题
    string desc = 2;                            // 描述
    string icon = 3;                            // 广告图标
    int32 ad_type = 4;                          // 广告样式:1-native,2-rewarded_video,3-banner,4-interstitial,5-splash,6-视频流
    int32 ad_style = 5;                         // 广告展示样式:1-文字链,2-图片,3-视频,4-html代码,5-视频+图片(原生视频贴片),6-一图一文,7-三图一文
    int32 interaction_type = 6;                 // 交互类型:1-使用浏览器打开,2-下载应用,4-小程序
    repeated Material materials = 7;            // 物料集合(图片、视频等)
    optional DeeplinkSet deeplinks = 8;         // 深度链接集合(多级降级)
    repeated EventTracker events = 9;           // 上报事件集合
    optional Interaction interaction = 10;      // 交互配置(摇一摇、滑动等)
    optional Interstitial interstitial = 11;    // 插屏专用参数
    optional Reward reward = 12;                // 激励视频奖励参数
    optional Splash splash = 13;                // 开屏专用参数
    repeated NativeAsset native_assets = 14;    // 原生信息流组件列表
    optional NativeLink native_link = 15;       // 原生广告链接
    repeated int32 api_supported = 16;          // 支持的MRAID版本
    string source = 17;
}

// 物料定义
message Material {
    string id = 1;                      // 物料唯一ID
    int32 type = 2;                     // 1=图片,2=视频,3=HTML
    string url = 3;                     // 物料地址
    optional int32 width = 4;           // 宽度(像素)
    optional int32 height = 5;          // 高度(像素)
    optional int32 duration = 6;        // 视频时长(秒)
    optional string mime = 7;           // MIME类型
}

// 深度链接集合
message DeeplinkSet {
    optional string scheme = 1;          // 自定义URL Scheme
    optional string universal_link = 2;  // iOS Universal Link
    optional string fallback_url = 3;    // 降级H5落地页
    optional string download_url = 4;    // 应用商店下载地址
    optional string quick_app_url = 5;   // 快应用地址
}

// 事件上报配置
message EventTracker {
    string type = 1;                    // impression/click/video_start/video_complete/close/track
    repeated string urls = 2;           // 上报URL列表
    optional string method = 3;         // GET/POST/IMAGE
}

// 交互配置
message Interaction {
    string type = 1;                    // shake/slide/click_anywhere/long_press
    map<string, double> threshold = 2;  // 触发阈值,如 {"accelerometer":2.5}
    optional string alert = 3;          // 提示文案
    optional InteractionFeedback feedback = 4; // 反馈配置
}

// 交互反馈
message InteractionFeedback {
    optional bool haptic = 1;           // 是否震动
    optional string sound = 2;          // 反馈音效URL
}

// ==================== 以下结构体兼容1.2的,新版逐渐废弃 ====================

// 插屏专用参数
message Interstitial {
    bool fullscreen = 1;                // 是否全屏
    optional int32 close_button_delay = 2; // 关闭按钮延迟秒数
    optional string close_button_position = 3; // 按钮位置
    optional int32 skip_seconds = 4;    // 可跳过时长
}

// 激励视频奖励
message Reward {
    int32 amount = 1;                   // 奖励数量
    string type = 2;                    // 奖励类型
    optional string description = 3;    // 奖励描述
}

// 开屏专用参数
message Splash {
    optional int32 skip_seconds = 1;    // 可跳过时长
    optional bool countdown = 2;        // 是否显示倒计时
    optional bool logo_visible = 3;     // 是否展示Logo
    optional double click_area_rate = 4; // 可点击区域占比
    optional string skip_position = 5;  // 跳过按钮位置
}

// 原生信息流组件(OpenRTB Native 1.2风格)
message NativeAsset {
    int32 id = 1;                       // 组件ID
    optional bool required = 2;         // 是否必须展示
    optional NativeTitle title = 3;
    optional NativeImage img = 4;
    optional NativeData data = 5;
    optional NativeVideo video = 6;
}

message NativeTitle {
    string text = 1;
}

message NativeImage {
    string url = 1;
    optional int32 width = 2;
    optional int32 height = 3;
}

message NativeData {
    int32 type = 1;                     // 数据类型码
    string value = 2;                   // 数据内容
}

message NativeVideo {
    string vasttag = 1;                 // VAST标签
}

message NativeLink {
    string url = 1;                     // 落地页URL
    repeated string clicktrackers = 2;  // 点击监测URL
    optional string fallback_url = 3;   // 降级URL
}

// 顶层扩展
message Ext {
    optional string request_id = 1;     // 内部请求追踪ID
    optional string encryption = 2;     // 加密方式
    map<string, string> debug = 3;      // 调试信息
}

3. 加密与签名

3.1 加密流程

构建请求对象参数 - version"3.3.0" - uuid:广告位 ID - timestamp:当前 Unix 毫秒时间戳 - signature:HMAC-SHA256 签名值 - nonce:随机字符串,每次请求唯一,长度为 24 字符 - data:AES-256-GCM 加密后的 BidRequest JSON 字符串

text

  // 1. 生成 24位随机字符串 nonce,注意特殊字符不能包含在 nonce 中
	nonce := GenerateNonce(24)
	timestamp := time.Now().UnixMilli()
	version := "1.0"

	// 2. 序列化业务数据
	plainJSON, err := MessageToJsonByte(msg)
	if err != nil {
		return nil, err
	}

	// 3. 派生 AES 密钥并加密
	aesKey := DeriveKey(nonce, sk)
	dataEnc, err := AesEncrypt(plainJSON, aesKey)
	if err != nil {
		return nil, err
	}

	// 4. 构造待签名字符串:Version+Uuid+Timestamp+Nonce+Data
	signPlain := fmt.Sprintf("%s%s%d%s%s", version, uuid, timestamp, nonce, dataEnc)

	// 5. HMAC 签名
	signature := hmacSign(signPlain, sk)

  // 6. 构建 AdxRequest 结构体
	adxRequest := AdxRequest{
		Version:   version,
		Uuid:      uuid,
		Timestamp: timestamp,
		Nonce:     nonce,
		Data:      dataEnc,
		Signature: signature,
	}

3.2 涉及的方法 Go 示例

go
import (
	"crypto/rand"
	"crypto/hmac"
	"crypto/cipher"
	"crypto/sha256"
	"encoding/base64"

	"golang.org/x/crypto/hkdf"
	"google.golang.org/protobuf/encoding/protojson"
	"google.golang.org/protobuf/proto"
)

func GenerateNonce(length int) string {
	b := make([]byte, length)
	rand.Read(b)
	return base64.RawURLEncoding.EncodeToString(b)
}

// MessageToJsonByte Protobuf 数据解析为 JSON字符串字节码
func MessageToJsonByte(msg proto.Message) ([]byte, error) {
	marshal, err := protojson.Marshal(msg)
	if err != nil {
		return nil, err
	}
	return marshal, nil
}

// DeriveKey 加密密钥使用密钥 SK 与 nonce 共同派生
func DeriveKey(nonce string, sk []byte) []byte {
	hkdfReader := hkdf.New(sha256.New, sk, []byte(nonce), []byte("aes-key"))
	key := make([]byte, 32)
	_, _ = io.ReadFull(hkdfReader, key)
	return key
}

// AesEncrypt AES-256-GCM 加密
func AesEncrypt(plaintext []byte, key []byte) (string, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return "", err
	}
	nonce := make([]byte, gcm.NonceSize())
	if _, err := rand.Read(nonce); err != nil {
		return "", err
	}
	ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)
	return base64.URLEncoding.EncodeToString(ciphertext), nil
}

// hmacSign HMAC-SHA256 签名
func hmacSign(message string, secret []byte) string {
	h := hmac.New(sha256.New, secret)
	h.Write([]byte(message))
	return base64.URLEncoding.EncodeToString(h.Sum(nil))
}

4. 竞价请求 示例

4.1 外层结构:AdxRequest(明文 JSON)

json
{
  "version": "3.3.0",
  "uuid": "test_placement_001",
  "timestamp": 1748073600123,
  "signature": "abc123...URL-safe-base64...",
  "nonce": "aBcDeFgHiJkLmNoPqRsTuVwx",
  "data": "eyJpZCI6InJlcV8yMDI2...URL-safe-base64..."
}

4.2 HTTP 说明

Accept-Encoding必须要支持gzip,否则会产生乱码错误。 Content-Type必须是application/json; charset=utf-8,否则无法正常交互并可能产生乱码错误。

http
POST /api/v1/bid HTTP/1.1
Host: api.ujuadx.com
Content-Type: application/json; charset=utf-8
Accept: application/json
Accept-Encoding: gzip, deflate, br

{
  "version": "3.3.0",
  "uuid": "test_placement_001",
  "timestamp": 1748073600123,
  "signature": "abc123def456...",
  "nonce": "aBcDeFgHiJkLmNoPqRsTuVwx",
  "data": "eyJpZC..."
}

4.3 完整 BidRequest 安卓开屏 示例

以下是一个可直接使用的完整 BidRequest JSON:

json
{
  "id": "xiaomi_req_20260507_101",
  "imp": [
    {
      "id": "splash_imp_xiaomi_01",
      "slot_attribute": {
        "width": 1080,
        "height": 2400
      },
      "bidfloor": 1
    }
  ],
  "app": {
    "name": "未来计算器",
    "bundle": "com.wl_yuan.futuecalc",
    "ver": "2.15.30"
  },
  "device": {
    "ua": "Mozilla/5.0 (Linux; Android 14; 240109PC Build/UKQ1.240829.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.6099.144 Mobile Safari/537.36",
    "geo": {
      "lat": 39.9152,
      "lon": 116.4039,
      "type": 1,
      "accuracy": 20,
      "country": "CN",
      "region": "BEIJING",
      "city": "BEIJING",
      "zip": "100000",
      "utcOffset": 480
    },
    "dnt": 0,
    "lmt": 0,
    "ip": "183.14.132.117",
    "ipv6": "240e:390:3a0:1230:8c0:8fff:fe3a:4b2e",
    "deviceType": 1,
    "make": "Xiaomi",
    "model": "240109PC",
    "os": "Android",
    "osv": "14",
    "hwv": "qcom",
    "h": 1080,
    "w": 2400,
    "ppi": 440,
    "pxRatio": 3.0,
    "orientation": 1,
    "js": 1,
    "geoFetch": 1,
    "flashVer": "",
    "language": "zh-CN",
    "carrier": "中国电信",
    "mccMnc": "46003",
    "connectionType": 2,
    "ifa": "8956cecef52c936a",
    "did": "",
    "didSha1": "",
    "didMd5": "e8b2a3b2e1c2d3e4f5a6b7c8d9e0f1a2",
    "dpid": "f8e4d9c0ab123456",
    "dpidSha1": "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
    "dpidMd5": "5d41402abc4b2a76b9719d911017c592",
    "mac": "B4:5D:50:12:34:AB",
    "macSha1": "3f786850e387550fdab836ed7e6dc881de23001e",
    "macMd5": "7a68a4c5e3f12d8b0e5c67a9123b4f56",
    "osBootTime": "1702051200",
    "osUpdateTime": "1713123456.785738",
    "osBirthTime": "1689123456.125795",
    "nameMd5": "d8578edf8458ce06fbc5bb76a58c5ca4",
    "memorySize": "12582912",
    "diskSize": "536870912",
    "modelCode": "240109PC",
    "timeZone": "Asia/Shanghai",
    "ext": {
      "bootMark": "a1b2c3d4e5f6",
      "updateMark": "f6e5d4c3b2a1",
      "verCodeHms": "",
      "verCodeAg": "",
      "verRom": "2304FPN6DG-2.0.1.0.KLBCNXM"
    }
  },
  "user": {
    "id": "mi_user_9f3b4c51d2",
    "yob": 1992,
    "gender": "F",
    "keywords": "购物,游戏,音乐"
  },
  "ext": {
    "version": "3.3.0",
    "verSdk": "1.1.0.210",
    "installedApp": ["1","2","3"]
  }
}

5. 竞价响应

5.1 外层结构:AdxResponse

服务端返回的 JSON 格式响应:

json
{
  "version": "3.3.0",
  "trace_id": "trace_abc123def456",
  "timestamp": 1748073600445,
  "lengthy": 45,
  "code": 0,
  "message": "success",
  "data": { ... }
}

字段说明:

字段类型说明
versionstring协议版本,如 "3.3.0"
trace_idstring关键:请求追踪 ID,报错时提供此值可大幅缩短排查时间
timestampint64服务端响应时的毫秒时间戳
lengthyuint32全链路耗时(毫秒),可用于监控延迟
codeuint32业务状态码:0=成功
messagestring状态描述
dataBidResponse竞价响应数据;无竞价时无返回

5.2 出价扩展:BidExt(核心渲染数据)

这是最重要的结构,包含了渲染广告所需的所有信息:

protobuf
// BidExt — 出价扩展字段(核心!包含所有渲染所需信息)
// 来源: ujuadxapi_response.proto
message BidExt {
  // === 基本信息 ===
  string title = 1;                 // 广告标题,如 "限时特惠!新品上市"
  string desc = 2;                  // 广告描述,如 "点击了解更多优惠详情"
  string icon = 3;                  // 广告图标 URL

  // === 广告类型与样式(决定如何渲染)===
  int32 ad_type = 4;               // ★ 广告类型:
                                   //   1 = 原生信息流(Native)
                                   //   2 = 激励视频(Rewarded Video)
                                   //   3 = 横幅(Banner)
                                   //   4 = 插屏(Interstitial)
                                   //   5 = 开屏(Splash)
                                   //   6 = 视频流(Instream Video)
  int32 ad_style = 5;              // ★ 展示样式:
                                   //   1 = 文字链
                                   //   2 = 图片
                                   //   3 = 视频
                                   //   4 = HTML代码
                                   //   5 = 视频+图片(原生视频贴片)
                                   //   6 = 一图一文
                                   //   7 = 三图一文
  int32 interaction_type = 6;      // 交互类型:
                                   //   1 = 使用浏览器打开
                                   //   2 = 下载应用
                                   //   4 = 小程序

  // === 物料集合(图片/视频/HTML)===
  repeated Material materials = 7; // ★ 广告素材列表

  // === 深度链接(点击行为)===
  DeeplinkSet deeplinks = 8;       // 多级降级链接

  // === 事件追踪(手动触发上报的核心!)===
  repeated EventTracker events = 9; // ★★★ 事件上报配置列表

  // === 各广告类型的专用参数 ===
  Interstitial interstitial = 10;  // 插屏专用(关闭按钮延迟等)
  Reward reward = 11;              // 激励视频专用(奖励信息)
  Splash splash = 12;              // 开屏专用(倒计时、Logo 等)

  // === 原生广告专用 ===
  repeated NativeAsset native_assets = 13; // 原生组件列表
  NativeLink native_link = 14;     // 原生广告链接

  // === 其他 ===
  Interaction interaction = 15;    // 交互配置(摇一摇/滑动等)
  repeated int32 api_supported = 16; // 支持的 MRAID 版本列表
  string source = 17;              // 来源标识
}

Material 物料

protobuf
// Material — 广告素材
// 来源: ujuadxapi_response.proto
message Material {
  string id = 1;                   // 物料唯一ID
  int32 type = 2;                  // 物料类型:1=图片, 2=视频, 3=HTML
  string url = 3;                  // ★ 物料下载/显示 URL
  optional int32 width = 4;        // 宽度(像素)
  optional int32 height = 5;       // 高度(像素)
  optional double duration = 6;    // 视频时长(秒,仅 type=2 时有值)
  optional string mime = 7;        // MIME 类型,如 "image/jpeg"、"video/mp4"
}

EventTracker 事件追踪

protobuf
// EventTracker — 事件追踪配置
// 来源: ujuadxapi_response.proto
message EventTracker {
  string type = 1;                 // ★ 事件类型(见下方枚举表)
  repeated string urls = 2;        // ★ 需要上报的 URL 列表(可能有多个)
  optional string method = 3;      // 上报方式:"GET" / "POST" / "IMAGE"
}

支持的 event.type:

type含义触发时机适用广告类型
impression曝光广告成功展示时所有类型
click点击用户点击广告时所有类型
video_start视频开始视频开始播放时类型 2/6
video_complete视频完成视频播放完毕时类型 2/6
close关闭用户关闭广告时类型 2/4/5
track自定义追踪其他自定义事件按需

DeeplinkSet 深度链接

protobuf
// DeeplinkSet — 多级降级深度链接
// 来源: ujuadxapi_response.proto
message DeeplinkSet {
  optional string scheme = 1;          // 自定义 URL Scheme(如 "myapp://")
  optional string universal_link = 2;  // iOS Universal Link
  optional string fallback_url = 3;    // 降级 H5 落地页
  optional string download_url = 4;    // 应用商店下载地址
  optional string quick_app_url = 5;   // 快应用地址
}

各类型专用参数

protobuf
// Interstitial — 插屏广告专用参数
message Interstitial {
  bool fullscreen = 1;             // 是否全屏
  optional double close_button_delay = 2;  // 关闭按钮延迟(秒)
  optional string close_button_position = 3; // 关闭按钮位置
  optional double skip_seconds = 4;         // 可跳过时长(秒)
}

// Reward — 激励视频奖励信息
message Reward {
  double amount = 1;               // 奖励数量
  string type = 2;                 // 奖励类型(金币/道具/生命等)
  optional string description = 3; // 奖励描述文本
}

// Splash — 开屏广告专用参数
message Splash {
  optional double skip_seconds = 1;       // 可跳过时长
  optional bool countdown = 2;            // 是否显示倒计时
  optional bool logo_visible = 3;         // 是否展示 Logo
  optional double click_area_rate = 4;    // 可点击区域占比(0~1)
  optional string skip_position = 5;      // 跳过按钮位置
}

// Interaction — 交互配置(摇一摇/滑动等)
message Interaction {
  string type = 1;                  // 交互类型:shake/slide/click_anywhere/long_press
  map<string, double> threshold = 2;     // 触发阈值,如 {"accelerometer":2.5}
  optional string alert = 3;        // 提示文案
  InteractionFeedback feedback = 4; // 反馈配置
}

// InteractionFeedback — 交互反馈
message InteractionFeedback {
  optional bool haptic = 1;        // 是否震动
  optional string sound = 2;       // 反馈音效URL
}

// NativeAsset — 原生广告组件
message NativeAsset {
  int32 id = 1;                    // 组件ID:1=标题, 2=图片, 3=数据, 4=视频
  optional bool required = 2;      // 是否必须展示
  NativeTitle title = 3;           // 标题内容
  NativeImage img = 4;             // 图片
  NativeData data = 5;             // 数据
  NativeVideo video = 6;           // 视频
}

// NativeTitle — 原生组件:标题
message NativeTitle { string text = 1; }

// NativeImage — 原生组件:图片
message NativeImage {
  string url = 1;
  optional int32 width = 2;
  optional int32 height = 3;
}

// NativeData — 原生组件:数据
message NativeData { int32 type = 1; string value = 2; }

// NativeVideo — 原生组件:视频
message NativeVideo { string vasttag = 1; }

// NativeLink — 原生广告链接
message NativeLink {
  string url = 1;                       // 落地页 URL
  repeated string clicktrackers = 2;    // 点击监测 URL
  optional string fallback_url = 3;     // 降级 URL
}

// Ext — 顶层扩展字段
message Ext {
  optional string request_id = 1;       // 内部请求追踪ID
  optional string encryption = 2;       // 加密方式
  map<string, string> debug = 3;        // 调试信息
}

5.5 完整响应示例

有竞价响应:

json
{
    "version": "5.3.8",
    "trace_id": "t-1779959917741-000-00000",
    "timestamp": "1779959917855",
    "lengthy": 0,
    "code": 0,
    "message": "成功",
    "data": {
        "seatbid": [
            {
                "bid": [
                    {
                        "adomain": [],
                        "id": "splash_imp_xiaomi_01",
                        "price": 107.69,
                        "currency": "CNY",
                        "adm": "",
                        "cid": "5fc103ee5255c43bdca4c5d888826f72",
                        "nurl": "http://localhost:30040/event?ext=bG1LHRxCAvd_pmNiLwtdDeXB2NCbQ5xr7aZ-451BLI49ofMZfDpGJCc1ZgnjirS-mFrsEqrUbGRortG1gAH8t3IWCz_Vkq6g6XM_LVtrGXR8M0TZFCAhpa7pl2aLCSfklxZFojuOFuzYzv_I2qH62fv7PmxoCLrpcQ6JjUzJe_2RWFq8QT15EVyNQjLLCV9tS11DS63g0YcC34S0gFOWwxZFrxfrDdSmbGl0t3jyB-Q5vZuk9uDGBViR-BIejwqOT__dbB6vtZ41ZDajiUZSEZH0SmwbFmLOQBS81teneyVtace0pWKy6deBUuiaWl_4RRHiEaOESn7ryvHjfogw2G23o4cpujxUGKf2fNjnOdKAcXS6-TIOevD2mUpIgA5A2gLsTAlobacEFhzHYnG9HMSV-Z_Gr-5ETQqzjjDk1Ku-poz47o4VviJB5K5ODvMxI6_MX63t8X96dIONuDMz2Kx271eR01l9HXLJ1aUxa4KmvcDm8jfWkEwhMnhYcKAKf2ui6n6zQtFKrHYzoxeTtgNsZxcCwdK2WiVd-XxkJQxdZzOvJXzde1ddMbMWR0P8tlmpXw3IQXjNw96mk91S8kij-XB6_cgmY3IZ5gxnmhH1TTNMYP5jag7rxJ3My4SZZgQ9LsJm2x31UyyQtsI23d8lJtlAaGHWOIqSIZ7UiWxKdDZgq9XgbVZ4ome22fJq3XvHQ4tMUh4MJu8-BAXriqkyCQ7CXp96ABWF2XW1Jjx4g3Kv5Ert6mV0byNclZ39kdosJxmq1eYIKwY3MiHMbZqShvbFFwIuGJxlmAF6zqL8i0s1yKGLE9ebofeMCjeWR8FF2cJRTffIhNvmfBpgxAR15MxqRto2n2Op6z3LqjDnI8SlzkmVYzyPCiebvvZSStBAOdftBLvYhi2RhQU0timF1Vy_dPBvUaztx6w8efjJK370ALnjmvAjOCB_t1bBvWsnjMNOvmKaYs9gK3IIBqhDLILieYzLINIgAfDCIkwTEV_v-kpRJ0pRdT1siYujiTxiAgNH5e3-kjbZ9RnG-B5-zWN3N6JrzELJtvNieKneuNgPbJQtWi0M9ZhJ6cXOEhLtkGHWL1rN55-x0zTU5Kg5xxdUhbUm8wk7govjTq6AFIHFyDfAFPhm0NztBkR0JPN6iS1bGRhADHki1xFmfgubM_1OfuS_4tuXDGAKyQTYwkHz5-CikEhPAJwY_YhWGEWlAhZhK_xCVltXbaqEZyGn1QG8NjhK158zz-0_bFhPHwO2NEctDvpnMb-tKxBhkkbCdMaMH16QJrHczegX9ZU78kazPg63-jqRofq8JxcO4YaksopIhQcD1Z_QYIO2TST5HDXsSJ0xtfdZSPG41DodSR1QIQTQJf7iEZMRfAVYfzzlD21tp5MbWhuExkPTYM0GfnzeDN7HHlOW4Fk4Uq3R37sutHWwIdfUU87_HiLw&t_id=t-1779959917741-000-00000&type=win",
                        "lurl": "http://localhost:30040/event?ext=qxI-CHJIApj4gTRt22y0_nPtHNqptahex4ZWVpzxnWiXtSN0AC36MrJ6MvRO8f0M1d5cizGSKnbGE0O5GkTdFxE5UcamwL47aKqq9xZv8mgNB1hjsBb0uA6IbFIp0j9dDjKYCXb143YIftlc6KCdhQhLS4WLNXyOBW-oK-wI2FGo03bKvvHtAFWxNvuHx1snDIeFiFq-v2P1_ENNCPfXd2w_yKXU7oscFrVc5m4KrwKFEMmi7ZN7pApybnqswkvX71mkEBFImk3EokarByfhlrDrU3sAMGMzifCja5QqggWinNV3DjalfA8leGrgm0lCHP4GOPI9LIbLLQsA-PUXLARD13Yvegon6mcxJQvpzCeMF4yhAL9xRzwzPPhk6PNvgwFt-B2y636UrnmYIzXkIFwnE2P4sxajjT-aPzEGgMzxChkJQaaiLHdTQWCDzljeddla4xXllMfuG2fTUKXrI7HWYV1tfXw5tVPtN7CI27-l-GxeznpeP-AsrhmsIhj6JkW6TiVg_tY5-Dz5iwj_ignVfItQ9yaEbqIkfVIvpxdWU__zbhb-jaZABjVEMqSwRiDsF12G-HcW8CqLnK3RwHgaFSZp_wqS6fbX7shfhbPEvaQH_tbcOOipIn0OlVy3RdiFRkrk2uOIfBsVcIpQcCdWGYXo90XRCorKacXn_rLxQAw9GQ-kcnLLBpvaw-ggEMh_YMBhfY-nJukKwIxkdHtpDRj1ahxOJb_GmFtcJ6JTHb40C6RFwtNkqxlJVmx4WOlaXnhAhS4ri1U7ZADSn8FQjMVlpZPK7b4WGhsiFFwHQIhFsxLB12HZ_bhsSTqPvbSf3eZjZkuwzqzKH-5kQ8SXEeB9GPsMwDfAgg9CWP0GoKpXp1qPINJC60XV8PpfXxJt3_0I6am32v_2-4RuX-0G9okUmeyDsfHy0Pl4oykTKyOCynhSZU589sMgO54grtXC7-sT3yUP9Es4pnjY1LbHXSTOwune9OM9jM7GA6eHlUigFUtc7X-6tUKzu7F5tkJ-q884Ipug2FA6u4V9CbNAPV0RfPBdVXOMKFTMfosBe9cbeJGofo4b4LxdodxtlN_6UanHn0rZO_y1LrZkkd-AqddpZhz5OO3gIOdACMCb0h9Cuj8Boyw8VEL9x6fwokPwP3DUERZGHYZCEiEwse4xUB8Q-9uByB1pdhMsfeKeoQLNWIsp8PRUTgGkQ3VoUODWQkgJ9CQHXOh4cMB1Xi0VPme1Yo7TB00mKVwUTvIqbDzQ3uymVG6Runm_387j8OuYcjWH0CY0Izn6JAdRlvJlAtvc7iWu5EfMUczmAX-viHxWlyh4_6wMTTROOtPC5c2U-WDnqFwEGUSQGP2MZLXEQiByBeoB2gjzbXwjDbSlw2nj0_eDjDVRhDsLhT6LnvJdKWyxDKYjwtIUIiWN51hNc8w8SirHp5VfVA&t_id=t-1779959917741-000-00000&type=loss&loss_code=__LOSS_CODE__",
                        "ext": {
                            "materials": [
                                {
                                    "id": "video_0",
                                    "type": 2,
                                    "url": "https://static.66mobi.com/creativeAudit/10084/720*1440/607bf5a57638448dbc365d49683d54e0.mp4",
                                    "width": 1080,
                                    "height": 1920,
                                    "duration": 5,
                                    "mime": "video/mp4"
                                },
                                {
                                    "id": "video_pre_img",
                                    "type": 1,
                                    "url": "https://static.66mobi.com/qualification/6413a233c9ba498e8253634790ff7c1e.jpg",
                                    "width": 1080,
                                    "height": 1920
                                },
                                {
                                    "id": "video_end_img",
                                    "type": 1,
                                    "url": "https://static.66mobi.com/qualification/6413a233c9ba498e8253634790ff7c1e.jpg",
                                    "width": 1080,
                                    "height": 1920
                                }
                            ],
                            "events": [
                                {
                                    "urls": [
                                        "http://localhost:30040/event?ext=d6aUzLAHR_p1EHon8WfV4QFPClYa6DtKuF0hoS8hIkWC7vesGQfxy-ytsUEXs3jhNDZkjiLRO_L1ErwdgacFib_a3to1KI1oGAYa0QmW7iWDgbO7YuTCzt9XpnJm0Us9-QUNF6SVlGjc0muNMdSgy8XXi5zjbS9Nu-wYhdDXBkp5uNoUxLoixvS4osD4CI4MeyDYz5baefjXgq09nStL_oBt8BZBWe77vWaW7Ox856tCPyJwMkh1bTVW-iKsyTQj_c3aipuYTsuGm2vhIOo274jTbS22bc5lbjGIDTwW0AjTUgSAVbCBSOdb_l5Zdc4l3HfbR_8dkk7elGy5JtV0P8pXgap0LZ7_PIM-C8NE1xgVCL__ZtzYfuvNa4F-SxSACx6oeMy8_URgeyJiosmvHNqAvcxLkzmW2SO3npW566T307E3CzugTjV0ggziDlDlK2CF8IVzMX9ifVNt8bqRaSqZIQjZ5VZHY_XT0y47D3SqVvSOj8Ax1qO_9W6weCu_sk6tNuiQVTOxcIa0jf-FWQueKU7bCeZY8Y7rcFURgfSG41RVT_rq_e72VGY_HHeLhujJ61ZjrLFA0nnbSZdMC37hw7JkGvlm5wszmhWYuG7uhKIdYOR5JPrKPbPmck3Cglt3qcsvQeShjsM87bTKWcQZQMysTe__bWvIm5ReTWZEMNsEAjKmEzXxHjNLl1QytRegV54SWdOZVEB2_XRobtFqnrHStw2lUFAdfQCjoSrSfJFWTprCQ0isk3850E8hawgSDqF1v30JyawwQhq_lj199r_jbnKehPLywdhblRJd7RX_NuSFRwG8ku0e2zPjl66NsVThbxrTft2zx1xlGjg5aQePkGUL53gXvt4A0Jv0n85dX9EnajoM3r6Q7XxbN4l1sTa2k7wNvkdtGkdMbPM27mbZMSpwN4OCa6dVxlbVJc4dWW30vvrlWwqIbFcYCORqF80Rj9_3cioI6vAOqF7C1jX-2xoGPUAUWbK3sDa1KnntlxxIyFL-U3SgGVrXigWKw9BESaes0U3-VYt66EQZOtn7nxV5ZIa22U-LR0OR1L5GS7fckeTODBruPS30JATfsp6BIb4XbXgqlGa09aF1UkWgrXYguc3YpiTo_49EghNLdOGyWUBST042hB_GBCpOhzFwzZ5O26T7avPcAIcC6JMwNuat4jQpu2VF1JtYXMO3CF3tA5aBNHSpqRQRbSYVMgdgNHgb_zZqncfTzRco1LNlqJ-x4sJbvBCzxIycJBwWkSXyP5k9Oc9GZIUxiJBFVfP_iO0gVqCaOEE-TSkGAAc9MkMdnKivaay66oSuxn6ClsOPOje8wNhTQPy2JDuDZaMVcxMu07-H3v4DF6myyxaHofLrzgYHfRYyydOdd-5FlEGfciS8C8XaNr9A_mWYaoZXrGX1tTHZXqBuNKJpTwd54cKkmRxxS37svmM7G-SKJxsfSsvR4XOQRtlrYIhThVC5kbmQ8oz6uxd4tL5zryqeImbpIne7eCwJi_Lk7gsnYcbufNUHdJzCztumkiiDGhU3aGn749QjOEJrh3__GA&t_id=t-1779959917741-000-00000&type=impression"
                                    ],
                                    "type": "impression",
                                    "method": "IMAGE"
                                },
                                {
                                    "urls": [
                                        "http://localhost:30040/event?ext=r4JxyA0jDcadfjXgW4PuLHjGQUQPMfc5Ts6ZZgKOnKkOwISZDEUt9BXcVly6y0WKAiUgpq4H2MmfwhSfOwhzZBqiFZdX2kN0FcJgHXGo71sPITJQ6qDV7lGMYL24ZawnHujUA1VWMylr_3YwMFnPUWDfc8EHv_6irGGfsd-y6_TnhLKMy4yzx6ncIbec_XCtSlCOCcC7PGkSUH-g4pSHlEDDcVZCjrvkbKbYak6svnZDqQ0kWZ1hPJHTu9etJagmxcx47tf6ra_1lyj-qDhNKjlv_NaOM5Apil1DWX0OrLieHqFr26HjualeDCoWEG94SgQ46iNKalAVH6e8QqByBe5FBmVLF2f5hR1gJxpNa2bqlEF70neJqEow9rj4LU8MEvqygaQ-D71wVt75FDg0ctViN7Vr_ROe6rhLGd8rr4XjrtzcdrdfTzAoC9TwOEYgcALDwt4BPgOD9yvtL-DCfCpJlsyxMzVbr7m1h58iRzplTfeAhQ3n3ou7m8rZorqWgW66Xd06fH6C0lc05EBNBAhcLSccGZ1TpiNx7j1D7p6H2qT_f-JNziVch8LY9ha3ysoFF4t6pbj9HAg-up1n5WxQ4vJcMhwTjTeTZFj1awNQGboelqYJysSANxnaocrfN0B0878lJ9hACKULeBUUeileBWPqGR9KUO8BVtmkx6nYaPdgIH13jnOuFTmI9o3yzJzTqPcuWI5h1Tk7hnd-pQziOMF7NqYsR-tPUCWuKwErQoC_XvpG770YMTzameNReF6pgRLXmOeaOPGd-CXE-9N1ip-5eT-0V67RzdZ2k5-03XWpyhDWgxmVvZtp1fBNCo7FkzLepPKMSuYwVJSuTZhVvCQT5UvaCgRU4lW0jmpzIv_0tPhCX8lnGQcfdrtI0tvwnTHoNaqNGTR3ioMf9cB9P4xs3bcNfMCag2hn6j_G00Mq0su6DOroraLO4_567CQCLgXf0jX0LAxrD7y2JlewpIKtLwdy-jkxNUIL_sV_y1UnnB6zCvCinw3tPN9jCr7W6jkirWJY8OeaYsxTIKqo9BumW2YHr4awXuV7uMGtTfsa1e2_bKV1EKbLgcdyLAItpz6kd9q2lZnWE9yFKRtLw9qf05g68v4HRNiPM6HxNi2ByOPXKEJlA84izYhREe_6LWJ2_tq8ASLM4UC3tiuQJnNzcEphI6Lh_-k2VXIUJH5wFepEPjBPa-IGWQcfRU1w6qwfpDLgJ3S7ZcsE2tuq8VNHzAqhiirkMyD3IHHyqlPcNgv8A9BwIaUDGPYIPc3TxCYoASirG7dEg51VGUMLUeeVVjjE6RWWspHQWDpFlYH_r7lCHDsm7mIKACRd7IFPgRsbJAGO9Q93LYOTiHBgXnRY6YNluSgvecHEThIx1Iydg4oWwqptB9CvwLS0M38MHcuauUw3zXuAyh4nqRIOS6oBxHKQlbAN0w66vGxlokG8_VVU0DVo1Vbun0ACcv0AHmr0Rce5rIWQC-sDncbons9ofJMNK22BRTOxO6ho-8wiEY9waOXMk8L3B0GZM2vgAB-BuRKinjXN1jGrTanuynAJXhII9TYsbQ-1x2Dubyx2zSsg8dSdTGPF81zjZvx1tYkyBo9jzUoEI4kXn2g4JSLUFLoxpI7K8kdsTi1Mr0h0k1flJuS29yg6ZDs2UYq8HFDafAO4HcdgvJMZttPIgeGpQScCUEJPzIqgGAFMRN8YqHVoaPEsro_TT7rAlmqmD5lmPMuRTlnKVhplsjkGZ9CqhD19L31Lgzwz3qTY7HOxkhVsVEJsSnmqI2JD6O2MjQpCBSHNkNc2SfRYdJQW8ohFE_GcIaVT5O6Q&t_id=t-1779959917741-000-00000&type=click&down_x=__DOWN_X__&down_y=__DOWN_Y__&sc_down_x=__SC_DOWN_X__&sc_down_y=__SC_DOWN_Y__&sc_up_x=__SC_UP_X__&sc_up_y=__SC_UP_Y__&up_x=__UP_X__&up_y=__UP_Y__&utc_end_ts=__UTC_END_TS__&utc_ts=__UTC_TS__"
                                    ],
                                    "type": "click",
                                    "method": "GET"
                                },
                                {
                                    "urls": [
                                        "http://localhost:30040/event?ext=A9-zuGMmMDoV03X6tWsxeLeWNtSy0-LBGcEgznQ1vacIo-zyaK9bJBJ54i5GZ9QkxpQ97KwsfdvZtY33GxHsj6RFFsJkzpahy1dX1ksdK98J-o4-War98k4dYnlbDesSmc2tOBrEBkJmIBXlixzCyGhMh9Aum7Stq19iM4pnj0uoT_xr5e6nuGZXi2HtaKbyfRUDegkpvPTtcHgGUYccIHATlMl6dqCy9UFlI6lVqzwPbaHip7Y0bEl2IObXaqGOlOqdSgbAVjBehRVg0dQ9Qc5LRyWNe3e7FU2KMXVDy3FdPlOu8i2Tln9GujmUuzwXRzR9pQgJ0Or8LtDi-AYWZKWCSWRH0EzjRs4xpfd51NbwOcC30L3yPcy7zGMbdFcj5DKcsEdTXBqaA2VqEiC9_oWgSK71VsMCYfM5CaNIxNwpUVLxQocKzha1mKBKhpgd9apZNXDCLYY4FZPESpP63ZgdfR7Y3KcZoCKw1ZIyc81BccMiurUMKUVSztIKKoNsl8B_B1Fh0cVfJTr5oMFSGZb22py3JtCRABRo_puy-pwV8bM9083yWWcN3I0mMBVPGuqIK_5Z4r6suAf5x4Gh7ljOKSL2U3loMK7gEaYOnG4M9gcGWk16IxkhDjsmeqcFgrRHtxLKr3tsqHUShhJLx9RlAyHvqgs2bBN217y2InjdhbHlhuiu5uKp9jt2nSBo9dHnhiz34qzW77vknJqGtrhzHpi49cUCggYLzKWPCcZlB_AkrbeJEPa2ejLVfJdbM-1LZWN1fJvwOhLU0F-YNP9fDxCzpIiY99ekaTROIWXSaCVbY3GIzaXOLQyq3YtBViDEWRsK78TGObbIxRCbtPgNlhcT1FnGTg3xN4jCPG-IxALdZUzt2uEs_Ne53bD9wrsPcdfrjRXSLj3C0NuiY3k7M8ar2brb-TPUL9XGQQHKBbCLIYYrUmjdUzDPryiC1Osf3DAVjWjp3wuMmZxz51oFBLXraQsgl8hRoJaRwc5e1fIjrOsG-q8fDbx06uBt-JBb0EXbwRJ4Ty0Zvtxj5g899VSHYNn5sV05-VrXibWH27g-w6EzlfZbAdcUsqKqbBH8ysNDLYSiu3KC7b5Q_2Lo7A1FMqEGX-YMU0Sc_pflD2P3xldgiHMq6dtqHkmNFRkUunQp00BBqUmYDsvYbqi04GkewNIcmYUQem-1pgAZN5hrHkr7CHux1rgvQ3YNfaFaqUmEMQa2ymENnJLLTDPz9MD_Ot3ZwrR0NmpfTKMF1bZi_1cfmc6qSvaA5WUOZmZda_8Hb79Wwf4EE42KnbXsT4To-SqEEY8JbTWZ7M9Qyvew_KX5r0w49usLS93JtQ06l-uFSjM-y0amAGC0rlECE7-1-kuoedjYwjEr8PCoR33DyEAeb7JV-wXaAuzeoIupGGDXkI5FX0QiijqR_QObwprxp2JA58g_Vh-XuZCVzvWSEy8ITyOkfI4&t_id=t-1779959917741-000-00000&type=deeplink_success"
                                    ],
                                    "type": "deeplink_success",
                                    "method": "POST"
                                }
                            ],
                            "native_assets": [],
                            "api_supported": [],
                            "title": "淘宝好逛,好物超值",
                            "desc": "全品类覆盖,超值好物随心逛",
                            "icon": "https://static.66mobi.com/qualification/098807d535af4c93aac2227a063d1524.png",
                            "ad_type": 5,
                            "ad_style": 5,
                            "interaction_type": 1,
                            "source": "淘宝",
                            "deeplinks": {
                                "scheme": "tbopen://m.taobao.com/tbopen/index.html?source=auto&action=ali.open.nav&module=h5&bootImage=0&spm=2014.ugdhh.2200803434164.226906-862795-32896&bc_fl_src=growth_dhh_2200803434164_226906-862795-32896&materialid=226906&h5Url=https%3A%2F%2Fstar-link.taobao.com%3Fslk_actid%3D100000000323%26spm%3D2014.ugdhh.2200803434164.226906-862795-32896%26bc_fl_src%3Dgrowth_dhh_2200803434164_226906-862795-32896%26activity_id%3D521012716",
                                "fallback_url": "https://tencent-ssp.66mobi.com/lpNotice.api?reqId=xiaomi_req_20260507_101&pid=48413866&v=I9M8fxEwCV52G9m5ykp5JEhKsYab5-MyUJNYMnGqrhwjhKgDStQyOAz63D_tnMuwmhd_4LyVNNdOMlKRrqkA_kQkgpo0Lwa42NcHWCKK3BQ4cLXdPwWkaf-32Rei8XPuwGkmRaffg68JyjIvR9AprGa2kfnL06i5niXx5Qwrd8WuvsUaIraoJKjf9C_B1cbqAO3R9XebWQROw7P48v8nS_HbzkZ0HplpgXd_KjBfWD1zIsXLP7bmuAJlSK2jetAZBRd8EIJQxNTIrRs8ywCr65IFA-AqFCwDjkgLAMgR44tTNbgKX7uoATARN9jZ-X3SCSbnJ_I3yaZfaKokwL479ROdFRMFHSLFbp5jYi5S0FosCm2y3UZE544DdK2SVvN2wrctg2MWMIit5qvhePAZYSddUFTE43iFXQbp3rI3J9GsqcvZkgtFS-fWPpPMY8Py0ymImlk_OI2aPLtfdbijO5kNzpbWEWguXib-e-39NAnHb4YcaFAdF1fdCPrz1KtaVA17Ynjw4Ox6JzpkhE3pKI0KsGwB7PFp5GVWKks4Xm4fgKWoz3mJt4YW8xZtqf_hzaMG1pTxenZe5cjUHRNQyI_dEpaLV3xKPh39qwco5fRQQkhcNxvyat92Q0omc1Ms3p79iCEogcZQVQDSQaoXn_krwtPzoT-ELlWSnglLR1y7dozGT08ofxmUvE5p_MX7XlHMjhiTdTTZq_xR1FNTpXPVPcdk6S83Fqt8wH2fNOGiCWFqZpdHFab8TXeqroy_Cgf0TWhNw8gTiRuknrCjqZUPsj-8RIPIzYgZjPwhYv3bc7NZhU5_ceCtucTTsPUaIUF3QyTXxJaMvVF0NzKWT_ZkejmD0jVfY7VNX1-FrQpTeZ8miE58VSB-DTN4w7EAF-tXCf_FOY6AsgWAZIRCUEcOAgtx-ZmC54SkN0cDicgN5jxKM2k5pxpmFlFbhGomWtuRTtKnGauFJTxY&target=https%3A%2F%2Fug.m.taobao.com%2Fapp%2Fstarlink%2Fwakeup-transit%2Fpages%2Fdownload%3Fstar_id%3D5292%26targetUrl%3Dhttps%253A%252F%252Fpages-fast.m.taobao.com%252Fwow%252Fz%252Fapp%252Fug%252Fcrowd%252Fnewuser-foreign%253Fx-ssr%253Dtrue%2526disableNav%253DYES%2526forceThemis%253Dtrue%2526x-preload%253Dtrue%2526x-sec%253Dwua%2526source%253Djulang%2526asac%253D2A24C032ASAUX2BUE25HHF%2526spmcnt%253Dcrowdcarry.newuser-foreign%2526itemIds%253D846840263141%2526spm%253D2014.ugdhh.2200803434232.846840263141-2060776-1393509178%2526spm_back_up%253Dcrowdcarry.newuser-foreign%2526dpa_source_code%253D12890%2526imgid%253D9cf5abe48c73d9351c7145f5b81c8801%2526slk_actid%253D100000000207%2526bc_fl_src%253Dgrowth_dhh_2200803434232_846840263141-2060776-1393509178-283313094-db4a9cc66cc4f51f0484099357fc35f0-53001-0-ADX_DSP_EXAMPLE-2022121301-0-0-1-588257-0-0-23527-0-d522978_snull_qnull_t120416_r508774_c532770%26slk_force_set_request%3Dtrue",
                                "download_url": "market://details?id=com.taobao.taobao"
                            }
                        }
                    }
                ]
            }
        ],
        "id": "xiaomi_req_20260507_101",
        "adx_ext": "meBE_JBJpI4Qz9-7qTM6dY8Wj_oTbm6m11rj-oxUIQntDygXRxvnm1zaUMgk9Jq-J2kw8nXCJWnm7GWz0Q6of2CaevXIk8IFFpAnYY5C582J76HdKK2IpA9PBAL8U5xRlLzWb_nfzkeQH3VaTO8S42rqyUs6YO8FMlbTP0Se78L5wiNvlDBxLQgr85I="
    }
}

No-Bid 响应(无竞价):

正常响应,放弃此次竞价机会,建议调低价格

json
{
    "version": "3.3.0",
    "timestamp": 1779888806892,
    "code": 41000,
    "message": "无出价"
}

6. 事件上报

广告竞胜使用GET方式调 NUrl

6.1 宏说明

参数说明
__LOSS_CODE__竞败
__OS__客户端操作系统的类型; 0–Android ;1–iOS
__IMEI__用户终端的IMEI,15位数字; 取md5sum摘要
__MAC__用户终端的eth0 接口的 _MAC 地址(大写去除冒号分隔符),md5加密;去除分隔符":",(保持大写)取 _md5sum 摘要
__IDFA__iOS IDFA适用于iOS6及以上;保留原始值
__CAID__用户终端的CAID,适用于iOS系统;版本号以及具体的CAID值,以ver_CAID(原始值)这样的格式,每次传输传两个CAID,分别为当前最新版本号和上一版本号的CAID值,两者之间以逗号分割。示例:CAID=20210301_xxxxxx,20201201_xxxxxx。 _如果当前只有一个版本的CAID,可以只传一个,如:CAID=20210301_xxxxxxxx
__AAID__Android Advertising ID;保留原始值
__OAID__用户终端的OAID,适用于Android系统 ;保留原始值
__DUID__Windows Phone 用户终端的DUID,md5加密;取md5sum摘要
__IP__媒体投放系统获取的用户终端的公网IP地址,用于比对智能路由IP差异;A.B.C.D(4段点分),如12.34.56.78
__UA__数据上报终端设备的User Agent;字符串,需URLEncode,如 _Mozilla%2F5.0(Linux%3BAndroid4.0.4%3BGT-I9220%20Build%2FIMM76D )
__TS__客户端触发监测的时间;UTC时间戳,自1970年起的毫秒数
__LBS__用户终端设备的经纬度地理坐标;十进制保留6位小数,西经南纬保留负数,用字母x分割纬度与精度(先纬后经,最后精度),如35.758134x-122.406722x100.0
__GEO__用户终端设备的经纬度地理坐标;十进制保留3位小数,西经南纬保留负数,用字母x分割纬度与精度(先纬后经,最后精度),如35.7x-122.4x10000.0
__REQ_WIDTH__广告请求中的广告位宽(请求数据中参数 pos.width,如果请求不填,则无需替换)
__REQ_HEIGHT__广告请求中的广告位高(请求数据中参数 pos.height,如果请求不填,则无需替换)
__WIDTH__实际广告位的宽,单位为像素
__HEIGHT__实际广告位的高,单位为像素
__DOWN_X__用户手指按下设备屏幕时的相对广告位横坐标;如无法获取时,请填“-999”。
__DOWN_Y__用户手指按下设备屏幕时的相对广告位纵坐标;如无法获取时,请填“-999”
__UP_X__用户手指离开设备屏幕时的相对广告位横坐标,如无法获取时,请填“-999”
__UP_Y__用户手指离开设备屏幕时的相对广告位纵坐标,如无法获取时,请填“-999”
__SC_DOWN_X__用户手指按下设备屏幕时绝对横坐标;如无法获取时,请填“-999”。
__SC_DOWN_Y__用户手指按下设备屏幕时绝对纵坐标;如无法获取时,请填“-999”
__SC_UP_X__用户手指离开设备屏幕时绝对横坐标,如无法获取时,请填“-999”
__SC_UP_Y__用户手指离开设备屏幕时绝对纵坐标,如无法获取时,请填“-999”
__MANUFACTURER__手机厂商
__UTC_TS__当前业务开始时刻的UTC时间戳(例如点击按下,开始展现)
__UTC_END_TS__当前业务结束时刻的UTC时间戳(例如点击抬起)
__VIDEO_DURATION__视频 用户点击时,视频已播放时长秒数

💡 提示:以上宏变量主要用于反作弊校验。非必要宏若 URL 中未包含则无需替换。

6.2 竞败原因

ID广告竞败原因
1001返回广告超时
1002请求广告超时
2001广告主行业不支持,或行业id错误
2002广告主未过审
2003广告主审核拒绝
2004广告创意未过审
2005广告创意审核拒绝
3001广告主屏蔽
3002广告创意url被屏蔽
3003无标题,或标题错误
3004标题或文案触发敏感词屏蔽
3005投放广告的包名被屏蔽
3006无落地页,或错误
3007无图片地址,或错误
3008无视频地址,或错误
3009下载类广告位无下载地址,或错误
3010下载类广告无包名,或错误
3011图片尺寸/类型不匹配(错误)
3012下载类广告包名未在商店上架
3013落地页协议头屏蔽
4001异常过高出价
4002低于媒体底价
5001竞价失败
6001其他
6002快应用过滤

6.3 事件上报机制

ADX 采用分布式 URL 上报模式,而非集中式 token 端点。

竞价响应的 BidExt.events[] 数组中定义了所有可触发的事件及其上报目标 URL。SSP 在相应时机对这些 URL 发起请求即可。 Url的数量可能有多条,需要分别触发

6.3.1 上报流程

触发某事件(如曝光)

  ├─ 1. 从 events[] 中查找 type 匹配的 EventTracker
  │     例:{ type: "impression", urls: [...], method: "IMAGE" }

  ├─ 2. 对每个 URL 执行宏替换(见 §6.1)

  ├─ 3. 根据 method 选择上报方式

  │   ┌──────────────────────────────────────────┐
  │   │ method = "IMAGE"(推荐用于曝光)          │
  │   │   → new Image().src = finalUrl          │
  │   │   → 浏览器静默 GET,不等待响应           │
  │   ├──────────────────────────────────────────┤
  │   │ method = "GET"(默认)                   │
  │   │   → fetch(finalUrl, {method: 'GET'})    │
  │   ├──────────────────────────────────────────┤
  │   │ method = "POST"                          │
  │   │   → fetch(finalUrl, {method: 'POST'})   │
  │   └──────────────────────────────────────────┘

  └─ 4. 记录日志(时间戳、事件类型、URLs、状态码)

6.2.3 各事件触发时机

操作触发的 event.type说明
广告渲染完成且可见impression通常使用 IMAGE 方式静默上报
用户点击广告区域click点击后打开落地页(deeplinks 优先)
视频开始播放video_start仅视频类广告(ad_type=2/6)
视频播放完毕video_complete仅视频类广告
用户关闭广告close插屏/激励/开屏广告

7. 错误码参考

7.1 响应码(AdxResponse.code)

codeHTTP 状态码含义可能原因建议处理
0200 OK成功正常解析 data 字段获取竞价结果。检查 seatbid 是否为空数组判断 no-bid
41000200 OKNo Bid正常放弃此次竞价机会,建议调低价格

7.2 常见问题排查

现象可能原因排查方法
参数无效 1000签名错误确认签名是否正确
请求已过期 12002请求已过期timestamp 过期
间歇性 401nonce 重复确保每次请求使用全新的随机 nonce
返回 400BidRequest 解析失败确保加密的内容是合法的 JSON 且字段名符合 snake_case(Proto JSON Mapping)

8. 调试与排障

8.1 自检清单

发送请求前逐项确认:

  • [ ] version = "1.0"
  • [ ] uuid = 分配的广告位 AccessKey(非租户ID
  • [ ] timestamp = 当前毫秒时间戳(Date.now() / time.Now().UnixMilli() / System.currentTimeMillis()
  • [ ] nonce = 24 字符随机字符串(每次请求全新)
  • [ ] signature = URLSafeBase64(HMAC-SHA256(sk, "{version}{uuid}{timestamp}{nonce}{data}"))无分隔符
  • [ ] data = URLSafeBase64(GCM_nonce(12B) \|\| AES-GCM-Ciphertext \|\| AuthTag(16B))
  • [ ] 加密内容 = BidRequest PB 对象的 ProtoJSON 序列化结果(snake_case 字段名)
  • [ ] Content-Type = application/json
  • [ ] 请求体为 JSON 格式
  • [ ] BidRequest.id 全局唯一
  • [ ] BidRequest.imp[] 至少包含 1 个元素
  • [ ] imp[].slot_attribute.widthheight 已填写

8.2 日志记录建议

go
// RequestLog — 建议记录的请求日志字段(Go struct 示例)
type RequestLog struct {
	Ts          string   // 发送时间(ISO 8601)
	RequestId   string   // BidRequest.id
	Uuid        string   // AccessKey(广告位标识)
	HttpStatus  int      // HTTP 状态码
	ResponseCode int32    // AdxResponse.code
	TraceId     string   // AdxResponse.trace_id(关键!排查必备)
	LatencyMs   uint32   // AdxResponse.lengthy
	HasBid      bool     // data.seatbid 是否非空
	AdType      *int32   // 有竞价时的广告类型
	WinPrice    *float64 // 胜出价格
}

联系技术支持时,请务必提供 trace_id 和对应的时间范围。


9. 版本管理

项目说明
当前协议版本version: "3.3.0"
API 路径/api/v3/bid
传输编码JSON (application/json)
适用终端仅移动端(iOS / Android)
兼容策略向后兼容更新仅增加可选字段
不兼容变更发布新版本路径(如 /api/v2/bid
变更通知提前 30 天邮件通知

文档更新记录

版本日期变更类型变更内容
v1.0.02025-03-25初始发布初版,定义 Protobuf 二进制传输格式
v3.3.02026-05-26重大修正传输格式由 Protobuf 二进制修正为 JSON(application/json),明确 Proto 文件角色为数据结构契约+PB类生成工具,加密内容为 ProtoJSON 序列化的 BidRequest JSON;修正 UUID/AK 定义为"广告位标识"(非租户ID);补充 Device/App/User 等遗漏字段;数据结构全部使用 Proto message 格式;限定适用范围为移动端;补充在线调试工具说明;新增附录(os_boot_time 等字段获取示例、安装 APP 枚举)

© 2026 ADX Platform. 本文档仅供已签约 SSP 合作伙伴使用,未经授权不得传播。

附录

获取 os_boot_time 系统启动时间

Objective-C
static time_t bootSecTime(){
    struct timeval boottime;
    size_t len = sizeof(boottime);
    int mib[2] = { CTL_KERN, KERN_BOOTTIME };
    if( sysctl(mib, 2, &boottime, &len, NULL, 0) < 0 ){
        return 0;
    }
    return boottime.tv_sec;
}

- (NSString *)bootTimeInSec{
    return [NSString stringWithFormat:@"%ld",bootSecTime()];
}

获取 os_update_time 系统更新时间

Objective-C
- (NSString *)getSysU {
    NSString *result = nil;
    NSString *information = @"L3Zhci9tb2JpbGUvTGlicmFyeS9Vc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzL1B1YmxpY0luZm8vTUNNZXRhLnBsaXN0";
    NSData *data=[[NSData alloc]initWithBase64EncodedString:information options:0];
    NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSError *error = nil;
    NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:dataString error:&error];
    if (fileAttributes) {
        id singleAttibute = [fileAttributes objectForKey:NSFileCreationDate];
        if ([singleAttibute isKindOfClass:[NSDate class]]) {
            NSDate *dataDate = singleAttibute;
            result = [NSString stringWithFormat:@"%.6f",[dataDate timeIntervalSince1970]];
        }
    }
    return result;
}

获取 os_birth_time 设备初始化时间

Objective-C
static NSString * getFileTime() {
    struct stat info;
    int result = stat("/var/mobile", &info);
    if (result != 0) {
        return @"";
    }
     struct timespec time = info.st_birthtimespec;
     return [NSString stringWithFormat:@"%ld.%09ld", time.tv_sec, time.tv_nsec];
 }

获取 boot_mark 阿里反作弊标记

IOS示例

Objective-C
- (NSString *)getBoot{
    NSString *timeString = nil;
    int mib[2];
    size_t size;
    struct timeval  boottime;
    mib[0] = CTL_KERN;
    mib[1] = KERN_BOOTTIME;
    size = sizeof(boottime);
    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1)
    {
        timeString = [NSString stringWithFormat:@"%d.%d", (int) boottime.tv_sec, (int) boottime.tv_usec];
    }
    return timeString?:@"";
}

Android示例

java
static jstring getBoot(JNIEnv *env, jclass) {
    FILE *fp = fopen("/proc/sys/kernel/random/boot_id", "r");
    char boot[TID1_LEN];
    if (fp == NULL) {
        // 获取失败
    } else {
        unsigned char c;
        int i = 0;
        while (i < TID1_LEN) {
            c = fgetc(fp);
            boot[i] = c;
            i = i + 1;
        }
        if (ferror(fp)) {
            // 获取失败
        }
    }
//    fgets(boot,sizeof(boot),fp);
    std::string sboot = boot;
    return env->NewStringUTF(sboot.c_str());
}

获取 update_mark 阿里反作弊标记

IOS示例

Objective-C
- (NSString *)getUpdate{
    NSString *timeString = nil;
    struct stat sb;
    NSString *enCodePath = @"L3Zhci9tb2JpbGU=";
    NSData *data=[[NSData alloc]initWithBase64EncodedString:enCodePath options:0];
    NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    const char* dePath = [dataString cStringUsingEncoding:NSUTF8StringEncoding];
    if (stat(dePath, &sb) != -1) {
        timeString = [NSString stringWithFormat:@"%d.%d", (int)sb.st_ctimespec.tv_sec, (int)sb.st_ctimespec.tv_nsec];
    }
    else {
        timeString = @"0.0";
    }
    return timeString?:@"";
}

Android示例

java
// update 
static jstring getUpdate(JNIEnv *env, jclass) {
    struct stat sb;
    int updates,updatens;
    if (stat("/data/data", &sb) == -1) {
        // 获取失败
    } else {
        updatens = (int) sb.st_atim.tv_nsec;
        updates = (int) sb.st_atim.tv_sec;
    }
    std::string idRes = std::to_string(updates) + "." + std::to_string(updatens);
    return env->NewStringUTF(idRes.c_str());
}

获取 ver_code_hms 和 ver_code_ag

java
//获取AG版本号 
private static String directGetAgVersionCode(Context context) {
    String version;
    version = getVersionCode(context, "com.huawei.appmarket");
    if (version == null) {
        version = "";
    }
    return version;
}

// 获取HMS版本号 
public static String directGetHmsVersionCode(Context context) {
    String version;
    version = getVersionCode(context, "com.huawei.hwid");
    if (version == null) {
        version = "";
    }
    return version;
}

// 根据包名获取应用版本号 
public static String getVersionCode(Context context, String pkgName) {
    try {
        PackageInfo pkgInfo = getPackageInfo(context, pkgName);
        return pkgInfo == null ? null :
                String.valueOf(pkgInfo.versionCode);
    } catch (AndroidRuntimeException e) {
        Log.w(TAG, "getVersionCode fail");
    } catch (Exception e) {
        Log.w(TAG, "getVersionCode fail");
    }
    return null;
}
// 根据包名获取PackageInfo  
public static PackageInfo getPackageInfo(Context context, String
        packageName) {
    if (TextUtils.isEmpty(packageName)) {
        return null;
    }
    PackageInfo info = null;
    try {
        if (context != null) {
            PackageManager packageManager = context.getPackageManager();
            if (packageManager != null) {
                info = packageManager.getPackageInfo(packageName,
                        PackageManager.GET_META_DATA);
            }
        }
    } catch (PackageManager.NameNotFoundException e) {
        Log.w(TAG, "getPackageInfo NameNotFoundException");
    } catch (Exception e) {
        Log.w(TAG, "getPackageInfo Exception");
    }
    return info;
}

安装APP枚举

序号应用名称
1淘宝
2天猫
3京东
4拼多多
5唯品会
6苏宁
7聚美优品
8国美
9大众点评
10美团
11饿了么
12UC浏览器
13手机百度
14天天快报
15优酷
16趣头条
17米读
18萌推
19网易新闻
20波波视频
21腾讯新闻
22知乎
23爱奇艺
24凤凰新闻
25全民k歌
26QQ音乐
27豌豆荚
28京东金融
29口碑
30七猫
31快手
32b站
33百度地图
34抖音
35支付宝
36考拉海购
37携程
38淘宝特价
39每日优鲜
40京东极速版
41闲鱼
42夸克
43高德
44美团外卖
45网易严选
46去哪儿
47点淘
48新氧医美
49寺库奢侈品
50微博
51斗鱼
52天眼查
53贝壳
54菜鸟裹裹
55钉钉
56飞猪
57盒马
58掌上生活
59小红书
60京东金融
61滴滴出行
62书旗小说
63百度极速版
107得物
1091688
120微信
567转转