菜单

热云归因设置

出于数据安全的考虑,热云不会直接将数据回调至TopOn,故需要开发者在服务器设置转发,将热云回调的请求转发至TopOn

 

一、开发者与热云沟通,设置回传的参数

开发者向热云拿激活回调的说明文档,并按文档要求提供接收回调数据的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号的数据):

    1. ROI数据依赖买量数据,为保证ROI数据的准确性,需要和买量数据聚合,聚合依据是广告创意ID等,所以开发者必须和热云沟通回调以下三个参数:ry_adgroup_id、ry_adplan_id、ry_adcreative_id ,因为热云默认是不回传的

    2. 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)
}

 

最近修改: 2026-02-04Powered by