微信公众号网页授权思路解析及具体代码

微信开发文档
实现方式也是两种:

1.静默授权登录
授权登录以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)特点:用户无感知;

2.非静默授权登录
非静默授权以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
(区别:除了scope不一样,以及调用微信接口不一样,功能上,静默授权不需要用户确认,只需要用户访问某个网页,属于嵌套在普通网页里的授权形式,但是只能获取到用户的唯一标示openid和union id,无法拿到用户的微信头像、微信名称等个人信息,对于用户的简单认证还是很有用的。)

非静默授权

微信公众号技术开发文档: [https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432]
首先编写一个工具类

package com.wlw.util;
import java.io.IOException;
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 net.sf.json.JSONObject;/*** * 工具类* 用来根据接口地址进行网络请求* @author wlw**/
public class AuthUtil {public static final String APP_ID = "****************";     //填写自己的APPIDpublic static final String APP_SECRET = "**************";   //填写自己的APPSECRETpublic static JSONObject doGetJson(String url) throws Exception, IOException {JSONObject jsonObject=null;//初始化httpClientDefaultHttpClient client=new DefaultHttpClient();//用Get方式进行提交HttpGet httpGet=new HttpGet(url);//发送请求HttpResponse response= client.execute(httpGet);//获取数据HttpEntity entity=response.getEntity();//格式转换if (entity!=null) {String result=EntityUtils.toString(entity,"UTF-8");jsonObject=JSONObject.fromObject(result);}//释放链接httpGet.releaseConnection();return jsonObject;}}

1.引导用户进入授权页面同意授权,获取code
主要是发送请求:https://open.weixin.qq.com/connect/oauth2/authorize?appid=“+wx_appid+”&redirect_uri=“+api.wx_reg+”&response_type=code&scope=snsapi_login,snsapi_userinfo&state=1,0#wechat_redirect
其中各个参数的意义:

2.如果用户同意授权,页面将跳转至 redirect_uri并且携带"?code=CODE&state=STATE"
通过code换取网页授权access_token(后台操作)以及通过access_token换取用户信息

package com.wlw.servlet;
import java.io.IOException;
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 com.wlw.util.AuthUtil;
import net.sf.json.JSONObject;/*** 回调地址* * @author wlw**/
@WebServlet("/redirect_uri")
public class CallBackServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*** 获取code*/String code=req.getParameter("code");String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+AuthUtil.APP_ID+ "&secret="+AuthUtil.APP_SECRET+ "&code="+code+ "&grant_type=authorization_code";JSONObject jsonObject;try {jsonObject = AuthUtil.doGetJson(url);String openid=jsonObject.getString("openid");String token=jsonObject.getString("access_token");/*** 拉取用户信息*/String infoUrl="https://api.weixin.qq.com/sns/userinfo?access_token="+token+ "&openid="+openid+ "&lang=zh_CN";JSONObject userInfo=AuthUtil.doGetJson(infoUrl);//这里的userInfo已经是用户的信息了System.out.println(userInfo);//使用微信用户信息直接登录,无需注册和绑定req.setAttribute("info", userInfo);req.getRequestDispatcher("/index1.jsp").forward(req, resp);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubsuper.doPost(req, resp);}
}

这里解释一下回调函数:回调地址是当我们用户同意授权后,程序会进行对回调地址的访问。所以回调地址必须在公网上能够进行访问的。(用我自己的理解就相当于是你给腾讯平台发送请求,获取用户的信息,当你参数携带正确的情况下,腾讯就会向你发送一个请求,而这个请求的路径就是上面的redirect_uri所指的路径,所以回调函数的调用只有可能在公网上进行调用)

以上就是微信非静默授权登录的代码部分,至于微信公众平台里的配置,看我下一个文章吧~

一下是另外两种登录的api,跟上面类似步骤,知识参数不一样而已,详细看开发文档,对应参数,详细你一定可以解决的…………
网站的微信授权登录是以二维码的形式 api网址 api https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

手机端微信授权登录api网址 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN

特殊情况:html页面,controller不方便控制页面跳转的情况,公众平台上菜单的地址就不能写接口的地址,但是如果对微信接口的回调参数理解透彻的话,就很好吧,公众平台的菜单地址同样可以直接写它自身的授权接口,同时,回调地址写进入的页面,这样,相当于是通过菜单直接调微信授权接口,然后微信再跳转到你的网页页面上,同时可以携带上需要的code,页面上从路径中截取到code发送给后台,后台再进行access_token和openid的值的请求,就能正常的走通……

参考文献

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问参考链接(请在微信客户端中打开此链接体验):scope为snsapi_basehttps://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirectscope为snsapi_userinfohttps://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。
//授权登录回调跳转,第一步先获取code参数,从而请求access_token
var getRequest = GetRequest();
var code = null;
if (getRequest.code) {code = getRequest.code;var data = {};var url = getWeiContextPath() + "接口路径";data.code = code;//课程//同步ajax,供方法中调接口$.ajax({type: "POST",cache: false,data: data,async: false,url: url,success: function (result) {//信息完整,直接进入测试页面window.location.href = "index.html"},error: function (result) {alert(result.msg)}});
} else {//没有code,再次请求获取codevar pageUrl = window.location.href.replace(/[/]/g, "%2f").replace(/[:]/g, "%3a").replace(/[#]/g, "%23").replace(/[&]/g, "%26").replace(/[=]/g, "%3d");var url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +"wx7813bb6299b9b52a" +"&redirect_uri=" +pageUrl +"&response_type=code&scope=snsapi_base&state=STATE&connect_redirect=1#wechat_redirect";window.location.href = url;
}//获取页面请求路径中的参数
function GetRequest() {var url = location.search; //获取url中"?"符后的字串var theRequest = new Object();if (url.indexOf("?") != -1) {var str = url.substr(1);strs = str.split("&");for (var i = 0; i < strs.length; i++) {theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);}}return theRequest;
}

微信公众号网页授权思路解析及具体代码相关推荐

