0
点赞
收藏
分享

微信扫一扫

开发网页微信登入获取微信用户信息


1、先进入微信公众号测试平台(填写这些的时候需要买域名,我买的是阿里云域名):

​​微信公众平台​​

用自己微信登入可以获取自己的appid和appsecret

2、在idea后台写代码,此处的token就是测试平台自己设置的token:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

@RestController
@RequestMapping("/wx")
public class WxTestController {

private Logger log = LoggerFactory.getLogger(WxTestController.class);

private String TOKEN = "*****";

@RequestMapping("/login")
public String login(@RequestParam("signature") String signature,
@RequestParam("timestamp") String timestamp,
@RequestParam("nonce") String nonce,
@RequestParam("echostr") String echostr) {
log.info("timestamp:"+timestamp);
log.info("nonce:"+nonce);
//排序
String sortString = sort(TOKEN, timestamp, nonce);
//加密
String myString = sha1(sortString);
//校验
if (myString != null && myString != "" && myString.equals(signature)) {
System.out.println("签名校验通过");
//如果检验成功原样返回echostr,微信服务器接收到此输出,才会确认检验完成。
return echostr;
} else {
System.out.println("签名校验失败");
return "";
}
}

public String sort(String token, String timestamp, String nonce) {
String[] strArray = {token, timestamp, nonce};
Arrays.sort(strArray);
StringBuilder sb = new StringBuilder();
for (String str : strArray) {
sb.append(str);
}

return sb.toString();
}

public String sha1(String str) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(str.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();

} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}

}

3、二级域名在那个js框中,-----不带http://!!!!

4、代码上传服务器启动项目,然后点击提交,提示连接成功便完成。

接下来就是需要登入获取用户信息了

一共就四步,附上 微信开发文档连接:​​网页授权 | 微信开放文档​​

​​1 第一步:用户同意授权,获取code​​

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

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

​​4 第四步:拉取用户信息(需scope为 snsapi_userinfo)​​

​​5 附:检验授权凭证(access_token)是否有效​​

代码如下:

mport com.naruto.huo.util.AuthUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

@Controller
public class WxLoginController{

private Logger log = LoggerFactory.getLogger(WxLoginController.class);

/**
*
*/

private static final long serialVersionUID = 1L;

@RequestMapping("/wxLogin")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

log.info("进入WxLoginController");
//第一步:引导用户进入授权页面同意授权,获取code
//回调地址
String backUrl = "*****"; //第1种情况使用

// String backUrl = "*****k";//第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);

}

}

import com.naruto.huo.model.UserVx;
import com.naruto.huo.util.AuthUtil;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
import java.util.Date;

@Controller
public class WxIndexController {

/**
*
*/
private Logger log = LoggerFactory.getLogger(WxIndexController.class);

private static final long serialVersionUID = 1L;

//1. 获取JDBCTemplate对象
@Autowired
private JdbcTemplate jdbcTemplate;


private String dbUrl;

private String driverClassName;

private String userName;

private String passWord;


private Connection conn = null;

private PreparedStatement ps = null;

private ResultSet rs = null;


//初始化数据库
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();

}

}

@RequestMapping("/callBack")
protected ModelAndView callBack(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

log.info("进入获取code后台");
//第二步:通过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");
System.out.println("第一次的token:"+token);
String openid = jsonObject.getString("openid");
String refresh_token = jsonObject.getString("refresh_token");

// 第三步:刷新access_token(如果需要)
JSONObject jsonObjectRefresh = AuthUtil.getRefreshToken(refresh_token);
// 第四步:拉取用户信息(需scope为 snsapi_userinfo)
System.out.println("==========================jsonObjectRefresh" + jsonObjectRefresh);
String tokenR = jsonObject.getString("access_token");
String openidR = jsonObject.getString("openid");
String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + tokenR
+ "&openid=" + openidR
+ "&lang=zh_CN";

//通过网络请求方法来请求上面这个接口

JSONObject userInfo = AuthUtil.doGetJson(infoUrl);

//存储此用户
UserVx userVx = new UserVx();
userVx.setOpenId((String)userInfo.get("openid"));
userVx.setPassword("123456");
userVx.setUpdateTime(new Date());
userVx.setCreateTime(new Date());
log.info("获取到openid:"+(String)userInfo.get("openid"));
Integer count = jdbcTemplate.queryForObject("select count(1) from user_wx where openid = ?",Integer.class,new Object[]{(String)userInfo.get("openid")});
log.info("此用户存在几个:"+count);
if(count == 0){
String sql = "insert into user_wx (openid,password,create_time,update_time) values (?,?,?,?)";
jdbcTemplate.update(sql,(String)userInfo.get("openid"),"123456",new Date(),new Date());
log.info("插入一条数据成功");
}else{
String sql = "update user_wx update_time = ? where openid = ?";
jdbcTemplate.update(sql,new Date(),(String)userInfo.get("openid"));
}

//第1种情况:使用微信用户信息直接登录,无需注册和绑定

request.setAttribute("info", userInfo);
//直接跳转
// request.getRequestDispatcher("/index1Wx.html").forward(request, response);
ModelAndView mv = new ModelAndView();
mv.setViewName("index1Wx");
return mv;
//第2种情况: 将微信与当前系统的账号进行绑定(需将第1种情况和@WebServlet("/callBack")注释掉)

//第一步,根据当前openid查询数据库,看是否该账号已经进行绑定

/* try {

String nickname = getNickName(openid);

if (!"".equals(nickname)) {

//已绑定

request.setAttribute("nickname", nickname);

request.getRequestDispatcher("/indexWx2.html").forward(request, response);

} else {

//未绑定

request.setAttribute("openid", openid);

request.getRequestDispatcher("/loginWx.html").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方法,用来接受登录请求
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("/indexWx2.html").forward(request, response);

System.out.println("账号绑定成功");

} else {

System.out.println("账号绑定失败");

}


} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


}*/


}

成功后:扫码即可获取信息

举报

相关推荐

获取微信用户openid

0 条评论