网页应用java实现微信扫码登录授权

准备工作:

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

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

 

第一步:获得code

第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接:
https://open.weixin.qq.com/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.com/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.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.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.com/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.com/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 URL(path);
			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以及用户的个人信息,登录流程就基本完成了。

 

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
要在Java实现微信扫码登录,您可以按照以下步骤进行操作。 首先,您需要在微信公众平台上创建一个开发者账号,并获取到您的AppID和AppSecret。这些信息将用于后续的认证和授权操作。 然后,您可以使用微信提供的SDK或API来实现扫码登录功能。根据您提供的引用内容,您可以参考微信官方文档中的扫码登录部分来了解具体的实现流程。 在Java中,您可以通过后台的Controller来处理微信的认证和授权逻辑。您可以根据微信返回的参数(如code和state)来调用相应的方法进行验证和授权操作。 在前端页面中,您可以使用微信提供的JS SDK来生成扫码登录的二维码并显示在页面上。同时,您需要在前端页面中添加相应的点击事件,以触发微信登录功能。 在后台的Controller中,您可以通过调用微信的API来获取扫码登录所需的参数,如AppID和redirect_uri。然后将这些参数传递给前端页面,以便生成正确的扫码登录二维码。 总结起来,您需要进行以下步骤来实现Java中的微信扫码登录: 1. 在微信公众平台上创建开发者账号,并获取AppID和AppSecret。 2. 在后台的Controller中处理微信的认证和授权逻辑。 3. 在前端页面中使用微信的JS SDK生成扫码登录二维码,并添加相应的点击事件。 4. 调用微信的API来获取扫码登录所需的参数,并将这些参数传递给前端页面。 希望以上信息能帮助到您实现Java中的微信扫码登录功能。如有更多问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [java集成微信扫码登录](https://blog.csdn.net/weixin_48214611/article/details/120134304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java实现微信二维码登录功能](https://blog.csdn.net/weixin_42132143/article/details/89206215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值