spring boot 实现微信扫码登录
微信扫码功能实现基于微信开放平台,但是这个申请账号是需要收费的。我们个人在做项目的过程中可以使用微信测试号来实现扫码登录功能。申请测试号需要去[微信公众平台]: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
,微信扫码登录就可以了。
扫码登录成功后,会直接分配一个appId和appsecret,这两个参数就是我们要用的。
首先,需要向微信申请一个用于登录的二维码:
@GetMapping("/weixinLogin")
private ResultJson weixinLogin(){
try {
// String token1=weiXinShareService.setAccessToken();
//获取token开发者
String token=weiXinShareService.getAccessToken();
String url="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+token;
String scene_str = getRandomString(8);//这里生成一个带参数的二维码,参数是scene_str
String json="{\"expire_seconds\": 604800, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \""+scene_str+"\"}}}";
log.info(json);
JSONObject jsonObject = JSONObject.parseObject(json);
JSONObject jsonObject1 = HttpUtils.httpPost(url,jsonObject);
jsonObject1.put("sceneStr",scene_str);
log.info("获取微信登录二维码成功!!!!"+jsonObject1.toJSONString());
return ResultJson.ok(jsonObject1);
} catch (Exception e) {
log.info("获取微信登录二维码失败:"+e);
return ResultJson.failure(ResultCode.BAD_REQUEST);
}
}
//length用户要求产生字符串的长度
public static String getRandomString(int length){
String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random=new Random();
StringBuffer sb=new StringBuffer();
for(int i=0;i<length;i++){
int number=random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}
上面方法返回的是一个json对象,我们需要使用json对象中的ticket换取二维码:
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=
//在这个地址后面拼接ticket直接获取二维码
换取的二维码是可以直接访问的,在前台通过一个标签就可以展示出来。
换取到二维码之后,在微信公众平台做一些配置:
URL处填写登录以后回调的接口路径,token出随便填写,但是要和后台代码保持一致,域名注意要去掉http,下面是我的回调方法
@RequestMapping ("/checkSign")
public String checkSign ( HttpServletRequest request) throws Exception {
//获取微信请求参数
log.info("接收微信公众号事件触发回调请求");
String signature = request.getParameter ("signature");
String timestamp = request.getParameter ("timestamp");
String nonce = request.getParameter ("nonce");
String echostr = request.getParameter ("echostr");
//参数排序。 token 就要换成自己实际写的 token
String [] params = new String [] {
timestamp,nonce,"123456"} ;
Arrays.sort (params) ;
//拼接
String paramstr = params[0] + params[1] + params[2] ;
//加密
//获取 shal 算法封装类
MessageDigest Sha1Dtgest = MessageDigest.getInstance("SHA-1") ;
//进行加密
byte [] digestResult = Sha1Dtgest.digest(paramstr.getBytes ("UTF-8"));
//拿到加密结果
//String mysignature = WebUtils.byte2HexStr(digestResult);
String mysignature = FileDataConvert.bytes2HexString(digestResult)