通过微信接口获取code
2021
04.14

1、通过微信接口获取code

微信获取code接口: 

https://open.weixin.qq.com/connect/oauth2/authorize?

参数

是否必须

说明

appid

公众号的唯一标识

redirect_uri

授权后重定向的回调链接地址,请使用urlencode对链接进行处理

response_type

返回类型,请填写code

scope

应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)

state

重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

#wechat_redirect

无论直接打开还是做页面302重定向时候,必须带此参数

* code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期

2、Controller控制器:

/**

* 第三方登录接口

*/

@RequestMapping("/login")

public void getCode(HttpServletRequest request, HttpServletResponse response) throws IOException {

//拼接url

StringBuilder url = new StringBuilder(); url.append("https://open.weixin.qq.com/connect/oauth2/authorize?"); //微信开放平台的appid

url.append("appid=" + ConfigConstans.wechatAppid); // 项目中的公众号的appid



//转码

try {

//回调地址 ,回调地址要进行Encode转码

String redirect_uri = URLEncoder.encode(ConfigConstans.contextPath + "/callback", "utf-8");

System.out.println("redirect_uri==" + redirect_uri); url.append("&redirect_uri=" + redirect_uri); //微信授权后回调的地址链接,代码如下

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

url.append("&response_type=code"); url.append("&scope=snsapi_userinfo"); // 当前使用的是授权登录,(snsapi_base) 不弹出授权页面,根据需求使用



url.append("&state=" + request.getSession().getId()); // 微信中的回调参数

url.append("#wechat_redirect");

System.out.println("url===" + url.toString());

String s = url.toString(); response.sendRedirect(s);

}


 

 

3、微信用户授权确认登陆

 第一步登录链接拼好后,在手机微信中打开,微信便会跳转到确认授权页面,点击确认授权即可。(这一步,不用开发者做处理!)

 用户同意授权,页面将跳转至

 redirect_uri/?code=CODE&state=STATE。

 

4、微信回调code值请参考微信开放文档

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

 

5、微信回调方法

/**

* 微信 授权登录回调

**/

@RequestMapping("/callback")

public String callback(String code, String state, HttpServletRequest request, HttpServletResponse response) throws Exception {

System.out.println("====" + code + "===" + state + "===="); log.info("code===" + code);

log.info("state===" + state);

HttpSession session = request.getSession(); //拼写微信获取access_token访问地址

String url = "https://api.weixin.qq.com/sns/oauth2/access_token"; url += "?appid=" + ConfigConstans.wechatAppid; // 使用项目中的公众号的appid

url += "&secret=" + ConfigConstans.wechatAppsecret; // 使用项目中的公众号的appsecret

url += "&code=" + code; // code==200时,请求正确,信息返回正确 url += "&grant_type=authorization_code";

log.info("url=="+url); //获取返回数据

JSONObject userMap = urlHalder(url); // 接收回调信息

//获取openid

Object openId = userMap.get("openid"); //用户唯一标识,若程序有PC端和AP端,建议是有回调信息中的uuid

Object accessToken = userMap.get("access_token");

String loginurl = "";

if (ObjectUtils.isNotNull(openId) && ObjectUtils.isNotNull(accessToken)) {

String infourl = "https://api.weixin.qq.com/sns/userinfo"; infourl += "?access_token=" + accessToken;

infourl += "&openid=" + openId; //获取返回数据

JSONObject userInfoMap = urlHalder(infourl); //根据openId 获取用户信息

BasUser basUser = basUserService.getUserByopenId(userInfoMap.get("openid"));

if (ObjectUtils.isNull(basUser)){ //没有当前数据时,进入程序中的绑定页面

loginurl = ConfigConstans.contextPath+"/user/login?openId="+userInfoMap.get("openid");

}else { //有当前数据时,进入程序中的首页 loginurl = ConfigConstans.contextPath+"/index";

} session.setAttribute(UserCacheConstans.USER_OPENID,String.valueOf(userInfoMap.get("openid")));

}

return "redirect:" + loginurl;

}





* 正确时返回的JSON数据包

{

"openid": "OPENID",

"nickname": NICKNAME,

"sex": 1,

"province":"PROVINCE",

"city":"CITY",

"country":"COUNTRY", "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",

"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],

"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"

}


参数

描述

openid

用户的唯一标识

nickname

用户昵称

sex

用户的性别,值为1时是男性,值为2时是女性,值为0时是未知

province

用户个人资料填写的省份

city

普通用户个人资料填写的城市

country

国家,如中国为CN

headimgurl

用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。

privilege

用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

unionid

只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。




 

热门文章
1
通过微信接口获取code
7112浏览 2021-04-14 09:26
2
Java实现html页面抓取转PDF
4049浏览 2021-04-13 17:09
3
vue 页面按钮点击复制内容
2996浏览 2021-04-21 09:42
4
对接父子级数据的添加或修改逻辑
2954浏览 2021-04-21 09:47
5
Mysql常用sql语句
2762浏览 2021-04-20 10:46
6
邀请函│EICD2021中国民办教育大会
2068浏览 2021-03-15 14:06
7
Linux安装中文字体
1982浏览 2021-04-13 17:14
8
合并单元格的方法
1698浏览 2021-04-14 09:23
9
vue中数组去重的实现
1608浏览 2021-04-14 09:20
10
Nginx如何配置重定向
1581浏览 2021-04-14 09:09