admin管理员组

文章数量:1573361

微信登录

  • 1、二维码
  • 2、授权成功
  • 3、题外
  • 4、本篇用到的发送get请求的工具类

微信登录官网: https://developers.weixin.qq/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

1、二维码

  • 点击微信登录,弹出微信登录的二维码
/*
	APPID:应用唯一标识(公司申请微信登录成功后都有一个appid)
	REDIRECT_URI:请使用urlEncode对链接进行处理(一般项目上线后都有一个域名(如:www.某度),这里就填写需要访问项目的域名:注意该域名对应的项目端口必须是80端口)
	
	注意:域名后面也可以跟需要跳转的路径,如:http://www.某度/callback.html 
*/
//访问该路径,弹出二维码
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_login&state=1#wechat_redirect"

样:

2、授权成功

  • 用户点击同意微信登录后可以从访问路径里面获取到code
通过code,传到后台能获取到openid和令牌access_token等)
    openid:每个微信用户的唯一标识,可以拿它到数据库中查询来判断他以前是否登录过
    access_token:令牌,可以通过他和openid获取到微信登录用户的信息

  • 注:我这里是跳转的前端页面所以是根据href获取的
//打印出来结果:http://域名:80端口的/callback.html?code=aaaaaaaaaaa&state=1
 let url = location.href;

  • 截取路径里面的code值,拿它获取openid
//1、发送get请求到微信平台,拿到Openid
//注意:替换字符串里面括号内的内容(包含括号)
//这个地址是微信官方给的
String url ="https://api.weixin.qq/sns/oauth2/access_token?appid=(自己公司的APPID)&secret=(密文:公司注册成功后也有)&code=(这里填扫码传来的CODE)&grant_type=authorization_code";

//2、使用工具类发送get请求(工具类这本篇文章的最后),发送成功后得到的就是openid和access_token
String httpGet = HttpClientUtils.httpGet(url);

//最后httpGet 结果就是这样:我们只要openid和access_token
//注意这只是json字符串,要获取里面的内容需要转成json对象
{"access_token":"bbb","expires_in":aaa,"refresh_token":"ccc","openid":"ddd"}



//3、然后我们根据这个openid到数据库中去查询(这里有个微信登录用户类),判断他以前是否已经用微信登录过了

........ 查询代码略过

如果以前已经登录过了(系统记录了微信登录信息了),那么就直接在这结束逻辑,并且跳转到登录过后的界面

.....................


//4、如果他是第一次用微信登录,那么根据openid和access_token也是发送一个get请求。拿到到微信用户点击授权后,微信官网给你的信息
//替换括号的内容(包括括号):这个地址和上面的是不一样的,都是微信官方给的
String urlUser ="https://api.weixin.qq/sns/userinfo?access_token=(上面使用code获取到他给你的ACCESS_TOKEN)&openid=(上面使用code获取到他给你的OPENID)";

String WxLogin = HttpClientUtils.httpGet(urlUser);

/ *
	这坨是json字符串,也是需要转json对象
 	
 	最终拿到的字符串结果:(选取我们需要的保存即可,注意:一定要保存openid)
		{
		"openid":"OPENID", //微信用户的唯一标识
		"nickname":"NICKNAME", //微信用户的昵称
		"sex":1, //性别
		"province":"PROVINCE",
		"city":"CITY",
		"country":"COUNTRY",
		"headimgurl": "http://wx.qlogo/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
		"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
		}
*/


//5、到这基本上也就结束了,后面的逻辑不过就是像一个普通的user用户一样保存上面的一坨微信用户信息。然后跳转到登录过后的界面即可
	.........

3、题外

//这个是写给本人看的

//如果需要跳转到前台另一个页面在跳转到后台的话,就需要这样,路径直接写死
//这样避免了重新跳转页面,openid和access_token拿不到的问题,(直接将这两个数据传发到路径里传到前台,到时候在获取到路径里面的openid然后在传回来)
String bindUrl ="http://域名/bindle.html?access_token="+access_token+"&openid="+openid+"";

4、本篇用到的发送get请求的工具类

  • 直接拷贝使用即可
/**
 * 使用httpclient组件发送http请求
 *   get:现在只用到get
 *   post
 */
public class HttpClientUtils {
    /**
     * 发送get请求
     * @param url 请求地址
     * @return 返回内容 json
     */
    public static String httpGet(String url){

        // 1 创建发起请求客户端
        try {
            HttpClient client = new HttpClient();
            // 2 创建要发起请求-tet
            GetMethod getMethod = new GetMethod(url);
            getMethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
            // 3 通过客户端传入请求就可以发起请求,获取响应对象
            client.executeMethod(getMethod);
            // 4 提取响应json字符串返回
            String result = new String(getMethod.getResponseBodyAsString().getBytes("utf8"));
            return result;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

本文标签: 第三方