今日頭條(OCPC)廣告激活數據對接-JAVA版

最近在今日頭條投廣告,頭條反饋可以按照實際激活數據的轉換來付費,也就是說,只有用戶真的下載並打開應用了才收費,過程類似與早年間的GHOST系統預裝軟件

下面說下頭條的整個邏輯:

頭條處理邏輯

1、用戶在頭條點擊廣告頁,廣告頁引領用戶去下載,用戶下載後打開應用,頭條吧這個用戶的設備信息以及一些廣告信息和回掉信息推送給監測服務器

2、應用將設備的唯一信息傳遞給監測服務器

3、監測服務器,視時機,將客戶端傳遞的設備信息和頭條傳遞近7天的設備信息進行匹配

4、匹配成功後調用接口回傳給今日頭條,那麼這就完成了一次成功的轉換,頭條就開始扣你錢了

監測服務器處理邏輯

1、需要開發一個GET請求的接口用來接收頭條的推送數據,最好分兩個接口(IOS,android)

下面是源碼:
// IOS獲取頭條推送數據
    @RequestMapping(value = "/ttpushIos", method = RequestMethod.GET)
    @ResponseBody
    public String ttpushIos(String adid, String cid, String idfa, String mac, String os,
            String timestamp, String convert_id, String callback) {


        TouTiao touTiao =
                new TouTiao(adid, cid, idfa, mac, os, timestamp, convert_id, callback, "", "0", "");

        logger.info("今日頭條回饋IOS數據" + touTiao.toString());

        touTiaoService.insertSelective(touTiao);//持久化

        return "success";

    }

iOS和安卓的接口信息字段不一樣,也可能會變,參照最新的頭條文檔就行,總之需要吧數據存儲到本地

2、接受客戶端傳遞的設備信息,這個就是普通的接口,自己寫下就行,這裏不貼代碼了


3、接受到頭條和客戶端的設備信息後,監測服務器需要比對,並將信息反饋給頭條


具體處理代碼就不貼了,下面貼下簽名和加密部分

// 使用 HMAC-SHA1 簽名方法對對url進行簽名
                String sig = "";
                try {
                    sig = new HmacSHA1Util().HmacSHA1Encrypt(url, key);
                } catch (Exception e) {
                    logger.info("HMAC-SHA1 簽名方法對對url進行簽名失敗");
                    e.printStackTrace();
                }

下面是工具類的源碼:
public class HmacSHA1Util {
    private static final String MAC_NAME = "HmacSHA1";
    private static final String ENCODING = "UTF-8";

    /**
     * 使用 HMAC-SHA1 簽名方法對對encryptText進行簽名
     * 
     * @param encryptText 被簽名的字符串
     * @param encryptKey 密鑰
     * @return 返回被加密後的字符串
     * @throws Exception
     */
    public static String HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {
        byte[] data = encryptKey.getBytes(ENCODING);
        // 根據給定的字節數組構造一個密鑰,第二參數指定一個密鑰算法的名稱
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
        // 生成一個指定 Mac 算法 的 Mac 對象
        Mac mac = Mac.getInstance(MAC_NAME);
        // 用給定密鑰初始化 Mac 對象
        mac.init(secretKey);
        byte[] text = encryptText.getBytes(ENCODING);
        // 完成 Mac 操作
        byte[] digest = mac.doFinal(text);
        StringBuilder sBuilder = bytesToHexString(digest);
        return sBuilder.toString();
    }

    /**
     * 轉換成Hex
     * 
     * @param bytesArray
     */
    public static StringBuilder bytesToHexString(byte[] bytesArray) {
        if (bytesArray == null) {
            return null;
        }
        StringBuilder sBuilder = new StringBuilder();
        for (byte b : bytesArray) {
            String hv = String.format("%02x", b);
            sBuilder.append(hv);
        }
        return sBuilder;
    }

    /**
     * 使用 HMAC-SHA1 簽名方法對對encryptText進行簽名
     * 
     * @param encryptData 被簽名的字符串
     * @param encryptKey 密鑰
     * @return 返回被加密後的字符串
     * @throws Exception
     */
    public static String hmacSHA1Encrypt(byte[] encryptData, String encryptKey) throws Exception {
        byte[] data = encryptKey.getBytes(ENCODING);
        // 根據給定的字節數組構造一個密鑰,第二參數指定一個密鑰算法的名稱
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
        // 生成一個指定 Mac 算法 的 Mac 對象
        Mac mac = Mac.getInstance(MAC_NAME);
        // 用給定密鑰初始化 Mac 對象
        mac.init(secretKey);
        // 完成 Mac 操作
        byte[] digest = mac.doFinal(encryptData);
        StringBuilder sBuilder = bytesToHexString(digest);
        return sBuilder.toString();
    }
}

base64加密

 // 對其進行base64加密
                sig = new Base64Util().getBase64(sig);
                url = url + "&signature=" + sig;
工具類源碼:
public class Base64Util {
    // 加密
    public static String getBase64(String str) {
        byte[] b = null;
        String s = null;
        try {
            b = str.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if (b != null) {

            s = Base64.encodeBytes(b);
        }
        return s;
    }

    // 解密
    public static String getFromBase64(String s) {
        byte[] b = null;
        String result = null;
        if (s != null) {
            try {
                b = Base64.decode(s);
                result = new String(b, "utf-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    public static void main(String[] args) {
        String string1 = "你好nnnn!";
        System.out.println(getBase64(string1));
        System.out.println(getFromBase64(getBase64(string1)));
    }
}

廣告主配置:

以上都準備號了之後,下面進入頭條網站,新建轉化,下面說下這幾個東西都怎麼填寫



需要用戶填寫的就是1、2、5項
對於第5項

填寫過程中,一定要仔細比對,一旦提交不能更改,只能再次新建
其餘的就可以參照頭條的API文檔進行編寫了




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章