最近做一个小工具,通过公众号菜单打开。页面使用H5来写的。需要用户通过菜单打开小工具的时候要求用户授权微信信息,进行登入。
接下来说说大致步骤吧,其实微信公众号的开发文档介绍得很详细。
微信公众号开发文档链接:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
具体步骤:
1 第一步:用户同意授权,获取code (前端)
2 第二步:通过code换取网页授权access_token (后台)
3 第三步:刷新access_token(如果需要) (后台)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)(后台)
5 附:检验授权凭证(access_token)是否有效 (后台)
其实就是获取在前端用 window.location.href 打开微信URL页面 url中包含了回调页面的参数。 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。这样我们就得到了 code。前端的任务就完成了。我们可以利用这个code到后台换取accessToken和通过accessToken拉取用户信息。
跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。(域名必须在公众号后台配置)
地址: 设置与管理->开发->接口权限->网页服务->网页授权->网页授权获取用户基本信息
部分代码:
1,获取code,并提示用户授权
window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${url}&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect`
2,通过code换取网页授权access_token
这一步是在后台进行
```java
//公众号appid
public static final String APPID = "APPID ";
//公众号appsecert
public static final String APPSECRET = "APPSECRET ";
请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
String url = GET_ACCESS_TOKEN_URL.replace("CODE", code).replace("APPID", APPID).replace("SECRET", APPSECRET);
JSONObject jsonObject = httpRequest(url, "GET", "");
正常返回时
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
请求有误时
{"errcode":40029,"errmsg":"invalid code"}
3,获取用户信息
请求地址
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
String userInfoUrl = GET_USER_INFO_URL.replace("ACCESS_TOKEN", access_token).replace("OPENID", openid);
JSONObject infoResult = httpRequest(userInfoUrl, "GET", "");
正常返回
{
"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"
}
错误返回
{"errcode":40003,"errmsg":" invalid openid "}
刷新和校验验证码我就不贴代码了。是同上的逻辑。
4,刷新access_token(如果需要) (后台)
获取第二步的refresh_token后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
5,检验授权凭证(access_token)是否有效 (后台)
http:GET(请使用https协议) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID