1.准备工作

1)登录微信公众号接口测试平台设置信息,地址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
登录成功后可以看到测试用的appid和appsecret,这个在代码里面会用到。

2)需要设置网页授权

这边需要填域名,如果没有域名,可以用内网穿透动态解析一个域名。这边用的是NATAPP,没有账号可以注册一个:https://natapp.cn/register
注册完毕后实名认证,选择免费通道,具体操作手册可参考:https://natapp.cn/article/minecraft

根据操作手册就是这样:

然后设置域名,这边要注意的是这个地址,只需要域名部分,下图是我映射好的地址,一定不能填错,不然在微信授权登录会一直报redirect_url错误

另外后面回调地址用微信访问的时候,使用的微信得先扫一下这个二维码关注一下才可以

2.代码部分

1)请求微信接口的工具类

package com.example.demo.util;import net.sf.json.JSONObject;
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 java.io.IOException;public class AuthUtil {public static final String APPID = "wxca86e04bc4065918";public static final String APPSECRET = "cb44b8fa1791d5f2ea4e8c9eb4d2b963";//回调地址public static final String backUrl="http://mt4ynq.natappfree.cc/callBack";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;}
}

2)controller类(版本1)

package com.example.demo.controller.wx;import com.example.demo.util.AuthUtil;
import net.sf.json.JSONObject;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.server.PathParam;
import java.io.IOException;
import java.net.URLEncoder;@RestController
@RequestMapping("/front/auth")
public class WxAuthorizeController {/*** Tea微信登录接口* @throws IOException*/@RequestMapping("/wx_login")public void wxLogin(HttpServletResponse response) throws IOException {//域名(暂时写死的)String sym = "http://mt4ynq.natappfree.cc";//这里是回调的urlString redirect_uri = URLEncoder.encode(sym + "/front/auth/callBack", "UTF-8");String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +"appid=APPID" +"&redirect_uri=REDIRECT_URI" +"&response_type=code" +"&scope=SCOPE" +"&state=123#wechat_redirect";response.sendRedirect(url.replace("APPID", "wxca86e04bc4065918").replace("REDIRECT_URI", redirect_uri).replace("SCOPE", "snsapi_userinfo"));}/*** Tea微信授权成功的回调函数** @param request* @param response* @throws IOException*/@RequestMapping("/callBack")protected void deGet(HttpServletRequest request, HttpServletResponse response)throws Exception {//获取回调地址中的codeString code = request.getParameter("code");//拼接url  !!!!!!!!!!根据code获取openId和access_tokenString url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + "wxca86e04bc4065918" + "&secret="+ "cb44b8fa1791d5f2ea4e8c9eb4d2b963" + "&code=" + code + "&grant_type=authorization_code";JSONObject jsonObject = AuthUtil.doGetJson(url);//1.获取微信用户的openidString openid = jsonObject.getString("openid");//2.获取获取access_tokenString access_token = jsonObject.getString("access_token");//!!!!!!!!!!!再根据access_token获取用户信息String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid+ "&lang=zh_CN";//3.获取微信用户信息JSONObject userInfo = AuthUtil.doGetJson(infoUrl);//至此拿到了微信用户的所有信息,剩下的就是业务逻辑处理部分了//保存openid和access_token到sessionrequest.getSession().setAttribute("openid", openid);request.getSession().setAttribute("access_token", access_token);//去数据库查询此微信是否绑定过手机
//        UserVo user = userService.queryByOpenId(openid);
//        String mobile=user==null?"":user.getMobile();//        if(null == mobile || "".equals(mobile)){//            //如果无手机信息,则跳转手机绑定页面String wareName1=URLEncoder.encode(userInfo.get("nickname").toString(), "UTF-8");response.sendRedirect("/front/auth/loginSucess?name="+wareName1);
//        }else{//            //否则直接跳转首页
//            response.sendRedirect("/front/index.html");
//        }}@RequestMapping("/loginSucess")public String loginSucess(@PathParam("name")String name){return "wechat login sucesss "+name;}}

版本2的代码步骤说明更详细

版本2

package com.example.demo.controller.wx;import com.example.demo.dao.UserMapper;
import com.example.demo.entity.User;
import com.example.demo.util.AuthUtil;
import net.sf.json.JSONObject;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;@RestController
public class WxV2Controller {@Resourceprivate UserMapper userMapper;@RequestMapping(value="/wxlogin")public void wx(HttpServletRequest request, HttpServletResponse response) throws IOException {//第一步:引导用户进入授权页面同意授权,获取codeStringBuilder builder = new StringBuilder("https://open.weixin.qq.com/connect/oauth2/authorize?appid=");builder.append(AuthUtil.APPID);builder.append("&redirect_uri=");builder.append(URLEncoder.encode(AuthUtil.backUrl));//开发文档要求转换builder.append("&response_type=code");builder.append("&scope=snsapi_userinfo");builder.append("&state=STATE#wechat_redirect");//授权页面地址//将StringBuilder转换成StringString url=builder.toString();//重定向到授权页面response.sendRedirect(url);}@RequestMapping(value="/callBack")public String wxcallback(@RequestParam("code") String code, Model model)throws IOException {System.out.println("code:" + code);//获取code后,请求以下链接获取access_tokenStringBuilder builder = new StringBuilder("https://api.weixin.qq.com/sns/oauth2/access_token?appid=");builder.append(AuthUtil.APPID);builder.append("&secret=");builder.append(AuthUtil.APPSECRET);builder.append("&code=");builder.append(code);builder.append("&grant_type=authorization_code");//通过网络请求方法来请求上面这个接口//将StringBuilder转换成StringString url=builder.toString();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)StringBuilder builder1 = new StringBuilder("https://api.weixin.qq.com/sns/userinfo?access_token=");builder1.append(token);builder1.append("&openid=");builder1.append(openid);builder1.append("&lang=zh_CN");//通过网络请求方法来请求上面这个接口//将StringBuilder转换成StringString infoUrl=builder1.toString();JSONObject userInfo = AuthUtil.doGetJson(infoUrl);System.out.println("userInfo=======" + userInfo);//第1种情况:使用微信用户信息直接登录,无需注册和绑定
//        model.addAttribute("info",userInfo);
//        return "wx/wxtest1";
////第2种情况:查看数据库是否存在相对应用户try {User wxuser = userMapper.findNameByopenId(openid);if (wxuser != null) {//已绑定model.addAttribute("info",userInfo);model.addAttribute("name", wxuser.getUsername());return "wx/wxtest2";} else {//未绑定model.addAttribute("openid", openid);return "wx/wxtest3";}} catch (Exception e) {e.printStackTrace();}return "wx/fail";   //跳转到登录失败页面}
}

3.测试

以版本1的controller为例,可浏览器请求:
(1)http://mt4ynq.natappfree.cc/front/auth/wxLogin获取code,并根据代码里面的重定向转发请求给callback接口;
(2)callback这里面根据code请求了微信接口获取openId和access_token;
(3)再根据获取的openid和access_token获取用户信息。

微信公众号第三方登录,简单易懂相关推荐

