1、微信开放平台注册开发者帐号,https://open.weixin.QQ.com/cgi-bin/index?t=home/index&lang=zh_CN&token=d996b1993b09061b3429b7582814d48fd320b371
2、并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret。
3、申请微信登录且通过审核后,可开始接入流程,https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=d996b1993b09061b3429b7582814d48fd320b371&lang=zh_CN
3.1 获取code
PC端打开以下链接:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识 |
redirect_uri | 是 | 重定向地址,需要进行UrlEncode |
response_type | 是 | 填code |
scope | 是 | 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可 |
state | 否 | 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 |
用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数
redirect_uri?code=CODE&state=STATE
若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数
redirect_uri?state=STATE
通过code获取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
secret | 是 | 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填authorization_code |
正确的返回:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN","openid":"OPENID", "scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
unionid | 当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。 |
3.3 获取用户信息
http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用凭证 |
openid | 是 | 普通用户的标识,对当前开发者帐号唯一 |
lang | 否 | 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN |
正确的Json返回结果:
{ "openid":"OPENID","nickname":"NICKNAME","sex":1,"PRovince":"PROVINCE","city":"CITY","country":"COUNTRY","headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0","privilege":["PRIVILEGE1", "PRIVILEGE2"],"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"}
参数 | 说明 |
---|---|
openid | 普通用户的标识,对当前开发者帐号唯一 |
nickname | 普通用户昵称 |
sex | 普通用户性别,1为男性,2为女性 |
province | 普通用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 |
privilege | 用户特权信息,json数组,如微信沃卡用户为(chinaunicom) |
unionid | 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。 |
建议:开发者最好保存用户unionID信息,以便以后在不同应用中进行用户信息互通。
3.4 示例3.4.1 weChatLogin.jsp
3.4.2 project.propeties
3.4.3 controller.java
package xxx;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.json.JSONObject;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import com.gaokaowenwen.common.utils.HttpClientUtil;import com.gaokaowenwen.common.utils.Validator;public class test { @Value("${wx_appId}") public String wx_appId; @Value("${wx_appSecret}") public String wx_appSecret; @Value("${wx_baseUrl}") public String wx_baseUrl; @Value("${wx_callbackUrl}") public String wx_callbackUrl; @RequestMapping("/") public void index(HttpServletRequest request,HttpServletResponse response) { // 微信登陆的回调只能在域名下 String code = request.getParameter("code"); String state = request.getParameter("state"); if (!Validator.checkNullString(code) && "test".equals(state)) { // 获取access token,oppenid等 String GET_ACCESS_TOKEN = wx_baseUrl + "/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code"; String accessToken_url = String.format(GET_ACCESS_TOKEN, wx_appId, wx_appSecret, code); String accessTokenStr = HttpClientUtil.doGet(accessToken_url); JSONObject json = new JSONObject(accessTokenStr); String access_token = (String) json.get("access_token"); String openid = (String) json.get("openid"); // 获取用户信息 String GET_USERINFO = wx_baseUrl + "/userinfo?access_token=%s&openid=%s"; String userinfo_url = String.format(GET_USERINFO, access_token, openid); String userinfo = HttpClientUtil.doGet(userinfo_url); //处理用户信息 } }}
新闻热点
疑难解答