Springboot 实现 PC端 微信扫码登录

依赖

  <!--  httpclient-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>4.1.0</version>
        </dependency>

PC端后台扫码登录~获取ticket及其他参数

	@GetMapping("/getTicket")
	public  ResponseData<Map<String, Object>> getTicket() {
		return loginService.getTicket();
	}

application.yml配置

### 微信网页(h5)配置参数
wxh5:
 appid: wx57f8a596522dfb99 #公众号APPID (这使用的是测试账户公众号)
 appSecret: 426c9109b51dd1f5183ec506a7d78dbd #公众号AppSecret (这使用的是测试账户公众号)
 serverurl: http://jdqaiv.natappfree.cc  #服务器回调地址(最好是https协议)


实现类

	@Value("${wxh5.appid}")
	private String appid;
	@Value("${wxh5.appSecret}")
	private String appSecret;
	@Value("${wxh5.serverurl}")
	private String serverurl;
	@Override
	public ResponseData<Map<String, Object>> getTicket() {
		Map<String, Object> map = WeixinUtil.getTicket(appid, appSecret);
		return ResponseData.success(map);
	}

工具类


	public static Map<String, Object> getTicket(String appid, String appSecret) {
		String accessToken = getAccessToken(appid, appSecret);
		String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + accessToken.trim();
		JSONObject jsonObject = new JSONObject();
		JSONObject actionInfo = new JSONObject();
		JSONObject scene = new JSONObject();
		scene.put("scene_str", getRandomString(20));
		actionInfo.put("scene", scene);
		jsonObject.put("expire_seconds", "604800");
		jsonObject.put("action_name", "QR_STR_SCENE");
		jsonObject.put("action_info", actionInfo);
		String json = HttpClient.sendJson(url, jsonObject.toString());
		JSONObject resJson = JSONObject.parseObject(json);
		Map<String, Object> map = new HashMap<>();
		map.put("ticket", resJson.get("ticket").toString());
		map.put("expire_seconds", resJson.get("expire_seconds").toString());
		map.put("url", resJson.get("url").toString());
		return map;
	}

HttpClient


    public static String sendJson(String url, String json) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }

获取二维码

通过 ticket 换取二维码

获取二维码 ticket 后,开发者可用 ticket 换取二维码图片。请注意,本接口无须登录态即可调用。

请求说明

HTTP GET请求(请使用 https 协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET 提醒:TICKET记得进行UrlEncode

前端获取即可

手机扫码后回调

微信公众号测试平台:测试平台
在这里插入图片描述
这里的URL是微信扫码后的回调地址,需要做验证
微信服务器会对我们填写的URL发送请求
如果我们的URL为http://jdqaiv.natappfree.cc/login/qrCodeChekToken
那么,微信服务器就会发送如下请求
http://jdqaiv.natappfree.cc/login/qrCodeChekToken?timestamp=1598322596602&signature=33f90dee6b86275b5851143d871d0122ef48cb0e&nonce=8588471354&echostr=c695cca1-8f36-403b-96e0-ffdac740b0ef
当返回结果为echostr的值时,就算调用成功了
c695cca1-8f36-403b-96e0-ffdac740b0ef
所以我们需要在自己的项目中写一个方法,提供给微信服务器调用

	@GetMapping("/login/qrCodeChekToken")
	public String   callBack(HttpServletRequest request) throws WxErrorException, IOException {
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");

		return echostr;

校验通过后台再改为如下的代码:

@PostMapping("/qrCodeChekToken")
	public ResponseData<Map<String, Object>>  qrCodeChekToken(HttpServletRequest request) throws IOException {
		return loginService.qrCodeChekToken(request);
	}

实现类

@Override
	public ResponseData<Map<String, Object>> qrCodeChekToken(HttpServletRequest request) throws IOException {
		WxMpXmlMessage message = WxMpXmlMessage.fromXml(request.getInputStream());//获取消息流,并解析xml
		String messageType = message.getMsgType();                                //消息类型
		String messageEvent = message.getEvent();                                    //消息事件
		// openid
		String fromUser = message.getFromUser();                                    //发送者帐号
		String text = message.getContent();                                        //文本消息  文本内容

		log.info("文本消息来自:{}", fromUser);
		log.info("文本消息:{}", text);

		return null;
	}
}

获取到信息之后就可以做其他操作了,这里的实现使用的是微信公众平台方式实现,也可以使用微信开放平台实现,但是开放平台需要认证为开发者资质。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要PC网站上实现微信扫码登录功能,可以按照以下步骤进行: 1. 注册微信开放平台账号:访问微信开放平台(https://open.weixin.qq.com/),使用微信账号登录并注册一个开放平台账号。 2. 创建应用并获取应用ID和密钥:在微信开放平台上创建一个应用,并获取对应的应用ID(AppID)和密钥(AppSecret)。 3. 引入微信登录SDK:下载并引入微信登录Java SDK,可以使用官方提供的SDK或第三方库,例如weixin-java-tools。 4. 配置回调URL:在微信开放平台上配置回调URL,该URL用于接收微信授权回调的code。 5. 实现扫码登录页面:在PC网站上创建一个扫码登录页面,可以使用HTML和CSS进行布局和样式设计。 6. 发起微信授权请求:在扫码登录页面中,通过调用微信登录SDK提供的接口,生成带有应用ID和回调URL的二维码图片,并显示在页面上供用户扫码。 7. 处理微信授权回调:在设置的回调URL对应的接口中,获取微信授权回调的code,并使用该code调用微信登录SDK提供的接口,获取access_token和openid等用户信息。 8. 实现登录逻辑:根据获取到的用户信息,可以选择将用户信息保存到数据库中,或者进行其他逻辑处理。 需要注意的是,微信授权登录涉及到用户隐私和安全,建议在实施过程中加强安全验证和保护用户信息。 以上是一个大致的步骤,具体实现过程可以参考微信开放平台的文档和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缘不易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值