写一个宠物饲养的小程序,记录自己宠物的日常,包括喂食、洗澡、称重、疫苗等,可以形成时间轴瀑布流。另外有互动区,可以与其它宠友一起交流饲养心得、分享萌宠的日常。技术栈:SpringBoot、MyBatis、原生小程序。
由于个人的测试appid是没有获取用户手机号的权限的,但是可以获取到openid,这个ID对于每个用户也是唯一的,因此我们可以通过这个方式模拟小程序授权登录的效果:
@GetMapping("/getopenid")
public JsonResult getOpenId(String code, HttpServletRequest request) {
String url = "https://api.weixin.qq.com/sns/jscode2session";
url += "?appid=你的测试appid";//小程序的appid
url += "&secret=你的密钥";//appSecret
url += "&js_code=" + code;
url += "&grant_type=authorization_code";
url += "&connect_redirect=1";
String res = null;
JsonResult result = new JsonResult();
try {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// DefaultHttpClient();
HttpGet httpget = new HttpGet(url); //GET方式
CloseableHttpResponse response = null;
// 配置信息
RequestConfig requestConfig = RequestConfig.custom() // 设置连接超时时间(单位毫秒)
.setConnectTimeout(30000) // 设置请求超时时间(单位毫秒)
.setConnectionRequestTimeout(30000) // socket读写超时时间(单位毫秒)
.setSocketTimeout(30000) // 设置是否允许重定向(默认为true)
.setRedirectsEnabled(false).build(); // 将上面的配置信息 运用到这个Get请求里
httpget.setConfig(requestConfig); // 向微信服务器发送Get请求,获取微信用户信息
response = httpClient.execute(httpget); // 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
res = EntityUtils.toString(responseEntity);
logger.info("WXMP_OPENID获取用户openid响应:"+res);
}
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (Exception e) {
e.printStackTrace();
return JsonResult.error("500", "获取用openid发生异常");
}
JSONObject jo = JSON.parseObject(res);
String openid = jo.getString("openid");
logger.info("WXMP_OPENID获取用户openid:"+openid);
//判断是否新用户,如果是新用户则自动注册插入数据库,否则登录
User record = new User();
record.setOpenId(openid);
User user = userMapper.selectOne(record);
if(user==null) {
//插入新用户
user = new User();
user.setStatus(1);
user.setOpenId(openid);
userMapper.insertSelective(user);//插入数据库
}
//将openid存入token中
String token = jwtConfig.createToken(openid);
if (!StringUtils.isEmpty(token)) {
jo.put("token",token) ;
}
jo.put("user", user);
result.setData(jo);
return result;
}