腾讯广告广点通API接入文档(Android)
官方文档地址
如果能够看懂文档的也没有必要再往下面看了。本篇文章就到此结束。
下面记录的是本人在上面锁踩过的坑,因为我发现Mac电脑上面的联系客服不是我想要的。
本来只是内部使用的文档,后来想想还是公开出来,希望能够帮助到人。
进入正式的接入流程吧!!!
Step 1: 注册成为开发者
Step 2: 创建应用
这两步建议可以直接看文档,坑不在这一块。但是创建应用的时候有几个点可以注意下
- 应用介绍:这个不只是简单的介绍一下应用,还需要表明创建应用以后需要用到哪些接口,并且是干嘛使用的
应用介绍说明(自己的应用介绍说明),主要使用到的接口有:1、
https://developers.e.qq.com/oauth/authorize
通过这个接口获取到authorization_code
;2、调用接口https://api.e.qq.com/oauth/token
获取到access_token
和refresh_token
; 3、最后在调用https://api.e.qq.com/v1.0/campaigns/add
发送请求 - 回调地址:这个可以是你们公司的域名之类的,可以是不正确的,没有很大的关系。
- 创建应用以后会向邮箱里面给你发送一些数据,我整个过程中没有使用这个数据,直接使用的是正式流程中的数据。主要还是看自己吧!
应用创建成功以后并且审核通过的话,就可以进行接下来的步骤了。
Step 3:授权认证
授权认证就是用浏览器去调用一个接口
https://developers.e.qq.com/oauth/authorize?client_id=123456&redirect_uri=https://www.example.com&state=&scope=
其中:
- client_id:开发者创建的应用唯一标识id,必填,可通过 [应用程序管理页面] 查看;
- redirect_uri:回调地址,由开发者自行提供和定义(地址主域需与开发者创建应用程序时登记的回调主域一致),用于跳转并接收回调信息,必填;
- state:开发者自定义参数,可用于验证请求有效性或者传递其他自定义信息,回调的时候会原样带回,可选;
- scope:授权的能力范围,可选,不传时表示授权范围为当前应用程序所拥有的所有能力;
OAuth 2.0 授权页面如下图所示:
同意授权以后,页面将会跳转到以下链接:
https://www.test.com/?authorization_code=1066a051ea8fbaf011b892c202ae1c93&state=
https://www.test.com
表示你所填写的回调地址。
authorization_code=1066a051ea8fbaf011b892c202ae1c93
这个参数将会在接下来的步骤中有这很大的作用。
点击进入你的腾讯社交平台->应用程序管理->应用test,进入应用test详情页面,会在页面的最底下绑定帐号管理栏里面多出刚刚授权的账号,
我这边有两个是因为我授权了两个账号。注意到图片上面有个广点通账号,这个将会对你有用的。
Step 4:使用 authorization_code 获得 access_token 和 refresh_token
腾讯文档关于获取这个还是说的很清楚的,具体可以查看文档。直接贴一个我这边请求的图:
这个接口的请求方式是GET
Step 5:上报用户行为数据
上报用户行为数据之前需要广点通人员在DMP后台新建App用户行为数据源,这一步骤将会取得 用户属性数据源 id ,接口会要用到的。
请求地址:
https://api.e.qq.com/v1.0/user_properties/add?access_token=<ACCESS_TOKEN>×tamp=<TIMESTAMP>&nonce=<NONCE>'
对参数进行讲解一下
- access_token:就是上一个接口获取到的数据
- timestamp : 时间戳 (秒级别)
- nonce : 32位随机码
请求方式:POST
请求参数:
名称 | 类型 | 描述 |
---|---|---|
account_id(必填) | integer | 推广帐号 id,有操作权限的帐号id,包括代理商和广告主帐号 id |
user_action_set_id(必填) | integer | 用户行为源 id,通过 [user_action_sets 接口] 创建用户行为源时分配的唯一 id |
actions(必填) | struct[] | 返回数组列表,不能大于 50KB 数组最小长度 1,最大长度 50 |
action_time(必填) | integer | 行为发生时,客户端的时间点。 UNIX时间,单位为秒,如果不填将使用服务端时间填写 最小值 0,最大值 2147483647 |
user_id(必填) | struct | 用户标识 |
hash_imei(必填) | string | IMEI 设备号保持小写,进行 md5 编码 字段长度最小 32 字节,长度最大 32 字节 |
action_type(必填) | enum | 标准行为类型,当值为 'CUSTOM' 时表示自定义行为类型,[枚举详情] 枚举列表:{ CUSTOM, REGISTER, VIEW_CONTENT, CONSULT, ADD_TO_CART, PURCHASE, ACTIVATE_APP, SEARCH, ADD_TO_WISHLIST, INITIATE_CHECKOUT, COMPLETE_ORDER, START_APP, RATE, PAGE_VIEW, RESERVATION, SHARE, APPLY, CLAIM_OFFER, NAVIGATE, PRODUCT_RECOMMEND, VISIT_STORE, TRY_OUT, DELIVER, SIGN_IN } |
上面只是对参数进行讲解
还是给个json示例吧
{"account_id": "<ACCOUNT_ID>","user_action_set_id": "<USER_ACTION_SET_ID>","actions": [{"action_time": 1535097324,"user_id": {"hash_imei": "f9efca36a3c30e1cf28170d86ecbf5e9"},"action_type": "REGISTER",}]
}
复制代码
account_id
怎么获取呢?两种方式:
一种就是我们在获取 access_token
的时候,返回结果数据里面还有一个 account_id
的字段,没错,就是那个了。
第二种就是我们在应用详情下面的绑定账号管理里面的广点通账号ID
user_action_set_id
就是用户属性数据源 id ,让对面对接人员提供。
action_time
:时间戳(秒级别的)
hash_imei
:imei的MD5加密字符串
action_type
:本次上报的类型
如果接口返回的是
{"code": 0,"message": ""
}
复制代码
那就恭喜你,流程已经走通了。
现在是不是要开始上代码了呢,别急,还有一些要注意的东西。
比如说,上面获取到的 access_token
是会过期的,需要使用到 refresh_token
去刷新有效期的。具体怎么刷新?看腾讯文档。现在的问题在哪里呢?比如说,今天对接测试通过了,打包上线并且审核通过了,过两天下载的用户就会出现 access_token
过期的问题,怎么处理呢?有同学肯定会说,那我们在用户调用上报数据接口的时候去刷新一下不就行了。其实也可以的,但是我觉得这个刷新也太频繁了吧。所以我特意询问过腾讯的技术支持,他们建议把刷新 access_token
的机制放到我们的服务器端去做,也就是让服务器端帮我们一天刷新一下这个 token ,刷新 access_token
并不会改变 access_token
的值,只会改变 access_token
的有效期。那我们在客户端所要做的事情就很简单了,那就是上报数据就行了。
代码该上还是要上的(注意:以下代码由kotlin编写):
实体类
class OCPABean(/*** 广点通帐号ID,(可以自己查找,也可以由对方提供)*/var accountID: String?,/*** 用户行为源 id,这个由对方提供(广点通)*/var userActionSetId: String?,/*** 通过code获取到的token*/var token: String?,/****/var channelIdList: List<String>?)
复制代码
下面这个类主要是用来初始化我们的一些必要的数据
object OCPAStorage {/*** 用于存储app包名所对应的渠道号*/var ocpaConfig = mutableMapOf<String, OCPABean>()init {initTest()}private fun initTest() {var list = listOf("getui1")var ocpaBean = OCPABean("83005", "177844", "5a42ed16464f8cda38c7e4ea000", list)ocpaConfig["com.baidu.test"] = ocpaBean}}
复制代码
工具类,提供一些方法,注:currentRegisterNeedReport
这个方法可以根据自己的需求进行实现
object OCPAUtil {var ocpaBean: OCPABean? = null/*** 当前的包名和渠道是否需要上报*/fun currentRegisterNeedReport(context: Context): Boolean {var packageName = context.packageNamevar ocpaConfigMap = OCPAStorage.ocpaConfigvar keys = ocpaConfigMap.keysif (packageName in keys) {var ocpaBean = ocpaConfigMap[packageName]var channelIdList = ocpaBean?.channelIdListvar channelName = ChannelUtil.getChannelName(context)if (channelIdList?.contains(channelName) == true) {this@OCPAUtil.ocpaBean = ocpaBeanreturn true}}return false}/*** 获取当前秒级的时间戳*/fun getTimeStamp(): String {var timeStamp = System.currentTimeMillis() / 1000return timeStamp.toString()}/*** 生成32位编码* @return string*/fun getUUID(): String {return UUID.randomUUID().toString().trim().replace("-", "")}}
复制代码
下面这个类是主要做网络请求,上报接口的,采用的Okhttp3网络框架
object OCPAHttpClient {const val SP_CONSTANT = "OCPA_SP_CONSTANT"fun register(context: Context) {var spConstant = FRSharedPreferences.getStringNotClear(SP_CONSTANT, "")
// var spConstant = ""if (TextUtils.isEmpty(spConstant) && OCPAUtil.currentRegisterNeedReport(context)) {httpRegister()}}private fun httpRegister() {var ocpaBean = OCPAUtil.ocpaBeanocpaBean?.let {val okHttpClient = OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build()//获取当前的秒级时间戳var timeStamp = OCPAUtil.getTimeStamp()//构造一个urlvar baseUrl = "https://api.e.qq.com/v1.0/user_actions/add?access_token=${ocpaBean.token}×tamp=$timeStamp&nonce=${OCPAUtil.getUUID()}"var dataJsonObject = JSONObject()//构造参数try {dataJsonObject.put("account_id", ocpaBean.accountID)dataJsonObject.put("user_action_set_id", ocpaBean.userActionSetId)var actionJA = JSONArray()var actionJO = JSONObject()actionJO.put("action_time", timeStamp)actionJO.put("action_type", "REGISTER")var userIdJO = JSONObject()var imei = FRDeviceUtil.getPhoneInfo()imei?.let {userIdJO.put("hash_imei", FREncryptUtil.string2MD5(imei))}actionJO.put("user_id", userIdJO)actionJA.put(actionJO)dataJsonObject.put("actions", actionJA)} catch (e: JSONException) {e.printStackTrace()}var requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), dataJsonObject.toString())var request = Request.Builder().url(baseUrl).post(requestBody).build()okHttpClient.newCall(request).enqueue(object : Callback {override fun onFailure(call: Call?, e: IOException?) {FRLog.e("log", "OCPA注册失败")}override fun onResponse(call: Call?, response: Response?) {FRSharedPreferences.setStringNotClear(SP_CONSTANT, SP_CONSTANT)FRLog.e("log", response?.body()?.string())}})}}
}
复制代码
MD5加密类:
public class FREncryptUtil {/*** 利用MD5进行加密** @param inStr 待加密的字符串* @return 加密后的字符串* @throws NoSuchAlgorithmException 没有这种产生消息摘要的算法* @throws UnsupportedEncodingException*/public static String string2MD5(String inStr) {if (TextUtils.isEmpty(inStr))return "";MessageDigest md5 = null;try {md5 = MessageDigest.getInstance("MD5");} catch (Exception e) {System.out.println(e.toString());e.printStackTrace();return "";}char[] charArray = inStr.toCharArray();byte[] byteArray = new byte[charArray.length];for (int i = 0; i < charArray.length; i++)byteArray[i] = (byte) charArray[i];byte[] md5Bytes = md5.digest(byteArray);StringBuffer hexValue = new StringBuffer();for (int i = 0; i < md5Bytes.length; i++) {int val = ((int) md5Bytes[i]) & 0xff;if (val < 16)hexValue.append("0");hexValue.append(Integer.toHexString(val));}return hexValue.toString();}
}
复制代码
获取Imei的方法:这个方法可能和使用的时候有点不一样,具体的修改自己看着改一下吧。
/*** 获取手机的IMEI** @return*/
public static String getPhoneInfo(Context context) {TelephonyManager tm = null;try {tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);return tm.getDeviceId();} catch (Exception e) {return "";}
}
复制代码
好了,到此结束吧。不要忘记叫后台帮忙刷新 token 啊!!!
转载于:https://juejin.im/post/5b7fda3cf265da437d6e02ef
腾讯广告广点通API接入文档(Android)相关推荐
- 对接腾讯广告(广点通) 上传用户行为
目录 一.前言 二.账号 三.数据源 四.涉及接口以及大致流程 1.广告主账号授权. (授权给开发者账号) 2.获取access_token 3.上传用户行为 五.代码 一.前言 不知道有没有跟我一样 ...
- 腾讯广告 广点通 数据上报 上传用户行为数据
腾讯广告文档地址:https://developers.e.qq.com/docs/start 第一步 准备账户信息 const APP_URl = 'https://api.e.qq.com'; c ...
- 数位云开发者平台:室内定位api接入文档
API文档 1 概述 数位云场景识别 API v3接口用于查询用户的场景位置.标签等 POI数据,用户可以使用 Java.Golang.C#. C++.Python 等开发语言发送请求且接收 JSON ...
- 爱奇艺移动 APP 广告激活 等数据 API 对接文档
http://static-d.iqiyi.com/qx/resource/ocpm-api.pdf
- 广点通sdk接入 _应用墙广告
广点通sdk接入 _应用墙广告 1:导入相关架包,写入相关权限和配置 android-query-full.0.26.7.jar GDTUnionSDK.4.8.513.jar<uses-per ...
- 腾讯云:一句话语音识别API接入步骤和说明
语音识别 API 升级到 3.0 版本.全新的 API 接口文档更加规范和全面,统一的参数风格和公共错误码,统一的 SDK/CLI 版本与 API 文档严格一致,给您带来简单快捷的使用体验.支持全地域 ...
- 极速验号API接口文档说明
使用场景: 1.旺旺号授权后,可以获取大部分的数据 2.可根据用户的购买行为.信用分值等一系列的数值 3.相对于照妖镜验号来说,极速验号获取的信息更全面更准确,可以多维度判断旺旺号是否可靠 4.可以看 ...
- 扔掉Swagger,试试这款功能强大,零注解侵入的API接口文档生成工具!
欢迎关注方志朋的博客,回复"666"获面试宝典 介绍 smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-d ...
- Facebook 游戏开发更新文档 API 参考文档 v6.0
Facebook 游戏开发更新文档 API 参考文档 v6.0 更新日志 1.排行榜 此版本全新推出排行榜 API!提供一套强大的 API, 使得游戏可获取排行榜.查询得分 情况和设置新分数(支持分数 ...
最新文章
- Spring Boot 中引入 MyBatisPlus 的常规流程
- linux常用命令收集(持续中)
- C/C++ 语言获取文件大小
- rabbitmq java文档_《RabbitMQ官方文档》订阅与发布
- gVIM+zencoding快速开发HTML/CSS/JS(适用WEB前端)
- time函数python_Python连载6-time包函数简介
- 《中国人工智能学会通讯》——5.16 结 论
- 如何使用postman做接口测试
- 使用双指针可能只需要遍历一趟哦(洛谷P1147题题解,Java语言描述)
- ROS笔记(12) Rviz
- 转义字符html识别吗,HTML_谈谈html转义字符如何通过代码识别,偶尔会在数据中看到诸如#3 - phpStudy...
- java调用linux设备,使用Java调用Linux系统命令
- [ZJOI2013]K大数查询
- HIVE 面试题总结
- 2021全国人工智能大赛(NAIC)视觉编码赛道初赛一阶段baseline分享
- C++函数参数省略号
- unsw计算机科学的挂科率,恐怖挂科率创新高!UNSW期中惊现大面积挂科,商科一课程Fail率接近60%,朋友圈一篇哀嚎!...
- Ocata Neutron代码分析(六)——APIRouter的初始化(1)加载core plugin和service plugin...
- Python使用腾讯云-短信服务发送手机短信
- c语言RLC算法,「百科」1分钟了解RC、RL、RLC电路原理