  1. 微信公众号第三方登录window.open打开新窗口和url携带http网址参数base64转码传参

    原文链接:https://dsx2016.com/?p=1109 公众号:大师兄2016 需求场景 微信第三台平台只能绑定一个域名. 当从另一个域名下的系统进行绑定操作时,只能以打开指定域名的方式进行 ...

  2. 微信公众号第三方平台开发PYTHON教程 PART 1

    微信是一个时代的标志,虽然它现在不温不火,但我们大部分人离不开它.最近我帮朋友的公司接入了微信公众号第三方,使其成为第三方开发者. 网上公众号的开发教程,描述很多,但第三方的就几乎没有,可能是商业部分 ...

  3. 微赞config.修改php,微信公众号第三方平台 微赞WZ_V100.0版20170612整合包 整合人人商城V2新版+一键升级...

    php+mysql php版本5.3或者以上,OPENSSL必需开启,这是本程序与微信公众号通讯的需求. 我们建议您用云主机!Windows或者Linux皆可,windows主机不推荐用IIS环境,可 ...

  4. H5 微信公众号 授权登录 前后端分离篇(资料准备+前端01)

    实现微信公众号授权登录,很简单,但是注意的地方要细心,小伙伴们跟着我的思路一起实现吧! 文章目录 一.帐号申请 1. 正式账号 2. 测试帐号 二.微信文档 2.1. 文档主页 2.2. 授权流程 2 ...

