Java 实现微信扫码登录方法(提供前端及后端核心代码)

这篇具有很好参考价值的文章主要介绍了Java 实现微信扫码登录方法(提供前端及后端核心代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思路

1、Vue前端页面获取一个公众号的二维码,不是普通二维号,是带有场景值的

2、java后端接收前端的请求,生成一个带时效性的二维码链接返回给前端

3、公众号平台配置服务器接口地址

4、接收到关注或扫码请求并相应处理

5、前端轮询状态,如果检查到验证通过进到下一页面

前端页面

java微信扫码登录功能实现,java,微信,vue.js,vue.js,微信,java

vue代码

    wxlogin() {
        this.$showLoading();
        getTempQrCode(this.token).then((res) => {
            console.log("res==========",res);
            this.$closeLoading();
            this.imageUrl = objToStr(res.data.message);
            this.loginType='wx'
            setTimeout(() => {
                this.check();               
            }, 1000);
        }) 
    },

java代码

@RequestMapping(value = "/getTempQrCode", method = RequestMethod.GET)
public Result<?> getTempQrCode(@RequestParam(name = "scene_str", required = true) String sceneStr) {

        WeixinHelper.setAppId(appid);
        WeixinHelper.setSecret(secret);
        String result = WeixinHelper.createTempQrCode(WeixinHelper.getAccessToken(), sceneStr);
        return Result.ok(result);
}


public static String createTempQrCode(String access_token, String scene_str) {
        String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + access_token;
        Map<String, Object> data = new HashMap<>();
        data.put("expire_seconds", 604800);
        data.put("action_name", "QR_STR_SCENE");
        Map<String, Object> action_info = new HashMap<>();
        Map<String, Object> scene = new HashMap<>();
        scene.put("scene_str", scene_str);
        action_info.put("scene", scene);
        data.put("action_info", action_info);
        String json = HttpUtil.createPost(url)
                .header("Content-Type", "application/json")
                .body(JSONUtil.toJsonStr(data))
                .execute().body();
        System.out.println("json = " + json);
        String qrcode = (String) JSONUtil.getByPath(JSONUtil.parse(json), "ticket");
        return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + qrcode;
    }



public static String getAccessToken() {
        accessToken = getNewAccessToken();
        return accessToken;
}


public static String getNewAccessToken() {
        String access_token = "";
        String grant_type = "client_credential";//获取access_token填写client_credential
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grant_type + "&appid=" + appId + "&secret=" + secret;
        try {
            URL urlGet = new URL(url);
            HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
            http.setRequestMethod("GET"); // 必须是get方式请求
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
            System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
            http.connect();
            InputStream is = http.getInputStream();
            int size = is.available();
            byte[] jsonBytes = new byte[size];
            is.read(jsonBytes);
            String message = new String(jsonBytes, "UTF-8");
            JSONObject demoJson = JSONObject.parseObject(message);
            System.out.println("JSON字符串:" + demoJson);
            access_token = demoJson.getString("access_token");
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return access_token;
}




公众号配置

java微信扫码登录功能实现,java,微信,vue.js,vue.js,微信,java

java提供消息接收接口代码,有两个,一个get(公众平台网址验证的时候用),一个post(消息事件触发时用)

/*
     * @param signature 微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。
     * @param timestamp 时间戳
     * @param nonce     这是个随机数
     * @param echostr   随机字符串,验证成功后原样返回
     */
    @GetMapping("/wx/event")
    public void get(@RequestParam(required = false) String signature,
                    @RequestParam(required = false) String timestamp,
                    @RequestParam(required = false) String nonce,
                    @RequestParam(required = false) String echostr,
                    HttpServletResponse response) throws IOException {
        System.out.println("接受事件===" + echostr);
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(echostr);
        response.getWriter().flush();
        response.getWriter().close();
    }

    //处理微信推送事件
    @PostMapping("/wx/event")
    public void post(final HttpServletRequest request, HttpServletResponse response) {

        System.out.println("接受事件");
        try {
            // 微信加密签名
            final String signature = request.getParameter("signature");
            // 时间戳
            final String timestamp = request.getParameter("timestamp");
            // 随机数
            final String nonce = request.getParameter("nonce");
            // 随机字符串
            final String echostr = request.getParameter("echostr");
            //将xml文件转成易处理的map(下方贴出)
            final Map<String, String> map = oConvertUtils.parseXml(request);
            //开发者微信号
            final String toUserName = map.get("ToUserName");
            //OpenId
            final String fromUserName = map.get("FromUserName");
            //消息创建时间 (整型)
            final String createTime = map.get("CreateTime");
            //消息类型,event
            final String msgType = map.get("MsgType");
            //事件类型
            final String event = map.get("Event");

            String scene_str = "";
            String msg = "";
            if ("event".equals(msgType)) {
                if (event.equals("subscribe")) {
                    final String ticket = map.get("Ticket");
                    if (ticket != null) {
                        scene_str = map.get("EventKey").replace("qrscene_", "");
                    }
                    msg = getXmlReturnMsg(fromUserName, toUserName, (new Date()).getTime(), "欢迎您使用量子文档");
                }
                //注:事件类型为SCAN即已关注
                else if (event.equals("SCAN")) {
                    final String ticket = map.get("Ticket");
                    if (ticket != null) {
                        scene_str = map.get("EventKey");
                    }
                    msg = getXmlReturnMsg(fromUserName, toUserName, (new Date()).getTime(), "您刚刚扫码登录了量子文档");

                }
            }
            System.out.println("event:" + event);
            System.out.println("场景值:" + scene_str);
            System.out.println("openId:" + fromUserName);
            System.out.println("ToUserName:" + toUserName);

            // 如果scene_str 不为空代表用户已经扫描并且关注了公众号
            if (oConvertUtils.isNotEmpty(scene_str)) {
                QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
                queryWrapper.eq("open_id", fromUserName);
                SysUser sysUser = sysUserService.getOne(queryWrapper, false);
                if (sysUser == null) {
                    sysUser = new SysUser();
                    sysUser.setOpenId(fromUserName);
                    sysUser.setUsername(fromUserName);
                    sysUser.setRealname(null);
                    String salt = oConvertUtils.randomGen(8);
                    String passwordEncode = PasswordUtil.encrypt(fromUserName, salt, salt);
                    sysUser.setSalt(salt);
                    sysUser.setMemberLevelId("1");
                    sysUser.setPassword(passwordEncode);
                    sysUser.setStatus(1);
                    sysUser.setDelFlag(CommonConstant.DEL_FLAG_0);
                    sysUserService.save(sysUser);
                    LzMessage message = new LzMessage();
                    message.setMsgDate(new Date());
                    message.setContent("欢迎您使用量子文档");
                    message.setFileId(null);
                    message.setIsRead(0);
                    message.setDelFlag(0);
                    message.setMsgType(3);
                    message.setFromUserId("001");
                    message.setFromUserName("小量子");
                    message.setToUserId(sysUser.getId());
                    lzMessageService.save(message);
                }
                // 将微信公众号用户ID缓存到redis中,标记用户已经扫码完成,执行登录逻辑。
                redisUtil.set(scene_str, fromUserName, 60);
            }
            System.out.println("打印消息体=========");
            System.out.println(msg);
            System.out.println("=========");

            response.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            out.print(msg);
            out.flush();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

vue前端轮询

check() {
        if (this.loginType!='wx') return false;       
        checkScanState(this.token).then((res) => {
            console.log(res);
            console.log("check....");
            if (res.data.success == true) {
                sessionStorage.setItem('token', res.data.result.token)
                sessionStorage.setItem('userId', res.data.result.userInfo.id)
                sessionStorage.setItem('userName', res.data.result.userInfo.username)
                sessionStorage.setItem('realname', res.data.result.userInfo.realname)
                sessionStorage.setItem('sex', res.data.result.userInfo.sex)
                sessionStorage.setItem('memberLevelName', res.data.result.memberLevel.name)
                sessionStorage.setItem('maxFileCount', res.data.result.memberLevel.maxFileCount)
                this.loginType = "";
                if (objToStr(res.data.result.userInfo.realname) == "") {
                    this.$showInputBox({
                        caption: "输入您的姓名",
                        inputValue: '',
                        callback: (data) => {
                            updateRealname(res.data.result.userInfo.id, data).then((res) => {
                                sessionStorage.setItem('realname', data)
                                this.$closeInputBox();    
                            })
                        }
                    })
                }
                this.$router.push({
                    path: '/person' ,
                })
            } else {               
                setTimeout(() => {
                    this.check();               
                }, 1000);
            }
        })           
    },

后端接受前端查状态的轮询请求文章来源地址https://www.toymoban.com/news/detail-826451.html

@ApiOperation("检查扫码状态")
	@GetMapping("/checkScanState")
	public Result<JSONObject> wechatLogin(@RequestParam(name = "scene_str", required = true) String sceneStr) {
		Result<JSONObject> result = new Result<JSONObject>();
		Object openId = redisUtil.get(sceneStr);
		if (openId == null) {
			result.error500("未登入");
			return result;
		}

		QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("open_id", openId);
		SysUser sysUser = sysUserService.getOne(queryWrapper, false);
		if (sysUser != null) {

			String syspassword = sysUser.getPassword();
			String username = sysUser.getUsername();
			// 生成token
			String token = JwtUtil.sign(username, syspassword);
			redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
			//清空用户登录Shiro权限缓存
			redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
			//清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
			redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));

			result = sysUserService.checkUserIsEffective(sysUser);
			if(!result.isSuccess()) {
				return result;
			}
			//用户信息
			userInfo(sysUser, result);
			//添加日志
			sysBaseAPI.addLog("用户名: " + sysUser.getUsername() + ",登录成功!", CommonConstant.LOG_TYPE_1, null);
		}
		return result;
	}



	/**
	 * 用户信息
	 *
	 * @param sysUser
	 * @param result
	 * @return
	 */
	private Result<JSONObject> userInfo(SysUser sysUser, Result<JSONObject> result) {
		String syspassword = sysUser.getPassword();
		String username = sysUser.getUsername();
		// 生成token
		String token = JwtUtil.sign(username, syspassword);
        // 设置token缓存有效时间
		redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
		redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000);

		// 获取用户部门信息
		JSONObject obj = new JSONObject();
		List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
		obj.put("departs", departs);
		if (departs == null || departs.size() == 0) {
			obj.put("multi_depart", 0);
		} else if (departs.size() == 1) {
			sysUserService.updateUserDepart(username, departs.get(0).getOrgCode());
			obj.put("multi_depart", 1);
		} else {
			obj.put("multi_depart", 2);
		}
		obj.put("token", token);
		obj.put("userInfo", sysUser);
		obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
		obj.put("memberLevel", lzMemberLevelService.getById(sysUser.getMemberLevelId()));
		result.setResult(obj);
		result.success("登录成功");
		return result;
	}

到了这里,关于Java 实现微信扫码登录方法(提供前端及后端核心代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot实现微信扫码登录

    目录 1,注册微信开发者账号,创建一个应用,获取AppID和AppSecret 2,在Spring Boot项目中引入微信SDK依赖  3,在Spring Boot配置文件中配置AppID和AppSecret 4,创建一个Controller,处理微信登录请求。 5,在启动类中配置WxMpService的Bean 6,在页面中提供微信登录按钮,点击后跳转到授权

    2024年02月04日
    浏览(54)
  • 个人博客网站实现微信扫码登录(新)

            在不久之前(两年前)我写了一篇同名的博客《个人博客网站实现微信扫码登录(附源码)》,当时只是做一个记录而已。但是没想到会收到很多“猿友”的私聊, “代码跑不起来”、“实现原理”、“测试网址访问不了” 等各种问题。我也都一一解答了。趁着这

    2024年02月08日
    浏览(59)
  • 记录--vue3问题:如何实现微信扫码授权登录?

    一、需求 微信扫码授权,如果允许授权,则登录成功,跳转到首页。 二、问题 1、微信扫码授权有几种实现方式? 2、说一下这几种实现方式的原理是什么? 3、vue中的微信扫码授权登录,与uniapp和原生小程序的微信授权登录,它们之间有共同点吗? TWO 解决问题,答案速览

    2024年02月13日
    浏览(54)
  • Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)

    目录 前言 下面展示操作流程 注册微信小程序 通过后台获取小程序码 前端处理 时序图理解 方案实现步骤 前言 很多业务场景之下我们需要实现  微信扫码登录  的需求,如: 同步网站与小程序的用户数据 。 需要获取用户微信相关基本信息,如头像、id等 实例:小程序上的

    2024年02月02日
    浏览(58)
  • 尚医通-day10【微信扫码登录】(内附源码)

    https://open.weixin.qq.com (1)注册开发者账号:准备营业执照 (2)邮箱激活 (3)完善开发者资料 (4)开发者资质认证:1-2个工作日审批、300元 (5)创建网站应用:提交审核,7个工作日审批(免费) (6)熟悉微信登录流程 参考文档:https://developers.weixin.qq.com/doc/oplatform/Web

    2024年02月08日
    浏览(44)
  • 微信扫码登录(new WxLogin)-二维码样式修改

    例如: .impowerBox .qrcode {width: 180px;} .impowerBox .title {display: none;} .impowerBox .info {width: 180px;} .status_icon {display: none} .impowerBox .status {text-align: center;} 二、自定义二维码样式进行base64加密 在线加密解密网站  三、将解密后的密文添加到href中 注意: 密文前加入  data:text/css;base64,    

    2024年02月13日
    浏览(59)
  • pbootcms对接微信扫码登录代码核心片段和步骤(前后端)

    首先需要在微信公众平台或开放平台中创建应用,并获取到AppID和AppSecret。 在pbootcms中创建一个自定义模板页面(例如:wechat_login.html),并在该页面中添加以下代码,用于生成微信扫码登录的二维码: 创建一个名为wechat_callback.php的文件,用于接收微信的回调请求并获取用户

    2024年02月05日
    浏览(45)
  • 网站使用微信小程序扫码登录的实现方法

    传统网站一般都会使用账号密码登录,但这种方式总有用户会忘记密码,找回密码需要一系列验证,也挺麻烦的,于是学习了一下扫码登录,这种方式不仅不会有忘记密码的烦恼,登录还十分快捷。用户体验较好. 网站端点击小程序图片,弹出小程序码 小程序端授权页面 1、

    2024年02月16日
    浏览(52)
  • 微信扫码登陆流程

    以下为几类型微信登录的功能说明(基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统): 序号 类型 授权域/接口 用户侧使用流程 接入流程 1 App 接入微信SDK,并调用snsapi_userinfo (1)在App内选择使用微信登录 (2)拉起微信客户端,打开用户授权页,完成登录授权 (1)注

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包