SpringBoot对接微信公众平台(1)--- 配置微信公众平台测试号URL并校检

SpringBoot对接微信公众平台(1)--- 配置微信公众平台测试号URL并校检

  • 说明
  • 微信公众号接口测试号申请
  • 后端代码实现
  • 内网穿透接口测试

说明

这里记录下自己学习SpringBoot对接微信公众平台的成长过程,以防止后面继续踩坑且方便以后直接使用。这里使用微信公众号的接口测试号来开发微信公众平台。
微信公众号官网:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

微信公众号接口测试号申请

访问微信公众号平台,如下图:
在这里插入图片描述
点击进去后,只需要填接口配置信息即可。
在这里插入图片描述

后端代码实现

微信公众平台接入指南:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

因为我的代码是在本地开发的,ip地址是127.0.0.1,SpringBoot项目端口是8080,因为微信测试号那个URL接口地址配置必须是域名加外网访问,所以我这里在本地使用了内网穿透,将127.0.0.1:8080映射成了一个域名,这里的域名是软件生成给我们的,内网穿透成功后就可在外网访问。这样我们相当于将本地开发服务作为了一台服务器。
如果有小伙伴不知道什么是内网穿透,或者怎么配置内网穿透,请自行百度解决哦。网上有相关教程。
我映射后如下:
在这里插入图片描述
创建一个SpringBoot项目,如下:
在这里插入图片描述
pom.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>wechat-service</artifactId><version>0.0.1-SNAPSHOT</version><name>wechat-service</name><description>wechat-service</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--web依赖,内嵌入tomcat,RestTempLate使用该依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--用来将string的json格式字符串转换成json对象--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.49</version></dependency><!--lombok依赖,用来对象省略写set、get方法--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.wechatservice.WechatServiceApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

application.yml代码:

server:port: 8080wxChat:appID:你的测试公众号appIDappsecret:你的测试公众号appsecret

WeChatController代码如下:

package com.example.wechatservice.controller;import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;@RestController
@RequestMapping(value = "/weChat")
public class WeChatController {//测试内网穿透后在外网访问接口@GetMapping(value = "/hello")public String hello(){return "hello";}//测试微信公众平台里面的接口配置信息里面的URL能否调用成功,这种只是测试微信公众平台能否调用接口,但是不能识别它是否真的来自于微信公众平台来调用你的,所以才需要做验证@GetMapping(value = "/test")public String test(@RequestParam(value = "signature", required = false) String signature,@RequestParam(value = "timestamp", required = false) String timestamp,@RequestParam(value = "nonce", required = false) String nonce,@RequestParam(value = "echostr", required = false) String echostr){System.out.println("微信测试公众平台调用我了!!!!");System.out.println("signature="+signature);System.out.println("timestamp="+timestamp);System.out.println("nonce="+nonce);System.out.println("echostr="+echostr);//必须原封不动将echostr返回给微信公众号,微信公众测试号才能配置成功那个URL,返回其他值都会导致配置失败return echostr;}//测试微信公众平台里面的接口配置信息,并验证它是否真的来自微信公众平台@GetMapping(value = "/check")public String check(@RequestParam(value = "signature", required = false) String signature,@RequestParam(value = "timestamp", required = false) String timestamp,@RequestParam(value = "nonce", required = false) String nonce,@RequestParam(value = "echostr", required = false) String echostr){System.out.println("微信公众平台调用我了!!!!");//微信公众平台配置的token值String token="testToken";//1.将token、timestamp、nonce三个参数进行字典序排序List<String> list= Arrays.asList(token,timestamp,nonce);//排序Collections.sort(list);//2.将三个参数字符串拼接成一个字符串进行sha1加密StringBuilder stringBuilder=new StringBuilder();for(String s:list){stringBuilder.append(s);}//加密try{MessageDigest instance = MessageDigest.getInstance("SHA-1");//使用sha1进行加密获得byte数组byte[] digest=instance.digest(stringBuilder.toString().getBytes());StringBuilder sum=new StringBuilder();for(byte b:digest){sum.append(Integer.toHexString((b>>4)&15));sum.append(Integer.toHexString(b&15));}//3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if(!StringUtils.isEmpty(signature)&&signature.equals(sum.toString())){System.out.println("一致");//必须原封不动将echostr返回给微信公众号,微信公众测试号才能配置成功那个URL,返回其他值都会导致配置失败return echostr;}}catch (Exception e){e.printStackTrace();}return null;}
}

