背景
业务场景是:判断当前登录用户是否已经关注指定的官方微信公众号,没有就指引用户关注。

微信公众号官方文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

详细步骤

一.公众号后台配置

  1. 获取appid, appsecret,添加白名单
    登录微信公众平台,进入基本配置。开发中需要用到两个参数,appId和appSecret(appSecret只展示一次,需保存下来,否则需要重置获取)。获取access_token时需要添加IP白名单。
  2. 添加网页授权

二.后台实现思路

  1. 获取公众号的access_token
    https请求方式: GET
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数 说明
grant_type $ 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret

返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{“access_token”:“ACCESS_TOKEN”,“expires_in”:7200}

参数说明

参数 说明
access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{“errcode”:40013,“errmsg”:“invalid appid”}

返回错误码参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

  1. 获取用户的openid
    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(说明:OpenID就是加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。
    用户同意授权,获取code通过code来获取openid
    https请求方式: GET
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 说明
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret
code code
grant_type authorization_code
  1. 根据前两个步骤获得的信息(access_token和openId),调用微信接口获取用户基本信息
    https请求方式: GET
    https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

返回说明
正常情况下,微信会返回下述JSON数据包给公众号:

  {"subscribe": 1, "openid": "xxxxxx", "nickname": "Band", "sex": 1, "language": "zh_CN", "city": "深圳", "province": "广东", "country": "中国",   "headimgurl":"","subscribe_time": 1382694957,"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL""remark": "","groupid": 0,"tagid_list":[128,2],"subscribe_scene": "ADD_SCENE_QR_CODE","qr_scene": 98765,"qr_scene_str": ""}返回参数说明:参数            说明subscribe       用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。openid          用户的标识,对当前公众号唯一nickname        用户的昵称sex             用户的性别,值为1时是男性,值为2时是女性,值为0时是未知city            用户所在城市country         用户所在国家province        用户所在省份language        用户的语言,简体中文为zh_CNheadimgurl      用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。subscribe_time  用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间unionid         只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。remark          公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注groupid         用户所在的分组ID(兼容旧的用户分组接口)tagid_list      用户被打上的标签ID列表subscribe_scene 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他qr_scene        二维码扫码场景(开发者自定义)qr_scene_str    二维码扫码场景描述(开发者自定义)错误结果:{"errcode":40013,"errmsg":"invalid appid"}

详情查看官方文档-获取用户基本信息 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839

三.java后台实现

获取openid参考:

实体
@Data
public class WeiXinOauth2Token {private String accessToken;private int expiresIn;private String refeshToken;private String openId;private String scope;
}String userListUrl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
/*** 通过网页授权code获取微信openid* @param appId* @param appSecret* @param code* @return*/public static WeiXinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {WeiXinOauth2Token wat = new WeiXinOauth2Token();String requestUrl = oauth2WebUrl.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {wat = new WeiXinOauth2Token();wat.setAccessToken(jsonObject.getString("access_token"));wat.setExpiresIn(jsonObject.getInteger("expires_in"));wat.setRefeshToken(jsonObject.getString("refresh_token"));wat.setOpenId(jsonObject.getString("openid"));wat.setScope(jsonObject.getString("scope"));} catch (Exception e) {wat = null;String errorCode = jsonObject.getString("errcode");String errorMsg = jsonObject.getString("errmsg");log.error("获取网页授权凭证失败 errcode:"+errorCode+",errMsg:"+errorMsg);}}return wat;}工具类
/*** 发送https请求* @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);//conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); // 当outputStr不为null时向输出流写数据if (null != outputStr) {OutputStream outputStream = conn.getOutputStream();// 注意编码格式outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 从输入流读取返回内容InputStream inputStream = conn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;conn.disconnect();jsonObject = JSONObject.parseObject(buffer.toString());} catch (ConnectException ce) {log.error("连接超时:{}", ce);} catch (Exception e) {log.error("https请求异常:{}", e);}return jsonObject;}

判断用户是否已关注公众号相关推荐

  1. 微信小程序中判断用户是否已关注公众号的两种实现

    背景: 最近的一个小程序项目中有这么一个需求:进入我的主页后, 如果用户没有关注过我们的公众号, 则展示一个引导关注公众号组件, 点击后跳转到一篇公众号文章, 指引用户进行关注,用户完成关注隐藏该组件 ...

  2. 微擎 用户是否已关注公众号

    if(empty($_W['openid'])||$_W['fans']['follow']!=1){ message( '请先关注公众号!', '', 'error' ); } 当$_W['open ...

  3. php如何判断是否关注,微信公众号判断用户是否已关注php代码解析

    搜索热词 <:微信公众号判断用户是否已关注PHP代码解析>要点: 本文介绍了:微信公众号判断用户是否已关注PHP代码解析,希望对您有用.如果有疑问,可以联系我们. 用户关注公众号,才能参与 ...

  4. 微信公众号开发小坑:确认访问的微信是否为已关注公众号,秘钥使用全局access_token不能使用局部变量access_token

    环境说明: 1.项目功能:年会抽奖活动开发,子功能:获取客户的相对公众号的唯一oppenid,然后确认是否关注本公众号,关注则获取客户信息后发抽奖券保存,否则先关注微信公众号: 2.java环境:SS ...

  5. 生成微信公众号二维码(用户扫码关注公众号)

    1.token 文件 /*** https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=1 ...

  6. 您已关注公众号满1年,诚邀您免费加入金融学习交流群!

    作为一名福利小编,今天我又要营业了 你们懂~ 在后台最多的一类消息就是 "小编在吗?有那种资源吗?" "......" "那种实用又免费的CFA学习资 ...

  7. 小程序关注公众号组件<official-account ></official-account>的使用方法

    1.首先在微信小程序后台设置,管理设置,要管理同一主体的公众号. 2.接下来,微信小程序后台设置 关注公众号,绑定要关注的公众号.设置的公众号需与小程序主体一致. 3.最低版本:2.19.0起开发版小 ...

  8. 微信扫描自定义二维码关注公众号

    首先讲讲项目背景,为电动汽车充电设备开发一套通过微信公众号在线充电产品,产品实现如下功能,通过微信扫描充电设备上二维码,实现与充电设备的交互,控制充电设备启停.要求扫描二维码时,判断是否已经关注客户的 ...

  9. 对于微信二维码相关官方文档的一些注解(微信登录和绑定微信、关注公众号)

    转载自:https://www.jianshu.com/p/d533c69be034 由于微信官方文档对此的描述虽然还可以,但是还是有一些让人疑惑的地方,所以笔者做了一些注解,希望对大家有所帮助 为什 ...

最新文章

  1. MyBatis 一个简单配置搞定数据加密解密!
  2. QT的QGraphicsLineItem类的使用
  3. Web中Servlet
  4. oracle将字符串转化为blob,oracle String类型转换成blob类型插入
  5. .net core 文件流保存图片_如何将图片打包成PDF文件进行保存?
  6. Codeforces Round #387 (Div. 2) A+B+C+D!
  7. PMP助力!让你成功转型项目管理
  8. 安卓端gis_通图采集手机版(GIS数据采集软件)V1.31 安卓版
  9. python编程自学好学吗 ?
  10. 1编写偏移量为3的凯撒密码大小写混合加密程序(50分)
  11. FAT32与NTFS区别
  12. 让ros机器人行走、建图、路径规划、定位和导航
  13. Flink反压与背压
  14. 衡量软件交付性能的4个指标
  15. 前后端交互必备之js数组方法大全
  16. YOLOV5检测代码detect.py注释与解析
  17. 第二季 明文封包教程
  18. 【邢不行|量化小讲堂系列58-实战篇】零基础了解什么是期权,抓住下轮牛市红利
  19. 人工智能时代下的数据安全治理
  20. R语言使用ggplot绘制线型与点

热门文章

  1. 计算机英语 自我介绍,计算机专业学生面试英语自我介绍
  2. 混合现实在医学领域的应用学习日志
  3. for(int num:nums)
  4. Oracle EBS 常用表 查询语句
  5. 前端剑法第二式————淬焰
  6. Intel 助力移动云百万 IOPS 云硬盘,打造极速云存储体验
  7. excel 公式标多级目录序号
  8. 英语谚语精选(English Proverb Collection)
  9. 使用window.open打开新窗口被谷歌浏览器拦截
  10. 《大前端进阶 Node.js》系列 必知必会必问(面试高频)