一.包装RequestBody
import lombok.Data;
@Data
public class DyLoginVo {
private String code;
// dy 抖音, tt 头条, xg 西瓜
private String btyeDanceType = "dy";
// 加密手机号
private String encryptedMobile;
//昵称
private String nickName;
//头像
private String avatarUrl;
}
二.controller层
@PostMapping("loginForDy")
@ApiOperation("抖音登录接口")
public AjaxResult loginForDy(@RequestBody DyLoginVo vo){
return dyLoginService.loginForDy(vo);
}
三.service层
public AjaxResult loginForDy(DyLoginVo vo) {
if (StringUtils.isEmpty(vo.getCode())) {
return AjaxResult.error("code 不能为空");
}
/**
* 获取用户基本信息
*/
JSONObject jsonObject = new JSONObject();
jsonObject.put("appid", appId);
jsonObject.put("secret", appKey);
jsonObject.put("code", vo.getCode());
jsonObject.put("anonymous_code","");
Map<String, String> headerParams = new HashMap();
headerParams.put("Content-Type", "application/json");
String baseDataStr = HttpUtils.doPostJson(url, headerParams, jsonObject.toJSONString());
JSONObject baseDataObject = JSON.parseObject(baseDataStr);
if (baseDataObject.get("data") == null) {
log.error("获取字节用户基本信息异常 req => {} , res => {}", JSON.toJSONString(jsonObject), baseDataStr);
return AjaxResult.error("获取用户信息失败");
}
JSONObject baseData = baseDataObject.getJSONObject("data");
if (baseData.get("openid") == null) {
log.error("获取字节用户基本信息异常 req => {} , res => {}", JSON.toJSONString(jsonObject), baseDataStr);
return AjaxResult.error("获取用户信息失败");
}
String openId = baseData.get("openid").toString();
// 此刻可以判断用户是否存在, 可注册
WzDouyinUser wzDouyinUser = douyinUserService.selectWzDouyinUserByOpenId(openId);
if (wzDouyinUser != null) {
return AjaxResult.success(wzDouyinUser);
} else {
WzDouyinUser user = new WzDouyinUser();
user.setOpenId(openId);
user.setNickname(vo.getNickName());
user.setImage(vo.getAvatarUrl());
if (StringUtils.isNotEmpty(vo.getEncryptedMobile())) {
try {
user.setMobile(DyUtil.getMobile(appKey, vo.getEncryptedMobile()));
} catch (Exception e) {
return AjaxResult.error("手机号解密失败!");
}
}
douyinUserService.insertWzDouyinUser(user);
Long id = user.getId();
Hashids hashids = new Hashids(HASH_KEY, 4);
String encode = hashids.encode(id);
user.setInvitationCode(encode);
douyinUserService.updateWzDouyinUser(user);
WzDouyinUser douyinUser = douyinUserService.selectWzDouyinUserById(user.getId());
return AjaxResult.success(douyinUser);
}
}
四.工具类
public class HttpUtils {
public static String sendGet(String url) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
public static String doPostJson(String url, Map<String, String> headers, String json) {
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
HttpPost httpPost = new HttpPost(url);
httpPost = (HttpPost)addHeaders(httpPost, headers);
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception var16) {
var16.printStackTrace();
} finally {
try {
response.close();
} catch (IOException var15) {
var15.printStackTrace();
}
}
return resultString;
}
private static HttpRequestBase addHeaders(HttpRequestBase httpRequest, Map<String, String> headers) {
httpRequest.addHeader("Authorization", "1231321321313132132");
Iterator var2 = headers.entrySet().iterator();
while(var2.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry)var2.next();
httpRequest.addHeader((String)entry.getKey(), (String)entry.getValue());
}
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000).setConnectionRequestTimeout(35000).setSocketTimeout(60000).build();
httpRequest.setConfig(requestConfig);
return httpRequest;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, JSONObject param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>