Java实现微信网页授权的完整示例代码教程

2024-12-09 0 705

在互联网应用开发领域,微信网页授权Java技术的融合是众多开发者必须掌握的技能之一。这种结合方式既有其独特性,也隐藏着一些容易出错的问题,这些问题既让人感到好奇,又让人感到困扰。

开发前的准备工作

在项目启动前,有很多细节需要明确。首先,公众号是核心部分,我们可以用测试账号,并且需要获取其AppID。接着,要设置授权回调域名。在公众号开发者中心的接口权限部分,找到网页服务下的网页账号,然后是网页授权获取用户基本信息,这里进行修改。只需填写完整的域名,不要添加任何协议头。比如,有开发者2018年开发时,因为不熟悉域名配置,费了很大力气才弄懂。此外,Ngrok可以用来将虚拟域名映射到本地环境,学会使用它并扫描相关二维码,这些都是必要的步骤。

在进行Java编程时,环境的搭建同样关键。比如,需要指定版本的JDK以及适宜的开发工具。以某个开发团队为例,他们在开发微信网页授权功能时,就因为选择了不兼容的JDK版本,遭遇了兼容性问题。

授权流程的第一步

Java实现微信网页授权的完整示例代码教程

确保用户顺利进入授权页面并同意授权,以获取必要的code,这一步骤极为关键。这相当于将需要授权的页面链接与微信的认证接口相结合。在此过程中,scope参数尤其重要,它包含两个选项。其中,snsapi_base这一选项仅能获取用户信息。比如,在电商网站的快速登录页面,使用它可实现无需额外操作的静默认证。某电商在2019年采纳这一功能后,其登录成功率有所提高。这是因为用户无需手动点击认证按钮,就像直接访问网站一样简便。

Java实现微信网页授权的完整示例代码教程

snsapi_userinfo可以提供更详尽的信息,比如用户的昵称、头像以及他们所在的地方。但要注意,这需要用户亲自点击认证的按键。在开发某社交应用时,这一功能被采纳,有开发者指出,这种手动操作可能会减少一些用户的参与热情。

换取网页授权

Java实现微信网页授权的完整示例代码教程

这一步骤与基础支持中的操作存在差异。我们需要在控制器中获取微信传回的code,然后利用这个code发起请求并获取用户的基本信息。在开发过程中,这一环节的代码编写非常关键。有些新手开发者由于未能妥善处理代码逻辑,导致获取的信息不完整。比如在处理用户头像显示时,因未能准确获取到全部信息,导致头像无法正常显示。

同时,还需关注代码在不同环境中的变动。比如,在本地测试和线上实际运行时,可能因为网络或服务器设置等原因,代码的表现会有所不同。拿一个例子来说,一家小公司在把应用从测试服务器移至线上服务器时,就遇到了这段代码的暂时性问题。

Java实现微信网页授权的完整示例代码教程

项目结构和代码示例



 WxAuth
 
  index.html
  index.htm
  index.jsp
  default.html
  default.htm
  default.jsp
 
  
 
   wxCallBack
   com.xingshang.servlet.CallBackSerclet
   
     dbUrl
     jdbc:mysql://127.0.0.1:3306/wxauth
   
   
     driverClassName
     com.mysql.jdbc.Driver
   
   
     userName
     root
   
   
     passWord
     123456
   
   1
 
 
 
   wxCallBack
   /wxCallBack
 
 

先审视项目框架,掌握其结构对全面理解开发步骤很有帮助。这就像盖楼前得先有设计图。web.xml中的代码同样至关重要。在Java实现上,需对每一行代码进行细致分析。比如,login.jsp和index.jsp文件中都含有一些必不可少的代码。一位技术爱好者在研究示例代码时发现,合理编排代码块和添加适当的注释,能显著提升代码的易读性和维护性。

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;
  }
}

代码量一旦增多,良好的项目架构和规范的代码模板便如同夜幕中的灯塔,为开发者指明了后续修改和优化的路径。一些开发者起初忽视项目结构,但随着功能的不断扩展,项目代码变得杂乱无章,升级和改造变得困难重重。

相关jar包的意义

附带的jar包不容小觑。它们具备多样的功能。其中一些负责处理网络请求,比如2018年流行的一款jar包,它专门用于提升网络传输速度。还有一些与数据安全加密相关,这在处理用户信息时至关重要。比如在金融APP开发中,当需要实现微信网页授权时,数据安全的jar包就能确保用户敏感信息的安全。

若遗漏了添加相应jar包或版本不对应,微信网页授权功能可能会完全失效。有开发者在进行项目转移时,因疏忽未转移一个重要jar包,结果程序运行时频繁出现错误。

可能遇到的问题与调试

在Java实现微信网页授权的整个流程中,难免会遇到一些问题。这些问题可能包括前面提到的代码逻辑上的错误,或者是由于环境配置不同而产生的问题。遇到这些困难时,具备自我调试的能力变得至关重要。开发者可以利用诸如日志记录等工具,详细记录程序的每一步执行情况。以2017年为例,有一支开发团队在解决微信网页授权登录超时的问题时,就是通过仔细分析日志,最终找到了问题的根源并成功解决。

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);
  }
}

动手自己调试不仅能迅速解决眼前的问题,还能增强个人技术实力。若遇到困难就依赖他人,技术进步将难以实现。你是否在开发中遇到过类似难题?

您可以讲述您的个人经历,同时也欢迎您点赞并转发这篇文章,以便更多需要的开发者能够看到。

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();
    }
    
  }
  
}

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

七爪网 行业资讯 Java实现微信网页授权的完整示例代码教程 https://www.7claw.com/2801143.html

七爪网源码交易平台

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务