内网穿透接口测试

这里我在另外一台连了网络的电脑进行接口请求,发现接口请求成功。如下:
在这里插入图片描述
既然外网已经能够成功访问到我们的接口了,那我们直接在微信公众平台配置对应的URL即可。
使用这个http://你的域名/weChat/test接口进行测试,看看能否配置成功。如下:
在这里插入图片描述
后端控制台调用test接口打印如下:
在这里插入图片描述
/weChat/test接口只是我们用来验证能否正常配置成功,但是无法校检是否真的来自于微信公众平台,所以真正实际开发需要调用/weChat/check接口,如下:
在这里插入图片描述
后端控制台打印如下:
在这里插入图片描述
好了,到这里笔记就结束了。填写几个注意点:

  • 必须是域名加外网可以访问,测试公众号域名可以不用备案。
  • 接口配置信息那里的URL配置的是你后端接口地址,点击提交按钮的时候会去请求你的那个接口,使用get请求并会向你传signature、timestamp、nonce、echostr这四个参数,接口返回必须是echostr值,如果返回的不是这个echostr值,都会显示配置失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

房价暴跌到头?中国楼市回调信号愈发强烈!

一、房地产市场的繁荣与萧条 在过去的几十年里&#xff0c;中国的房地产市场经历了多次繁荣与萧条的周期。自2015年第二季度起&#xff0c;全国房价开始逐渐攀升&#xff0c;这标志着新一轮房地产市场的繁荣期的开始。以深圳为例&#xff0c;新政出台后&#xff0c;这座城市的…

CSS 实现文本的渐变色

