今日頭條(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文件進行編寫了