手把手接入【微信测试公众号】,不会还有人不会调试公众号吧?

2023-11-18

Java接入测试微信公众号调试流程

前提

  1. 微信号
  2. 一个开发工具,我用的idea
  3. 最好准备一个穿透工具,我用的花生壳
  4. 去微信官方下载好所需的jar包引入到你的项目,微信脚手架

创建并配置测试号

登陆注册微信测试公众号【沙箱】

页面参数从上到下依次解析:

  1. 测试号信息 ,请记住并保存下它们。它可以给你换取到调用凭证accesstoken
    测试号信息
  2. 接口配置信息,这里主要是对你的项目进行可行性验证,你需要在你的项目中写上一个可以访问的接口,这边的Token你可以自己定义,点击【提交】按钮的时候,微信服务器会发送请求到你的URL,你需要根据Token去验证签名并返回给微信服务器正确的内容

接口配置前

至于微信的验签怎么做?请参考目录

返回微信验签成功后:
接口配置成功3. 测试号二维码
测试号二维码模块
左边的二维码,就是提供给你沙箱测试的二维码,右边就是扫描了你的二维码关注的用户名称和当前公众号的openId。正式环境的后台也是可以看到每个用户的openId的。
把用户移除再关注,openId不会改变。

  1. 消息模版接口
    ![消息模版接口](https://img-blog.csdnimg.cn/b4d61aca960e4794b992548c7664e52b.png
    新增一个消息模版,模版具体内容以你的业务所需要而定。测试号发送消息稍微会随意一点,正式的公众号后台可以选定行业模版。最终做推送需要记录的模版Id。

  2. 体验接口权限表
    体验接口权限表
    下面展示的都是测试号允许调用的接口权限,点击进去是文档具体描述,应该不需要我再解释了吧。

微信验签

/**
 * Created with IntelliJ IDEA.
 *
 * @Author Nipppppp
 * @Date: 2023/03/02/15:10
 * @Description: 验签小工具
 * 
 */
public class WxTokenCheckUtil{
	 // 与接口配置信息中的Token要一致
    private static String token = "";
    /**
     * 验证签名
     * @param signature 微信计算出的前面
     * @param timestamp 时间戳
     * @param nonce 唯一标识
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] arr = new String[] { token, timestamp, nonce };
        // 将token、timestamp、nonce三个参数进行字典序排序
        Arrays.sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;

        try {
            md = MessageDigest.getInstance("SHA-1");
            byte[] digest = md.digest(content.toString().getBytes());
            //这是你计算出来的签名
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        //对比一下你计算出来的签名和微信的是否一致
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }

    /**
     * 将字节数组转换为十六进制字符串
     * 
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }

    /**
     * 将字节转换为十六进制字符串
     * 
     * @param mByte
     * @return
     */
    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;
    }
}


