微信授权登录(springboot)

微信开放平台网址:https://open.weixin.qq.com
本人小白,只是记录一下,避免以后忘记

一:微信资质认证(网上很多教程)
因为公司要求需要微信登录,所以需要微信开发者认证,要先去微信开放平台进行资质认证
在这里插入图片描述
认证成功后,获取到AppID和AppSecret(这两个是微信授权登录所必须的)
二:进行开发
公司要求微信小程序登录后判断用户是否绑定了手机号,如果没有就需要去获取验证码注册手机号,找了很多资料,看了很多代码,结合自身的需求才弄出来,记录一下

WeixinLoginUtils工具类
public class WeixinLoginUtils {
    /**
     * 微信小程序登陆通过code获取session_key 和 openid
     * @param weixinappID
     * @param weixinappSecret
     * @param code
     * @return
     * @throws Exception
     */
    public StringBuilder getSessionKeyOropenid(String weixinappID,String weixinappSecret,String code) throws Exception{
        //查看官方文档 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317853&token=&lang=
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+weixinappID+"&secret="+
                weixinappSecret+"&js_code="+code+"&grant_type=authorization_code";
        URI uri = URI.create(url);
        HttpClient client = HttpClients.createDefault();
        HttpGet get = new HttpGet(uri);
        HttpResponse response=client.execute(get);
        StringBuilder sb = new StringBuilder();
        if (response.getStatusLine().getStatusCode() == 200) {
            HttpEntity entity = response.getEntity();
            BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
            for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
                sb.append(temp);
            }
        }
        return sb;
    }

/**
     * AES解密
     *
     * @param encryptedData         //密文,被加密的数据
     * @param session_key           //秘钥
     * @param iv                    //偏移量
     * @return
     * @throws Exception
     */
    public static String decrypt1(String encryptedData, String iv, String session_key,String encodingFormat){
        //被加密的数据
        byte[] dataByte = Base64.decode(encryptedData);
        //加密秘钥
        byte[] keyByte = Base64.decode(session_key);
        //偏移量
        byte[] ivByte = Base64.decode(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;
    }
  }

WeixinLoginProperties:

@Component
@ConfigurationProperties(prefix="weixinconfig")
@Data
public class WeixinLoginProperties {
    private String weixinappID ; // 移动应用appid

    private String weixinappSecret;  // 移动应用AppSecret

}

application-dev.yml

weixinconfig: #微信开放平台配置
  weixinappID:自己的appid
  weixinappSecret: 自己的appsecret

WeiXinParam

@Data
public class WeiXinParam {
    String openid = "";
    String unionId = "";
    String sex = "1";
    String nickname = "";
    String city = "";
    String province = "";
    String country = "";
    String avatarUrl = "";
    String headimgurl="";
}

UserServiceImpl实现类

 public JsonResult threeLogin(String code, String encryptedData,String iv,Integer type) {
        Map map = new HashMap();
        // 登录凭证不能为空
        if (code == null || code.length() == 0) {
            map.put("status", 0);
            map.put("msg", "code 不能为空");
            return JsonResult.faild(map);
        }
        try {
            //调用微信授权
            WeixinLoginUtils weixinLoginUtils = new WeixinLoginUtils();
            StringBuilder stringBuilder = weixinLoginUtils.getSessionKeyOropenid(weixinLoginProperties.getWeixinappID(), weixinLoginProperties.getWeixinappSecret(), code);
            System.out.println(stringBuilder);
            System.out.println("请求的jscode为:"+code);
            System.out.println("appid为:"+weixinLoginProperties.getWeixinappID());
            System.out.println("appSecret为:"+weixinLoginProperties.getWeixinappSecret());
            System.out.println("encryptedData为:"+encryptedData);
            System.out.println("iv为:"+iv);
            if (stringBuilder != null) {
                if (stringBuilder.toString().trim().contains("errcode")) {
                    return new JsonResult(ResultStatusCode.WX_ERRCODE);
                }
                JSONObject object = JSONObject.parseObject(stringBuilder.toString().trim());
                String session_key=object.getString("session_key");
                String openid=object.getString("openid");
                String unionid=object.getString("unionid");
                // TODO 业务逻辑  通过查询看是否第一次微信授权
             }
    }

业务逻辑是按照公司要求来的,获取到openid后,可以通过openid来查询用户是否登录和绑定过手机号,如果登录过,就只需要更新一下操作时间,就可以直接登录了。如果没有登录过,就需要将用户信息保存到数据库中,且需要注册手机号,这里我没有用微信提供的获取手机号的方式,公司自己写了注册接口,在后台将openid与userid进行绑定,并返回一个状态,传给前台,让前台接收到后知道需要调用注册接口,以此来完成注册手机号

你可能感兴趣的:(微信授权登录(springboot))