1.说明
由于项目临时提出需求,需要对接淘宝公共平台查询用户的一些信息,所以需要和淘宝平台做对接,我查看了一下淘宝公共平台开发文档,虽然写的挺丰富挺整洁,但我还是一头雾水,业务流程相对复杂,经过多次查看和尝试接口文档调用,终于是花了周末两天的是将搞定了,不得不记录一下,希望下次不要再采坑,也希望对需要对接淘宝平台的小伙伴们有一些帮助,不要花费不必要的时间在踩坑的路上.
淘宝开放平台地址:开放平台-文档中心 taobao.tbk.dg.cpa.activity.report( 淘宝客-推广者-任务奖励效果报表 )
2.踩坑
看这里有详细的API说明,下面还有一大堆参数说明和调用示例,但我还是踩坑了
这是使用淘宝SDK的请求示例
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
TbkDgCpaActivityReportRequest req = new TbkDgCpaActivityReportRequest();
req.setEventId(1L);
req.setBizDate("20210818");
req.setPageNo(1L);
req.setQueryType(1L);
req.setPageSize(10L);
req.setPid("mm_123_123_123");
req.setRelationId(100L);
TbkDgCpaActivityReportResponse rsp = client.execute(req);
System.out.println(rsp.getBody());
最开始使用的是这个 开放平台-文档中心
还是有一些区别的,这里显示推广者不需要token而我了带token的
TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
TbkScCpaActivityReportRequest req = new TbkScCpaActivityReportRequest();
req.setEventId(1L);
req.setBizDate("20210818");
req.setPageNo(1L);
req.setQueryType(1L);
req.setPageSize(10L);
req.setPid("mm_123_123_123");
req.setRelationId(100L);
TbkScCpaActivityReportResponse rsp = client.execute(req, sessionKey);
System.out.println(rsp.getBody());
因为在调用时候发现 client.execute(req, sessionKey)方法一个参数不带sessionKey会有问题,显然我的SDK里面没有这个方法,所以下面重点讲解带token的方式
3.解决方案
既然需要token那就要看看怎样获取到token ,这里的session就是我们想要的sessionKey
点击进去 开放平台-文档中心
这里也会有详细的介绍
1.创建应用
这里不做过多说明,跟着文档就可以
2.获取授权code
拼接url访问在跳转页会返回一个连接带code参数就是我们需要的code,详细的参数也可以在文档中看到
3.获取token
拿到上一步获取到的code就可以获取到访问token,这个是示例,按照这种方式的确可以获取到,在实际应用时候稍作修改就行了
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.taobao.api.internal.util.WebUtils; //引用top sdk
public class open_oauth {
public static void main(String[] args) {
String url="https://oauth.taobao.com/token";
Map<String,String> props=new HashMap<String,String>();
props.put("grant_type","authorization_code");
/*测试时,需把test参数换成自己应用对应的值*/
props.put("code","test");
props.put("client_id","test");
props.put("client_secret","test");
props.put("redirect_uri","http://www.test.com");
props.put("view","web");
String s="";
try{s=WebUtils.doPost(url, props, 30000, 30000);
System.out.println(s);
}catch(IOException e){
e.printStackTrace();}
} }
下面是我写的测试
@GetMapping("/tb-report")
public String tbCpaReport(@RequestParam Map<String,String> map) throws ApiException {
String url = "https://eco.taobao.com/router/rest";
String appKey = map.get("appKey");
String secret =map.get("secret");
String date =map.get("date");
String pid =map.get("pid");
String eventId =map.get("eventId");
String token = openAuth(map);
TaobaoClient client = new DefaultTaobaoClient(url, appKey, secret);
TbkDgCpaActivityReportRequest request = new TbkDgCpaActivityReportRequest();
request.setEventId(Long.parseLong(eventId));
request.setBizDate(date);
request.setPageNo(1L);
request.setQueryType(1L);
request.setPageSize(10L);
request.setPid(pid);
request.setRelationId(100L);
TbkDgCpaActivityReportResponse response = client.execute(request,token);
System.out.println(response.getBody());
return response.getBody();
}
@GetMapping("/open-auth")
public String openAuth(@RequestParam Map<String,String> map){
String code =map.get("code") ;
String redisKey = "tb-token-"+code;
String accessToken = (String) redisUtils.get(redisKey);
if(null!=accessToken&&!"".equals(accessToken)){
return accessToken;
}
String appKey = map.get("appKey");
String secret =map.get("secret");
String url="https://oauth.taobao.com/token";
Map<String,String> props=new HashMap<String,String>();
props.put("grant_type","authorization_code");
/*测试时,需把test参数换成自己应用对应的值*/
props.put("code",code);
props.put("client_id",appKey);
props.put("client_secret",secret);
props.put("redirect_uri","https://hhmt-tb.yoqu.net/v2/taobao/code");
props.put("view","web");
String s="";
try{s=WebUtils.doPost(url, props, 30000, 30000);
JSONObject json = JSONObject.parseObject(s);
accessToken = (String) json.get("access_token");
redisUtils.set(redisKey,accessToken,1800L,TimeUnit.SECONDS);
}catch(IOException exception){
exception.printStackTrace();}
return accessToken;
}
需要注意的是要自己保存code和token,因为一个code只能获取一次token,而且token有效时间是半小时,所有这里我选择保存在redis里面
4.测试
pid参数可以查到具体的某一个推广位,如果不加就是查所有。因为只是测试,所有这里没有写分页参数,代码中也没有校验逻辑。需要的小伙伴可以在这个基础上做更改。
4.总结
先读文档在测试,实在不行就百度,CSDB,B站