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以及用户的个人信息,登录流程就基本完成了。
本文标签: 网页
j9九游会老哥俱乐部交流区的版权声明:本文标题:网页应用java实现微信扫码登录授权 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1727388695a1112481.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论