首先 添加 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>
启动服务: