java记录简单实现巨量Marketing-API自定义回传

1.配置点击监听,拿到媒体转换数据

  /**
     * 点击监听
     * 
     * @param request
     * @param response
     */
    @RequestMapping("/click/{code}")
    public void adClick(HttpServletRequest request, HttpServletResponse response) {
        Map<String, Object> parameterMap = parameterMap(request);
        OceanEngineReq req =null;
        try {
              req = MapUtils.mapToBean(parameterMap, OceanEngineReq.class);
        } catch (Exception e) {
            parameterMap.forEach((k,v)->{
                System.out.println(k+"->"+v);
            });
            logger.error("媒体数据转化失败" + request.getRequestURI(), e);
        }
        try {
            if(req!=null){
                oceanEngineService.processOceanEngineData(request, req, MediumType.CLICK);
            }
        } catch (Exception e) {
            logger.error("自归因失败" + request.getRequestURI(), e);
        }
    }
package com.youguo.wl.model.req;

import lombok.Data;
import lombok.ToString;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;

/**
 * @Classname OceanEngineReq
 * @Description 描述
 * @Date 2021/9/15 0015 10:09
 * @@author lqh
 */
@Data
@ToString(callSuper = true)
public class OceanEngineReq extends BaseReq {
    private static final long serialVersionUID = 4464749435603779280L;
    /** 广告计划id **/
    private String aid;
    /** 广告计划名称 **/
    private String aid_name;
    /** 广告主id **/
    private String advertiser_id;
    /** 广告创意 id,长整型 **/
    private String cid;
    /** 广告创意名称 **/
    private String cid_name;
    /** 广告组 id **/
    private String campaign_id;
    /** 广告组名称 **/
    private String campaign_name;
    /**
     * 创意样式 2=小图模式 3=大图模式 4=组图模式 5=视频
     */
    private String ctype;
    /**
     * 广告投放位置 今日头条:1-10000,80000-110001 西瓜视频:10001-10099 火山小视频:30001-30099 抖音:40001-40099 穿山甲开屏广告:800000000
     * 穿山甲网盟非开屏广告:900000000 通投广告位:33013 搜索:38016
     */
    private String csite;
    /** 转化id **/
    private String convert_id;
    /** 请求下发的id **/
    private String request_id;
    /** 这次请求的语言 **/
    private String sl;

    /** IOS 6+的设备id字段,32位 **/
    private String idfa;

    /** Android Q及更高版本的设备号的md5摘要,32位 **/
    private String oaid_md5;
    /**
     * 操作系统平台 安卓:0 IOS:1 其他:3
     */
    private String os;
    /**
     * 移动设备mac地址,转换成大写字母,去掉“:”,并且取md5摘要后的结果
     **/
    private String mac;
    /** 移动设备 mac 地址,转换成大写字母,并且取md5摘要后的结果,32位 **/
    private String mac1;
    /**
     * 媒体投放系统获取的用户终端的公共IP地址
     **/
    private String ip;

    /** 用户代理(User Agent) **/
    private String ua;
    /** 位置信息,包含三部分:latitude(纬度),longitude(经度)以及precise(确切信息,精度) **/
    private String geo;
    /** 客户端发生广告点击事件的时间,以毫秒为单位时间戳 **/
    private Long ts;
    /** 回调参数,内容是一个加密字符串,在调用事件回传接口的时候会用到 **/
    private String callback_param;
    /** 直接把调用事件回传接口的url生成出来,广告主可以直接使用 **/
    private String callback_url;
    /** 手机型号 **/
    private String model;
    /** 对外广告位编码 **/
    private String union_site;
    /** 不同版本的中国广告协会互联网广告标识,CAID1是20201230版 **/
    private String caid1;
    /** 暂无CAID2 **/
    private String caid2;
    private String vid;


}
package com.youguo.wl.model.req;

import com.youguo.wl.base.util.DeviceIdUtils;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;

/**
 * @Classname BaseReq
 * @Description 描述
 * @Date 2021/9/15 0015 15:03
 * @@author lqh
 */
@Data
public class BaseReq implements Serializable {
    private static final long serialVersionUID = -4090116648703791619L;
    /** 设备唯一key **/
    private String deviceId;
    /** 安卓的设备 ID 的 md5 摘要,32位 **/
    private String imei;
    /** 安卓id原值的md5,32位 **/
    private String androidid;
    /** Android Q及更高版本的设备号,32位 **/
    private String oaid;

    private boolean hasDevice=true;

    public String getDeviceId() {
        StringBuilder id=new StringBuilder();
        if(StringUtils.isNotEmpty(this.imei)){
            id.append(this.imei);
        }
        if(StringUtils.isNotEmpty(this.oaid)){
            id.append(this.oaid);
        }

        if(StringUtils.isNotEmpty(this.androidid)){
            id.append(this.androidid);
        }
        if(id.length()==0){
            id.append("-1");
            this.hasDevice=false;
        }
        return id.toString();
    }

    public void setImei(String imei) {
        this.imei = DeviceIdUtils.dealImei(imei);
    }

    public void setAndroidid(String androidid) {
        this.androidid = DeviceIdUtils.dealAndroidid(androidid);
    }

    public void setOaid(String oaid) {
        this.oaid = DeviceIdUtils.dealOaid(oaid);
    }
}
package com.youguo.wl.base.util;

/**
 * 设备id处理
 *
 */
public class DeviceIdUtils {

    public static String dealImei(String imei) {
        if(imei==null) {
            return null;
        }
        imei = imei.trim();
        if("".equals(imei) || "null".equals(imei.toLowerCase()) || imei.matches("0+")) {
            return null;
        }
        return imei;
    }

    public static String dealOaid(String oaid) {
        if(oaid==null) {
            return null;
        }
        oaid = oaid.trim();
        if("".equals(oaid) || "null".equals(oaid.toLowerCase()) || oaid.replaceAll("-", "").matches("0+")) {
            return null;
        }
        return oaid;
    }

    public static String dealAndroidid(String androidid) {
        if(androidid==null) {
            return null;
        }
        androidid = androidid.trim();
        if("".equals(androidid) || "null".equals(androidid.toLowerCase()) || androidid.matches("0+")) {
            return null;
        }
        return androidid;
    }
}
 public Map<String,Object> parameterMap(HttpServletRequest request)
    {
       // logger.info(map.get("order[0][column]"));//排序字段列
        //logger.info(map.get(ordebynamekey));//排序字段
        //logger.info(map.get("order[0][dir]"));//排序方式

        Map<String,String[]> prmap=request.getParameterMap();
        Map<String,Object> parameterMap=new HashMap<>();
        String key; String value[];
        int lens;
        int i;
        StringBuffer valestr=new StringBuffer();;


        for (Map.Entry<String, String[]> entry : prmap.entrySet())
        {
            key=entry.getKey();
            value=entry.getValue();
         // System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
            lens=value==null?0:value.length;
            valestr=new StringBuffer();
            for(i=0;i<lens;i++)
            {
                if(i>0)
                    valestr.append(",");
                valestr.append(value[i]);
            }
            parameterMap.put(key,valestr.toString());
        }
        //处理排序字段

      // String ordebynamekey= "columns["+parameterMap.get("order[0][column]")+"][data]";
        String ordebycolname;
        value=prmap.get("order[0][column]");
        lens=value==null?0:value.length;
        String ordeyType = (String) parameterMap.get("order[0][dir]");
        ordeyType=ordeyType==null?"":ordeyType.trim().toLowerCase();
        boolean isfirst=true;
        valestr=new StringBuffer();
        if(ordeyType.equals("desc") && lens>0)
        {
            valestr.append(" order by ");
            for(i=0;i<lens;i++ )
            {
                ordebycolname = "columns[" + value[i] + "][data]";;
                if(!StringUtils.isBlank(ordebycolname))
                {
                    if(!isfirst)
                        valestr.append(",");
                    valestr.append(request.getParameter(ordebycolname));
                    valestr.append(" desc");
                    isfirst=false;
                }
            }
        }
        else if(lens>0)
        {
            valestr.append(" order by ");
            for(i=0;i<lens;i++ )
            {
                ordebycolname = "columns[" + value[i] + "][data]";;
                if(!StringUtils.isBlank(ordebycolname))
                {
                    if(!isfirst)
                        valestr.append(",");
                    valestr.append(request.getParameter(ordebycolname));
                    isfirst=false;
                }
            }
            valestr.append(" asc ");
        }
        parameterMap.put("datatableorderby",valestr.toString());
        return parameterMap;
    }

