我对接公众号,主要使用的地方在H5。实现效果就是不需要关注公众号就会弹出来一个授权页,然后进行其他的一些操作。
效果图:

其实代码很简单,主要是这个流程。我先讲流程,再结合代码,请仔细看完,绝对可以完成。

  1. 请求微信授权接口(分为静默模式和非静默模式)
  2. 在第一步的基础上会有一个回调地址redirect_uri,这里就是写我们自己的登录逻辑和获取用户信息

其实就完了。。。。

一、请求微信授权接口

https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri=https://c380h47694.vicp.fun//wechat/login&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

主要几个参数:

  • appid 微信公众号)appid
  • redirect_uri 回调地址)就是你的接口
  • response_type 固定写死的
  • scope 类型这个参数就很重要了
    • snsapi_userinfo:非静默模式,就是像上图一样会弹出授权页
    • snsapi_base:静默模式

文档地址

二、编写回调接口


主要就是获取网页授权token和用户信息接口,需要注意有几个获取用户信息的url,不要用错了 网页授权是用这个获取

/** 获取网页授权access_token的URL,和基础服务access_token不同 **/private final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
/** 用户信息URL**/private final static String USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";/*** 网页授权AccessToken* @param code 微信传递的code* @return json*/private static JSONObject geOauth2AccessToken(String code) {String requestUrl = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", SECRET).replace("CODE",code);// 发起GET请求获取凭证String result = HttpUtil.get(requestUrl);log.info(result);JSONObject jsonObject = JSONUtil.parseObj(result);if (Objects.nonNull(jsonObject.getInt(ERR_CODE))) {throw new CustomException("网页授权AccessToken失败:"+jsonObject);}return jsonObject;}
/*** 获取用户信息*   // 用户的标识*   System.out.println(jsonObject.getStr("openid"));*   // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息*   System.out.println(jsonObject.getInt("subscribe"));*   // 用户关注时间*   System.out.println(jsonObject.getStr("subscribe_time"));*   // 昵称*   System.out.println(jsonObject.getStr("nickname"));*   // 用户的性别(1是男性,2是女性,0是未知)*   System.out.println(jsonObject.getInt("sex"));*   // 用户所在国家*   System.out.println(jsonObject.getStr("country"));*   // 用户所在省份*   System.out.println(jsonObject.getStr("province"));*   // 用户所在城市*   System.out.println(jsonObject.getStr("city"));*   // 用户的语言,简体中文为zh_CN*   System.out.println(jsonObject.getStr("language"));*   // 用户头像*   System.out.println(jsonObject.getStr("headimgurl"));* @param accessToken 接口访问凭证 全局访问token* @param openId 用户标识* @return WeixinUserInfo*/public static JSONObject getUserInfo(String accessToken, String openId) {// 拼接请求地址String requestUrl = USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);// 获取用户信息String result = HttpUtil.get(requestUrl);log.info("获取用户信息结果:"+result);JSONObject jsonObject = JSONUtil.parseObj(result);return jsonObject;}

三、公众号配置


完事!!!

编写获取微信签名

用的是hutool工具类生成的随机数
应该复制过去能直接用,不过有些不重要的代码没有贴,随便改改写死就行

@ApiOperation(value = "获取微信签名")@GetMapping("/getWXSign")public Result<String> getWXSign(@ApiParam("当前地址") String url) {long timeStampSec = System.currentTimeMillis() /1000;String timestamp = String.format("%010d", timeStampSec);String nonceStr = RandomUtil.randomString(8);String[] urls = url.split("#");String newUrl = urls[0];JSONObject respJson =new JSONObject();String wxJsapiTicket = WechatUtil.getWXJsapiTicket();System.out.println("ticket:"+wxJsapiTicket);String[] paramArr =new String[]{"url=" + newUrl,"jsapi_ticket=" + wxJsapiTicket,"noncestr=" + nonceStr,"timestamp=" + timestamp};Arrays.sort(paramArr);// 将排序后的结果拼接成一个字符串String content = paramArr[0].concat("&").concat(paramArr[1]).concat("&").concat(paramArr[2]).concat("&").concat(paramArr[3]);String signature = null;try {MessageDigest md = MessageDigest.getInstance("SHA-1");// 对接后的字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());signature = WechatUtil.byteToStr(digest).toLowerCase();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}respJson.put("appId", WechatUtil.APPID);respJson.put("timestamp", timestamp);respJson.put("nonceStr", nonceStr);respJson.put("signature", signature);return Result.newSuccess(respJson.toJSONString());}/*** 获取基础服务接口访问凭证* @return token 基础token*/public static String getAccessToken() {String accessToken;RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);Object accessTokenCache = redisUtil.get(CommonConstant.ACCESS_TOKEN);if (Objects.nonNull(accessTokenCache)) {accessToken = accessTokenCache.toString();return accessToken;}String requestUrl = TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", SECRET);// 发起GET请求获取凭证String result = HttpUtil.get(requestUrl);log.info("全局获取token接口返回参数:"+result);JSONObject jsonObject = JSONUtil.parseObj(result);if (Objects.nonNull(jsonObject.getInt(ERR_CODE))) {throw new CustomException("获取用户信息失败,请重试");}accessToken = jsonObject.getStr("access_token");redisUtil.set(CommonConstant.ACCESS_TOKEN,accessToken);return accessToken;}/***  入参为token,返回ticket* @return*/public static String getWXJsapiTicket() {String accessToken = getAccessToken();String tokenUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=jsapi";String result = HttpUtil.get(tokenUrl);com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result);return jsonObject.getString("ticket");}/*** 编码sign* @param byteArray sign* @return 字符串*/public static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}private static String byteToHexStr(byte mByte) {char[] digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = digit[(mByte >>> 4) & 0X0F];tempArr[1] = digit[mByte & 0X0F];String s = new String(tempArr);return s;}

遇到的坑

  1. 切换测试公众号和真实公众号的时遇到的缓存或者没切换

java对接微信公众号相关推荐

  1. JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能

    最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...

  2. Java对接微信公众号模板消息推送(架包WxJava)

    内容有点多,请耐心! 最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offi ...

  3. Java对接微信公众号模板消息推送

    最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offiaccount/Get ...

  4. java对接微信公众号发布文章

    前言 在工作中遇到一个需求,需要向微信公众号发布文章,通过查询资料以及查阅微信的开发文档,最终实现. 微信开发文档:https://developers.weixin.qq.com/doc/offia ...

  5. 手把手教你使用java对接微信公众号-获取地理位置信息

    公众号需要定位当前用户的地址位置,需要通过签名后返回的数据,前端将参数回调到微信服务器获取地理位置信息,官方文档说明(https://developers.weixin.qq.com/doc/offi ...

  6. java 对接微信公众号(一)获取token

    1.登录微信公众平台,在基本配置里获取AppId和AppSecret 2.获取token(token获取到存本地,后续API都要带token访问) 需要在基本配置里配置ip白名单才能获取到token ...

  7. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  8. Java对接微信公众平台详解

    Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...

  9. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  10. 微信公众号页面支付接口java,[Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付...

    [Java教程]微信公众号支付(三):页面调用微信支付JS并完成支付 0 2015-09-15 15:00:30 一.调用微信的JS文件 1.首先要绑定[JS接口安全域名],"公众号设置&q ...

最新文章

  1. javascript禁止修改对象
  2. 《C++游戏编程入门(第4版)》——2.4 使用带else子句的if语句序列
  3. 页面无刷新ajax上传文件--模拟iframe,超简单
  4. Linux安装Elasticsearch+Kibana(7.10.2)
  5. awk -f 分隔符 命令_千面 awk
  6. SAP ui5 ABAP repository handler class的 get_webcontent方法
  7. [Golang]计算一个文件的MD5值
  8. 从零开始学习springBoot2
  9. 银河麒麟配置java环境_中标麒麟系统上安装Java、Eclipse指南.doc
  10. 串口中断和定时器中断_51单片机中断机制(定时器/计数器)
  11. oracle 数据库 去重查询
  12. C#收集中控ZKTeco考勤数据
  13. 使用Animate制作汽车广告动画
  14. 计算机辅助 高等数学教学,高等数学教学方法
  15. 单片机实验四 矩阵键盘实验
  16. C语言获取数组和字符串长度
  17. C1083:无法打开源文件
  18. php 短信验证码过期时间,php下发短信验证码60秒简单验证
  19. 3.样条曲线之B样条曲线
  20. Java获取WiFi ssid_如何在Flutter中获取当前连接的wifi的wifi名称(SSID)

热门文章

  1. delphi7 安装/卸载控件通用方法
  2. 收藏 | 90+深度学习开源数据集整理:包括目标检测、工业缺陷、图像分割等多个方向(附下载)...
  3. dp在约会上是什么意思_dp是什么意思网络术语 饭圈为什么喜欢用缩写
  4. java jxta_JXTA——JAVA P2P网络编程技术(入门篇) | 学步园
  5. scrollTop、clientHeight、 scrollHeight...学完真的理解了
  6. 计算机任何启动论文,启动管理器论文10篇_发表之家
  7. 数据库原理及应用总结
  8. 教你图片批量重命名编号,不要括号
  9. HTML仿小米官网登陆
  10. java代码c3p0连接池配置,c3p0连接池acquireincrement属性配置详解