  5. php模拟微信公众号服务器,GitHub - Lin07ux/wechat-third-server: 使用 ThinkPHP、Vue 搭建一个带有后台的微信公众号第三方服务器的基础模板...

    微信公众号第三方服务器 该项目用于实现一个最基本的微信公众号第三方服务器开发的模板. 基于: ThinkPHP v3.2.3 Vue v2.2.0 Vue-resource v1.0.3 功能 微信用 ...

  6. 微信公众号第三方平台开发PYTHON教程 PART 2

    github地址:cppfun@wechat-open-third-party-dev 微信公众号第三方平台开发python教程 Part 1 这一节肯定是在第一节的基础上,如果你没有看过第一节,可能 ...

  7. 使用.net 操作 微信公众平台 —— 第三方登录

    目录 1. 使用.net 操作 微信公众平台 -- 接入 2. 使用.net 操作 微信公众平台 -- 生成微信菜单 3. 使用.net 操作 微信公众平台 -- 接收并回复用户消息 4. 使用.ne ...

  8. uni-app 对FastAdmin微信公众号授权登录实例

    uni-app 对FastAdmin微信公众号授权登录实例 uniapp 微信公众号授权登录代码 跳转获取code 提交fastadmin 第三方登录插件 进行登录验证 存储token onLoad( ...

  9. 公众平台模板消息所在行业_如何使用微信公众号第三方平台群发模板消息助手?...

    对于微信公众号群发模板消息助手的实现,公众号后台提供了接口编程实现,微号帮平台提供了模板消息群发功能实现,均可以让微信公众号群发模板消息,模板消息即按固定格式的文本模块消息,没有图文形式,纯固定格式的 ...

  10. 微信公众号服务器页面模板,GitHub - devsnippet/wechat-third-server: 使用 ThinkPHP、Vue 搭建一个带有后台的微信公众号第三方服务器的基础模板...

    微信公众号第三方服务器 该项目用于实现一个最基本的微信公众号第三方服务器开发的模板. 基于: ThinkPHP v3.2.3 Vue v2.2.0 Vue-resource v1.0.3 功能 微信用 ...

最新文章

  1. Serendipity解决IE缓存为0
  2. 机器学习 处理不平衡数据_在机器学习中处理不平衡数据
  3. 千兆网综合布线系统的线缆选型
  4. Chess DP 思维题
  5. DockerCon 2017报告:企业在关注吗?
  6. Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)
  7. php基于纯真IP数据库实现IP地址信息查询
  8. trunk与access的区别
  9. 信息化系统软件实施工程师基础技能
  10. 网页中嵌入flash文件的几种方法
  11. 七日之都账号服务器,永远的7日之都开服时间一览表 7日之都最新服务器开服时间一览...
  12. Python量化交易平台开发教程系列5-底层接口对接
  13. 北大教授的美国博士生涯:学术是自由灵魂的分泌物
  14. linux系统命令梳理
  15. 【附源码】计算机毕业设计JAVA罪犯信息管理系统
  16. 深度剖析:如何实现一个 Virtual DOM 算法
  17. Edge浏览器查看md文件
  18. 【无标题】Linux服务器上监控网络带宽的18个常用命令
  19. python螺旋圆的绘制_亦明图记:SolidWorks绘制异形弹簧圈,操作简单只需三步就可完成...
  20. [计算机基础与编程综合实验]计费管理系统

热门文章

  1. JAVA中级(五)response(1)基本介绍,代表响应的类,如何设置响应头,行,体
  2. 高并发场景以及应对技巧
  3. C语言入门实战(12):求自然常数e的值
  4. Aruba无线AP入坑心得
  5. 阅读笔记-HTTP返回状态码
  6. Android设置状态栏的字体颜色
  7. 【2020 ACM Fellow 华人学者】 Cathy H. Wu 特拉华大学
  8. miui10android9,MIUI 10稳定版刚到 基于安卓9的MIUI10 8.9.7开发版也来
  9. 微信小程序开发之小米商城
  10. 计算机自杀式软件--USBKill