3-4 公众号授权登录4

首先 添加  mysql-connector-java-5.1.22-bin.jar

创建数据库:

auth.sql

/*
Navicat MySQL Data Transfer

Source Server         : django
Source Server Version : 50560
Source Host           : 118.31.36.138:3306
Source Database       : auth

Target Server Type    : MYSQL
Target Server Version : 50560
File Encoding         : 65001

Date: 2018-08-19 13:57:58
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `ACCOUNT` varchar(20) NOT NULL,
  `PASSWORD` varchar(20) NOT NULL,
  `NICKNAME` varchar(20) NOT NULL,
  `OPENID` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'test', '123', 'laoda', null);

/WxAuth/WebContent/WEB-INF/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_2_5.xsd" id="WebApp_ID" version="2.5">
  <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.wx.auth.servlet.CallBackServlet</servlet-class>
  	<init-param>
  		<param-name>dbUrl</param-name>
  		<param-value>jdbc:mysql://118.31.36.138:3306/auth</param-value>
  	</init-param>
  	<init-param>
  		<param-name>driverName</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></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>

然后把 /WxAuth/src/com/wx/auth/servlet/CallBackServlet.java 的 @WebServlet("/callBack") 删除

还有  /WxAuth/src/com/wx/auth/servlet/LoginServlet.java 里面也要替换为:wxCallBack

//        String backUrl = "http://huanglianggu.s1.natapp.cc/WxAuth/callBack";
        String backUrl = "http://huanglianggu.s1.natapp.cc/WxAuth/wxCallBack";

/WxAuth/src/com/wx/auth/servlet/CallBackServlet.java

package com.wx.auth.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 net.sf.json.JSONObject;





import com.wx.auth.util.AuthUtil;
 
//@WebServlet("/callBack")
public class CallBackServlet extends HttpServlet{
 
	private String dbUrl;
	private String driverName;
	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.driverName = config.getInitParameter("driverName");
			this.userName = config.getInitParameter("userName");
			this.passWord = config.getInitParameter("passWord");
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String code = req.getParameter("code");
		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);
		String openid = jsonObject.getString("openid");
		String token = jsonObject.getString("access_token");
		
		// 第四步:拉取用户信息(需scope为 snsapi_userinfo)
		//String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
		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 = "+userInfo);
		
//		resp.sendRedirect("http://www.baidu.com");
		//super.doGet(req, resp);
		
		
		// 1.使用微信用户信息登录,无需注册和绑定
//		req.setAttribute("userInfo", userInfo);
//		req.getRequestDispatcher("/index1.jsp").forward(req, resp);
		
		// 2.将微信与当前系统的账号进行绑定
		
		try {
			String nickName = getNickName(openid);
			if(!"".equals(nickName)){
				//绑定成功
				req.setAttribute("nickName", nickName);
				req.getRequestDispatcher("/index2.jsp").forward(req,resp);
			}else{
				//未绑定
				req.setAttribute("openid", openid);
				req.getRequestDispatcher("/login.jsp").forward(req,resp);
			}
		} catch (SQLException e) {
			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;
	}
	
	public int updateUser(String openid,String account,String password) 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;
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String account = req.getParameter("account");
		String password = req.getParameter("password");
		String openid = req.getParameter("openid");
		
		try {
			int temp = updateUser(openid, account, password);
			if(temp>0){
				System.out.println("账号绑定成功");
			}else{
				System.out.println("");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
}

/WxAuth/WebContent/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>
	<dir>用户昵称:${nickName }</dir>
</body>
</html>

/WxAuth/WebContent/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" name="登录并绑定">
	
	</form>
</body>
</html>

启动服务:

猜你喜欢

转载自blog.csdn.net/huanglianggu/article/details/81837466
3-4