网站应用 - 微信登录

网站微信登录,做起来挺简单的,我们做这个,首页是要去看微信文档,文档看懂了,然后理清楚逻辑,怎么进行绑定贵公司的账号,业务那块要理清楚!

首先,微信官方告诉我们,要先去申请网站应用,好吧,去申请一下,几小时后,审批通过,速度蛮快的!
申请成功,我们就可以拿到AppId, AppSercret,那么就可以去开心的调接口了!

看看接口文档,嗯,二维码是吧,看看URL,简单,传参,然后发起请求,好舒服,嗯,按照参往里面传,然后出现了二维码。开心!

第二步,用户扫描成功,跳到我传的回调地址,进行授权申请登录,那么就可以拿到oppid了,开心,oppid拿到手了,不是就可以进行关联了,简单,关联在一起,这里要提醒一下,公众号与小程序的oppid是不一样的,但是uuid是一样的,如果要关联小程序与公众号,那么就要再通过token去拿uuid哦,我是偷懒,没有再去调接口拿uuid了!

又有同学问我了,如果没有绑定账号怎么办,这个我就不给与回答,你自己动动小脑袋去想,哈哈!还有,token不要总是去调,要缓存起来,每次用户登录,你要延迟这个token的时间,博主我是知道怎么做,就是懒,到时候如果需要用到,我再花几分钟改改代码。

开始写代码了!

首先,写一个WxConfig类,把你的配置写好,我公开下我的


    //微信二维码
    public static  final String WX_OA_CODE = "https://open.weixin.qq.com/connect/qrconnect?";

    //微信二维码回调地址
    public static  final String REDIRECT_URL = "http://127.0.0.1:8888/v1/b/user/wx_login";

    //微信网站应用
    public static final String APPID="1";
    public  static final String APPSERCRET="2";

http请求

/**
* dapeng
*/
public class Httprequests {
	public static String  sendGet (String url,String param) {
        String result ="";
        BufferedReader in  =null;
        try {
            String urlNameString = url +"?" +param;
            System.out.println("发送的链接请求:"+urlNameString);
            URL reaurl = new URL(urlNameString);

            URLConnection connection  = reaurl.openConnection();

            //设置通用
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

            //建立实际的连接
            connection.connect();

            Map<String, List<String>> map = connection.getHeaderFields();
            //定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }


    /**
     * 向指定 URL 发送POST方法的请求
     * @param url 发送请求的 URL
     * @param param 参数
     * @return String 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());

            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }
}

service层

  /**
     * 微信登录 - 二维码
     * @param request
     */
    void getCode(HttpServletRequest request);

    /**
     * 微信登录
     * @param request
     */
    OrgSessionEntity wxLogin(HttpServletRequest request);

impl层

/**
* dapeng
*/
@Override
    public void getCode(HttpServletRequest request) {
        String state = UUID.randomUUID().toString().replaceAll("_","");
        RedisUtil.setex("wx_open_state" + request.getSession().getId(), state,600);
        StringBuilder url = new StringBuilder();
        url.append(WxConfigVar.WX_OA_CODE);
        url.append("appid=" + WxConfigVar.APPID);
        url.append("&redirect_uri=" + URLEncoder.encode(WxConfigVar.REDIRECT_URL));
        url.append("&response_type=code");
        url.append("&scope=snsapi_login");
        url.append("&state=" + state + "#wechat_redirect");
        //打印路径
        System.out.println(url);
        Httprequests.sendGet(url.toString(), "");
    }
	
	 @Override
    public OrgSessionEntity wxLogin(HttpServletRequest request) {
        String code = request.getParameter("code");
        String state = request.getParameter("state");
        String stateStr = RedisUtil.get("wx_open_state"+ request.getSession().getId());
        if(state.equals(stateStr) || StringUtils.isEmpty(state)){
            throw new WxUserException(ErrorCodeEnum.WX_PARAMETER_NON_HAIR.code(),ErrorCodeEnum.WX_PARAMETER_NON_HAIR.msg());
        }
        //用户授权成功
        if(StringUtils.isNotEmpty(code)){
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+WxConfigVar.APPID +"&secret="+WxConfigVar.APPSERCRET+"&code="+code+"&grant_type=authorization_code";
            String urln = Httprequests.sendGet(url,"");

            System.out.println(urln);

            JSONObject jsonObject = JSONObject.parseObject(urln);
            String openid = jsonObject.getString("openid");
          	//已经拿到了openid了,开心起来吧!
        }else {
            throw new WxUserException(ErrorCodeEnum.WX_PARAMETER_NULL.code(),ErrorCodeEnum.WX_PARAMETER_NULL.msg());
        }
    }

OK了,就网站微信登录就完成了,是不是很简单,半小时就做好了,如果你的领导给你3天时间做个微信登录,那你就有2天半的时间去学习,去逛贴吧了,美滋滋哈!!!

发布了72 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40206199/article/details/103420252