一、概述
-
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
-
例如您关注一个公众号后,有些在下面的菜单中有一个“我的”,一般点这个我的菜单就需要登录。这个登录可就可以使用微信授权登录。
-
官方文档地址:点这里
-
如果您对公众号开发流程不是很了解,或者没有什么基础请先看微信公众号开发基础架构搭建。
二、配置授权回调页面地址
- 在微信公众号平台中配置授权回调页面地址。
三、获取授权信息
- 下面是一个在应用中要获取微信授权后用户信息的示例
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;
}
}