目录

一.编码前准备工作

二.源码

1.WXConstants

2.HttpRequestUtils

3.WXLogin


一.编码前准备工作

1.打开微信开放平台https://open.weixin.qq.com/,注册并认证账号,必须通过企业注册

2.登录微信开放平台并在管理中心创建网站应用提交审核,审核通知之口通过查看详情可获得AppIDAppSecret

3.进行编码

二.源码

1.WXConstants

public class WXConstants {// 微信开放平台创建的网站应用的appsecretpublic static final String APPSECRET = "1b97ce0a29cc41e2abb66096";// 微信开放平台创建的网站应用的appidpublic static final String APPID = "wxf060e68596d5";public static final String SCOPE = "snsapi_login";// 微信开放平台创建的网站 设置的授权回调域public static final String DOMAIN_NAME = "http://196.29.119.38";
}

2.HttpRequestUtils

import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;public class HttpRequestUtils {private static CloseableHttpClient httpClient;static {PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(100);connectionManager.setDefaultMaxPerRoute(20);connectionManager.setDefaultMaxPerRoute(50);httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();}public static String get(String url) {CloseableHttpResponse response = null;BufferedReader in = null;String result = "";try {HttpGet httpGet = new HttpGet(url);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000).setConnectionRequestTimeout(30000).setSocketTimeout(30000).build();httpGet.setConfig(requestConfig);httpGet.addHeader("Content-type", "application/json; charset=utf-8");httpGet.setHeader("Accept", "application/json");response = httpClient.execute(httpGet);in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));StringBuffer sb = new StringBuffer("");String line = "";String NL = System.getProperty("line.separator");while ((line = in.readLine()) != null) {sb.append(line + NL);}in.close();result = sb.toString();} catch (IOException e) {e.printStackTrace();} finally {try {if (null != response) {response.close();}} catch (IOException e) {e.printStackTrace();}}return result;}public static String post(String url, String jsonString) {CloseableHttpResponse response = null;BufferedReader in = null;String result = "";try {HttpPost httpPost = new HttpPost(url);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000).setConnectionRequestTimeout(30000).setSocketTimeout(30000).build();httpPost.setConfig(requestConfig);httpPost.setConfig(requestConfig);httpPost.addHeader("Content-type", "application/json; charset=utf-8");httpPost.setHeader("Accept", "application/json");httpPost.setEntity(new StringEntity(jsonString, Charset.forName("UTF-8")));response = httpClient.execute(httpPost);in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));StringBuffer sb = new StringBuffer("");String line = "";String NL = System.getProperty("line.separator");while ((line = in.readLine()) != null) {sb.append(line + NL);}in.close();result = sb.toString();} catch (IOException e) {e.printStackTrace();} finally {try {if (null != response) {response.close();}} catch (IOException e) {e.printStackTrace();}}return result;}}

3.WXLogin


