微信开放官方文档
https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
微信测官方测试号
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
微信授权
一.先准备内网穿透
在此采用的是natapp 最好配置端口号为80 项目暂时也改成80
二.配置微信官方测试
流程说明
三.代码部分
<!--糊涂工具类 ps:需要里面的http客户端发送工具-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.7</version>
</dependency>
还有一些没有添加上的依赖在此就不在添加了 主要是 校验之类的一些内容自行判断一下几个包括返回对象
微信公众号工具类
package com.dog.common.utils.wx;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.dog.common.exception.CustomException;
import com.dog.common.utils.StringUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @program: dog
* @description: 微信工具类
* @author: @DogElder
* @create: 2021-04-13 23:51
**/
@Log4j2
@Service
public class WxUtils {
/**
* 微信公众号appid
*/
private static final String APPID = "*****";
/**
* 微信公众号secret
*/
private static final String SECRET = "*****";
/**
* 域名 域名和图中配置的不一样 域名更改记得和微信配置保持一致
*/
private static final String DOMAIN_NAME = "http://8sg95s.natappfree.cc";
/**
* 获取微信的code
*
* @param response 响应体
* @return 重定向
*/
public String getWxCode(HttpServletResponse response) {
// 第一步:用户同意授权,获取code
StringBuilder path = new StringBuilder();
//微信公众号appid
path.append("https://open.weixin.qq.com/connect/oauth2/authorize?appid=").append(APPID);
//重定向的地址
path.append("&redirect_uri=").append(DOMAIN_NAME).append("/getWxgzhUser");
path.append("&response_type=code");
/*
*以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
*以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
*/
path.append("&scope=").append("snsapi_userinfo");
path.append("&state=STATE");
path.append("&connect_redirect=1#wechat_redirect");
try {
response.sendRedirect(path.toString());
} catch (IOException e) {
log.error("获取微信code失败: " + e.getMessage());
}
//必须重定向,否则不能成功
return "redirect:" + path.toString();
}
/**
* 获取openid和access_token 这里的 access_token与基本的access_token不是一个东西具体看官方文档
* @param code 微信code 可以通过后台获取 或者 让前端传过来
* @return
*/
public Map<String, Object> getOpenId(@NotBlank(message = "微信code不能为空/空串") String code) {
return this.getOpenId(APPID, SECRET, code);
}
/**
* 获取openid和access_token 这里的 access_token与基本的access_token不是一个东西具体看官方文档
* @param appid 微信公众号appid
* @param secret 微信公众号secret
* @param code 微信code 可以通过后台获取 或者 让前端传过来
* @return
*/
public Map<String, Object> getOpenId(@NotBlank(message = "微信appid不能为空/空串") String appid
, @NotBlank(message = "微信secret不能为空/空串") String secret
, @NotBlank(message = "微信code不能为空/空串") String code) {
StringBuilder path = new StringBuilder();
path.append("https://api.weixin.qq.com/sns/oauth2/access_token?appid=").append(appid);
path.append("&secret=").append(secret);
path.append("&code=").append(code);
path.append("&grant_type=authorization_code");
//发送请求 响应微信返回的参数
String res = HttpUtil.get(path.toString());
JSONObject jsonObject = JSONUtil.parseObj(res);
String openid = jsonObject.getStr("openid");
String access_token = jsonObject.getStr("access_token");
if (StringUtils.isEmpty(openid) || StringUtils.isEmpty(access_token)) {
log.error("openid或access_token参数为空");
throw new CustomException("openid或access_token参数为空");
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("openid", openid);
map.put("access_token", access_token);
return map;
}
/**
* 获取用户信息
*
* @param openid 用户openid
* @param accessToken 用户access_token
* @return
*/
public Map<String, Object> getUserInfo(@NotBlank(message = "微信openid不能为空/空串")String openid
,@NotBlank(message = "微信accessToken不能为空/空串") String accessToken) {
StringBuilder path = new StringBuilder();
path.append("https://api.weixin.qq.com/sns/userinfo?access_token=").append(accessToken);
path.append("&openid=").append(openid);
String res = HttpUtil.get(path.toString());
JSONObject jsonObject = JSONUtil.parseObj(res);
Map<String, Object> map = jsonToMap(jsonObject);
return map;
}
/**
* @Description: json对象转为map
* @Param: jsonObject
* @return: Map
* @Author:@Dog_Elder
* @Date: 2021/4/14
*/
public static Map<String,Object> jsonToMap(JSONObject jsonObject){
Map<String, Object> map = new HashMap<String, Object>();
Iterator it = jsonObject.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
map.put(entry.getKey(), entry.getValue());
}
return map;
}
}
Controller
/**
* @program: dog
* @description:
* @author: @Dog_Elder
* @create: 2021-03-13 16:26
**/
@RestController
public class DemoController {
@Autowired
private WxUtils wxUtils;
/**
* 前端向服务器获取微信的code
*/
@GetMapping("/getWxCode")
public void getWxCode(HttpServletResponse response) {
wxUtils.getWxCode(response);
}
/**
* 根据获取code的重定向方法 获取openId和access_token
*
* @param request
* @return
*/
@GetMapping("/getWxgzhUser")
public AjaxResult getWxgzhApi(HttpServletRequest request) {
String code = request.getParameter("code");
return AjaxResult.success(wxUtils.getOpenId(code));
}
/**
* 获取用户信息
* 必须是用户手动授权才可以获取用户信息 否则 无法获取
*
* @param openid 用户openid
* @param accessToken 用户access_token
* @return
*/
@GetMapping("/getWxUserInfo")
public AjaxResult getWxUserInfo(
@NotBlank(message = "openid不能为空/空串") String openid
, @NotBlank(message = "accessToken/空串") String accessToken) {
return AjaxResult.success(wxUtils.getUserInfo(openid, accessToken));
}
}
四.测试部分
-
先关注微信测试公众号
-
链接需要通过微信浏览器打开 用 手机微信或电脑微信或微信开发工具打开
此时已经拿到了access_token和openid 注意想获取用户的基本信息必须是用户手动授权的才可以获取用户信息