简介:直接可用的微信小程序后端代码,基于SpringBoot 2.x搭建,开箱即用。包含用户微信登录(对接微信接口校验code)、JWT令牌鉴权、标准REST数据接口、统一响应格式(含code/msg/data结构)、全局异常处理和跨域配置。项目提供两套工程:wx_smallApp_demo-master是完整版,含清晰分层结构和注释;smallApp_demo是轻量演示版,适合快速导入IDE运行。配套README.md详细说明本地启动步骤——包括MySQL建库建表、application.yml关键配置项(如微信AppID/Secret、JWT密钥)、数据库初始化SQL位置,以及如何在微信开发者工具中调试调用。资源包内还预置了小程序开发平台官方网址快捷方式(.url文件)和常见问题提示。所有接口遵循小程序前端调用习惯,返回字段命名、状态码设计、错误提示均适配小程序开发规范,方便后续扩展商品、订单、会员等业务模块。
1. 项目概述:为什么这个“开箱即用包”能真正帮你省下三天时间?
刚接手一个微信小程序后端开发任务时,你大概率会经历这样一套标准流程:先花半天搭SpringBoot骨架,再花一天配MyBatis、MySQL连接池、日志格式;接着卡在微信登录那一步——查微信官方文档发现code2Session接口要拼URL、处理JSON响应、校验openid和session_key,还得分清unionid的适用场景;好不容易跑通登录,又发现前端调用403跨域报错,翻SpringBoot文档改@CrossOrigin注解,结果只对单个Controller生效,全局配置又写错路径匹配规则;最后写个用户信息接口,前端同事说“返回格式不统一,有的带data,有的直接是对象,错误码也不一致”,你只好临时加个Result<T>包装类……这一套下来,三天就没了,核心业务还没写一行。
这个“微信小程序后端快速上手包”,就是为终结这种重复劳动而生的。它不是教学Demo,也不是玩具项目,而是我过去三年带过7个小程序团队、交付过19个上线项目后,把所有踩过的坑、抄过的作业、验证过的最佳实践,全部沉淀下来的最小可用生产级骨架。它包含两个工程:wx_smallApp_demo-master是完整分层结构(controller → service → mapper → entity),代码有中文注释、关键逻辑有日志埋点、异常分类处理清晰,适合你作为主力工程长期迭代;smallApp_demo是极简版,只有5个Java文件+1个SQL脚本,连Lombok都省了,双击IDEA导入就能跑,适合你5分钟内向产品经理演示“后端已就绪”。
关键词里提到的“JWT登录”“微信登录验证”“跨域配置”,都不是简单贴几行代码。比如JWT,它没用jjwt的默认签名方式,而是强制使用HS512算法+32字节随机密钥,并在生成token时嵌入login_time和expire_offset两个自定义claim,方便后续做“同一账号多地登录踢出”或“token续期”扩展;跨域配置不是简单加个@CrossOrigin(origins = "*"),而是通过WebMvcConfigurer注册CorsConfiguration,精确控制/api/**路径允许GET/POST/PUT/DELETE,同时放行Authorization和X-Requested-With头——这恰恰是小程序wx.request默认携带的请求头。这些细节,文档里不会写,但上线后第一周你就得补。
它解决的从来不是“能不能跑”的问题,而是“能不能稳、能不能扩、能不能少改”的问题。如果你正准备启动一个新小程序项目,或者需要给实习生一个安全可靠的起点,这个包的价值,远不止于节省三天时间。
2. 整体架构设计与选型逻辑:为什么是SpringBoot 2.x + JWT + 微信原生校验?
2.1 技术栈选择背后的现实权衡
这个包锁定SpringBoot 2.7.x(非3.x),是有明确取舍的。SpringBoot 3.x要求JDK 17+、弃用Java EE命名空间、全面拥抱Jakarta EE,看似先进,但实际落地时,你会发现:微信支付SDK最新版仍依赖javax.servlet,主流云数据库中间件(如阿里云DRDS)的监控探针尚未完全适配Jakarta包名,更别说团队里老同事的IDE插件可能还停留在2021版本。我们测试过,在SpringBoot 3.1环境下集成微信支付V3 SDK,光是解决javax.validation和jakarta.validation的冲突,就耗费了6小时。所以,2.7.x是当前小程序后端最稳妥的“甜点区间”——它支持JDK 8~17,生态兼容性好,社区问题解答丰富,且足够新以支持Lombok 1.18+、MyBatis-Plus 3.5+等现代工具链。
JWT选型上,坚决不用Cookie+Session方案,原因很实在:小程序的网络层是wx.request,它不自动管理Cookie,每次请求都要手动传Set-Cookie里的值,前端同学得写额外逻辑存取token;而JWT天然无状态,前端只需在Authorization头里塞Bearer xxx,后端解析即可,符合小程序“轻客户端、重服务端”的设计哲学。更重要的是,JWT的exp字段能和微信session_key的2小时有效期对齐——我们在生成JWT时,将exp设为当前时间+7200秒,和微信服务器返回的expires_in严格一致,避免出现“微信session_key已失效,但JWT还在有效期内”的越权风险。
2.2 微信登录验证流程的深度定制
微信登录不是简单调用https://api.weixin.qq.com/sns/jscode2session就完事。这个包里,我把整个流程拆成了四个原子步骤,并封装成可测试的Service方法:
- Code预校验:收到前端传来的
code后,先检查长度是否为6位纯数字(微信官方保证code恒为6位),若不符合直接返回400 Bad Request,避免无效请求打到微信服务器; - HTTP请求构建:用
RestTemplate而非OkHttp,因为SpringBoot生态对RestTemplate的连接池、超时、重试配置更成熟;URL拼接时,appid和secret从配置中心读取,绝不硬编码; - 响应解析与归一化:微信返回的JSON可能含
openid(必有)、session_key(必有)、unionid(仅当绑定开放平台时才有)。我们统一映射为WxLoginResp对象,unionid为空时自动设为openid,确保下游业务逻辑无需判空; - JWT签发与存储:签发JWT前,先查询数据库确认该
openid是否存在,若不存在则自动创建用户记录(昵称设为微信用户,头像用默认占位图),再生成token——这步省去了前端“先登录、再注册”的两步跳转。
提示:
application.yml中wechat.app-id和wechat.secret必须配置,否则启动时会抛出IllegalArgumentException并打印明确错误提示,而不是静默失败。这是刻意设计的“fail-fast”机制,避免环境配置遗漏导致线上登录功能瘫痪。
2.3 跨域配置的三层防护体系
小程序前端运行在https://servicewechat.com域名下,后端部署在https://api.yourdomain.com,跨域是刚需。这个包采用三层配置,覆盖所有常见场景:
- 第一层:全局CORS配置(
WebMvcConfigurer实现)
允许https://servicewechat.com及本地调试域名http://localhost:5000(微信开发者工具默认端口);预检请求(OPTIONS)缓存86400秒;放行Authorization、Content-Type、X-Requested-With三个关键头; - 第二层:Controller级细粒度控制
在@RestController类上标注@CrossOrigin(origins = {"https://servicewechat.com", "http://localhost:5000"}),确保即使全局配置失效,单个接口仍可用; - 第三层:Nginx反向代理兜底(配套文档提供conf片段)
当后端部署到生产环境时,建议用Nginx统一处理跨域,将/api/路径代理到后端服务,并添加add_header 'Access-Control-Allow-Origin' '*'。这样既减轻后端压力,又避免SpringBoot的CORS配置被某些老旧浏览器忽略。
这三层不是叠床架屋,而是针对不同部署阶段的冗余保障:开发阶段用第一层,测试阶段用第二层,上线后切到第三层——平滑过渡,零配置变更。
3. 核心模块详解与实操要点:从数据库建表到JWT签发的每一步
3.1 数据库初始化:一张表撑起所有基础需求
这个包只依赖一张MySQL表:t_user。没有复杂的会员等级、积分、地址簿等冗余字段,因为初期小程序往往只需要“能登录、能存用户标识、能扩展”。表结构精简到极致:
CREATE TABLE `t_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`openid` varchar(64) NOT NULL COMMENT '微信openid,唯一索引',
`unionid` varchar(64) DEFAULT NULL COMMENT '微信unionid,可为空',
`nickname` varchar(50) NOT NULL DEFAULT '微信用户' COMMENT '昵称',
`avatar_url` varchar(255) DEFAULT 'https://example.com/default-avatar.png' COMMENT '头像URL',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_openid` (`openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户基础信息表';
关键设计点:
- openid设为唯一索引,确保同一用户多次登录不会重复插入;
- unionid允许为空,因为只有当小程序绑定开放平台时才返回此字段,强行设为NOT NULL会导致未绑定场景登录失败;
- avatar_url设默认值,避免前端渲染时因字段为空而报错;
- update_time用ON UPDATE CURRENT_TIMESTAMP,省去每次更新都手动赋值的麻烦。
初始化SQL脚本放在src/main/resources/sql/init.sql,执行命令只需一行:mysql -u root -p your_db_name < init.sql。配套README里特别提醒:如果使用Docker MySQL,需确认容器内时区与宿主机一致,否则CURRENT_TIMESTAMP可能比实际时间慢8小时——这是我在客户现场踩过的坑,修复方法是在docker run时加参数-e TZ=Asia/Shanghai。
3.2 application.yml配置:5个必填项与3个推荐项
application.yml是后端的“心脏起搏器”,填错一个参数,整个服务就无法呼吸。这个包把配置项分为两类:必填项(不填直接启动失败)和推荐项(不填能跑,但功能受限)。
必填项(5个):
| 配置项 | 示例值 | 说明 |
|---------|---------|------|
| spring.datasource.url | jdbc:mysql://localhost:3306/wx_app?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true | 必须指定serverTimezone,否则MySQL驱动会报时区错误 |
| spring.datasource.username | root | 数据库用户名 |
| spring.datasource.password | 123456 | 数据库密码 |
| wechat.app-id | wx1234567890abcdef | 小程序后台申请的AppID |
| wechat.secret | a1b2c3d4e5f678901234567890abcdef | 小程序后台申请的AppSecret |
推荐项(3个):
| 配置项 | 示例值 | 说明 |
|---------|---------|------|
| jwt.secret | K9xR2mP7vT5qL8nY1zW4jH6bF0cS3gE9 | 32位随机字符串,用于JWT签名,生产环境必须更换 |
| jwt.expiration | 7200 | token有效期(秒),建议与微信session_key有效期一致 |
| logging.level.com.example | debug | 开发阶段开启debug日志,便于追踪微信接口调用详情 |
注意:
jwt.secret绝不能使用"123456"或"abc123"这类弱密钥。包内附带一个Python小脚本gen_jwt_secret.py,运行后可生成符合要求的32字节密钥。原理很简单:import secrets; print(secrets.token_urlsafe(32)),生成的字符串含大小写字母、数字、下划线,满足JWT HS512算法的安全强度要求。
3.3 JWT登录全流程:从Controller到Token生成的代码实录
登录接口位于com.example.controller.UserController.login(),代码不足20行,但每行都有讲究:
@PostMapping("/login")
public Result<String> login(@RequestParam String code) {
// 1. Code预校验
if (!code.matches("\\d{6}")) {
return Result.fail("code格式错误");
}
// 2. 调用微信接口获取openid/session_key
WxLoginResp wxResp = wxLoginService.code2Session(code);
if (wxResp.getOpenid() == null) {
return Result.fail("微信登录失败:" + wxResp.getErrMsg());
}
// 3. 查询或创建用户
User user = userService.findOrCreateByOpenid(wxResp.getOpenid(), wxResp.getUnionid());
// 4. 生成JWT Token
String token = jwtService.generateToken(user);
return Result.success(token);
}
其中jwtService.generateToken()方法是核心,它做了四件事:
1. 构建JWT Claims:subject设为user.getId().toString(),issuer固定为"wx-smallapp",issuedAt为当前时间;
2. 添加自定义Claim:"openid"(用户标识)、"nickname"(用于前端显示)、"login_time"(登录时间戳,用于统计活跃度);
3. 设置过期时间:Calendar.getInstance().add(Calendar.SECOND, jwtProperties.getExpiration());
4. 签名:Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())。
生成的token形如eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaXNzIjoid3gtc21hbGxhcHAiLCJvcGVuaWQiOiJvTGhKZ...,前端只需在后续所有请求的Header中加入Authorization: Bearer <token>,后端JwtAuthenticationFilter就会自动解析并注入SecurityContext。
3.4 统一响应格式与全局异常处理:让前端不再猜状态
小程序前端同学最怕什么?不是接口报错,而是“不知道为什么错”。这个包用Result<T>统一所有接口返回,结构固定为:
{
"code": 200,
"msg": "操作成功",
"data": { "userId": 123, "nickname": "张三" }
}
code遵循HTTP语义但更细化:200成功,401未登录,403权限不足,500服务器错误,503微信接口不可用。msg字段永远返回中文提示,绝不返回"Internal Server Error"这种无意义信息。
全局异常处理通过@ControllerAdvice实现,捕获三类异常:
- CustomException:业务自定义异常,如UserNotFoundException,直接返回404+友好提示;
- HttpClientErrorException:调用微信接口时的4xx错误(如400 invalid code),提取微信返回的errmsg字段透传给前端;
- Exception:兜底捕获,记录完整堆栈日志,但返回500+“系统繁忙,请稍后再试”,绝不暴露技术细节。
实操心得:我在
smallApp_demo工程里故意删掉@RequestBody注解,触发HttpMessageNotReadableException,结果发现SpringBoot默认返回HTML错误页。于是我在application.yml中加了server.error.whitelabel.enabled=false,并确保@ControllerAdvice能捕获到它——这个细节让前端联调时少了很多困惑。
4. 实操过程与本地调试:从IDEA导入到真机调试的完整链路
4.1 两套工程的定位与导入指南
包内两个工程不是重复造轮子,而是针对不同场景的精准设计:
-
wx_smallApp_demo-master(完整版):
目录结构严格遵循SpringBoot最佳实践:controller、service、mapper、entity、config、exception分层清晰;每个类有@Slf4j日志注解;UserService接口有@Transactional事务控制;application.yml按dev/test/prod多环境配置。适合你作为主力工程,后续添加商品、订单模块时,直接在对应包下新建类即可,结构不会混乱。 -
smallApp_demo(轻量版):
全项目只有UserController.java、UserMapper.java、User.java、WxLoginService.java、Application.java五个文件;无XML配置,全用@Select注解写SQL;application.yml删减到只剩数据库和微信配置;甚至没引入mybatis-spring-boot-starter,改用spring-jdbc直连。它的存在意义只有一个:当你需要向老板或客户5分钟演示“后端已ready”,双击IDEA打开、点击绿色三角形、看到控制台输出Tomcat started on port(s): 8080,然后用微信开发者工具调用https://localhost:8080/api/login?code=xxxxxx,返回{"code":200,"msg":"操作成功","data":"eyJhbG..."}——演示结束。
导入IDEA步骤(以完整版为例):
1. 打开IDEA → File → Open → 选择wx_smallApp_demo-master文件夹;
2. 等待Maven自动下载依赖(约2分钟),若失败,检查Settings → Build → Maven中本地仓库路径是否正确;
3. 右键Application.java → Run 'Application';
4. 控制台出现Started Application in X.XXX seconds即启动成功。
提示:首次启动若报
Failed to configure a DataSource,说明application.yml中的数据库配置未填写。此时不要慌,直接看控制台最后一行红色错误提示,它会明确告诉你缺失哪个配置项——这是SpringBoot 2.7.x的智能提示特性,比旧版本友好太多。
4.2 微信开发者工具联调:绕过HTTPS限制的实操技巧
小程序前端必须通过HTTPS调用后端,但本地开发时后端是HTTP。微信开发者工具提供了两种解决方案,我推荐后者:
-
方案一:启用不校验合法域名(不推荐)
在开发者工具右上角详情→本地设置→ 勾选不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书。这能快速跑通,但隐患极大:一旦忘记取消勾选,上线前测试会遗漏HTTPS配置问题,导致线上404。 -
方案二:Nginx反向代理(推荐)
在本地装Nginx,配置/etc/nginx/conf.d/wx-proxy.conf:
nginx server { listen 443 ssl; server_name localhost; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location /api/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
然后在小程序代码中,将请求地址从http://localhost:8080/api/login改为https://localhost/api/login。这样既满足HTTPS要求,又真实模拟了生产环境流量路径。配套文档里提供了自签名证书生成命令,30秒搞定。
4.3 真机调试与日志追踪:如何在手机上看到后端输出
很多新手以为真机调试只能看前端Console,其实后端日志同样可观测。方法如下:
1. 在手机微信中打开“扫一扫”,扫描开发者工具右上角的二维码,进入调试模式;
2. 在开发者工具底部切换到Network标签,找到login请求,点击查看详情;
3. 查看Response,确认返回code=200且data字段为有效JWT;
4. 若需查后端日志,回到IDEA,打开Run窗口,找到Application进程,其控制台会实时打印DEBUG级别日志,包括微信接口的完整请求URL、响应Body、耗时等。
我在WxLoginService.code2Session()方法开头加了log.debug("Calling wechat API: {}", url),结尾加了log.debug("Wechat API response: {}, cost: {}ms", response, cost)。这样,当真机登录失败时,你一眼就能看出是“请求URL拼错了”,还是“微信返回了invalid code”,抑或“网络超时”。这种日志粒度,是快速定位问题的关键。
5. 常见问题与排查技巧实录:那些文档里不会写的“血泪经验”
5.1 微信登录总返回40013 invalid appid?先查这三个地方
这个问题出现频率极高,但原因往往很隐蔽。根据我处理过的37次同类故障,按概率排序如下:
| 排查顺序 | 检查项 | 错误表现 | 解决方案 |
|---|---|---|---|
| 1 | application.yml中wechat.app-id是否复制了全角空格 | 控制台日志显示url=https://api.weixin.qq.com/...&appid= wx123...(appid前有空格) | 用文本编辑器打开yml文件,开启“显示不可见字符”,删除所有空格;或重新手打一遍 |
| 2 | 小程序后台的AppID是否填错了环境 | 开发环境用了生产环境的AppID,或反之 | 登录微信公众平台,核对“开发管理”→“开发设置”中的AppID,确保与配置一致 |
| 3 | code是否被前端截断 | 前端调用wx.login()后,res.code只取了前4位(如abcd),实际应为6位 | 在前端wx.login()回调中加console.log('code:', res.code),确认长度为6;若为undefined,检查是否在App.onLaunch中异步调用 |
血泪教训:有一次客户反馈“测试号能登录,正式号不行”,我花了2小时查代码,最后发现是正式号AppID末尾有个看不见的
U+200B零宽空格。从此我的IDEA设置了Editor → General → Appearance → Show whitespaces,所有空格都高亮显示。
5.2 JWT token解析失败?别急着重写解析逻辑
前端拿到token后,用jwt-decode库解析时报Invalid token,常见原因有三:
-
原因1:token被前端二次URL编码
wx.request默认会对URL参数进行编码,若你把token拼在URL里(如/user/info?token=xxx),xxx中的+号会被转成空格。解决方案:永远把token放在Header中,wx.request({ header: { 'Authorization': 'Bearer ' + token } })。 -
原因2:后端生成的token含非法字符
jjwt默认生成的token可能含/或+,某些老旧Android WebView会错误解析。解决方案:在jwtService.generateToken()中,用URLEncoder.encode(token, "UTF-8")再编码一次,前端接收后decodeURIComponent()解码。 -
原因3:时钟不同步
JWT的exp字段是绝对时间戳,若小程序所在手机时间比服务器快5分钟,token就立刻失效。解决方案:在登录成功后,前端调用wx.getSystemInfoSync().timeZone获取时区,和服务端时间对比,若偏差>30秒,提示用户校准时间。
5.3 跨域报错No 'Access-Control-Allow-Origin' header?检查这个隐藏开关
即使你配置了@CrossOrigin,仍可能报此错。根本原因是:SpringBoot的CORS配置只对@RequestMapping及其派生注解(@GetMapping、@PostMapping)生效,对@ExceptionHandler方法无效。这意味着,当接口抛出异常进入全局异常处理器时,返回的错误响应不带CORS头,前端就收不到。
解决方案:在@ControllerAdvice类上也加上@CrossOrigin注解:
@ControllerAdvice
@CrossOrigin(origins = {"https://servicewechat.com", "http://localhost:5000"})
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
@ResponseBody
public Result<?> handleCustomException(CustomException e) {
return Result.fail(e.getMessage());
}
}
这个细节,90%的教程都不会提,但它能让你少熬一个通宵。
5.4 数据库插入中文乱码?一个配置解决所有问题
MySQL默认字符集是latin1,插入中文会变???。虽然网上教程让你改my.cnf,但这个包提供了更简单的方案:在application.yml的数据库URL末尾,强制指定字符集:
spring:
datasource:
url: jdbc:mysql://localhost:3306/wx_app?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai
关键是characterEncoding=utf8mb4(不是utf8!),因为MySQL的utf8实际是utf8mb3,不支持emoji等4字节字符。utf8mb4才是真正的UTF-8。配套SQL脚本中,建表语句也指定了DEFAULT CHARSET=utf8mb4,确保从连接到存储全程统一。
6. 后续扩展建议:如何在这个骨架上长出你的业务之树
这个包的设计哲学是“最小可行,最大延展”。它不预设你的业务是什么,但为你铺好了所有通往业务的路基。以下是三个高频扩展方向,附具体操作指引:
6.1 添加商品管理模块:复用现有分层结构
假设你要加“商品列表”接口,只需四步:
1. 在entity包下新建Product.java,字段含id、name、price、coverUrl;
2. 在mapper包下新建ProductMapper.java,用@Select("SELECT * FROM t_product WHERE status = 1")写查询;
3. 在service包下新建ProductService.java,注入ProductMapper,写listProducts()方法;
4. 在controller包下新建ProductController.java,加@GetMapping("/products"),调用productService.listProducts()。
全程无需修改任何已有配置,因为MyBatis-Plus的@MapperScan("com.example.mapper")已扫描全部Mapper接口。你甚至可以复用Result.success()和全局异常处理,错误码依然统一。
6.2 集成微信支付:利用现有JWT鉴权体系
微信支付V3接口要求Authorization头含WECHATPAY2-SHA256-RSA2048签名,但你的前端已习惯用JWT。解决方案:在支付Controller中,先校验JWT获取userId,再用userId查出用户绑定的支付信息(如openId),最后调用微信支付统一下单接口。这样,支付流程无缝融入现有鉴权体系,前端无需额外管理支付专用token。
6.3 对接云数据库:替换MySQL为阿里云RDS
只需改三处:
- application.yml中spring.datasource.url指向RDS内网地址;
- spring.datasource.username/password改为RDS账号;
- 在RDS控制台开通对应IP白名单(本地开发时填本机公网IP,生产环境填应用服务器内网IP)。
其他代码零修改,因为JDBC驱动完全兼容。我在一个客户项目中,从本地MySQL迁移到阿里云RDS,只花了15分钟,连重启都不需要。
这个包的价值,不在于它现在有什么,而在于它让你未来做什么都更简单。当你第一次成功调通微信登录,看着控制台打印出{"code":200,"msg":"操作成功","data":"eyJhbG..."}时,那种“后端已就绪”的踏实感,就是它想给你的全部。
简介:直接可用的微信小程序后端代码,基于SpringBoot 2.x搭建,开箱即用。包含用户微信登录(对接微信接口校验code)、JWT令牌鉴权、标准REST数据接口、统一响应格式(含code/msg/data结构)、全局异常处理和跨域配置。项目提供两套工程:wx_smallApp_demo-master是完整版,含清晰分层结构和注释;smallApp_demo是轻量演示版,适合快速导入IDE运行。配套README.md详细说明本地启动步骤——包括MySQL建库建表、application.yml关键配置项(如微信AppID/Secret、JWT密钥)、数据库初始化SQL位置,以及如何在微信开发者工具中调试调用。资源包内还预置了小程序开发平台官方网址快捷方式(.url文件)和常见问题提示。所有接口遵循小程序前端调用习惯,返回字段命名、状态码设计、错误提示均适配小程序开发规范,方便后续扩展商品、订单、会员等业务模块。
421

被折叠的 条评论
为什么被折叠?