import java.io.PrintWriter;
import java.net.URLEncoder;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import com.alibaba.fastjson.JSON;
import com.hongedu.ttms.ttms.commons.constant.EntityTrainingSystemConstants;
import com.hongedu.ttms.ttms.entity.User;
import com.hongedu.ttms.ttms.service.UserService;
import com.hongedu.ttms.ttms.web.front.index.FrontLoginController;
import com.hongedu.ttms.util.shiro.ShiroUser;/*** *                             _ooOoo_*                            o8888888o*                            88" . "88*                            (| -_- |)*                            O\  =  /O*                         ____/`---'\____*                       .'  \\|     |//  `.*                      /  \\|||  :  |||//  \*                     /  _||||| -:- |||||-  \*                     |   | \\\  -  /// |   |*                     | \_|  ''\---/''  |   |*                     \  .-\__  `-`  ___/-. /*                   ___`. .'  /--.--\  `. . __*                ."" '<  `.___\_<|>_/___.'  >'"".*               | | :  `- \`.;`\ _ /`;.`/ - ` : | |*               \  \ `-.   \_ __\ /__ _/   .-` /  /*          ======`-.____`-.___\_____/___.-`____.-'======*                             `=---='*          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*                         佛祖保佑        永无BUG*/
@Controller
@RequestMapping("/front/wxQr")
public class WXLogin extends HttpServlet{private static final long serialVersionUID = 1L;private final static Logger logger= LoggerFactory.getLogger(WXLogin.class);@Autowiredprivate UserService userService;/**1.授权*/@RequestMapping("/wxAuth")public void wxAuth (HttpServletRequest request,HttpServletResponse response) {try {String url = "https://open.weixin.qq.com/connect/qrconnect?"+ "appid=APPID"+ "&redirect_uri=REDIRECT_URI"+ "&response_type=code"+ "&scope=SCOPE"+ "&state=STATE#wechat_redirect";String callBack = WXConstants.DOMAIN_NAME + "/front/wxQr/callBack";String redirect_uri = URLEncoder.encode(callBack, "UTF-8");url = url.replace("APPID", WXConstants.APPID).replace("REDIRECT_URI", redirect_uri).replace("SCOPE", WXConstants.SCOPE);response.sendRedirect(url);} catch (Exception e) {e.printStackTrace();}}/** 2.回调,获取到openId&unionId */@RequestMapping("/callBack")public void callBack(HttpServletRequest request,HttpServletResponse response,String code,String state,User loginUser){try {logger.info("进入授权回调,code:{},state:{}",code,state);//1.通过code获取access_tokenJSONObject accessToken = this.getAccessToken(code);@SuppressWarnings("unused")//2.通过access_token和openid(unionId)获取用户信息JSONObject userInfo = this.getUserInfo(accessToken);//3.通过unionId检测是否绑定微信this.accountBinding(loginUser,accessToken,request, response);} catch (Exception e) {e.printStackTrace();}}/** 获取微信用户信息*/private JSONObject getUserInfo(JSONObject accessToken) {String url = "https://api.weixin.qq.com/sns/userinfo?"+ "access_token=ACCESS_TOKEN&"+ "openid=OPENID";url = url.replace("ACCESS_TOKEN",accessToken.getString("access_token")).replace("OPENID",accessToken.getString("openid"));String user =  HttpRequestUtils.get(url);logger.info("userInfo:{}",user);JSONObject userInfo = new JSONObject(user);return userInfo;}/**获取access_token*/private JSONObject getAccessToken(String code) {String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"+ "appid=APPID"+ "&secret=SECRET"+ "&code=CODE"+ "&grant_type=authorization_code";url = url.replace("APPID",WXConstants.APPID).replace("SECRET",WXConstants.APPSECRET).replace("CODE",code);String tokenInfo =  HttpRequestUtils.get(url);JSONObject accessToken = new JSONObject(tokenInfo);logger.info("accessToken:{}",accessToken);return accessToken;}public void accountBinding(User loginUser, JSONObject accessToken, HttpServletRequest request,HttpServletResponse response) {try {String openId = accessToken.getString("openid");String unionId = accessToken.getString("unionid");String url;PrintWriter out = response.getWriter();User user = this.checkUserByUnionId(unionId);if (user != null && StringUtils.isNotEmpty(user.getUnionId())) {this.saveLoginInfo(user, request);if (user.getRoleId()==EntityTrainingSystemConstants.EXPERT) {url = "/expert/index";out.println("<html><script>");out.println("window.open ('" + url + "','_top')");out.println("</script></html>");}else if (user.getRoleId()==EntityTrainingSystemConstants.TRAINEE) {url = "/person/projectIndex/index";out.println("<html><script>");out.println("window.open ('" + url + "','_top')");out.println("</script></html>");}} else {url = "/front/wxQr/binding";User userInfo = new User();userInfo.setOpenId(openId);userInfo.setUnionId(unionId);Cookie userCookie = new Cookie("user", JSON.toJSONString(userInfo));response.addCookie(userCookie);logger.info("userCookie:{}",userCookie);out.println("<html><script>");out.println("window.open ('" + url + "','_top')");out.println("</script></html>");}out.close();} catch (Exception e) {e.printStackTrace();}}private void saveLoginInfo(User loginUser, HttpServletRequest request) {try {FrontLoginController login = new FrontLoginController();Subject currentUser = login.Authenticated(loginUser.getUsername(), loginUser.getPassword());ShiroUser shirouser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();if (EntityTrainingSystemConstants.TRAINEE == loginUser.getRoleId()|| EntityTrainingSystemConstants.EXPERT == loginUser.getRoleId()) {login.saveLoginInfo(request, currentUser, shirouser);}} catch (Exception e) {e.printStackTrace();}}private User checkUserByUnionId(String unionId) { return userService.getUserByUnionId(unionId);}@RequestMapping("/binding")public String binding(String unionId,String openId,Model model) {model.addAttribute("unionId", unionId).addAttribute("openId", openId);return "/front/wxQr/binding";}
}

微信授权登录(扫码登录)--源码相关推荐

  1. QQ第三方授权登录(带详细源码)

    为什么80%的码农都做不了架构师?>>>    建议下载demo,照着开发文档看 1.首先要配置SDK,官网下载的,两个jar. 2.配置AndroidManifest.xml 的权 ...

  2. VB.net开发微信、支付宝扫码支付源码

    扫码消费机介绍:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21914722028.2.2b826baawDkx32&id=170 ...

  3. 教育网站通用登录页面html前端源码

