微信小程序+SpringBoot前后端通信与HTTPS部署实战

发布时间:2026/9/18 2:51:16

微信小程序+SpringBoot前后端通信与HTTPS部署实战 简介这份资料面向想打通前端与后端全链路的开发者尤其是需要完成课程设计或毕业设计的学生以及想从零搭建微信小程序配套 Java 服务的入门者。内容围绕微信小程序的组件与 API 调用、SpringBoot 后端架构搭建、RESTful 接口编写、前后端联调、免费 HTTPS 证书申请与 Linux 服务器上线部署等环节展开帮助读者理解小程序与 Java 服务之间如何完成通信与数据交互。资源包内共 1 个 PDF 文件压缩后约 341KB篇幅紧凑适合作为随查随用的技术脉络梳理文档。目前已有 13304 人学习说明其在小程序加 Java 后端这一方向上有较高参考价值可供快速了解整体流程与关键配置要点。1. 从零搭一套 微信小程序 SpringBoot 后端先想清楚通信边界很多人在微信开发者工具里点按钮拿不到数据第一反应是组件写错了实际卡住的是通信边界小程序不直接连数据库它只认 HTTPS 请求后端把对象序列化成 JSON 返回前端再用wx.request的success回调取res.data。这套「微信小程序 Java 后端」组合适合做课程设计、毕业设计、校园服务类项目也适合想从前端补后端能力的人做一次完整的前后端分离项目实战。本文里的技术点按四条线推进SpringBoot 骨架与 JSON 接口、小程序端请求与参数透传、HTTPS 证书与 jar 部署、测试接口到 RESTful 接口的收敛。先把边界立住后面每行代码才知道该放哪一端。2. SpringBoot 后端骨架pom 依赖、RestController 与 JSON 序列化2.1 Maven 依赖与 application.properties 关键参数后端用 SpringBoot 的核心原因是它把 Web 容器、JSON 序列化、配置读取都做成了默认行为。建 Maven 项目后先看依赖和配置两张表再动手写接口。依赖/配置项示例值作用spring-boot-starter-parent1.5.9.RELEASE统一管理 SpringBoot 相关依赖版本spring-boot-starter-web默认提供 SpringMVC、Jackson、内嵌 Tomcattomcat-embed-jasper随 parent 版本需要 JSP 渲染时补上server.port443 或 80后端监听端口HTTPS 常用 443spring.mvc.view.prefix/WEB-INF/jsp/JSP 视图路径前缀spring.mvc.view.suffix.jspJSP 视图后缀server.ssl.key-storeclasspath:xxxx.pfx证书文件位置server.ssl.key-store-passwordxxxxxxxx证书密码!-- pom.xml 关键部分一个 starter-web 带 exclusion再补 jasper -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version1.5.9.RELEASE/version /parent dependencies !-- Web 核心排除内嵌 Tomcat 后再单独引入 jasper 的场景 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency !-- 使用 JSP 时补充 Jasper 支持 -- dependency groupIdorg.apache.tomcat.embed/groupId artifactIdtomcat-embed-jasper/artifactId /dependency !-- 需要页面模板时可选 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-freemarker/artifactId /dependency /dependencies依赖部分要注意纯 JSON 接口项目不需要 JSP 和 Freemarker把这两个依赖去掉可以少一层排错成本。application.properties放在src/main/resources/下SpringBoot 启动时自动读取改端口、改证书路径都在这里。# application.properties本地联调先不配 SSL上线前再打开 spring.mvc.view.prefix/WEB-INF/jsp/ spring.mvc.view.suffix.jsp # 本地可用 8080部署到服务器再改成 443 server.port8080 # HTTPS 配置示例证书 pfx 文件放在 resources 下 # server.port443 # server.ssl.key-storeclasspath:xxxxxxx.pfx # server.ssl.key-store-passwordxxxxxxxx # server.ssl.keyStoreTypePKCS12参数说明server.port一旦改成 443本机如果没有管理员/root 权限会启动失败server.ssl.key-store用classpath:前缀表示从 jar 包内读取证书文件必须被打进产物keyStoreType要和证书格式对应pfx 一般是PKCS12。2.2 入口类与第一个 JSON 接口入口类放到根包下扫包范围才不会漏。ComponentScan(basePackages com.bin) EnableAutoConfiguration public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }这里用ComponentScanEnableAutoConfiguration是显式拆开写法等价于一个SpringBootApplication。basePackages写错会导致 Controller 不被扫描表现为接口 404。RestController public class ControllerText { RequestMapping(getUser) public MapString, Object getUser() { System.out.println(微信小程序正在调用。。。); MapString, Object map new HashMapString, Object(); ListString list new ArrayListString(); list.add(zhangsan); list.add(lisi); map.put(list, list); return map; } RequestMapping(getWord) public MapString, Object getText(String word) { MapString, Object map new HashMapString, Object(); String message 未匹配到内容; if (微信小程序.equals(word)) { message 从小程序官方文档的组件和 API 两栏开始查。; } else if (java.equals(word)) { message 后端接口先跑通 JSON再考虑接数据库。; } map.put(message, message); return map; } }RestController返回的对象会被 Jackson 转成 JSON小程序端拿到的就是{ list: [...] }或{ message: ... }。String word这种写法依赖参数名编译时需要保留参数名信息如果线上拿不到值改成RequestParam(word) String word更稳。2.3 RestController 与 Controller 的差异注解返回值处理适用场景Controller默认当视图名走视图解析器JSP、Freemarker 页面RestController返回值直接写回响应体转 JSON/文本小程序、App、前后端分离接口小程序和后端之间传的是 JSON 报文所以后端接口用RestController更省事。如果类上写了Controller方法上又忘了ResponseBody小程序会收到一段 HTML 或 404控制台却能看到方法执行了。2.4 本地联调与端口排查本地用微信开发者工具请求http://localhost:8080/getUser时要在「详情」-「项目设置」里勾选「不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书」。这一步只对开发者工具有效真机预览仍然要求 HTTPS 和合法域名。端口占用排查命令# Windows查看 8080 或 443 监听情况 netstat -ano | findstr :8080 # macOS / Linux查看端口占用进程 lsof -i:8080 # 直接验证接口是否返回 JSON curl -i http://localhost:8080/getUsernetstat的-ano会列出 PID配合任务管理器结束进程lsof查到的 PID 用kill -9 PID结束。如果curl返回 404先看 Controller 所在包是否在basePackages范围内返回 500看控制台异常栈连接被拒绝说明端口没起来或端口号不一致。3. 小程序端 wx.request 打通后端GET 列表与关键字查询3.1 wxml 结构与 data 初始化小程序端先搭最小页面一个按钮触发列表请求一个输入框加按钮触发关键字查询。wxml 只负责渲染数据从 js 的data里来。!-- pages/index/index.wxml -- button bindtaphouduanButton1点击发起请求/button view wx:for{{list}} wx:key*this 姓名{{item}} /view input typetext placeholder请输入你要查询的内容 bindinputhouduanTab_input / button bindtaphouduanButton2查询/button view wx:if{{message ! }}{{message}}/viewwx:for遍历listwx:key*this在数组元素为字符串时可用。bindinput把输入框的实时值写回data.wordbindtap触发请求。页面路径要在app.json的pages数组里注册否则开发者工具会直接报页面不存在。3.2 wx.request 的 url、method、header、success 回调// pages/index/index.js Page({ data: { list: , word: , message: }, houduanButton1: function () { var that this; wx.request({ url: http://localhost:8080/getUser, // 本地联调地址 method: GET, header: { content-type: application/json // 默认值 }, success: function (res) { console.log(res.data); // 控制台看后端返回结构 var list res.data.list; if (list null) { wx.showToast({ title: 数据获取失败, icon: none, duration: 2000 }); } else { that.setData({ list: list }); } }, fail: function (err) { console.error(request fail, err); } }); } });url在本地写localhost真机必须换成 HTTPS 域名method与实际后端映射一致后端RequestMapping默认支持 GET 和 POSTheader里content-type对 GET 影响不大POST 传 JSON 时后端要用RequestBody接收success里的res.data已经是解析后的对象不要再JSON.parse。that.setData是必须的直接this.data.list list不会触发渲染。3.3 关键字查询bindinput 与 data 透传// 继续在 Page 对象中追加 houduanTab_input: function (e) { this.setData({ word: e.detail.value }); }, houduanButton2: function () { var that this; wx.request({ url: http://localhost:8080/getWord, data: { word: that.data.word }, // 拼接为 ?wordxxx method: GET, header: { content-type: application/json }, success: function (res) { var message res.data.message; if (message null) { wx.showToast({ title: 数据获取失败, icon: none, duration: 2000 }); } else { that.setData({ message: message }); } } }); }GET 请求里data会被拼到 URL 后面后端用String word或RequestParam(word)都能接到。如果后端改成 POST 且接收 JSON小程序端要把data写成对象并设置header[content-type] application/json后端方法参数前加RequestBody。3.4 请求失败对照表现象常见原因检查点request:fail url not in domain list未勾选不校验域名或未配置合法域名开发者工具项目设置、小程序后台 request 合法域名404路径不匹配或 Controller 未扫描RequestMapping值、启动类扫包范围400参数名对不上或类型不匹配后端参数名、小程序data键名返回 HTML 而不是 JSON用了 Controller 未加 ResponseBody类注解换成 RestController连接被拒绝后端没启动或端口不一致server.port、netstat监听结果4. 从 HTTP 到 HTTPS证书配置、跨域与部署上线4.1 pfx 证书配置项与 443 端口小程序正式环境要求 HTTPS证书通常买域名时一起申请拿到 pfx 文件后放进src/main/resources/再打开application.properties里的 SSL 配置。server.port443 server.ssl.key-storeclasspath:yourdomain.pfx server.ssl.key-store-password你的证书密码 server.ssl.keyStoreTypePKCS12key-store用classpath:表示文件在 jar 包内key-store-password是证书导出时设置的密码keyStoreType要与证书格式一致pfx 一般填PKCS12。如果启动时报Keystore was tampered with, or password was incorrect优先检查密码和文件是否被 Maven 过滤破坏。打包时src/main/resources下的文件默认会进入产物不需要额外配置。4.2 后端跨域与小程序合法域名小程序请求不受浏览器同源策略限制但后端如果同时给 H5 页面或本地调试页提供接口就会遇到跨域。常见做法是加一个全局配置Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) // 上线后建议改成具体域名 .allowedMethods(GET, POST, PUT, DELETE) .allowedHeaders(*); } }addMapping(/**)表示对所有路径生效allowedOrigins在生产环境不要长期用*改成实际前端域名allowedMethods按接口实际使用范围收紧。小程序的合法域名配置在小程序管理后台完成要求 HTTPS 且域名不能带端口路径。开发者工具里勾选「不校验」只解决本地调试真机预览会直接拒绝。4.3 打成 jar 与 nohup 常驻SpringBoot 项目建议打成可执行 jar服务器上只需要对应版本的 JDK。本地执行# 跳过测试打包产物在 target 目录下 mvn clean package -DskipTests # 上传 jar 后后台常驻运行并输出日志 nohup java -jar helloworld.jar # 查看实时日志 tail -f nohup.out # 找到进程并停止 ps -ef | grep helloworld.jar kill -9 进程号nohup让进程忽略挂断信号让命令在后台执行日志默认写到当前目录的nohup.out。服务器重启后进程不会自动恢复需要重新执行启动命令或者用 systemd 做守护。-DskipTests在打包阶段跳过测试首次部署可以保留测试确认依赖完整后再加这个参数。4.4 上线后的连通性验证# -k 跳过证书链校验仅用于快速确认接口是否可达 curl -k -i https://yourdomain.com/getUser # 带参数验证查询接口 curl -k https://yourdomain.com/getWord?word微信小程序返回 JSON 且 HTTP 状态码为 200说明证书、端口、接口三层都通了。如果curl本地通、真机不通检查小程序后台的 request 合法域名是否填了当前域名以及证书是否在有效期内。5. 把测试接口做成可维护的 RESTful 接口统一返回体与参数校验接口数量一多每个 Controller 方法各返回各的Map小程序端就会写出一堆res.data.list、res.data.message、res.data.obj的取值判断。更稳的做法是先定一个统一返回体。public class ResultT { private int code; // 0 成功非 0 失败 private String msg; // 提示信息 private T data; // 业务数据 public static T ResultT ok(T data) { ResultT r new ResultT(); r.code 0; r.msg ok; r.data data; return r; } public static T ResultT fail(String msg) { ResultT r new ResultT(); r.code 1; r.msg msg; return r; } // getter/setter 省略 }Controller 返回值改成ResultListString或ResultString小程序端统一判断res.data.code 0再取res.data.data。参数校验用RequestParam的required或Valid都可以关键是把「参数缺失」和「业务无结果」分开前者返回非 0 的 code 和明确提示后者返回 code 0、data 为空数组前端不用靠null猜。验证方式用 curl 连续打三类请求正常参数、空参数、不存在的参数观察 HTTP 状态码和返回体是否稳定。再把微信开发者工具里的baseUrl抽成一个常量文件本地、测试、线上各一份避免每个页面里散落localhost:8080。下一次后端字段改名时先改Result和接口文档再改小程序端res.data.data的取值路径顺序反了就会在真机上报undefined。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/9/18 2:51:16

