首页 > 学院 > 开发设计 > 正文

web网站整合微信第三方登陆

2019-11-08 01:01:37
字体:
来源:转载
供稿:网友

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

3.2 获取access_token

通过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_inaccess_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);						//处理用户信息 		}	}}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表