前端:
在wxml文件中写入登录按钮并添加点击事件
<button bindtap="login">登录</button>
然后在js文件中写入逻辑,调用官方提供的API wx.login(官方文档链接),它会返回code有效期五分钟,把code传给服务端
login(){
console.log("登录")
wx.login({
success (res) {
if (res.code) {
console.log(res)
//发起网络请求
wx.request({
url: '', //登录接口
method:'POST',
data: {
code: res.code
},
success (res) {
console.log(res)
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
}
中间步骤:
登录(官方文档)需要传入4个参数 js_code(也就是前端传来的code),grant_type(固定不变authorization_code),以及appid和secret
appid和secret获取方法
后端:
接口实现类中调用官方登录接口传入js_code,grant_type,以及appid和secret,它会返回一个openid,可以拿它作为用户的唯一标识
@Override
public User userLoginDTO(UserLoginDTO userLoginDTO) {
//微信登录 请求官方接口获取openid
String url = "https://api.weixin.qq.com/sns/jscode2session";
Map<String, String> map = new HashMap<>();
map.put("appid", ""); //写入appid
map.put("secret", "");//写入secret
map.put("js_code", userLoginDTO.getCode()); //前端来的code
map.put("grant_type", "authorization_code");
//使用HttpClientUtil发送请求
String stringJson = doGet(url, map);
System.out.println(stringJson);
//接收json类型的字符串
JSONObject jsonObject = JSON.parseObject(stringJson);
String openid = jsonObject.getString("openid");
if (openid == null) {
throw new LoginFailedException("登录失败");
}
//现在已经拿到openid了以下代码是我业务代码,可以删除掉按照你们的业务去写了
//判断当前用户是否为新用户
User user = userMapper.getOpenidUser(openid);
if (user == null) {
//如果是新用户就注册
user = User.builder().openid(openid).createTime(LocalDateTime.now()).build();
userMapper.insertUser(user);
}
//返回用户对象
return user;
}
//封装请求方法 我使用的是HttpClients,没有引入maven坐标的自行引入
public static String doGet(String url, Map<String, String> paramMap) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
CloseableHttpResponse response = null;
try {
URIBuilder builder = new URIBuilder(url);
if (paramMap != null) {
for (String key : paramMap.keySet()) {
builder.addParameter(key, paramMap.get(key));
}
}
URI uri = builder.build();
//创建GET请求
HttpGet httpGet = new HttpGet(uri);
//发送请求
response = httpClient.execute(httpGet);
//判断响应状态
if (response.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}