栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot微信小程序登录/授权获取手机号

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot微信小程序登录/授权获取手机号

    @RequestMapping(value = "/loginWX", method = RequestMethod.POST)
    @ResponseBody
    public Object loginWX(String encryptedData, String iv, String code, HttpSession session) {
        log.info("微信登录");
        Map map = new HashMap();
        String user_id = "";
        String openid = "";
        String u_phone = "";
        String ua_icon = "";
        String ua_usernick = "";

        log.info("encryptedData:" + encryptedData);
        log.info("iv:" + iv);
        log.info("code:" + code);

        if (code != null) {
            String params = "";
            //1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
            //appid 小程序appid;secret 小程序secret;grant_type = "authorization_code"
            params = "appid=" + accountConfiguration.getAppId() + "&secret=" + accountConfiguration.getSecret() + "&js_code=" + code + "&grant_type="
                    + accountConfiguration.getGrantType();

            // 发送请求
            String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
            // 解析相应内容(转换成json对象)
            JSonObject json = new JSonObject(sr);
            System.out.println(json.toString());
            // 获取会话密钥(session_key)
            String session_key = json.get("session_key").toString();

            // 用户的唯一标识(openid)
            openid = (String) json.get("openid");

            2、对encryptedData加密数据进行AES解密 
            try {
                String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
                if (null != result && result.length() > 0) {
                    log.info("解密成功");

                    JSonObject userInfoJSON = new JSonObject(result);
                    Integer gender = Integer.parseInt(userInfoJSON.get("gender").toString());
                    String avatarUrl = userInfoJSON.get("avatarUrl").toString();
                    String nickName = userInfoJSON.get("nickName").toString();
                    //根据openid获取用户信息
                    Map user_map = appletService.getUserByOpenid(openid);
                    log.info("user_map:" + user_map);
                    if (user_map != null) {    //已注册
                        log.info("修改登录时间");
                        user_id = user_map.get("ua_id").toString();
                        u_phone = user_map.get("ua_phone") != null ? user_map.get("ua_phone").toString() : "";
                        ua_icon = avatarUrl;
                        ua_usernick = nickName;

                        //更新微信头像、昵称、最后登录时间
                        UserAdmin userAdmin = new UserAdmin();
                        userAdmin.setUa_id(user_id);
                        userAdmin.setUa_icon(ua_icon);
                        userAdmin.setUa_usernick(ua_usernick);
                        userAdmin.setUa_lastlogin_time(DateUtil.getStringDate());
                        appletService.updateUserAdmin(userAdmin);

                    } else {
                        log.info("新增用户");
                        //新增用户
                        UserAdmin userAdmin = new UserAdmin();
                        userAdmin.setUa_id(sid.nextShort());
                        userAdmin.setUa_openid(openid);
                        userAdmin.setUa_gender(gender);
                        userAdmin.setUa_icon(avatarUrl);
                        userAdmin.setUa_usernick(nickName);
                        userAdmin.setUa_type(2);    //用户类型
                        userAdmin.setUa_is_post(1);
                        userAdmin.setUa_status(1);  //状态
                        userAdmin.setUa_give_balance(0);    //赠送余额
                        userAdmin.setUa_recharge_balance(0);    //充值余额
                        userAdmin.setUa_create_time(DateUtil.getStringDate());
                        userAdmin.setUa_lastlogin_time(DateUtil.getStringDate());
                        int save_status = appletService.saveUser(userAdmin);
                        if (save_status > 0) {
                            user_id = userAdmin.getUa_id();
                            u_phone = userAdmin.getUa_phone();
                            ua_icon = userAdmin.getUa_icon();
                            ua_usernick = userAdmin.getUa_usernick();
                        }
                    }
                } else {
                    log.info("解密失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
                log.error("错误:" + e.getMessage());
            }
        }
        map.put("ua_id", user_id);
        map.put("ua_phone", u_phone);
        map.put("ua_icon", ua_icon);
        map.put("ua_usernick", ua_usernick);
        map.put("ua_openid", openid);
        System.out.println("用户登录信息:" + map.toString());
        return JSONResult.ok(map);
    }

工具类

HttpRequest

package com.qupaiji.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

public class HttpRequest {
    public static void main(String[] args) {
        //发送 GET 请求
//        String s=HttpRequest.sendGet("http://v.qq.com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o", "");
//        System.out.println(s);

//        //发送 POST 请求
//        String sr=HttpRequest.sendPost("http://www.toutiao.com/stream/widget/local_weather/data/?city=%E4%B8%8A%E6%B5%B7", "");
//        JSonObject json = JSONObject.fromObject(sr);
//        System.out.println(json.get("data"));
    }

    
    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", "*
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*
	public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
		// initialize(); //被加密的数据
		byte[] dataByte = base64.decodebase64(data); //加密秘钥
		byte[] keyByte = base64.decodebase64(key); //偏移量
		byte[] ivByte = base64.decodebase64(iv);
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
			SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
			AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
			parameters.init(new IvParameterSpec(ivByte));
			cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
			byte[] resultByte = cipher.doFinal(dataByte);
			if (null != resultByte && resultByte.length > 0) {
				String result = new String(resultByte, encodingFormat);
				return result;
			}
			return null;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidParameterSpecException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (InvalidAlgorithmParameterException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
}

实现思路:

        1.向微信服务器发送请求,使用登录凭证 code 获取 session_key 和 openid

        2.通过AesCbcUtil工具类对encryptedData加密数据进行AES解密

        3.解密成功后,从JSONObject类型对象中获取到头像、性别、昵称信息

        4.根据openid在用户表查询用户数据

        5.判断用户对象为空,执行新增用户操作,否则执行修改用户操作(最后登录时间、头像等)

        6.将openid及其它用户信息封装后返回给前端即可

授权获取手机号实现:

        1.其它部分与微信登录一样

        2.解密成功后,从JSONObject类型对象中获取到手机号

JSonObject userInfoJSON = new JSonObject(result);
String u_phone = userInfoJSON.get("purePhoneNumber").toString();

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/305408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号