因app推广需要接入Oppo应用商店回传数据接口,接入过程中,踩了一些坑,主要还是因为签名的问题导致回传签名验证不通过,搜索也没有找到相应的博文,或许是因为复用了之前其他模块的代码导致遇到了一些本可以规避的问题,现把相关代码贴一下,仅做备忘。
@Data
public class OppoCallBackReq {
private String ouId;
private Integer ascribeType;
private Integer type;
private Integer channel;
private Integer dataType;
private String pkg;
private Long timestamp;
private Long adId;
}
@Component
public class OppoCipherUtils {
@Value("${oppo.encode.key:oppoBase64Key}")
private String oppoBase64Key;
public String encode(String data) throws
GeneralSecurityException {
final Key dataKey = new SecretKeySpec(Base64.decodeBase64(oppoBase64Key),
"AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, dataKey);
byte[] encryptData = cipher.doFinal(data.getBytes());
return Base64.encodeBase64String(encryptData).replaceAll("\r",
"").replaceAll("\n", "");
}
}
@Value("${oppo.callback.url:https://api.ads.heytapmobi.com/api/uploadActiveData}")
private String oppoCallbackUrl;
@Value("${oppo.callback.salt:oppoCallbackSalt}")
private String oppoCallbackSalt;
public void callbackOppo(String oppoPkgName, Integer eventType, Long accountId) {
OppoCallBackReq req = new OppoCallBackReq();
Long now = System.currentTimeMillis();
req.setTimestamp(now);
req.setPkg(oppoPkgName);
try {
req.setOuId(oppoCipherUtils.encode(oaid));
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
req.setDataType(eventType);
req.setType(2);
req.setChannel(1);
req.setAscribeType(1);
req.setAdId(accountId);
Map<String, String> headers = new HashMap<>(1);
headers.put("signature", MD5Util.MD5(JsonUtil.toJson(req) + now + oppoCallbackSalt));
headers.put("timestamp", String.valueOf(now));
headers.put("Content-Type", "application/json;charset=UTF-8");
String result = httpService.post(oppoCallbackUrl, null, headers, req);
if (StringUtil.isNotBlank(result)) {
try {
JSONObject jsonObject = JSONObject.fromObject(result);
if (jsonObject != null) {
String successStr = jsonObject.optString("ret");
logger.info("callbackOppo successStr={}", successStr);
}
} catch (Exception e) {
logger.info("callbackOppo Exception", e);
}
}
}