    大家好,今天给大家介绍一款, 简单的教育网站通用登录页面html前端源码(图1).送给大家哦,获取方式在本文末尾. 图1 加入了输入验证(图2) 图2 响应式设计,适合各种分辨率(图3) 图3 代码完 ...

  4. 最新美化版彩虹DS网聚合登录中转API程序源码 搭建/QQ快捷登录

    介绍: 首页美化过的:彩虹代刷网聚合QQ快捷登录中转API程序源码 首页美观大气,非常不错. 拿来修改成其他行业的官网也不错哦~ 下面是搭建教程: 彩虹聚合登录中转API是一个可以实现中转QQ.微信. ...

  5. 基于olami开放语义平台的微信小程序遥知之源码实现

    概述 实现一个智能生活信息查询的小秘书功能,支持查天气.新闻.日历.汇率.笑话.故事.百科.诗词.邮编.区号.菜谱.股票.节目预告,还支持闲聊.算24点.数学计算.单位换算.购物.搜索等功能. 使用方 ...

  6. php qq钱包扫码接口,php最新版qq钱包扫码支付源码

    代码效果图 代码说明 php最新版qq钱包扫码支付源码,这套qq钱包扫码支付,经过云码素材修改,已经完全能正常使用,云码素材本站也在使用,如果你想测试一下,要以登录到会员中心,充值中使用qq钱包扫码支 ...

  7. 2021最新外卖霸王餐小程序、H5、微信公众号版外系统源码|霸王餐美团/饿了么系统 粉丝裂变玩源码下载

    2021年了,你还在用淘宝客吗?赶紧跟上互联网的大势吧,外卖cps就是cps人群趋势! 个人.个体.企业均可使用 外卖霸王餐小程序.H5.微信公众号版外系统源码|霸王餐美团/饿了么系统 粉丝裂变玩 2 ...

  8. ASP.NET微信群机器人管家系统,源码分享

    ASP.NET微信群机器人管家管理系统源码 需要源码学习可私信 一.源码特点 1.一款微信群机器人管家管理源码,支持机器人聊天等功能. 二.菜单功能 1.支持同事登录多个微信 2.支持机器人聊天(笑话 ...

  9. 最新h5微信大灌篮小游戏投篮赚钱源码+手动提现+免公众号

    介绍: 适用范围:Thinkphp内核微信大灌篮小游戏投篮赚钱源码下载 免公众号+个人免签支付接口 运行环境:php+mysql 源码详细: Thinkphp大灌篮游戏源码 微信投篮源码 运行环境:P ...

  10. 银联支付java代码实现_[VIP源码]【S008】Java实现支付宝、微信、银联支付项目实例项目源码 百度云 网盘...

    java源码项目名称:Java实现支付宝.微信.银联支付项目实例项目源码  支付项目源码& X3 U' W# h0 z# K 百度网盘下载链接: ( y! x% n" V9 F9 s ...

最新文章

  1. Spark源码阅读02-Spark核心原理之监控管理
  2. linux shell脚本中调用另一个shell脚本
  3. POJ2553 强连通出度为0的应用
  4. 优化嵌套查询 || 优化OR条件
  5. 求解决方法_解决方法
  6. mysql集群和主从区别_搭建MySQL主从集群,主从复制过程中同步延迟问题
  7. B. File List
  8. 多个tomcat部署的端口问题
  9. jdk的ServiceLoader
  10. Vista工具箱 v3.1
  11. mysql索引or_mysql索引之or条件
  12. 46. 考虑使用函数对象而不是函数作为STL算法的参数
  13. 作为程序员,你一般用什么软件画流程图时序图和状态图等?
  14. linux中用户信息存储在,在linux中,用于存放用户信息的两个文件是/etc/passwd和/etc/shadow。()...
  15. mysql误删数据快速恢复
  16. 本科计算机专业毕业设计论文写作指南
  17. clark变换第三行系数的由来
  18. win7 64位纯净版系统下载
  19. 基本了解云计算是什么东东了
  20. 创新创业名词解释_大学生创新创业指导_知到网课答案

热门文章

  1. Frontline软件CPAS
  2. Mac m1配置MAMP+PHPStorm环境
  3. 【六祎 - Java】对象序列化
  4. kaldi:计算词错率(WER)
  5. 达观数据签约全国首家银行系基金公司工银瑞信
  6. c++ 取整之ceil、floor、round、fix用法
  7. Android处理大图片
  8. 蓝绿发布、红黑发布、灰度发布你都分得清吗
  9. linux操作系统启动流程与kickstart文件制作
  10. 苹果4s怎么越狱教程_苹果手机桌面图标怎么随意摆放 iPhone桌面图标随意摆放教程...