最近在今日頭條投廣告,頭條反饋可以按照實際激活數據的轉換來付費,也就是說,只有用戶真的下載並打開應用了才收費,過程類似與早年間的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";
}
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)));
}
}