一、开发者与热云沟通,设置回传的参数
开发者向热云拿激活回调的说明文档,并按文档要求提供接收回调数据的postback地址、appkey和securitykey,在收到数据回调后需返回 HTTP 状态码 200给热云
其中appkey是在热云trackingio平台生成的appkey,securitykey是安全参数目前无实际应用意义,开发者自行提供任意字符串即可
为保证ROI数据的准确性,必须保证热云回传以下参数:
| 参数名 | 字段类型 | 是否必填 | 参数说明 |
|---|---|---|---|
| idfa | String | ios应用必填 | iOS 设备 ID, |
| idfv | String | ios应用必填 | iOS 广告标识符,注意:为保证ROI数据的准确性,必须和热云沟通回调idfv,因为热云默认是不回传的 |
| androidid | String | android应用必填 | Android 设备 ID |
| imei | String | android应用必填 | 手机的唯一标识 |
| mac | String | 可选 | mac 地址 |
| appkey | String | 必填 | 在热云trackingio平台生成的appkey |
| aip | String | 必填 | 触发事件的设备 IP |
| ry_adgroup_id | String | 必填 | 广告计划ID |
| ry_adplan_id | String | 必填 | 广告组ID |
| ry_adcreative_id | String | 必填 | 广告创意ID |
| channel | String | 可选 | 热云渠道,例如:“今日头条”,注意:需要分热云渠道查看roi报表时必须要在热云配置回调,热云默认是不回传的</font> |
注意(ROI报表暂时只有东八区数据):
-
ROI天级报表(生成时间:延迟2天,例如20220815号早上8点左右能看到20220813号的数据):
-
ROI数据依赖买量数据,为保证ROI数据的准确性,需要和买量数据聚合,聚合依据是广告创意ID等,所以开发者必须和热云沟通回调以下三个参数:ry_adgroup_id、ry_adplan_id、ry_adcreative_id ,因为热云默认是不回传的
-
LTV数据:不依赖买量数据,广告创意ID,广告组ID,广告计划ID可以不回调,即按热云默认处理即可,一般是自然量ry_adcreative_id=-1
-
-
ROI小时报表(生成时间:延迟3小时,例如20220815号15点能看到20220815号12点的数据):不依赖买量数据,广告创意ID,广告组ID,广告计划ID可以不回调,即按热云默认处理即可,一般是自然量ry_adcreative_id=-1,分小时报表会增大TopOn端费用,故需要额外向TopOn运营沟通开通权限
二、开发者收到热云回调后,再转发给TopOn
开发者自行部署中转服务,将热云回调的参数原封不动以Get方式转发给TopOn即可,TopOn收到数据会回调以下两个状态码,请开发者提前做好逻辑适配:
200:请求成功
500:请求失败
开发者需自行检查回调给TopOn的Url中的如下属性:
(1) appkey:这个热云key和开发者后台配置是否一样(开发者转发数据之前,必须先在TopOn后台的编辑应用页面,填写好应用 对应热云appkey,否则TopOn将无法正确解析到激活数据)
(2) ry_adcreative_id:这个创意id(格式:1723404341429299)是否有上传,一般-1或者空代表非正常创意id,开发者需要和热云沟 通返回
检查无误并确定转发成功(响应码=200)后耐心等待roi报表出来即可
Golang参考代码:
package main
import (
"flag"
"fmt"
"log"
"net/http"
)
const (
topOnBaseUrl = "https://postback.toponad.com/reyun/install" // TopOn 热云回调接口
localUrlPath = "/install" // 热云本地的URL路径
)
var (
listenPort int // 服务端监听端口
)
func init() {
flag.IntVar(&listenPort, "port", 8080, "server listen port")
flag.Parse()
}
func main() {
http.HandleFunc(localUrlPath, handleFunc)
log.Println("server start, listen port:", listenPort)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", listenPort), nil))
}
// 接收请求并转发至TopOn接口
func handleFunc(response http.ResponseWriter, request *http.Request) {
reqUrl := fmt.Sprintf("%s?%s", topOnBaseUrl, request.URL.Query().Encode())
resp, err := http.Get(reqUrl)
if err != nil || resp.StatusCode != http.StatusOK {
log.Printf("request TopOn interface error, url: %s, err: %v", reqUrl, err)
return
}
log.Println("request TopOn url:", reqUrl)
response.WriteHeader(http.StatusOK)
}