最近我做了一个关于商场的项目。B端使用了若易的开源框架微信授权登录,C端还是和Vue的前后端分离的。C端主要是小程序的形式,所以想总结一下微信小程序登录Java部分遇到的坑,也就是代码分享!
废话不多说,直接上代码!
1.控制器层代码
我使用 request 直接接收输入参数。您可以将其更改为您自己的 DTO 以接收输入参数。
@GetMapping("/letsLogin")
@ApiOperation("微信授权登录")
public R letsLogin(HttpServletRequest request){
return remoteMallUserService.letsLogin(request);
}
2.服务层代码
涉及到几个基本的配置参数,我这里分别列出。可以放到配置文件中引用,也可以直接作为常量引用;
同时可以参考微信公众平台提供的开发文档(服务器):API调用凭证| 微信开放文档
// APP_ID 小程序注册时由微信提供
private final static String APP_ID = "....";
// APP_SERCRET 小程序注册时由微信提供
private final static String APP_SERCRET = ".....";
// 请求地址这边用了多个所以我们按照调用的顺序来说明
// 首先是这个TOKENURL 用于获取微信用户的授权认证 来拿到“accessToken”
private final static String TOKENURL = "https://api.weixin.qq.com/cgi-bin/token";
// 第二是用于请求获取用户手机号的地址(结尾的“access_token”需要拼接上TOKENURL返回的参数)
private final static String PHONENURL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";

// 最后才是登录url了
private final static String URL = "https://api.weixin.qq.com/sns/jscode2session";
由于我自己的业务中有手机号验证登录的功能模块,所以我在输入参数的时候会判断是否有手机号,不存在时才通过微信请求;如果存在,我可以直接调用登录URL。;
这里我们还需要简单说明一下输入参数(红色为必填参数):
1. userPhone 用户电话号码;
2.代码:前端通过getPhoneNum()得到的代码;
3. loginCode:前端通过wx.login()获取的代码;
@Autowired
private RestTemplate restTemplate;
@Override
public R letsLogin(HttpServletRequest request){
// 先拿到前端通过wx.login()拿到的code -- 5分钟过期哦
String loginCode = request.getParameter("loginCode");
if(StringUtils.isBlank(loginCode)){
return R.fail(101,"loginCode不可以为空!");
}
String userPhone = request.getParameter("userPhone");
// 如果手机号为空则判断是否有code(该code是前端通过获取手机号方法拿到的)
if (StringUtils.isBlank(userPhone)){

String code = request.getParameter("code");
if(StringUtils.isBlank(code)){
return R.fail(101,"code为空,无法获取手机号!");
}
// 获取手机号 -- 这边需要定义一个传参的map
Map params1 = new HashMap<>();
// 此处为固定值不需要修改
params1.put("grant_type", "client_credential");
// APP_ID和APP_SERCRET需要根据实际情况进行传参
params1.put("appid", APP_ID);
params1.put("secret", APP_SERCRET);
// 调用TOKENURL获取授权凭证access_token
// 我这边用的是Hultool的HTTP请求工具 -- 之后会附上maven依赖
String resultToken = HttpUtil.sendGet(TOKENURL, params1);
// fastjson 框架自带 大家可以选择自己的JSON转换工具
JSONObject tokenJson = JSONObject.parseObject(resultToken);
String accessToken = (String)tokenJson.get("access_token");
// 使用前端code获取手机号码(accessToken一定要以get的方式请求)其他参数为json格式
String url1 = PHONEURL + accessToken;
Map paramMap = new HashMap<>();
paramMap.put("code", code);

HttpHeaders headers = new HttpHeaders();
HttpEntity
3.利用层代码。添加一个 RestTemplateConfig 配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//ms
factory.setConnectTimeout(15000);//ms
return factory;
}
}
4、Hultool的依赖
cn.hutool
hutool-all
5.2.4
最后说一下开发中踩过的坑,就是要得到手机号返回的response,要经过两次map转换才能得到最终的手机号,但是官方文档中的返回格式是JSON对象,如果是JSON字符串就不需要这么麻烦了微信授权登录,开发的时候可以优化这部分!