单站DOA-TDOA无源定位的RCTLS求解:从原理到Python实现

简介:面向从事无线通信、雷达技术及导航定位研究的科研人员与工程师,这份Word文档完整复现了基于正则化约束总体最小二乘的单站到达角与到达时差联合无源定位算法。文档从非线性观测方程线性化入手,系统阐述方程病态性分析、正则化约束模型构…

2026/9/18 2:46:16

DeepSeek+即梦:从0到1的AI视频创作全流程指南

简介:面向AI视频创作入门人群的完整实操指南,聚焦DeepSeek与即梦AI的协同工作流,覆盖前期账号注册、硬件网络适配、脚本构思、文生图、静态图转动态视频、后期合成等全链路环节,适合零基础学习者、短视频创作者及希望提升产出效率…

2026/9/18 2:46:16

离散信号与序列:核心概念、运算及工程实现陷阱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 4:01:19

Linux命令拾遗-top中的%nice是啥

简介# 这是Linux命令拾遗系列的第八篇,本篇主要介绍top命令中nice%这个指标的含义以及进程优先级相关内容。 在各种查看CPU使用率的工具中(如top),一般都有us%、sy%、ni%等,us%与sy%含义是比较容易理解的,一个是用户态CPU使用率…

2026/9/18 4:01:19

大模型系统提示词泄露全解析:从原理到防御的实战指南

1. 先聊聊这个标题到底在说什么如果你最近在逛技术社区、刷 AI 相关的资讯,大概率会频繁撞见system_prompts_leaks这个关键词。它并不是某个具体项目的代号,而是指过去一年里在 LLM 应用领域掀起巨浪的一类现象:大语言模型的系统提示词&#…

2026/9/18 3:56:19

Excel数据批量转Word工具拆解与Python实现

最近有朋友把“Excel 数据批量转 Word 工具(2026年最新版)”分享到群里,说是在国内一个软件分享社区看到的大神作品。我研究了一下这个工具的界面和架构,发现它比我之前想的要扎实得多,核心就一句话:读 Exc…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码