  1. 微信公众号网页授权--前端获取code及用户信息(vue)

    前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路. 一.测试号相关配置 首先在你公司申请的测试号上配置好相关信息 ...

  2. 微信公众号网页授权--前端获取code及用户信息(vue)【简单详细版】

    嗨喽大家好,前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的遇到的一些问题的见解,希望对你们有帮助. 一.测试号相关配置 首 ...

  3. 微信公众号网页授权,获取用户信息以及openid -- PHP后台

    微信公众号网页授权,获取用户信息以及openid 这几天做项目,想通过公众号的appid获取用户的openid就,然后在网上查资料,问朋友,最后找到了方法,就是这个网页授权. 起初一直很蒙,这个怎么弄 ...

  4. 微信公众号网页授权时序图

    微信公众号网页授权时序图 公众号网页授权时序图

  5. 微信公众号网页授权登录的超简单实现步骤

    微信开放平台为第三方移动程序提供分享.传播的接口, 使用户可将第三方程序的内容发布给好友或分享至朋友圈, 下面这篇文章主要给大家介绍了关于微信公众号网页授权登录的超简单实现方法, 需要的朋友可以参考下 ...

  6. 微信公众号网页授权40163问题【php】

    微信公众号网页授权40163问题 tp5为例,emmmm-一直报40163或40029问题,翻遍了各大网站都没找到合适我的办法. 如图: 解决之后如图: 因为重定向所以请求了两次code,所以一直报4 ...

  7. 微信公众号网页授权代码优化过程(一)

    2019独角兽企业重金招聘Python工程师标准>>> 第一次更新 写本系列博客的主要原因是,我在处理一个微信公众号项目时要做一个网页授权的操作(官方地址是https://mp.we ...

  8. php微信授权没有code返回,解决关于微信公众号网页授权获取code参数的问题

    解决关于微信公众号网页授权获取code参数的问题 发布时间:2018-07-24 23:21, 浏览次数:3327 , 标签: code * 在微信网页授权过程中,需要获取code参数,因为我用的是公 ...

  9. 公众号分享页面php,微信公众号网页分享功能开发的示例代码

    现在每天都可以看到很多微信分享的链接上面有网站或者商家的自定义的分享标题,和分享链接的描述及分享出去的图像,例如下面的分享出去的链接: 上面这个是微信的js-SDK页面分享给微信好友在聊天列表中显示的 ...

最新文章

  1. python操作webservices
  2. SpringBoot和SpringSecurity整合,未登录请求自定义controller访问前端页面,出现 302状态码,一直在登录页面重定向
  3. linux实验五 信号应用,实验五 进程间通信(中)
  4. Hadoop 运行jar包时 java.lang.ClassNotFoundException: Class com.zhen.mr.RunJob$HotMapper not found...
  5. iOS PUSH实现的简单步骤
  6. appium()-The event firing
  7. js判断一个字符串 是否存在在另一个字符串
  8. 计算机网络实验报告嗅探器,计算机网络实验(Wireshark)
  9. 很想去的地方面试没过_我们研究了学生在技术面试中的表现。 他们上学的地方没关系。...
  10. log4j在web中的使用
  11. java 嵌套类implement_有关 C++ 嵌套类
  12. hdu-5673 Robot(默次金数)
  13. 使用Intellij Idea生成可执行文件jar,转为exe文件步骤
  14. php 后端服务错误定义,【后端开发】php常见的错误类型有哪四种
  15. 破解Access(*.mdb)目前所有版本的密码
  16. Android内存管理的原理--进程管理
  17. linux bigendian未定义,big endian与little endian
  18. html写的3d烟花带字幕,Three.js 3D烟花绽放动画
  19. 阿里巴巴开发规约之编程规约(1)
  20. 如何使用python批量压缩图片_python 实现图片批量压缩的示例

热门文章

  1. 一篇“从入门到上手”的Solidworks机械设计教程
  2. Unity+NGUI性能优化方法总结
  3. 计算机毕业设计SSM鞍山丘比特房屋租赁管理系统【附源码数据库】
  4. Mac电脑必装的10款精品软件(上)
  5. (原创)直观了解通道混和器的校色作用
  6. 广达服务器进系统重启,广达 服务器 远程开机
  7. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜实例代码
  8. flask 视频流直播
  9. Numpy 数组切片
  10. 周志华老师开课啦!机器学习视频课上线了(附地址)