admin管理员组

文章数量:1559099

准备工作:

在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的appid和appsecret,申请微信登录且通过审核后,可开始接入流程。

提交审核到通过大概需要一个礼拜的时间,通过后可以拿到appid和appsecret,有这两个就可以调用微信api换取微信用户信息了。

 

第一步:获得code

第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在pc端打开以下链接:
https://open.weixin.qq/connect/qrconnect?appid=appid&redirect_uri=redirect_uri&response_type=code&scope=scope&state=state#wechat_redirect

就是上面这个网址,注意需要确保已经获得授权,有几个不同的参数

参数说明

参数是否必须说明
appid应用唯一标识,审核通过获得
redirect_uri回调地址,就是扫码完成之后 微信会将code作为参数传到这个地址上(注意这里回调地址需要urlencode处理)
response_type填code
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即
state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

这里只需要拼接好这个链接,就可以获取到微信提供的一个微信二维码链接,如果获取不了二维码说明就仔细检查参数看看有没有问题。最后看到的登录页面如下:

 

第二步:用code换取access_token

通过扫码,用户确认登录后,微信会将code值发生到我们提供的回调地址上,拿到code值之后我们就可以搞事情了

地址:

https://api.weixin.qq/sns/oauth2/access_token?appid=appid&secret=secret&code=code&grant_type=authorization_code

参数说明

参数是否必须说明
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
secret应用密钥appsecret,在微信开放平台提交应用审核通过后获得
code填写第一步获取的code参数
grant_type填authorization_code

 

import java.io.bufferedreader;
import java.io.ioexception;
import java.io.inputstream;
import java.io.inputstreamreader;
import java.io.outputstream;
import java.url;
import java.security.cert.certificateexception;
import java.security.cert.x509certificate;
import javax.ssl.httpsurlconnection;
import javax.ssl.sslcontext;
import javax.ssl.sslsocketfactory;
import javax.ssl.trustmanager;
import javax.ssl.x509trustmanager;
import org.apachemons.collections.maputils;
import com.alibaba.fastjson.json;
import com.alibaba.fastjson.jsonobject;
public class test {
	private static final string appid = "";// 微信应用唯一标识
	private static final string secret = "";
	public void main(string code) {
		jsonobject jsonobject = json.parseobject(getaccess_token(code));
		// 获取unionid,不同平台下唯一标识(小程序/网页应用/移动应用等不管什么应用下都是唯一的),            
       
		string unionid = maputils.getstring(jsonobject, "unionid"); //建议使用unionid作为区别标识
		
		// 获取token,换取用户个人信息时需要使用,过期需要刷新
		string access_token = maputils.getstring(jsonobject, "access_token");
		
		// 获取openid,仅授权应用下唯一
		string openid = maputils.getstring(jsonobject, "openid");
		
		
		//获取微信用户个人信息
		jsonobject userinfo = json.parseobject(getuserinfomation(access_token, openid));
	}
	/**
	 * 获取用户个人信息
	 * 
	 * @param access_token
	 * @param openid
	 * @return
	 */
	public static string getuserinfomation(string access_token, string openid) {
		string stringtoken = string.format("https://api.weixin.qq/sns/userinfo?access_token=%s&openid=%s", access_token, openid);
		string response = httputils.httpsrequesttostring(stringtoken, "get", null);
		return response;
	}
	/**
	 * code换取openid以及unionid,access_token
	 * 
	 * @param code
	 */
	public static string getaccess_token(string code) {
		string stringtoken = string.format("https://api.weixin.qq/sns/oauth2/access_token?", appid, secret, code);
		string response = httputils.httpsrequesttostring(stringtoken, "get", null);
		return response;
	}
	/**
	 * 发送https请求
	 * 
	 * @param path
	 * @param method
	 * @param body
	 * @return
	 */
	public static string httpsrequesttostring(string path, string method, string body) {
		if (path == null || method == null) {
			return null;
		}
		string response = null;
		inputstream inputstream = null;
		inputstreamreader inputstreamreader = null;
		bufferedreader bufferedreader = null;
		httpsurlconnection conn = null;
		try {
			// 创建sslconrext对象,并使用我们指定的信任管理器初始化
			sslcontext sslcontext = sslcontext.getinstance("ssl", "sunjsse");
			trustmanager[] tm = { new x509trustmanager() {
				@override
				public void checkclienttrusted(x509certificate[] chain, string authtype) throws certificateexception {
				}
				@override
				public void checkservertrusted(x509certificate[] chain, string authtype) throws certificateexception {
				}
				@override
				public x509certificate[] getacceptedissuers() {
					return null;
				}
			} };
			sslcontext.init(null, tm, new java.security.securerandom());
			// 从上面对象中得到sslsocketfactory
			sslsocketfactory ssf = sslcontext.getsocketfactory();
			url url = new ;
			conn = (httpsurlconnection) url.openconnection();
			conn.setsslsocketfactory(ssf);
			conn.setdooutput(true);
			conn.setdoinput(true);
			conn.setusecaches(false);
			// 设置请求方式(get|post)
			conn.setrequestmethod(method);
			// 有数据提交时
			if (null != body) {
				outputstream outputstream = conn.getoutputstream();
				outputstream.write(body.getbytes("utf-8"));
				outputstream.close();
			}
			// 将返回的输入流转换成字符串
			inputstream = conn.getinputstream();
			inputstreamreader = new inputstreamreader(inputstream, "utf-8");
			bufferedreader = new bufferedreader(inputstreamreader);
			string str = null;
			stringbuffer buffer = new stringbuffer();
			while ((str = bufferedreader.readline()) != null) {
				buffer.append(str);
			}
			response = buffer.tostring();
		} catch (exception e) {
		} finally {
			if (conn != null) {
				conn.disconnect();
			}
			try {
				bufferedreader.close();
				inputstreamreader.close();
				inputstream.close();
			} catch (ioexception execption) {
			}
		}
		return response;
	}
}

通过获取了unionid以及用户的个人信息,登录流程就基本完成了。

 

本文标签: 网页