1.--------------------用户授权登录并获取code

授权登录方式有两个,一种为静默授权登录(scope=snsapi_base),一种为非静默授权登录(scope=snsapi_userinfo),区别为静默授权是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)特点:用户无感知,但是只能获取到用户的唯一标示openid和union id,无法拿到用户的微信头像、微信名称等个人信息;非静默授权这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

如果用户同意授权,页面将跳转至 redirect_uri并且携带"?code=CODE&state=STATE"

2.-----------------使用第一步获得的code换取access_token

参数说明
appid=APPID(公众号唯一标识)
secret=SECRET(公众号的appsecret)
code=CODE(第一步获取的code参数)
grant_type=authorization_code(无需更改)

返回结果(json格式数据)
{
"access_token": "e1nYJFpZuehfQH1buzHFZLb7onqs_wT1cudSdy9HRlnaMXFtFpRMNFOA0euK6UxPcItrSNbAQVcXDdthbLJYX0MdH1p7-tkZSKuGqBCxVc0",
"expires_in": 7200,
"refresh_token": "0iVsXn4O1rBCASbO7hx8VNVUVFM1RP2Q4xS0giegd4jlIsJYOjTJNZ0b4Dsh_xcoB02ZZ3bt0WH0a47LvjIEPjWUnESJCZyl6EtY_xYZdVs",
"openid": "o47Fa0mp9SRTf3eiKmqWm69BjG_8",
"scope": "snsapi_userinfo"
}

结果解释
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope 用户授权的作用域,使用逗号(,)分隔

3.-----------------使用access_token获取用户信息

-------详情参照微信官方文档,下面贴整合代码

@RequestMapping(value = "/AuthorizationGetUserInfo.json", produces = "application/json;charset=utf-8", method = RequestMethod.GET)
@ResponseBody
public void AuthorizationGetUserInfo(HttpSession session, HttpServletResponse resp, String code) throws IOException{
if(code == null){
log.info("code为空===");
}
String url = " https://api.weixin.qq.com/sns/oauth2/access_token";
String access_tokenUrl = "appid=appid" + "&secret=secret" + "&code=" + code + "&grant_type=authorization_code";//通过code换取网页授权access_token路径
String result = HttpRequest.sendGet(url, access_tokenUrl);
Map<String, String> map = WXPayUtil.MapConversion(result);
String access_token = map.get("access_token");
String openid = map.get("openid");
String surl = "https://api.weixin.qq.com/sns/userinfo";
String userinfoUrl = "access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN";
String sresult = HttpRequest.sendGet(surl, userinfoUrl);
Map<String, String> userinfoMap = WXPayUtil.MapConversion(sresult); //标准json格式的String转json
String str = userinfoMap.get("nickname");
try {
userinfoMap.put("nickname", EmojiUtil.resolveToByteFromEmoji(str));
log.info("用户头像表情转化成字符" + userinfoMap.get("nickname")); } catch (Exception e) {
log.info("用户信息拉取失败=========================");
log.info("用户信息拉取失败=========================" + e.getMessage());
}
String suOpenid = vipMapperService.ByOpenIdQueVip(openid);//查询用户表中的openid
log.info("session的ID" + session.getId());
if (suOpenid != null && suOpenid != "") {
User user = vipMapperService.selectVipInfo(userinfoMap); if (!user.getUuser().equals(userinfoMap.get("nickname"))) {
userinfoMap.put("nickname", user.getUuser());//修改为新的昵称
}
if (!user.getHeadimgurl().equals(userinfoMap.get("headimgurl"))) {
userinfoMap.put("headimgurl", user.getHeadimgurl());//修改为新的头像
}
Integer Upresult = vipMapperService.ByWXUpVip(userinfoMap);//修改会员
if (Upresult < 0) {
log.info("修改会员失败了!");
}
} else {
//该openid用户表中不存在,新增用户
Integer Addresult = vipMapperService.AddVip(userinfoMap);
if (Addresult < 0) {
log.info("新增会员失败了===!");
}
}
Integer Uid = vipMapperService.ByOpenIdQuUid(openid);
Cookie cookie = new Cookie("Uid", String.valueOf(Uid));
resp.addCookie(cookie);
resp.sendRedirect(NowData.PROTOCOL + NowData.DOMAIN + "/WeChatpn/index.html#/mall");
}
---------------------------------utils
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
//System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* String转Map<String, String>
* map
*
* @return
*/
public static Map<String, String> MapConversion(String str) {
Map<String, Object> map = JSON.parseObject(str);
Map<String, String> NewMap = new HashMap<String, String>();
for (String string : map.keySet()) {
NewMap.put(string, map.get(string).toString());
}
return NewMap;
}
/**
* 利用正则表达式判断str是否存在表情字符
* @param str
* @return
*/
public static String resolveToByteFromEmoji(String str) {
Pattern pattern = Pattern
.compile("[^(\u2E80-\u9FFF\\w\\s`~!@#\\$%\\^&\\*\\(\\)_+-?()——=\\[\\]{}\\|;。,、《》”:;“!……’:‘\"<,>\\.?/\\\\*)]");
Matcher matcher = pattern.matcher(str);
StringBuffer sb2 = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb2, encode(matcher.group(0)));
}
matcher.appendTail(sb2);
//将分隔符 替换成\ 得到的内容就是 \u1245
return sb2.toString().replace("&ns;","\\");
}

