ID上报方式
广告系统跟踪ID
CLICK_ID
情况1:落地页 URL 上获取
推广 H5、小程序、小游戏是,在腾讯广告推广时,每次点击都会生成一个 click_id,在跳转到落地页时,会将 click_id 作为参数传入对应的 URL 中。
- 非微信流量:URL 中的参数 qz_gdt 的值
- 微信流量:URL 中的参数 gdt_vid 的值
情况2:监测链接获取
通过点击监测获取,监测链接提供宏字段给到客户,支持客户获取广告__
CLICK_ID__
设备标识
Android 设备
OAID
移动安全联盟提出的安卓系统移动终端设备补充标识(OAID)。
原值
MSA 网站获取 OAID 具体步骤
- 登录 MSA官网;
- 注册成为网站会员;
- 进入移动智能设备标识公共服务平台模块;
- 拉至页面最下方,阅读开发者说明,并下载安装 SDK。
返回值必须有『ret』,且参数值必须为0;否则视为不成功;返回值不能包含『302』,返回值中的『错误信息』如果是中文,必须使用 UTF-8 字符集,不能使用 GBK 等其他字符集。
加密
加密方式
字段 | 加密描述 | 加密方法 |
---|---|---|
hash_oaid/md5_oaid | 原值 md5 加密,加密后 32 位小写数字字母组合 | md5(oaid) |
md5_sha256_oaid | 原值 md5 加密,再采用 SHA256 加密,加密后为 64 位小写数字字母组合 | sha256(md5(oaid)) |
测试用例
原值:1fe9a970-efbb-29e0-0bdd-f5dbbf751ab5
md5_oaid/hash_oaid:83e9158a4fb54c0e1ef0b238639a23ae
md5_sha256_oaid:a58f9fffa86c12e6fb43f5232a46d53ef06196f4be138d185a09b1294c736c50
校验工具
IMEI[不推荐]
- Android版本 < 6.0,只需要 READ_PHONE_STATE 静态权限(安装 App 时即可获取到该权限),即可通过系统 API TelephonyManager#getDeviceId API 获取准确值;
- 6.0 ≤ Android版本 ≤ 9.0,READ_PHONE_STATE 升级为动态权限,安装 App 时不会获得该权限,需要在 App 运行时用户在弹窗确认授权后才可以获取;
- Android 版本 ≥ 10.0,设备不可变 ID 的隐私保护得到进一步升级,一般 App 无法获取到 IMEI 。
原值
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
deviceId = tm.getDeviceId();
需要注意,android 版本 ≥ 10不获取
加密
加密方式
字段 | 加密描述 | 加密方法 |
---|---|---|
hash_imei/md5_imei | 原值转小写 md5 加密,加密后为 32 位字母 + 数字,再转小写 | md5(imei.toLowerCase()).toLowerCase() |
md5_sha256_imei | 原值转小写 md5 加密,再采用 SHA256 加密,加密后为 64 位小写数字字母组合 | sha256(md5(imei.toLowerCase())) |
测试用例
原值:A000002C9060F7
md5_imei/hash_imei:f2d5a650733ca8c27d502b1c08da14e5
md5_sha256_imei:d64db6590359b386397db4d8a61dbc8fbd586b8a0b822ee6bc19316402d583b4
加密代码示例
- C++
bool GenerateMuid(const std::string& uni_id, const int32_t app_type, std::string* muid)
{
if (muid == NULL || uni_id.empty()) {
return false;
}
muid->clear();
std::string tmp;
if (app_type == kAppTypeAndoirdImei) {
LatinToLower(uni_id, &tmp);
}
else if (app_type == kAppTypeiOSIfa) {
LatinToUpper(uni_id, &tmp);
}
else {
return false;
}
md5sum32l(tmp, muid); // 32bit lower
return true;
}
校验工具
Android_id[不推荐]
- Android版本 < 8.0,不需要任何权限即可使用系统API(Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID))获取准确值
- Android版本 ≥ 8.0,应用签名、用户(即系统上的用户账号)和设备的每个组合都具有唯一的 ANDROID_ID值,即使系统升级也不变。
原值
Settings.System.getString(context.getApplicationContext().getContentResolver();
Settings.System.ANDROID_ID);
加密
加密方式
字段 | 加密描述 | 加密方法 |
---|---|---|
hash_android_id/md5_android_id | 原值 md5 加密,再转小写 | md5(androidId).toLowerCase() |
测试用例
原值:f40c5cf5100f9be3
hash_android_id/md5_android_id:1995c8f7cec20632797539b68555752f
校验工具
iOS 设备
CAID
获取 CAID
第一步:获取 CAID
方式一:通过腾讯广告 SDK 获取
备注:SDK 版本号 ≥ 2.0.11才支持该功能。
(1)在需要调用 SDK 方法获取CAID的文件中导入 SDK 头文件。
#import 'GDTAction.h'
(2)调用 SDK 方法获取 CAID 。
NSDictionary *caidDic = [GDTAction getCaid];
/*
* 以下内容为caidDic对应数据格式,里面的data值为设备的CAID:
* {
* "data": [
* { "value": "5ad74747f0e7eaadf159f4b9424e752f", "version": "20220111" },
* { "value": "3b4eedfb7e74c4517c95078d705dc2de", "version": "20230330" }
* ],
* "code": 0,
* "message": "OK"
* }
*/
方式二:通过中广协获取
- 登录中广协互联网广告技术实验室平台,填写对应的公司名称等相关信息,签署SDK/API服务协议协议并上传,完成初审;同步邮寄纸质版合同完成双方签署;
- 初审通过后可自行在控制台下载技术文档,完成付款后,广协会将密钥将发送至申请邮箱中。
热线电话:010-65924090/65924115
对于历史已经接入但是未付费的公司,广协已逐步暂停服务,如还希望接入 CAID,请尽快联系广协。
第二步:和腾讯广告侧联通,确认 CAID 一致性
进入<工具箱>-<效果分析>-<转化归因>,在【新建应用转化】旁进入【查看使用引导】弹框,点击右下角【校验CAID】。
联调页面需要客户填写原值的 IDFA,以及自己生成的设备的 CAID 原值,选择腾讯新闻客户端最新版本,点击信息流中的广告,并将点击广告的时间填入联调点击时间中。
点击校验后,等待约 10 分钟,给出联调结果。联调成功会有对应的显示,联调失败请点击右下角【反馈工单】。
第三步:获取 IDFV,并和 CAID 一起上报
IDFV 用于深度转化行为的归因和激活数据的去重,请按照以下方式获取 IDFV :
+(NSString *) idfv
{
return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
第四步:在点击转发中配置互联网广告标识 CAID
情况1:使用<工具>-<转化归因>
请您在配置点击监测链接时,配置 CAID,目前该ID以宏的形式__CAID__ 来支持点击转发。
例如:
https://www.example.com/click/?click_id=__CLICK_ID__&click_time=__CLICK_TIME__&campaign_id=_CAMPAIGN_ID__&adgroup_id=__ADGROUP_ID__&ad_id=__AD_ID__&muid=__MUID__&ip=__IP__&user_agent=__USER_AGENT__&account_id=__ACCOUNT_ID__&promoted_object_type=__PROMOTED_OBJECT_TYPE__&device_os_type=__DEVICE_OS_TYPE__&callback=__CALLBACK__&qaid_caa=__CAID__
情况2:使用<广告效果监测>
中广协 ID 对应的宏字段为__CAID__ 或 __QAID_CAA__(中广协QAID)。
宏__QAID_CAA__ 将填充 URLEncode 后的 JSON 数组,示例:URLEncode("[{\"qaid\":\"12345\",\"hash_qaid\":\"123456789012345\",\"version\":1005},{\"qaid\":\"67890\",\"hash_qaid\":\"6789523654780214556\",\"version\":1006 }]"。其中 qaid 即为中广协 ID,hash_qaid 为 CAID 原值 MD5 加密后的结果,version 即为腾讯版本号,支持两个版本同时下发,即最新版本和上一版本,如 1006 为最近版本,1005 为上一版本,这种情况下 1004 版本号将不再下发。
目前中广协版本,和腾讯版本号的映射关系如下。若自身仍在低于 1006 版本号进行归因的广告主,需要尽快升级到最新 1006 版本。
监测方式 | 腾讯版本号 | 中广协版本号 | 状态 |
---|---|---|---|
中广协ID(CAA) | 1005 | 20220111 | 支持 |
中广协ID(CAA) | 1006 | 20230330 | 支持,最新版 |
第五步:使用 CAID 或者加密后的 CAID 进行归因
可以像使用 IDFA 一样,将从腾讯获取的 CAID 和所有转化数据进行匹配,得到腾讯媒体归因结果。在归因时注意,由于 CAID 有多个版本,所以每个版本的 CAID 均需要进行一次归因。同时,如还能获取到 IDFA,也建议您使用 IDFA 进行归因,归因优先级如下: CAID(新版本:__CAID__ )> CAID(旧版本:__QAID_CAA__)> IDFA > IP+UA
第六步:把 iOS 转化数据上报
需要您在现有 API 协议的 user_id 结构中,新增如下上报协议:
需要上报的设备信息 | 字段名称 | 类型 | 说明 | 用处 | 是否必填 |
---|---|---|---|---|---|
CAID | caid | string | 作为唯一ID关联点击 | --- | |
CAID 版本 | caid_version | integer | 腾讯版本号:0-255 是保留字段 | 用于版本升级、第三方算法支持 | 在 CAID 填写时必填 |
IDFV | idfv | string | 客户侧可获取的 idfv 原值 | 用于激活次留去重和付费等深度行为的激活归因 | 在 CAID 填写时选填 |
注:以上字段不限制只在激活时上报,iOS 内部所有转化行为均需要上报以上字段
iOS16 以上通过 UIDevice 获取设备名称时,默认会返回 iPhone 而不再是“xx的iPhone”。广协侧已评估过此影响,不需要因此额外去申请权限获取真实的设备名称。这里接入方按照现有的接入方式使用即可,请勿额外申请权限,不影响 CAID 的设备识别度。如果自身业务需求要获取“ xx 的 iPhone”真实设备名,那在请求广协接口时,iOS16 设备也请替换为“iPhone”保持统一,后续我们会通过升级算法版本来优化。
上报代码示例
curl -X POST
-H "Authorization: Bearer "
-H "Content-Type: application/json;charset=utf8"
-d '{
"account_id" : 12235,
"actions" : [
{
"action_time" : 1481279071,
"user_id" : {
"gdt_openid" : "asdfghjkl",
"idfv" : "277D4B90-6699-424F-AFA8-9E7B12FA7CD6", // 本次新增: 客户侧获取的idfv
"caid_version" : 1004, // 本次新增: 如caid=1004为广协版本
"caid" : "a424aafe3c44b7e3618a95c0d55a56de" // 本次新增: caid内容
},
"action_type" : "ACTIVE",
"trace" : {
"click_id" : "asudor7tofuas9dfgr89ghejg"
}
},
]
}'
IDFA
IDFA 是目前 iOS 系统主流的广告获取设备标识符方式,用户可开启、关闭,每次切换会改变为新的取值。 10 以下的版本关闭时也能取到唯一值 ≥ 10的 iOS 版本关闭时取到的值为00000000000 ;系统大版本升级(如11 到 12) 时,IDFA 也会发生变化。
原值
idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
加密
加密方式
字段 | 加密描述 | 加密方法 |
---|---|---|
hash_idfa/md5_idfa | 原值转为8-4-4-4-12格式,转大写 md5 加密,再转小写 | hyphenIdfa = "%s-%s-%s-%s-%s".format(idfa.substring(0, 8),idfa.substring(8, 12),idfa.substring(12, 16),idfa.substring(16, 20),idfa.substring(20)) md5(hyphenIdfa.toUpperCase()).toLowerCase() |
md5_sha256_idfa | 原值转为8-4-4-4-12格式,转大写 md5 加密(常规加密后为小写),再采用 SHA256 加密,加密后为 64 位小写数字字母组合 | hyphenIdfa = "%s-%s-%s-%s-%s".format(idfa.substring(0, 8),idfa.substring(8, 12),idfa.substring(12, 16),idfa.substring(16, 20),idfa.substring(20)) sha256(md5(hyphenIdfa.toUpperCase()).toLowerCase()) |
测试用例
原值:ff1999cd71774937a47474937a102630
转为8-4-4-4-12格式:FF1999CD-7177-4937-A474-74937A102630
hash_idfa/md5_idfa:2c010ed96aef2fc34983e1e7e9176b7e
md5_sha256_idfa:9f2fc8b5eaaeba19fe9415767b13c1ec43c91aa039aa44684dfc8ec77d3b0607
加密代码示例
- C++
bool GenerateMuid(const std::string& uni_id, const int32_t app_type, std::string* muid)
{
if (muid == NULL || uni_id.empty()) {
return false;
}
muid->clear();
std::string tmp;
if (app_type == kAppTypeAndoirdImei) {
LatinToLower(uni_id, &tmp);
}
else if (app_type == kAppTypeiOSIfa) {
LatinToUpper(uni_id, &tmp);
}
else {
return false;
}
md5sum32l(tmp, muid); // 32bit lower
return true;
}
校验工具
手机号[不推荐]
加密
加密方式
字段 | 加密描述 | 加密方法 |
---|---|---|
md5_phone | md5 加密 | md5(phone) |
测试用例
原值:13012345678
md5_phone:f31da71b621cb1cf320749e15075c4de