
简介这份资料面向想打通前端与后端全链路的开发者尤其是需要完成课程设计或毕业设计的学生以及想从零搭建微信小程序配套 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。本文还有配套的精品资源点击获取