微信公众号授权,获取code获取openId获取用户基本信息

微信开放官方文档

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));
    }

}

四.测试部分

  1. 先关注微信测试公众号

  2. 链接需要通过微信浏览器打开 用 手机微信或电脑微信或微信开发工具打开

在这里插入图片描述

在这里插入图片描述

此时已经拿到了access_tokenopenid 注意想获取用户的基本信息必须是用户手动授权的才可以获取用户信息

在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值