定义一个类 .text-color{/* 创建一个水平方向的颜色渐变 */background: linear-gradient(120deg, #bd34fe 30%,#5c34fe, #41d1ff);/* 将文本透明度设置为0&#xff0c;以便背景渐变可见 */color: transparent;/* 使用背景渐变来填充文本背景 */-webkit-background-clip: text;…

LeetCode 0994.腐烂的橘子:广度优先搜索(BFS)

【LetMeFly】994.腐烂的橘子&#xff1a;广度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/rotting-oranges/ 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子…

【Spring】GoF 之代理模式

一、代理模式 在 Java 程序中的代理模式的作用&#xff1a; 当一个对象需要受到保护的时候&#xff0c;可以考虑使用代理对象去完成某个行为 需要给某个对象的功能进行功能增强的时候&#xff0c;可以考虑找一个代理进行增强 A 对象无法和 B 对象直接交互时&#xff0c;也可以…

如何在 Python 中使变量不可继承

1. 问题背景 在 Python 中&#xff0c;子类可以继承父类的属性和方法。但是&#xff0c;有时我们希望子类不能继承父类的某些属性或方法。这种情况下&#xff0c;该如何做呢&#xff1f; 2. 解决方案 解决方案一&#xff1a;使用双下划线前缀 Python 中的双下划线前缀用于表…

仓库管理流程详解(附作业流程图)

仓库管理流程在企业的日常运营中至关重要。它不仅是物资流转的核心环节&#xff0c;更关乎着企业的运营效率、成本控制和客户服务水平。一个高效、规范的仓库管理流程能够确保货物从入库到出库的各个环节有序进行&#xff0c;减少资源浪费和时间成本&#xff0c;同时帮助企业实…

Hive Sampling 抽样函数

Hive Sampling 抽样函数 1.random随机抽样 2.数据块抽样 3.分桶表抽样

【静态分析】软件分析课程实验A2-常量传播和Worklist求解器

Tai-e官网&#xff1a; 概述 | Tai-e 参考&#xff1a; https://www.cnblogs.com/gonghr/p/17979609 -------------------------------------------------------- 1 作业导览 为 Java 实现常量传播算法。实现一个通用的 worklist 求解器&#xff0c;并用它来解决一些数据…

超便捷备忘录共享方法 文字文件都可共享

在这个信息爆炸的时代&#xff0c;备忘录已成为我们生活中不可或缺的小助手。它记录着我们的工作计划、待办事项、灵感闪现&#xff0c;甚至是那些温馨的家庭琐事。然而&#xff0c;当我们在不同的设备间穿梭&#xff0c;如何在手机、电脑&#xff0c;甚至是不同品牌的手机之间…

理解机器学习中的类别不平衡问题

大家好&#xff0c;实际世界的数据集通常是杂乱的,当不同类别之间的样本分布不均匀时&#xff0c;就会出现类别不平衡。或者说&#xff0c;某些类别的样本比其他类别多得多。例如&#xff0c;考虑一个信用卡违约数据集&#xff0c;信用卡违约是一个相对较少发生的事件&#xff…

速锐得深入解析吉利几何CAN总线数据通信网络的拓扑层级框架技术

在现代汽车工业中&#xff0c;车辆的电子控制单元&#xff08;ECU&#xff09;之间的通信至关重要。这种通信大多通过控制器局域网络&#xff08;CAN&#xff09;总线实现&#xff0c;它是德国BOSCH公司于20世纪80年代初开发的一种串行数据通信协议。随着技术的不断进步&#x…

读人工智能时代与人类未来笔记01_重塑人类社会秩序

1. AlphaZero 1.1. 2017年年底&#xff0c;由谷歌旗下DeepMind公司开发的人工智能程序AlphaZero击败了当时世界上最强大的国际象棋程序Stockfish 1.1.1. AlphaZero对Stockfish的百场战绩是28胜72平0负&#xff0c;可以说获得了压倒性的胜利 1.1.2. …

安卓手机数据恢复全攻略:从备份到专业软件一网打尽!

随着科技的飞速发展&#xff0c;我们的生活中越来越离不开手机。然而&#xff0c;在使用手机的过程中&#xff0c;我们可能会遇到数据丢失的问题。对于安卓手机用户来说&#xff0c;如何有效地恢复丢失的数据是一个值得探讨的问题。本文将为您介绍安卓手机数据恢复的全攻略&…

西部首个全域直播基地,打造西部直播基地领军形象

天府锋巢直播产业基地作为西部直播产业的领军者&#xff0c;以其前瞻性的战略布局和卓越的服务体系&#xff0c;正加速推动全域直播的快速发展&#xff0c;助力直播产业实现新升级。该基地作为成都规模最大的直播基地&#xff0c;以加快全域直播为核心目标&#xff0c;通过促进…

利用香港多IP服务器优化网站访问速度的关键策略?

利用香港多IP服务器优化网站访问速度的关键策略? 随着数字化时代的不断发展&#xff0c;网站的全球访问速度成为企业吸引用户、提升竞争力的重要因素。特别对于跨国企业而言&#xff0c;如何确保全球用户都能享受到稳定快速的访问体验显得尤为重要。在这一背景下&#xff0c;…

生成ssl证书并配置到nginx

生成ssl证书并配置到nginx 安装证书生成工具 apt-get update apt install software-properties-common add-apt-repository ppa:certbot/certbot apt-get update apt-get install certbot python3-certbot-nginx生成证书 首先在新网上创建一个A链接&#xff0c;域名与服务器做…

考研OSchap4文件管理chap5磁盘管理(部分)

目录 一、整体认知 1.文件的定义 250 2.文件的属性 251 3.文件内部应该如何被组织(逻辑结构) 256 4.文件之间应该如何被组织起来(目录结构) 252 5.OS应该向上提供哪些功能 253 6.文件应该如何存放在外存中(物理结构) 258 7.OS如何管理外存中的空闲块(存储空间的管理) 25…

牛客Java面试题【面试】

牛客Java面试题【面试】 前言推荐牛客Java面试题【面试】第2章 Java笔面试高频考点&解题技巧1. Java基础[2.1 一、java-基础-1](https://www.nowcoder.com/study/live/689/2/1)1.1 为什么Java代码可以实现一次编写、到处运行&#xff1f;1.2 一个Java文件里可以有多个类吗&…

有必要买超声波洗眼镜机吗?力荐四款实力超群超声波清洗机

在日常生活中&#xff0c;眼镜不仅仅是我们视野的延展&#xff0c;像太阳眼镜&#xff0c;也是有着独特的作用。但是&#xff0c;在每天的使用过程中&#xff0c;眼镜片表面难免会有灰尘&#xff0c;污迹&#xff0c;甚至油渍&#xff0c;这些都会对镜片的材质产生一定的损伤&a…

数据结构-树概念基础知识

根结点&#xff1a;非空树中无前驱节点的结点 结点度&#xff1a;结点拥有的子树数或子节点数或后继节点数 树的度&#xff1a;树内各结点的度的最大值 叶子&#xff1a;终端节点&#xff0c;度为0 祖先&#xff1a;从根到该节点所经分支上的所有结点 子孙&#xff1a;以某结点…