jhprjv2/ruoyi-wechat/src/main/java/com/ruoyi/web/IndexController.java

119 lines
4.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.ruoyi.web;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOpenid;
import com.ruoyi.system.service.ISysUserOpenidService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
@Slf4j
@Controller
@RequestMapping("/wechat/wxAuth")
@CrossOrigin(origins = "*",maxAge = 3600)
public class IndexController {
@Autowired
private RedisCache redisCache;
@Autowired
private WxMpService wxMpService;
@Autowired
private ISysUserOpenidService sysUserOpenidService;
/**********************************************************页面跳转*************************************************/
/**
* @author JiangYuQi
* @param:
* @return 重定向到获取用户信息的类
* 微信授权登录
*/
@Anonymous
@GetMapping("/model")
public String model(Model model,String state) throws Exception {
model.addAttribute("state",state);
return "/wxAuth/index";
}
/**
* @author tao
* @param:
* @return 重定向到获取用户信息的类
* 微信授权登录
*/
@Anonymous
@GetMapping("/authorize")
public String authorize(String userOpenId, String state, HttpSession HttpSession) throws Exception {
HttpSession.setAttribute("userOpenId", userOpenId);
log.info("【微信网页授权】进来了,参数...{}", userOpenId);
//1. 配置
//2. 调用方法
String url = RuoYiConfig.getProjectUrl() + "wechat/wxAuth/userInfo";
/*
* 相当于这种形式
* URLEncoder.decode(returnUrl,"UTF-8"
* https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
*/
String resultUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_BASE, state);
log.info("【微信网页授权】获取code,result={}", resultUrl);
return "redirect:" + resultUrl;
}
/**
* @author tao
* @param:
* @return 重定向
* 获取用户信息类最后重定向到指定url
*/
@Anonymous
@GetMapping("/userInfo")
public String userInfo(@RequestParam("code") String code,
@RequestParam("state") String state, HttpSession HttpSession, Model model) throws Exception {
model.addAttribute("state", "NO");
/*当用户同意授权后会回调所设置的url并把authorization code传过来
然后用这个code获得access token其中也包含用户的openid等信息*/
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
try {
//获取access token
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
log.info("【AccessToken】{}", wxMpOAuth2AccessToken.getAccessToken());
// 拿到openid
String openId = wxMpOAuth2AccessToken.getOpenId();
String userOpenId = HttpSession.getAttribute("userOpenId").toString();
log.info("小程序用户...{}的openid...{}", userOpenId, openId);
if(StringUtils.isNotEmpty(openId) && StringUtils.isNotEmpty(userOpenId)){
SysUserOpenid sysUserOpenid = sysUserOpenidService.selectSysUserOpenidByOpenId(userOpenId);
if(sysUserOpenid!=null){
sysUserOpenid.setMsgOpenId(openId);
sysUserOpenidService.updateSysUserOpenid(sysUserOpenid);
//删除缓存
redisCache.deleteObject(CacheConstants.WX_MPMESSAGE_OPENID +sysUserOpenid.getLoginName());
model.addAttribute("state", "OK");
}
}
} catch (WxErrorException e) {
log.error("【微信网页授权】{}", e);
}
return "wxAuth/index";
}
}