皇冠welcome地址 皇冠welcome地址 皇冠welcome地址

Java——微信小程序授权手机号登录

最近我做了一个关于商场的项目。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=";

微信公众号登录授权_android 微信登录不回调授权页面_微信授权登录

// 最后才是登录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)){

微信授权登录_android 微信登录不回调授权页面_微信公众号登录授权

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);

android 微信登录不回调授权页面_微信公众号登录授权_微信授权登录

HttpHeaders headers = new HttpHeaders(); HttpEntity> httpEntity = new HttpEntity<>(paramMap, headers); ResponseEntity response = restTemplate.postForEntity(url1, httpEntity, Object.class); Object body = response.getBody(); Map map = new ObjectMapper().convertValue(body, Map.class); Object phoneInfo = map.get("phone_info"); Map map1 = new ObjectMapper().convertValue(phoneInfo, Map.class); // 以上都是response参数的处理 最终拿到userPhone 可以进行下一步 微信登陆了 userPhone = (String)map1.get("phoneNumber"); } // 构建 一个map传登录的参数 Map params = new HashMap<>(); params.put("appid", APP_ID); params.put("secret", APP_SERCRET); // 这里的code是前端通过wx.login()获取到的 params.put("js_code", loginCode); // 固定参数 params.put("grant_type", "authorization_code"); String resultJson = HttpUtil.sendGet(URL, params); JSONObject json = JSONObject.parseObject(resultJson);

微信授权登录_微信公众号登录授权_android 微信登录不回调授权页面

if (!json.containsKey("errcode")) { // 拿到openid(用户在该小程序的唯一用户标识) String openId = (String)json.get("openid"); // 之后的可以根据自己的业务进行处理 比如:新增用户... return R.ok("","登录成功"); } else { return R.fail(101,"登录失败!"); } }

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 {

微信公众号登录授权_微信授权登录_android 微信登录不回调授权页面

@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字符串就不需要这么麻烦了微信授权登录,开发的时候可以优化这部分!

© 2022 鄂ICP备2022098393号-1版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请联系站长举报,一经查实本站将立刻删除www0716@vip-qg.com举报