微信公众号授权回调用户信息,获取openid的更多相关文章

  1. 【tp5.1】微信公众号授权登录及获取信息录入数据库

    微信公众号开发文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 微信公众号授权登录分为两种: 1.以 ...

  2. uniapp - 微信公众号授权登录

    [缘由] 采用uniapp进行微信小程序和微信公众号双版本开发:考虑到用户唯一性,我们后端确定了以“unionid”.作为唯一标识. 有的小伙伴估计也是刚入这坑,我就简单说一下步骤流程   [摸索] ...

  3. 微信公众号开发(三)获取access_token

    微信公众号开发(三)获取access_token 1.说明 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.acce ...

  4. PHP之路——微信公众号授权获取用户信息

    官方文档链接:http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html /** * 获取code */ public f ...

  5. JAVA微信公众号网页开发 —— 用户授权获取openid

    官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 HttpClientUtil.java packa ...

  6. 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题

    开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...

  7. 玩玩微信公众号Java版之五:获取关注用户信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...

  8. 微信 公众号平台 与 开放平台 获取用户信息 scope snsapi_login

    微信公众号(公众平台) 和 微信开放平台 是两码事.公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知:后者是需要用户确 ...

  9. 微信公众号授权,支付,退款总结【shoucang】

    1.支付前准备 1.1首先两个平台接入账户. 商户平台:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F 公众平台: ...

随机推荐

  1. MySQL架构及优化原理

    1 MySQL架构原理 1.1 MySQL架构原理参看下述链接: https://blog.csdn.net/hguisu/article/details/7106342 1.2 MySQL优化详解参 ...

  2. Chrome添加 测试设备 手机iPhone x系列手机

    一.F12,点击下图中的Edit,添加设备 二.添加名为iPhone XR的设备,设备配置如下 三.其中User agent string如下 Mozilla/5.0 (iPhone; CPU iPh ...

  3. decimal和float的区别

    场景 今天在开发的时候,在mongodb中有个字段保存的数据结构是decimal,然后需要对这个字段的值进行范围的查询.结果却怎么查询值范围都是空. 解决 如图中看到的,利用Navicat,可以明显的 ...

  4. 记一次针对excel导出的优化

    最近发现我们系统导出excel文件时由于是导出百万级数据导出,速度过慢并且内存占用多,故进行了下面的一次优化. 我们使用apache的poi进行excel文件操作 主要耗时: 1.从数据库得到需要导出 ...

  5. Hotel 旅馆, 线段树查询,合并

    C. Hotel 旅馆 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 OIER最近的旅游计划,是到长春净月潭,享受那里的湖光山色, ...

  6. 自学linux——6.安全外壳协议(ssh服务)

    ssh服务 ssh(secure shell)安全外壳协议:远程连接协议,远程文件传输协议 1.协议使用端口号默认:22 若要修改,则修改ssh服务的配置文件/etc/ssh/ssh_config a ...

  7. 对象转换工具 MapStruct 介绍

    前言 在我们日常开发的分层结构的应用程序中,为了各层之间互相解耦,一般都会定义不同的对象用来在不同层之间传递数据,因此,就有了各种 XXXDTO.XXXVO.XXXBO 等基于数据库对象派生出来的对象 ...

  8. 时间-i春秋

    记一道跑脚本的题 进入页面拿到一段代码. <?php header("content-type:text/html;charset=utf-8"); '天下武功唯快不破'; ...

  9. C++ //构造函数调用规则 //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) //析构函数(空实现) //拷贝函数(值拷贝) //2.如果我们写了有参构造函数 编译器就不会提供默认构造函数 但是会提供拷贝构造函数 //3.如果我们写了拷贝函数 编译器就不再提供 默认 有参 构造函数

    //构造函数调用规则 #include <iostream> using namespace std; //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) ...

  10. Linux命令(六)之防火墙iptables的相关操作以及端口的开放

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...