2.从点击监听获取 callback_param 回调参数,内容是一个加密字符串,在调用事件回传接口的时候会用到,回传媒体,oaid必须传,否则媒体无法识别设备

 private static String ACTIVATE_URL = "https://ad.oceanengine.com/track/activate/";
    /**
     * 转化事件回调服务
     * 
     * @param callback
     *            监测链接参数
     * @param event_type
     *            事件类型对应媒体api:0-激活,6-次留
     *  @param props = String.format("&imei=%s&oaid=%s&oaid_md5=%s&caid1=%s&caid2=%s&os=%s&conv_time=%s", req.getImei(),
     *            oaid, oaid_md5, caid1, caid2, os, System.currentTimeMillis() / 1000L);
     * @return
     */
    public static HashMap<String, String> uploadEven(String callback, Integer event_type,String props ) {
        String url = ACTIVATE_URL +"?callback="+ callback +"&event_type="+ event_type+props;
        try{
            HashMap<String, String> result= HttpClientUtils.get(url);
            if("ok".equals(result.get("result_code").toString())){
                logger.info("回传媒体成功:事件{},参数{},结果{}",event_type,url,result.get("result_data"));
            }else {
                logger.info("回传媒体失败:事件{},参数{},结果{}",event_type,url,result.get("result_data"));
            }
            return result;
        }catch (Exception e){
            logger.error("回传媒体失败:事件{},参数{},原因{}",event_type,url,e);
        }
        return null;
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
巨量引擎广告转化回传 API 可以用于将广告转化数据回传巨量引擎,帮助广告主更好地评估广告效果和优化广告投放策略。下面是巨量引擎广告转化回传 API 的对接说明: 1. 获取 API 认证信息:在巨量引擎广告后台获取 API 认证信息,包括 App ID、App Key 和 Access Token。其中,App ID 和 App Key 是用于对接巨量引擎广告 API 的密钥,Access Token 是用于获取授权访问权限的令牌。 2. 创建转化回传 API:在巨量引擎广告后台创建转化回传 API,包括 API 名称、回传 URL、回传参数等信息。其中,回传 URL 是用于接收转化数据的 URL,回传参数是用于标识和描述转化数据的参数。 3. 调用转化回传 API:在广告转化发生时,调用转化回传 API,将转化数据以 JSON 格式 POST 提交到回传 URL,同时在 POST 请求头中添加 App ID 和 Access Token 等认证信息,确保数据能够被正确接收和处理。 4. 处理转化数据:在回传 URL 中接收并处理转化数据,根据回传参数解析和处理数据,并将数据保存到数据库或其他数据存储介质中。 以下是一个使用 PHP CURL 调用巨量引擎广告转化回传 API 的示例代码: ```php // API 认证信息 $app_id = "your_app_id"; $app_key = "your_app_key"; $access_token = "your_access_token"; // 转化回传 API URL $url = "http://your_callback_url"; // 转化数据 $data = array( "event_type" => "active", "user_id" => "your_user_id", "order_id" => "your_order_id", "order_price" => "your_order_price" ); // 创建 CURL 请求 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/json", "X-SS-App-Id: " . $app_id, "X-SS-Access-Token: " . $access_token )); // 发送请求并获取响应 $response = curl_exec($ch); curl_close($ch); // 处理响应 if ($response == "success") { // 转化回传成功,记录日志或其他处理 } else { // 转化回传失败,记录日志或其他处理 } ``` 以上代码中,需要将 `$app_id`、`$app_key` 和 `$access_token` 替换为实际的 API 认证信息,将 `$url` 替换为实际的转化回传 API URL,将 `$data` 替换为实际的转化数据。处理响应的方式可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值