微信公众号开发之网页授权,获取微信账号授权基本信息

一、概述

  • 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

  • 例如您关注一个公众号后,有些在下面的菜单中有一个“我的”,一般点这个我的菜单就需要登录。这个登录可就可以使用微信授权登录。

  • 官方文档地址:点这里

  • 如果您对公众号开发流程不是很了解,或者没有什么基础请先看微信公众号开发基础架构搭建

二、配置授权回调页面地址

  • 在微信公众号平台中配置授权回调页面地址。

在这里插入图片描述
在这里插入图片描述

三、获取授权信息

  • 下面是一个在应用中要获取微信授权后用户信息的示例
package top.yiqifu.weixin.offiaccount.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import top.yiqifu.weixin.offiaccount.config.WeixinConfig;
import weixin.popular.api.SnsAPI;
import weixin.popular.bean.sns.SnsToken;
import weixin.popular.bean.user.User;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller()
@RequestMapping("/weixin/profile")
public class WeixinProfileController {

    private static final Logger logger = LoggerFactory.getLogger(WeixinProfileController.class);

    @Autowired
    WeixinConfig config;

    @RequestMapping("/index")
    @ResponseBody
    public String index(HttpServletRequest request) {
        HttpSession session = request.getSession();

        User user = (User)session.getAttribute("weixin-user");
        if(null == user){
            return "获取微信用户失败,没有认证";
        }

        logger.debug("user", user);

        return user.getNickname();
    }
}

四、授权回调地址开发

  • 当调用微信授权地址后成功后,他会自动回调该地址。在为里我们可以通过授权码获取用户信息并保存在session中, 以备后续业务使用。
package top.yiqifu.weixin.offiaccount.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import top.yiqifu.weixin.offiaccount.config.WeixinConfig;
import weixin.popular.api.MenuAPI;
import weixin.popular.api.SnsAPI;
import weixin.popular.bean.BaseResult;
import weixin.popular.bean.sns.SnsToken;
import weixin.popular.bean.user.User;
import weixin.popular.support.TokenManager;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Controller()
@RequestMapping("/weixin/authorize")
public class WeixinAuthController {

    private static final Logger logger = LoggerFactory.getLogger(WeixinAuthController.class);

    @Autowired
    WeixinConfig config;

    @RequestMapping("/callback")
    public String list(@RequestParam Map<String, String> param, HttpServletRequest request) {
        String code = param.get("code");
        SnsToken stoken = SnsAPI.oauth2AccessToken(config.getAppID(), config.getAppsecret(), code);
        User user = SnsAPI.userinfo(stoken.getAccess_token(), config.getAppID(), "zh_CN");
        logger.debug("user", user);

        request.getSession().setAttribute("weixin-user", user);
        return "redirect:" +  param.get("returnUrl");
    }
}

五、检测授权过滤器

  • 此过滤器的作用是,在获取授权信息时候,如果没有授权则会跳转到微信授权地址进行授权,授权成功后会跳转到回调地址。
package top.yiqifu.weixin.offiaccount.filter;


import org.apache.commons.lang3.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import top.yiqifu.weixin.offiaccount.config.WeixinConfig;
import weixin.popular.bean.user.User;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

//@Component
@WebFilter(urlPatterns = "/weixin/profile/*", filterName = "weixinAuthFilter")
@Order(2)
public class WeixinAuthFilter implements Filter {

    private static final Logger logger = LoggerFactory.getLogger(WeixinAuthFilter.class);

    @Autowired
    WeixinConfig config;

    @Override
    public void init(FilterConfig filterConfig) {
        // TODO Auto-generated method stub
        logger.info("WeixinAuthFilter Init...");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        User user = (User)request.getSession().getAttribute("weixin-user");

        if(null == user) {
            // 业务地址
            String returnUrl =request.getRequestURI();
            returnUrl = URLEncoder.encode(returnUrl, "utf-8");

            // 微信授权回调地址
            String redirectUri = config.getServer()+ "/weixin/authorize/callback?returnUrl="+returnUrl;
            redirectUri = URLEncoder.encode(redirectUri, "utf-8");

            // 微信授权地址
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + config.getAppID() + "&redirect_uri="+redirectUri+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";

            response.sendRedirect(url);
            return;
        }else {
            logger.debug("user" , ToStringBuilder.reflectionToString(user));
        }
        chain.doFilter(request, response);

    }

}

六、相关配置

6.1 application.yaml 配置

weixin:
  offiaccount:
    appid: wx56b01298d347f42f
    appsecret: 1e6b4ed052c6897f4a4101af8ebb149f
    token: test-weixin-offiaccount
    server: https://6e839044.r7.cpolar.top

6.2 配置类

package top.yiqifu.weixin.offiaccount.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class WeixinConfig {

    @Value("${weixin.offiaccount.appid}")
    private String appID;
    @Value("${weixin.offiaccount.appsecret}")
    private String appsecret;
    @Value("${weixin.offiaccount.token}")
    private String token;
    @Value("${weixin.offiaccount.server}")
    private String server;

    public String getAppID() {
        return appID;
    }

    public String getAppsecret() {
        return appsecret;
    }

    public String getToken() {
        return token;
    }

    public String getServer() {
        return server;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

QIFU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值