|
@@ -0,0 +1,127 @@
|
|
|
|
+package com.jeeplus.weChat.controller;
|
|
|
|
+
|
|
|
|
+import com.jeeplus.weChat.util.SignUtil;
|
|
|
|
+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 me.chanjar.weixin.mp.bean.result.WxMpUser;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.web.bind.annotation.GetMapping;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestParam;
|
|
|
|
+import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
|
+
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.io.PrintWriter;
|
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
|
+import java.net.URLEncoder;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @author 王强
|
|
|
|
+ * @version 1.0
|
|
|
|
+ * @date 2024-07-15 16:45
|
|
|
|
+ */
|
|
|
|
+@RestController
|
|
|
|
+@Slf4j
|
|
|
|
+public class WeChatController {
|
|
|
|
+
|
|
|
|
+ private final String TOKEN = "wxs1314520"; // 你设置的Token
|
|
|
|
+
|
|
|
|
+ @GetMapping("/wechat")
|
|
|
|
+ public void sendMsgTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
|
|
|
+ // 微信加密签名.
|
|
|
|
+ String signature = request.getParameter("signature");
|
|
|
|
+ // 时间戳.
|
|
|
|
+ String timestamp = request.getParameter("timestamp");
|
|
|
|
+ // 随机数.
|
|
|
|
+ String nonce = request.getParameter("nonce");
|
|
|
|
+ // 随机字符串.
|
|
|
|
+ String echostr = request.getParameter("echostr");
|
|
|
|
+ // 请求校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败.
|
|
|
|
+ PrintWriter out = response.getWriter();
|
|
|
|
+
|
|
|
|
+ // 请求校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败.
|
|
|
|
+ if (SignUtil.checkSignature(signature, timestamp, nonce)) {
|
|
|
|
+ out.print(echostr);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ out.close();
|
|
|
|
+ out = null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private WxMpService wxMpService;
|
|
|
|
+
|
|
|
|
+ @Value("${wechat.projecturl}")
|
|
|
|
+ private String projectUrl;
|
|
|
|
+
|
|
|
|
+ @GetMapping("/auth")
|
|
|
|
+ @ResponseBody
|
|
|
|
+ public String auth(@RequestParam(value = "echostr", defaultValue = "没有获取到") String echostr) {
|
|
|
|
+ return echostr;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @author :tao
|
|
|
|
+ * @param: :
|
|
|
|
+ * @return: 重定向到获取用户信息的类
|
|
|
|
+ * 微信授权登录
|
|
|
|
+ */
|
|
|
|
+ @GetMapping( value = "/authorize")
|
|
|
|
+ public String authorize(@RequestParam(value = "returnUrl", defaultValue = "http://k2e6ew.natappfree.cc/") String returnUrl) throws UnsupportedEncodingException {
|
|
|
|
+ log.info("【微信网页授权】进来了,参数={}", returnUrl);
|
|
|
|
+ System.out.println("进来了:" + returnUrl);
|
|
|
|
+ //1. 配置
|
|
|
|
+ //2. 调用方法
|
|
|
|
+ String url = projectUrl + "api/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 redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_USER_INFO, URLEncoder.encode(returnUrl, "utf-8"));
|
|
|
|
+ log.info("【微信网页授权】获取code,result={}", redirectUrl);
|
|
|
|
+ return "redirect:" + redirectUrl;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @author :tao
|
|
|
|
+ * @param: :
|
|
|
|
+ * @return: 重定向
|
|
|
|
+ * 获取用户信息类,最后重定向到指定url
|
|
|
|
+ */
|
|
|
|
+ @GetMapping("/userInfo")
|
|
|
|
+ public String userInfo(@RequestParam("code") String code,
|
|
|
|
+ @RequestParam("state") String returnUrl) throws WxErrorException {
|
|
|
|
+ /*当用户同意授权后,会回调所设置的url并把authorization code传过来,
|
|
|
|
+ 然后用这个code获得access token,其中也包含用户的openid等信息*/
|
|
|
|
+ WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
|
|
|
|
+ try {
|
|
|
|
+ //获取access token
|
|
|
|
+ wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
|
|
|
|
+ log.info("【AccessToken:】{}", wxMpOAuth2AccessToken.getAccessToken());
|
|
|
|
+ } catch (WxErrorException e) {
|
|
|
|
+ log.error("【微信网页授权】{}", e);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 拿到openid
|
|
|
|
+ String openId = wxMpOAuth2AccessToken.getOpenId();
|
|
|
|
+ log.info("【openid:】{}", openId);
|
|
|
|
+ log.info("【我是前端要回调的地址:】{}", returnUrl + "&openid=" + openId);
|
|
|
|
+ // 顺便获取一下用户信息
|
|
|
|
+ WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, "zh_CN");
|
|
|
|
+ log.info("【用户信息:】{}", wxMpUser.toString());
|
|
|
|
+
|
|
|
|
+ //注意拼接参数,第一个参数需要加问号,之后参数使用&拼接的问题
|
|
|
|
+ //return "redirect:" + returnUrl + "/#/?openid=" + openId;
|
|
|
|
+// return "redirect:" + returnUrl;
|
|
|
|
+ return wxMpUser.getOpenId();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|