微信网页授权获取用户基本信息

340 阅读2分钟

微信官方文档

developers.weixin.qq.com/doc/offiacc…

准备工作

公众测试账号获取

mp.weixin.qq.com/debug/cgi-b…

设置 "网页授权获取用户基本信息"

需要参数

APPID: XXXXXXX

APPSECRET: XXX

backUrl: xxxx.cn          #授权回调页面域名

 

开始

yml添加配置

# 微信授权登录
weChat:
  APPID: XXXXXXX
  APPSECRET: XXX
  backUrl:  http://xxxx.cn #授权回调页面域名
  backApi: /wechat/callBack #网页授权回调接口

WXAuthUtil

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * @author :admin
 * @date :Created in 2019/6/27 20:17
 * @Time: 20:17
 * @description:公用网络请求工具类-微信
 * @modified By:
 * @version: 1.0$
 */
public class WXAuthUtil {

    public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException {
        JSONObject jsonObject = null;
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        HttpResponse response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            // 把返回的结果转换为JSON对象
            String result = EntityUtils.toString(entity, "UTF-8");
            jsonObject = JSON.parseObject(result);
        }
        return jsonObject;
    }
}

 

import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.ParseException;


/**
 * @author :admin
 * @date :Created in 2019/6/27 20:20
 * @Time: 20:20
 * @description:微信登录的实现类
 * @modified By:
 * @version: 1.0$
 */
@Slf4j
@Controller
@RequestMapping("wechat")
@Api(tags="微信授权")
public class WXLoginController {

    @Value("${weChat.APPID}")
    private String APPID;

    @Value("${weChat.APPSECRET}")
    private String APPSECRET;

    @Value("${weChat.backUrl}")
    private String backUrl;//授权域名

    @Value("${weChat.backApi}")
    private String backApi;//回调接口

    /**
     * 公众号微信登录授权
     * @param request
     * @param response
     * @param url 回调地址
     * @return
     * @throws ParseException
     */
    @ApiOperation("微信授权信息")
    @RequestMapping(value = "/authorization", method = RequestMethod.GET)
    public ModelAndView authorization(HttpServletRequest request, HttpServletResponse response, String url) throws ParseException {
        log.info("===================wxLogin微信授权成功后回调==========={}" + url);
        // 这个url的域名必须要进行再公众号中进行注册验证,这个地址是成功后的回调地址
        // 第一步:用户同意授权,获取code
        String getCodeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + APPID + "&redirect_uri="
                + URLEncoder.encode(backUrl + backApi + "?surveyId=" + url) + "&response_type=code" + "&scope=snsapi_userinfo"
                + "&state=STATE#wechat_redirect";
        url = "redirect:"+ getCodeUrl;
        log.info("-----------------------第二步重定向到微信callBack方法---------------------" + url);
        return new ModelAndView(url);
    }

    /**
     * 公众号微信登录授权回调函数
     * @param request
     * @param response
     * @param url 回调地址
     * @return
     * @throws ParseException
     */
    @ApiOperation("微信授权信息")
    @RequestMapping(value = "/callBack", method = RequestMethod.GET)
    public JSONObject callBack(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {
        //获取code 
        String code = request.getParameter("code");
        // 第二步:通过code换取网页授权access_token
        String getTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret="
                + APPSECRET + "&code=" + code + "&grant_type=authorization_code";

        JSONObject getTokenJson = WXAuthUtil.doGetJson(getTokenUrl);

        String openid = getTokenJson.getString("openid");
        String access_token = getTokenJson.getString("access_token");
        String refresh_token = getTokenJson.getString("refresh_token");

        // 第五步验证access_token是否失效;展示都不需要
        String vlidTokenUrl = "https://api.weixin.qq.com/sns/auth?access_token=" + access_token + "&openid=" + openid;

        JSONObject validTokenJson = WXAuthUtil.doGetJson(vlidTokenUrl);

        if (!"0".equals(validTokenJson.getString("errcode"))) {
            // 第三步:刷新access_token(如果需要)-----暂时没有使用,参考文档https://mp.weixin.qq.com/wiki,
            String refreshTokenUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + openid
                    + "&grant_type=refresh_token&refresh_token=" + refresh_token;

            JSONObject refreshTokenJson = WXAuthUtil.doGetJson(refreshTokenUrl);

            access_token = refreshTokenJson.getString("access_token");
        }
        // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
        String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN";
        JSONObject getUserInfoJson = WXAuthUtil.doGetJson(getUserInfoUrl);

        //可以根据获取的微信信息查询数据库是否存在数据,存在直接登录,不存在自动注册
        //response.sendRedirect(  url + "&token=ToKen");//重定向到前端
        return getUserInfoJson;
    }
}