/**
* 一个普通的提供验签开放接口
*/
  @RequestMapping("/niptest/valid")
    @ResponseBody
    public void wxValidTest(HttpServletRequest request, HttpServletResponse response) {

		//你可以打个日志看看
        log.debug("微信进来了。。。。");
        // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        String signature = request.getParameter("signature");
        // 时间戳
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        // 随机字符串
        String echostr = request.getParameter("echostr");

       
        PrintWriter out = null;
        try {
            out = response.getWriter();
             // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
            if (SignUtil.checkSignature(signature, timestamp, nonce)) {
                out.print(echostr);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }

    }

免登授权获取用户信息

如果你需要oauth2免登授权获取用户code换取openId话,请注意权限表里需要开启【网页授权获取用户基本信息】
在这里插入图片描述
这里已经踩过坑了,本身我的需求是需要公众号主页菜单点击的时候要拿到个人信息,在我没开启这个权限的时候,是拿不到用户免登code。

主页菜单免登跳转链接如下
(注意替换appId、redirectUrl,并且redirectUrl需要你对参数进行一下encode编码)

https://open.weixin.qq.com/connect/oauth2/authorize?appid={appId}&redirect_uri={redirectUrl}&response_type=code&scope=snsapi_base&connect_redirect=1#wechat_redirect

code换取用户openId链接如下
https://api.weixin.qq.com/sns/oauth2/access_token?appid={appId}&secret={appSecret}&code={code}&grant_type=authorization_code"

如何在H5中拿到用户code,我这边不说明了

流程:

  1. 获取用户code (注意code含有时效性,只能换一次
  2. http请求微信服务端,code换取用户openId
  3. 如果你的数据库中有对实体类和openId的绑定关系的话,现在就可以确认用户了

微信接口调试工具的使用

微信官方提供的调试工具

可以看到官方有提供部分权限功能的调试,最主要的就是先换取接口凭证access_token,再带着接口凭证去访问你需要调用的微信接口。和你在代码里所需要实现的逻辑应该是一致的。
appId、secret也就是你刚创建测试号时候我需要你去记录的必要参数
在这里插入图片描述
获取accesstoken

拿到调用凭证后,我们尝试着调用一下接口。

创建服务号菜单

拿到上一步获取的未过期的access_token ,按照微信提供的api文档,填写你需要的body,检查通过后会生成菜单。

在这里插入图片描述

新增成功
扫描测试二维码后主页会有你刚刚生成的菜单
body参数怎么构造、菜单玩法请参考微信api文档。
如果多次修改菜单,微信客户端会有缓存。重新关注公众号,获取最新的菜单。

常见错误

invalid signature

常见于微信验签错误,遇到该提示时请确认:

  1. appId、secret 公众号于你本地签名所用的是否一致

  2. 域名是否一致

    这里踩坑两次:
    	① 问号拼接带参url ,像这种https://....的内容 需要enconde编码一下,转成https%3A%2F%2F....。你实际以为你是https://,但是计算的时候可不一定是一样的字符串。
    	② 个人有遇到,明明是https的域名,计算签名的时候,断点进去是http(HttpServletRequest中的获取域名拿到的就是http。。。nginx加了证书后终于可以拿到https了)
    

如果都确认完毕还是报错,请打上断点。
微信js签名校验工具
看看小工具返回的签名和你的是否完全一致

错误1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手把手接入【微信测试公众号】,不会还有人不会调试公众号吧? 的相关文章

  • 如果我在 XML 布局中声明一个片段,如何将它传递为 Bundle?

    我有一个活动已替换为片段 该活动采用了一个 Intent 其中包含一些有关该活动应该显示哪些数据的额外信息 现在 我的 Activity 只是执行相同工作的 Fragment 的包装器 如果我使用标记在 XML 中声明该片段 如何将该捆绑包
  • 如何生成带logo的二维码?

    我正在为 Android 设备开发应用程序 我想生成带有徽标的二维码 With ZXing I know how to generate simple QR codes like this one But I want to generat
  • 查看登录设备

    我想查看Log在设备上 即System out println 我可以查看DDMS但如何在运行时在设备屏幕上查看APK文件 还有一个适用于 Android 的 Logcat 应用程序 code google com p android ra
  • 如何在 Jboss 7.1 中配置简单身份验证

    我正在从事由以下人员编写的项目纯jsps 脚本 不使用任何框架 jboss版本 jboss as 7 1 0 Final 我现在正在尝试在其上添加简单的身份验证 因此 当用户尝试浏览 jsp 时 比如说 http localhost myC
  • Spring Cloud Gateway + Spring安全资源服务器

    我真的不会把它放在这里 但我真的很困惑 我想实现以下目标 我在跑步 Java 14 Spring Cloud Gateway版本 Hoxton SR3 Spring Boot版本 2 2 5 RELEASE 现在我想将安全性集成到我的网关和
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 何时使用环境变量与系统属性?

    我想知道以下哪种方法是首选方法 我们可以将事情设置为APP HOME path to file export in profile或类似的东西 并将其访问为System getenv APP HOME 或者 也可以使用属性作为 DAPP H
  • Java - Servlet 的默认 contentType

    在servlet中 通常我们会指定一个contentType 然后我们就可以打印出html代码了 response setContentType text html PrintWriter out response getWriter 如果
  • 在 JSON 转换为 CSV 期间保持 JSON 键的顺序

    我正在使用此处提供的 JSON 库http www json org java index html http www json org java index html为了将 json 字符串转换为 CSV 但我遇到的问题是 转换后键的顺序
  • XmlAdapter 到 JAXB 绑定 Joda 的时间间隔?

    我已经被 Web 服务的 JAXB 绑定问题困扰了几个小时 为了准备一个必须返回 Joda Time 类实例 即时 持续时间 间隔等 的更大的 Web 服务 我从一个只有一个返回 Interval 的方法的 Web 服务开始 package
  • 带有 Spock Stub 的泛型

    我无法为泛型类编译 Spock 存根 构造函数的签名如下 SomeClass SerSup
  • Java中的字符算术

    在玩的过程中 我遇到了一些对我来说似乎很奇怪的事情 以下不是有效的 Java 代码 char x A x x 1 possible loss of precision 因为其中一个操作数是整数 所以另一个操作数被转换为整数 结果无法分配给字
  • cipher.update在java中做什么?

    我正在实施 DES CBC 我很困惑什么cipher init cipher update and cipher dofinal做 我只是使用 init 来设置密钥dofinal得到结果 我不使用更新 那是对的吗 另外使用时结果有什么不同U
  • 尝试将过滤器添加到 Grizzly+Jersey 应用程序时出现问题

    我有这个服务器初始化类 package magic app main import org glassfish grizzly http server HttpServer import org glassfish jersey grizz
  • 什么是样板代码、热点代码和热点?

    我知道这些术语是在性能实现 优化的背景下使用的 最近一直在研究这个问题 并尝试过搜索 但没有得到任何例子 清楚地阐述 描述这些概念以及在现实世界开发场景中实现这些问题 概念 有人可以彻底解释这些术语 示例场景以及可能使用这些概念和术语的地方
  • Spring JPA (Hibernate) Entity Manager 何时将连接返回到连接池?

    在我的 java 进程中 我使用以下 spring 配置连接到 MySql Configuration EnableTransactionManagement PropertySources PropertySource classpath
  • java中类的命名约定 - 全部大写

    在 Java 中 当类全部大写时 如何命名它 例如 如果我想创建一个班级来选择某些人成为 VIP 我应该将类命名为 VIPSelector 还是 VipSelector Thanks 你的两个选择都有效 类的主要目标是让它们以大写字母开头
  • GAE、JPA、XG 事务、实体组过多异常

    我知道 GAE 上的 XG 交易有 5 个实体组的限制 但我认为我在一项交易中仅使用 3 个组 商品 类别 商品类别 但仍然遇到此异常 引起原因 java lang IllegalArgumentException 在单个事务中对太多实体组
  • OutputStream 到 DB2 数据库表的 BLOB 列

    在 DB2 数据库中 我有下表 CREATE TABLE MyTestTable MYPATH VARCHAR 512 NOT NULL MYDATA BLOB CONSTRAINT MYTESTTABLE PK PRIMARY KEY M
  • Android:如何获取小数点后的两位数?不想截断值

    如何获取小数点后仅两位数的双精度值 例如 如果 a 190253 80846153846 那么结果值应该像 a 190253 80 尝试 我尝试过这个 public static DecimalFormat twoDForm new Dec

随机推荐

  • latex算法步骤,子代码编号及修改算法框的宽度

    看了官方文档和网上一下资料 对于一个步骤下面有好多子步骤的算法 大多是通过for循环与while判断实现的 而且对于for下面的每一步骤没有重新编码 感觉很乱 不好看 论文的参考文有下图的结构 感觉很好 可以一用 主要用到下面这个代码块 其
  • 被C语言的malloc给坑了

    事情是这样的 最近想用C语言实现一些数据结构 今天在写二叉树时在linux下使用gcc编码是没有任何问题的 然而当我在本地window使用clion编写时 同样的代码竟然不能用了 反复看了下代码没有任何问题 然后我把代码拷贝到linux中用
  • redis集群配置

    分片集群搭建 springboot集成redis 相关配置 spring redis timeout 3000 database 0 cluster node 127 0 0 1 7000 127 0 0 1 7001 127 0 0 1
  • SpringBoot 文件上传解决跨域问题

    后端解决跨域问题 在Controller接口上加上 CrossOrigin注解就可以 该注解可以加在类上 也可以加在方法上 一般的请求处理数据都没有问题 但是如果上传文件就会报跨域的错误 解决这个文件上传跨域的问题 就需要增加一个过滤器配置
  • django解决跨域的方法,django如何解决跨域问题,django如何跨域

    django 使三方工具包解决跨域问题 1 安装 pip install django cors headers 2 到django的配置文件settings py中配置 1 注册到app中 INSTALLED APPS corsheade
  • Thread.UncaughtExceptionHandler

    1 自定义Application继承Application 在清单文件中将默认的Application的android name 替换成自定义的Application对象名称即可 在Oncreate中写入要实现的内容 2 在编写APK程序时
  • SpringBoot @EnableAutoConfiguration exclude属性失效

    在学习SpringBoot的时候 入了不少的坑 今天学习 SpringBootApplication里面的 EnableAutoConfiguration注解的exclude属性的 加载配置中 发现了属性失效的case 病状 exclude
  • NMEA协议解析

    文章目录 一 NMEA0183协议 1 NMEA基本框架 2 常用语句 1 GNGGA 2 GNGLL 3 GNGSA 4 GPGSV 5 GNRMC 6 GNVTG 7 GNZDA 8 PAIRCLK等 二 异或校验和代码 1 网址在线计
  • Pycharm启动失败的可能原因之一

    下载好Python后下载Pycharm应用 但是点击应用配置后有时启动失败 有时弹框提示错误 看进程均不占CPU 尝试网上各种解决方案 重新下载软件 重装系统都没能解决 最终发现是因为电脑上装的加密软件导致 卸载后重新安装即可 Pychar
  • 解决 java.lang.noclassdeffounderror: XXX 相关问题

    本文能临时解决所有与noclassdeffounderror相关的报错 首先说下这个错误 它表示你在运行的时候没有找到这个包 但是我们在编译的时候反而有这个包 这里需要理解下 我们java在编译和运行的时候都会编译jar包 但是你肯定是id
  • 记一次Spark打包错误:object java.lang.Object in compiler mirror

    使用maven compile和package 一直报错scala reflect internal MissingRequirementError object scala runtime in compiler mirror not f
  • 【Linux】实现简易的Shell命令行解释器

    大家好我是沐曦希 文章目录 一 前言 二 准备工作 1 输出提示符 2 输入和获取命令 3 shell运行原理 4 内建命令 5 替换 三 整体代码 一 前言 前面学到了进程创建 进程终止 进程等待 进程替换 那么通过这些来制作一个简易的S
  • 多任务:分层特征融合网络 NDDR-CNN

    论文链接 NDDR CNN 论文摘要 In this paper we propose a novel Convolutional Neural Network CNN structure for general purpose multi
  • sqli-labs/Less-34

    这一关虽然属于宽字节注入 但是回归了post请求了 而且欢迎界面还是存在转义之后的样子和十六进制的样子 首先我们试试在username处输入admin 转义之后变成了admin 所以我们进行宽字节注入将注入修改为admin c0 结果界面还
  • 微信小程序隐私保护指引设置

    今天修改了发布规则 发布前必须填写用户隐私保护指引设置 就是以下内容
  • 解决Unity导出的APK启动黑屏的问题

    今天准备把最近写的Unity游戏编一个版本 但是放真机上运行时 一启动就黑屏 网上各种查资料 折腾半天后 找到了解决方案 需要指定Graphics APIs 为OpenGLES3 在 Project Settings gt Player g
  • sort中用lambda函数(看完就会)

    介绍 sort函数是默认从小到大排列的 如果我们想要改变排序方式就要自己写个cmp函数 如果排列方式比较简单的话我们可以在sort函数中用一个简单的lambda函数 源码及讲解 对非结构体的数组 前面的 表示对数的操作方式 如果填个 说明是
  • shell指令,通过函数实现数组求和,通过函数获取用户uid和gid

    一 实现一个对数组求和的函数 数组通过实参传递给函数 num 0 read p 请输入一组数据 a arr function add for i 0 i lt arr i do num arr i done return num add a
  • CSS中如何实现文字描边效果(Text Stroke)?

    聚沙成塔 每天进步一点点 专栏简介 文字描边效果 Text Stroke 示例 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅 这个专栏是为那些对
  • 手把手接入【微信测试公众号】,不会还有人不会调试公众号吧?

    仅使用微信的测试公众号 Java开发内容 遇错与参考 Java接入测试微信公众号调试流程 前提 创建并配置测试号 登陆注册微信测试公众号 沙箱 微信验签 免登授权获取用户信息 微信接口调试工具的使用 创建服务号菜单 常见错误 invalid