微信小程序生态5—微信扫码登录PC网站(公众号方式)

一、前言

扫码前

扫码后

准备材料

  • 已认证的公众号(必须为服务号,订阅号没有该接口的权限)

  • 一个公网访问网址,用于微信回调

  • 缓存或者数据库,用于存储token

  • 一个SpringBoot项目

实现步骤一览

  1. 使用微信公众号(服务号)的appId和appSecret生成一个token,这个token可以复用,但是有时效性

  2. 使用token当做参数调用微信api:qrcode/create创建一个二维码

  3. 使用微信扫码,用户订阅后,微信官方会回调我们的一个地址,将openId传过来

  4. 将openId保存下来,下次扫描时根据openId进行判断用户身份

注意点

  1. 只有服务号才有生成带参数的二维码接口权限

  2. 该接口每天100000次,适用于小规模用户登录

  3. 获取的AccessToken有时效性,可以利用redis进行保存

  4. 公众号开发有白名单限制,所以服务端在调用时需要配置白名单

二、实现步骤

1. 公众号相关

(1)登录公众号,获取appId和appKey

(2)配置服务器回调地址

2. 服务端相关

(1)创建SpringBoot项目将复制下来的appId和appkey配置好,并加上一个redis

(2)由于微信的回调值格式是XML格式,所以需要一个解析工具类

java 复制代码
package com.zzj.qlogin.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 微信返回值解码工具类
 */
public class XmlUtil {

    /**
     * 简单解析xml
     * @param in
     * @return
     */
    public static Map<String,Object> parseXML(InputStream in){
        Map<String,Object> map=new HashMap<>();
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(in);
            Element root = document.getRootElement();
            Iterator iterator = root.elementIterator();
            while (iterator.hasNext()){

                Element element = (Element) iterator.next();
                map.put(element.getName(),element.getStringValue());

            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return map;
    }

}

(3)回调接口,此处需要区分两个不同的事件:订阅和扫码,简单的处理逻辑如下

java 复制代码
    /**
     * 接收微信推送事件
     * @param request
     * @return
     */
    @PostMapping("/handleWxCheckSignature")
    @ResponseBody
    public String handleWxEvent(HttpServletRequest request){
        try {
             InputStream inputStream = request.getInputStream();

            Map<String, Object> map = XmlUtil.parseXML(inputStream);

            String userOpenId = (String) map.get("FromUserName");
            String event = (String) map.get("Event");
            if("subscribe".equals(event)){
                // TODO:获取openid判断用户是否存在,不存在则获取新增用户,自己的业务
                //自己生成的二维码不管是关注还是扫码都能取到ticket凭证
                String ticket = (String) map.get("Ticket");
                redisCacheManager.set(ticket,ticket,10*60);
                logger.info("用户关注:{}",userOpenId);
            }else if("SCAN".equals(event)){
                //自己生成的二维码不管是关注还是扫码都能取到ticket凭证
                String ticket = (String) map.get("Ticket");
                redisCacheManager.set(ticket,ticket,10*60);
                logger.info("用户扫码:{}",userOpenId);
            }
            logger.info("接收参数:{}",map);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";

    }

通过回调,微信会把当前扫码的用户的openid返回给我们,通过openid就可以获取用户信息了。

相关推荐
CCPC不拿奖不改名2 分钟前
Python基础:python语言中的文件操作+面试题目
开发语言·数据结构·人工智能·python·学习·面试·职场和发展
superman超哥2 分钟前
Rust 借用分割技巧:突破借用限制的精确访问
开发语言·后端·rust·编程语言·借用分割技巧·借用限制·精准访问
十年磨一剑~4 分钟前
MD在线转word工具
后端
计算机学姐7 分钟前
基于SpringBoot的高校体育场馆预约系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·信息可视化·推荐算法
武藤一雄12 分钟前
C# 关于应用程序域(AppDomain)需要注意的问题(持续更新)
后端·microsoft·微软·c#·.net·.netcore
项目題供诗15 分钟前
微信小程序黑马优购(项目)(十五)
微信小程序·小程序
爱上妖精的尾巴16 分钟前
7-8 WPS JS宏 对象使用实例5--按多字段做多种汇总
javascript·后端·restful·wps·jsa
LongtengGensSupreme19 分钟前
开放所有跨域 ----前端和后端
前端·后端·ajax·vue·api·jquery
superman超哥21 分钟前
Rust 生命周期注解:从语法到深层理解
开发语言·后端·rust·rust生命周期·生命周期注解
Net蚂蚁代码23 分钟前
【如何在ASP.Net Core中使用 IHostedService的方法】执行自动服务运行
后端·asp.net