Java实现微信网页授权的示例代码

开发前的准备:

1、需要有一个公众号(我这里用的测试号),拿到AppID和AppSecret;

2、进入公众号开发者中心页配置授权回调域名。具体位置:接口权限-网页服务-网页账号-网页授权获取用户基本信息-修改

注意,这里仅需填写全域名(如www.qq.com、www.baidu.com),勿加 http:// 等协议头及具体的地址字段;

 我们可以通过使用Ngrok来虚拟一个域名映射到本地开发环境,网址https://www.ngrok.cc/,大家自己去下载学习怎么使用

同时还需要扫一下这个二维码

授权步骤:

1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权access_token(与基础支持中的access_token不同)

3、通过网页授权access_token和openid获取用户基本信息

先看一下我的项目结构:

web.xml相关代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 <display-name>WxAuth</display-name>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
 </welcome-file-list>

 <servlet>
   <servlet-name>wxCallBack</servlet-name>
   <servlet-class>com.xingshang.servlet.CallBackSerclet</servlet-class>
   <init-param>
     <param-name>dbUrl</param-name>
     <param-value>jdbc:mysql://127.0.0.1:3306/wxauth</param-value>
   </init-param>
   <init-param>
     <param-name>driverClassName</param-name>
     <param-value>com.mysql.jdbc.Driver</param-value>
   </init-param>
   <init-param>
     <param-name>userName</param-name>
     <param-value>root</param-value>
   </init-param>
   <init-param>
     <param-name>passWord</param-name>
     <param-value>123456</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
   <servlet-name>wxCallBack</servlet-name>
   <url-pattern>/wxCallBack</url-pattern>
 </servlet-mapping>

</web-app>

AuthUtil工具类:

package com.xingshang.util;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import net.sf.json.JSONObject;

public class AuthUtil {

  public static final String APPID = "wx45c1428e5584fcdb";
  public static final String APPSECRET = "98174450eb706ada330f37e646be85d5";

  public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException{
    JSONObject jsonObject = null;
    //首先初始化HttpClient对象
    DefaultHttpClient client = new DefaultHttpClient();
    //通过get方式进行提交
    HttpGet httpGet = new HttpGet(url);
    //通过HTTPclient的execute方法进行发送请求
    HttpResponse response = client.execute(httpGet);
    //从response里面拿自己想要的结果
    HttpEntity entity = response.getEntity();
    if(entity != null){
      String result = EntityUtils.toString(entity,"UTF-8");
      jsonObject = jsonObject.fromObject(result);
    }
    //把链接释放掉
    httpGet.releaseConnection();
    return jsonObject;
  }
}

Java实现:

1、引导用户进入授权页面同意授权,获取code

这一步其实就是将需要授权的页面url拼接到微信的认证请求接口里面,比如需要用户在访问页面 时进行授权认证

其中的scope参数有两个值:

snsapi_base:只能获取到用户openid。好处是静默认证,无需用户手动点击认证按钮,感觉上像是直接进入网站一样。

snsapi_userinfo:可以获取到openid、昵称、头像、所在地等信息。需要用户手动点击认证按钮。

相关代码

package com.xingshang.servlet;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xingshang.util.AuthUtil;

/**
 * 入口地址
 * @author Administrator
 *
 */
@WebServlet("/wxLogin")
public class LoginServlet extends HttpServlet {

  /**
   *
   */
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //第一步:引导用户进入授权页面同意授权,获取code

    //回调地址
//    String backUrl = "http://suliu.free.ngrok.cc/WxAuth/callBack";  //第1种情况使用
    String backUrl = "http://suliu.free.ngrok.cc/WxAuth/wxCallBack";//第2种情况使用,这里是web.xml中的路径

    //授权页面地址
    String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+AuthUtil.APPID
        + "&redirect_uri="+URLEncoder.encode(backUrl)
        + "&response_type=code"
        + "&scope=snsapi_userinfo"
        + "&state=STATE#wechat_redirect";

    //重定向到授权页面
    response.sendRedirect(url);
  }
}

2、通过第一步获取的code换取网页授权access_token(与基础支持中的access_token不同)

这一步需要在控制器中获取微信回传给我们的code,通过这个code来请求access_token,通过access_token和openid获取用户基本信息:

相关代码:

package com.xingshang.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xingshang.util.AuthUtil;

import net.sf.json.JSONObject;

/**
 * 回调地址
 * @author Administrator
 *
 */
//@WebServlet("/callBack")
public class CallBackSerclet extends HttpServlet {

  /**
   *
   */
  private static final long serialVersionUID = 1L;

  private String dbUrl;
  private String driverClassName;
  private String userName;
  private String passWord;

  private Connection conn =null;
  private PreparedStatement ps =null;
  private ResultSet rs = null;

  //初始化数据库
  @Override
  public void init(ServletConfig config) throws ServletException {

    //加载驱动
    try {
      this.dbUrl = config.getInitParameter("dbUrl");
      this.driverClassName = config.getInitParameter("driverClassName");
      this.userName = config.getInitParameter("userName");
      this.passWord = config.getInitParameter("passWord");
      Class.forName(driverClassName);
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //第二步:通过code换取网页授权access_token

    //从request里面获取code参数(当微信服务器访问回调地址的时候,会把code参数传递过来)
    String code = request.getParameter("code");

    System.out.println("code:"+code);

    //获取code后,请求以下链接获取access_token
    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + AuthUtil.APPID
        + "&secret=" + AuthUtil.APPSECRET
        + "&code=" + code
        + "&grant_type=authorization_code";

    //通过网络请求方法来请求上面这个接口
    JSONObject jsonObject = AuthUtil.doGetJson(url);

    System.out.println("==========================jsonObject"+jsonObject);

    //从返回的JSON数据中取出access_token和openid,拉取用户信息时用
    String token = jsonObject.getString("access_token");
    String openid = jsonObject.getString("openid");

    // 第三步:刷新access_token(如果需要)

    // 第四步:拉取用户信息(需scope为 snsapi_userinfo)
    String infoUrl ="https://api.weixin.qq.com/sns/userinfo?access_token=" + token
        + "&openid=" + openid
        + "&lang=zh_CN";
    //通过网络请求方法来请求上面这个接口
    JSONObject userInfo = AuthUtil.doGetJson(infoUrl);

    System.out.println(userInfo);

    //第1种情况:使用微信用户信息直接登录,无需注册和绑定
//    request.setAttribute("info", userInfo);
    //直接跳转
//    request.getRequestDispatcher("/index1.jsp").forward(request, response);

    //第2种情况: 将微信与当前系统的账号进行绑定(需将第1种情况和@WebServlet("/callBack")注释掉)
    //第一步,根据当前openid查询数据库,看是否该账号已经进行绑定
    try {
      String nickname = getNickName(openid);
      if(!"".equals(nickname)){
        //已绑定
        request.setAttribute("nickname", nickname);
        request.getRequestDispatcher("/index2.jsp").forward(request, response);
      }else{
        //未绑定
        request.setAttribute("openid", openid);
        request.getRequestDispatcher("/login.jsp").forward(request, response);
      }
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

  //数据库的查询
  public String getNickName(String openid) throws SQLException{
    String nickName = "";
    //创建数据库链接
    conn = DriverManager.getConnection(dbUrl, userName, passWord);
    String sql = "select nickname from user where openid = ?";
    ps = conn.prepareStatement(sql);
    ps.setString(1, openid);
    rs = ps.executeQuery();
    while (rs.next()) {
      nickName = rs.getString("nickname");
    }

    //关闭链接
    rs.close();
    ps.close();
    conn.close();

    return nickName;
  }

  //数据库的修改(openid的綁定)
  public int updateUser(String account,String password,String openid) throws SQLException{

    //创建数据库链接
    conn = DriverManager.getConnection(dbUrl, userName, passWord);
    String sql = "update user set openid = ? where account = ? and password = ?";
    ps = conn.prepareStatement(sql);
    ps.setString(1, openid);
    ps.setString(2, account);
    ps.setString(3, password);
    int temp = ps.executeUpdate();

    //关闭链接
    rs.close();
    ps.close();
    conn.close();

    return temp;
  }

  //post方法,用来接受登录请求
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String account = request.getParameter("account");
    String password = request.getParameter("password");
    String openid = request.getParameter("openid");

    try {
      int temp = updateUser(account, password, openid); 

      if(temp > 0){
        String nickname = getNickName(openid);
        request.setAttribute("nickname", nickname);
        request.getRequestDispatcher("/index2.jsp").forward(request, response);
        System.out.println("账号绑定成功");
      }else{
        System.out.println("账号绑定失败");
      }

    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

}

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
  <form action="/WxAuth/wxCallBack" method="post">
    <input type="text" name="account" />
    <input type="password" name="password" />
    <input type="hidden" name="openid" value="${openid }" />
    <input type="submit" value="提交并绑定" />
  </form>
</body>
</html>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Insert title here</title>
</head>
<body style="font-size: 40px; text-align: center;">
  <a href="/WxAuth/wxLogin" rel="external nofollow" >微信公众授权登录</a>
</body>
</html>

index1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
  <div>登陆成功!</div>
  <div>用户昵称:${info.nickname}</div>
  <div>用户头像:<img style="text-align: top;" width="100" src="${info.headimgurl }"></div>
</body>
</html>

index2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
  <div>登陆成功!</div>
  <div>用户昵称:${nickname}</div>
</body>
</html>

最后附上需要的jar包

到此,微信授权登录成功,如果有运行问题请自行调试,我这边能正常运行的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于CI框架的微信网页授权库示例

    本文实例讲述了基于CI框架的微信网页授权库.分享给大家供大家参考,具体如下: 这里演示建立在CI框架上的微信网页授权功能. 1. 微信小类库,网页授权放置在libraries文件夹 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); Class Weixin { private $appId; private $appSecret; function __construct() { $this->

  • 详解微信开发之Author网页授权

    微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权! 1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修改授权回调域名,值得注意的是这里就是直接写全域名,如: www.liliangel.cn.然而我们开发h5中一般用的是二级域名,如:h5.liliangel.cn 也同样在安全回调域名中. 2.用户级授权

  • 微信公众号OAuth2.0网页授权问题浅析

    根据需求,我今天完成的是微信的网页授权然后拉取用户的一些基本信息的问题. 1.修改网页授权的基本信息.打开微信公众平台. 在这个地方写要授权的页面的网址. 2.我这边只是测试这个功能,所以我页面直接写了个测试页面,我在要测试的这个网站的根目录新建了一个ceshi.html 然后在他的控制器里面对其进行操作. 1)首先是分享的也就是授权的网页的链接要写的正确 然后url: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx444

  • ajax 实现微信网页授权登录的方法

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个phper ,所以,微信开发采用的是 EasyWeChat ,所以实现的方式是基于EW的. 其实实现这个也麻烦,在实现之前,我们需要了解一下微信授权的整个流程. 引导用户进入授权页面同意授权,获取code 通过code换取网页授权access_token(与基础支持中的access_token不同) 如果需要,开发者可以刷新网页授权access_toke

  • C#实现的微信网页授权操作逻辑封装示例

    本文实例讲述了C#实现的微信网页授权操作逻辑封装.分享给大家供大家参考,具体如下: 一.微信网页授权登录 前提: 1.已经获取的接口权限,如果是测试账号就已经有权限了 2.配置接口的授权域名 更多说明可以参考方倍工作室:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html 或者官网API:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 步骤: 1.用

  • 微信公众号-获取用户信息(网页授权获取)实现步骤

    根据微信公众号开发官方文档: 获取用户信息步骤如下: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信息(需scope为 snsapi_userinfo) 1 获取code 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

  • 微信网页授权并获取用户信息的方法

    介绍 在很多微信H5应用里,当用户访问第三方应用时就需要进行微信网页授权,并且很多涉及安全的操作我们必须要先获取用户信息才能继续,本文章简单介绍了微信授权流程,并通过申请微信测试账号来模拟网页授权,用户在授权页点击确定登录后获取用户信息并显示在前端页面,最后效果如下图 工具及开发准备 1. 微信开发者工具及微信测试号 因为是微信授权,所以必须要在微信环境下使用,首先我们要在这里安装微信开发者工具,因为我们没有自己的应用,所以还需要在微信公众平台申请一个接口测试号,这个接口测试号就相当于我们的第三

  • MVC微信网页授权获取用户OpenId

    最近开发微信公众平台,做下记录,以前也开发过,这次开发又给忘了,搞了半天,还是做个笔记为好. 注意框架为MVC 开发微信公众平台.场景为,在模板页中获取用户openid,想要进行验证的页面,集成模板页就可以了. 在_Layout.cshtml中加入如下代码 <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, ini

  • VueJs单页应用实现微信网页授权及微信分享功能示例

    在实际开发中,无论是做PC端.WebApp端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的功能及微信分享的功能,现在总算完成了,但开发过程中遇到好几个坑.废话不多说了,开始正题. 描述点 微信相关开发知识了解 怎么样实现微信相关功能本地测试 微信网页授权 微信分享 微信相关开发知识了解 微信公众号的appId,AppSecret 当我们注册一个微信公众号后,便能够得到一个appId(每个微信公众号只有一个,一个微信公

  • 微信开发 网页授权获取用户基本信息

    微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使用这个的时候失败了或者无法理解其内容,希望我出个教程详细讲解一下,于是便有了这篇文章. 一.什么是OAuth2.0 官方网站:http://oauth.net/   http://oauth.net/2/ 权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method

随机推荐