最近一个项目是在微信公众号内二次开发,涉及到微信公众号支付,根据文档要求想要支付就必须要获取到用户的openid。

这是微信官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

官方流程 
网页授权流程分为四步: 
1、引导用户进入授权页面同意授权,获取code 
2、通过code换取网页授权access_token(与基础支持中的access_token不同) 
3、如果需要,开发者可以刷新网页授权access_token,避免过期 
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

我的思路 
1、首先是要在公众号后台进行配置,设置回调路径,具体要求参照官方文档。

要将这里的txt文件放在项目根路径下,否则上面的回调域名是无法保存的。

 
2、用户访问第三方页面时,先去请求一个api,获取code和state

code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

请求API参数拼接 
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxXXXXXXXXXXXXXXXXXXXXXX&redirect_uri=http://XXXXXXXXXXX/ydx-business/payWeiXin/getOpenId&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect

这里的scope分为两种:一种是静默方式(snsapi_base);一种是非静默方式(snsapi_userinfo),需要用户去手动点击同意才能获取用户的信息。

这是非静默方式授权

静默方式直接就获取到了openid

3、在1中配置的回调方法中根据获取到的code和state再去请求如下接口,获取access_token 和openid。

获取code后,请求以下链接获取access_token: 
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

代码段


@SuppressWarnings("null")
@RequestMapping("/getOAuth")
public String getOAuth(){
String code = request.getParameter("code");//获取微信服务器授权返回的code值
String state = request.getParameter("state");//验证是否来自微信重定向的请求
PrintWriter pw = null;
try {
pw = response.getWriter();
if(Constant.STATE.equals(state)){
/**
* 构造请求链接
* https://api.weixin.qq.com/sns/oauth2/access_token?
* appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
*/
String url = Constant.ACCESS_TOKEN_URL+Constant.APP_ID+"&secret="+Constant.APP_SECRET+"&code="+code+"&grant_type=authorization_code";
String jsonStr = HttpUtil.httpRequest(url);
String openid = JSONObject.parseObject(jsonStr).getString("openid");
System.out.println(openid+"==========================");
session = request.getSession();
session.setAttribute("openid", openid);
return "login/wx_login";//登录页面
}else{
response.setContentType("text/html;charset=utf-8");
pw.write("<script>alert('授权失败!');</script>");
pw.flush();
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
response.setContentType("text/html;charset=utf-8");
pw.write("<script>alert('发生后台异常!');</script>");
pw.flush();
pw.close();
}
return null;
}

总结:到此就已经获取到了用户的openid,因为只涉及支付业务所用就不再往下获取用户的个人信息。感觉微信这里的官方文档逻辑还都比较清楚,照着流程走下来一般都没什么问题,具体如何获取到openid的代码可以参考我前文里的那段,已经在实际项目中实践过。

微信公众号网页授权获取用户openid的更多相关文章

  1. 微信公众平台--网页授权获取用户基本信息(snsapi_base方式)

    关于snsapi_base网页授权的说明 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回调 ...

  2. 微信公众平台--网页授权获取用户基本信息(snsapi_userinfo方式)

    关于snsapi_userinfo网页授权的说明 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的.但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注, ...

  3. 微信公众号订阅号以及服务号通过网页授权获取用户openid方法

    微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 官方流程 网页授权流程分为四步: 1.引导用户 ...

  4. 微信公众号网页授权登录--JAVA

    网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的.现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你. 请看流程图!看懂图,就懂了一半了: 其实整体流程大体只需三步:用户点 ...

  5. 你所误解的微信公众号开发、以及微信公众号网页授权、接收url跳转参数等问题

    前言:有一星期没跟新博客了,最近太忙.项目赶进度就没把时间花在博客上:今天来说说所谓的微信公众号开发和填坑记录: 微信公众号:运行在微信终端的应用 (对于开发者来说比较爽的你只需考虑兼容微信浏览器,因 ...

  6. JAVA微信公众号网页开发——获取公众号关注的所有用户(微信公众号粉丝)

    package com.weixin.sendmessage; import org.apache.commons.lang.StringUtils; import org.apache.http.H ...

  7. 微信网页授权获取用户openid及用户信息

    $code = $_GET["code"];//获取code $appid=“xxxx”;//公众号appid $APPSECRET="xxx";//公众号ap ...

  8. 微信公众号开发系列-获取微信OpenID

    在微信开发时候在做消息接口交互的时候须要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID.接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获 ...

  9. 【微信公众号开发】【8】网页授权获取用户基本信息(OAuth 2.0)

    前言: 1,在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名. 请注意,这 ...

随机推荐

  1. 23.python中的类属性和实例属性

    在上篇的时候,我们知道了:属性就是属于一个对象的数据或者函数,我们可以通过句点(.)来访问属性,同时 python 还支持在运作中添加和修改属性. 而数据变量,类似于: name = 'scolia' ...

  2. Xtreme9.0 - Car Spark 动态规划

    Car Spark 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/car-spark Descr ...

  3. JNI之String类型

    JNI使用的是改良的UTF-8格式的Strings. 以下文档来自官方: Modified UTF-8 Strings The JNI uses modified UTF-8 strings to r ...

  4. Mac的brew和brew cask区别以及安装brew cask

    brew多用于命令行. brew cask主要用于有GUI的软件,例如VLC等等. brew cask是brew的一个子集,也就是一个扩展. 安装brew cask扩展: ruby -e " ...

  5. “一次编写,随处运行” Intel HTML5技术研讨会

    HTML5 是一种开放标准.通过使用此标准,开发人员只需编写一次程序,即可在任何地方运行. 这一跨平台方法能够显著增加开发人员的总体潜在受众,同时在不同屏幕尺寸上为用户带来更一致的体验.因此,HTML ...

  6. Go 语言中的 new() 和 make()的区别

    本文是看了文章之后的心得. 在此感谢. 概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似.不过解释两者之间的不同也非常容易. 他们所做的事情,和应用的类型也不相同 ...

  7. jquery智能弹出层,自己主动推断位置

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. ASP.NET Web API实践系列05,消息处理管道

    ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的 ...

  9. 测试RemObjects Pascal Script

    unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...

  10. Delphi下让窗口不显示在任务栏的另类方法

    刚才看到了这篇东西<使窗口不在任务栏上显示(利用ITaskbarList接口)>,作者用ITaskList接口实现了隐藏窗口在任务栏按钮的功能,想起我好多年以前做的程序也有这样的功能,但是 ...