Java实现获取公众号用户的OpenID
OpenID是用户在某一个公众号的唯一标识,用户不同公众号的的OpenID是不一样的。在开发的时候,我们有时需要获取用户的OpenID。本文将介绍以下内容:“用户页面授权HTML代码”、“调用服务器后端接口的js代码”、“用户静默授权后端接口”、“微信服务器回调我们的服务器接口”、“获取微信服务器返回的信息”。
1、用户页面授权HTML代码。
设计一个用户点击授权的前端页面:
<div id="loginMain"><div id="loginInfomation" class="layui-form"><h2>欢迎登录博销宝管理后台</h2><div class="layui-form-item"><label class="layui-form-label"><strong class="requiredField">*</strong>公司编号:</label><div class="layui-input-block"><input type="text" class="layui-input" name="${Staff.FIELD_NAME_companySN}" value="" lay-verify="required|checkCompanySN" placeholder="请输入公司编号" /></div></div><div class="layui-form-item"><label class="layui-form-label"><strong class="requiredField">*</strong>手机号码:</label><div class="layui-input-block"><input type="text" class="layui-input" name="${Staff.FIELD_NAME_phone}" value="" lay-verify="required|checkPhone" maxlength="11" placeholder="请输入手机号码" /></div></div><div class="layui-form-item"><label class="layui-form-label"><strong class="requiredField">*</strong>密码:</label><div class="layui-input-block"><input type="password" class="layui-input" name="${Staff.FIELD_NAME_salt}" value="" lay-verify="required|checkPassword" placeholder="请输入密码" /> </div></div><input type="hidden" value="${identify}" name="identify"><input type="hidden" value="${ID}" name="ID"><button class="layui-btn layui-btn-lg layui-btn-normal" lay-submit lay-filter="wxLogin">登录</button></div></div>
2、调用服务器后端接口的js代码。
//登录系统form.on("submit(wxLogin)", function(data){var indexLoading = layer.load(1);var info = data.field;$.ajax({url: wxLogin_url,type: 'get',async: true,dataType: "json",data: info,success: function succFunction(data) {console.log(data);layer.close(indexLoading);if (data) {if (data.ERROR != "EC_NoError") {if (data.msg) {layer.msg("<span style='font-size: 0.2rem;'>" + data.msg + "</span>");} else {layer.msg("<span style='font-size: 0.2rem;'>登录失败</span>");}} else {switch (info.identify) {case "purchasingOrder":window.location.href = "../wx/purchasingOrderApproval.bx?ID=" + info.ID;break;case "unSalableCommodity":window.location.href = "../wx/unsalableCommodity.bx";break;default:console.log("未定义的标识符");break;}}} else {layer.msg("<span style='font-size: 0.2rem;'>登录失败</span>");}},error: function(XMLHttpRequest, textStatus, errorThrown) {layer.close(indexLoading);layer.msg(XMLHttpRequest.status + ":" + XMLHttpRequest.statusText);}});})
3、用户静默授权后端接口。
用户授权后,我们才能请求微信服务器获取用户信息。根据访问code的地址GET_CODE_URL,公众号账号appid和我们设置的回调接口callback_url生成url并访问微信服务器:
/** 用户请求页面(snsapi_userinfo页面授权) */@RequestMapping(value = "/wxLogin") // ...public void toGetAuthentication(HttpServletRequest request, HttpServletResponse response) throws Exception {if (!canCallCurrentAction(request.getSession(), BaseAction.EnumUserScope.ANYONE.getIndex())) {logger.debug("无权访问本Action");return;}logger.info("用户访问服务器!!!网页授权!!!");// 检查Cookie值是否存在// checkCookie(request, response);// ...可能在这个函数里面已经跳转,下面的代码不需要再跳转String backUrl = callback_url;String url = String.format(GET_CODE_URL, PUBLIC_ACCOUNT_APPID, URLEncoder.encode(backUrl, "UTF-8"), "snsapi_userinfo");// ...// 页面重定向response.sendRedirect(url);}
4、微信服务器回调我们的服务器接口。
callBack接口是我们在用户授权的时候指定的回调接口:
/** 静默授权后,微信会回调本ACTION,获取用户OpenId 参考微信官方文档:XXXXXXX */@RequestMapping(value = "/callBack")public String getOpenId(HttpServletRequest request, HttpServletResponse response, ModelMap mm) throws ClientProtocolException, IOException, ServletException {if (!canCallCurrentAction(request.getSession(), BaseAction.EnumUserScope.ANYONE.getIndex())) {logger.debug("无权访问本Action");return null;}……
获取微信返回的code,用code获取openid:
logger.info("callBack===接受到微信服务器发来的请求!!!");String code = request.getParameter(BaseWxModel.WX_CODE);// 微信会返回code值,用code获取openid
根据获取用户openID的地址GET_OPENID_URL,公众号账号PUBLIC_ACCOUNT_APPID,公众号密码PUBLIC_ACCOUNT_SECRET和code拼接请求URL:
// 1.拼接URLString url = String.format(GET_OPENID_URL, PUBLIC_ACCOUNT_APPID, PUBLIC_ACCOUNT_SECRET, code); // ...
向微信端发送请求,并返回JSON数据:
JSONObject jsonObject = WxUtils.getDataFromWxServer(url);/** 通用函数。 向微信服务器发送Get请求,返回JSON数据。 */public static JSONObject getDataFromWxServer(String url) {HttpClient httpClient = HttpClientBuilder.create().build();try {HttpGet httpGet = new HttpGet(url);HttpResponse response = httpClient.execute(httpGet);// 接收client执行的结果HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");return JSONObject.fromObject(result);} else {logger.error("向微信服务器发送Get请求发生错误!");return null;}} catch (Exception e) {logger.error("向微信服务器发送Get请求发生错误:" + e.getMessage());return null;}}
5、获取微信服务器返回的信息。
判断返回的错误码信息:
if (jsonObject.get(BaseWxModel.WX_ERRMSG) != null) {request.setAttribute("msg", "授权失败!!!请重新登录!");response.sendRedirect("/WEB-INF/wx/wx_loginFinished.jsp");}
获取微信端返回的openID数据:
String openid = jsonObject.getString(WxUser.field.getFIELD_NAME_openid()); // 用户唯一标识String token = jsonObject.getString(WxAccessToken.field.getFIELD_NAME_accessToken()); // 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同String expires_in = request.getParameter(WxAccessToken.field.getFIELD_NAME_accessToken()); // access_token接口调用凭证超时时间,单位(秒)String refresh_token = request.getParameter(BaseWxModel.WX_REFRESH_TOKEN); // 用户刷新access_token
Java实现获取公众号用户的OpenID相关推荐
- vue axios封装 获取微信公众号用户的openid
目录 axios封装 openid vue vue+ts axios封装 一般会在项目的src目录中,新建一个文件夹,作为网络请求模块,用来封装axios, 创建axios实例: axios.crea ...
- 微信小程序获取公众号code以及openId
微信小程序判断用户是否关注公众号-简要流程 版权 原文链接:树先生https://blog.csdn.net/weixin_39601000/article/details/105288342 没有需 ...
- 小程序开发与公众号用户关联推送消息
最近做了一个类似于日程提醒的小程序,需要把用户语音识别出的日程或提醒按照设置的提醒日期通过微信公众号推送给对应的用户进行提醒这样子.这是需求背景. 这个项目我已经做完了,但是中间遇到很多坑,所以想出篇 ...
- java获取openid_JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息...
https://www.cnblogs.com/lxwt/p/10154540.html?tdsourcetag=s_pcqq_aiomsg 一,首先说明下这个微信的openid 为了识别用户,每个用 ...
- 用java代码实现获取微信公众号用户关注列表
获取微信公众号用户关注列表 通用工具类:CommonUtil package com.weixin.util;import java.io.BufferedReader; import java.io ...
- 微信小程序中获取用户微信公众号授权(openid)用来发送模板消息
需求: 由于小程序不能直接向用户发送模板消息,所以需要用公众号向用户发送模板消息. 于是需要将小程序的openid和公众号的openid绑定在一起.提供两种思路: 方法一: 1.微信小程序和公众号都绑 ...
- H5获取微信公众号用户openId,用户信息
一共两步:1:用户同意授权,获取code,2:将code值传给后台获取用户openId或用户信息 一.怎样获取code值 1.登录微信公众平台后台获取公众号的AppId,设置回调地址. 回调地址设置: ...
- Android实现绑定微信公众号,获取相对公众号的唯一openId
Android绑定微信公众号.获取相对公众号的唯一openId 注意:为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台 ...
- Java实现微信公众号直接发送参数二维码给用户
文章目录 前言 一.参数二维码的作用 二.功能实现 1. 生成带参数二维码 2. 上传二维码图片 3. 发送带参数二维码给用户 总结 前言 公众号开发近些年是一个比较热门的方向,今天为大家讲解的是用J ...
最新文章
- java Windows7 下环境变量设置
- 计算机科学与技术 单片机,单片机-兰州交通大学计算机科学与技术实验教学中心...
- Ionic系列——调用摄像头拍照和选择图库照片功能的实现
- 【JSON系列】JSON核心知识点总结
- werkzeug routing.Map
- 解决Windows下Redis出现“MISCONF Redis is configured to save RDB snapshots”的错误
- BN层和Dropout层
- 斗鱼 Juno 监控中心的设计与实现
- vue 富文本编辑器 —— wangEditor
- Blob转换二进制流下载文件
- 什么是网点?印刷网点与CMYK色彩,彩色渐变色印刷原理。
- 10大顶级运营商转型案例剖析
- python网络安全协议_如果你不遵守Python中TCP和UDP等网络编程协议!那么你会自食其果...
- matlab蒙特卡罗方法求体积_实验二-蒙特卡罗方法计算三维体积
- swagger knife4j 解决接口下载文件响应乱码问题
- 如何在react中禁止浏览器后退
- undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocat
- 十六进制字符串转十进制数字
- 极客日报第127期:华为最新人事调整:余承东任智能汽车解决方案 BU CEO;美团悄悄更换抽佣规则,佣金不降反升;Scala 3 正式发布
- 将毫秒转换为年月日时分秒