# AppletController 统一响应处理修改说明 ## 修改概述 对 `AppletController.java` 中的小程序接口进行了统一响应格式处理,按照以下规范: - **成功响应**: code: 200 - **业务提示**: code: 422 - **Token验证失败**: code: 332 - **系统错误**: code: 500 ## 新增统一响应方法 在 `AppletControllerUtil.java` 中新增了以下统一响应处理方法: ### 1. 成功响应方法 ```java // 成功响应 - code: 200 public static AjaxResult appletSuccess(Object data) public static AjaxResult appletSuccess(String message) public static AjaxResult appletSuccess() ``` ### 2. 业务提示方法 ```java // 业务提示响应 - code: 422 public static AjaxResult appletWarning(String message) public static AjaxResult appletWarning(String message, Object data) ``` ### 3. Token验证失败方法 ```java // Token验证失败响应 - code: 332 public static AjaxResult appletUnauthorized() public static AjaxResult appletUnauthorized(String message) ``` ### 4. 系统错误方法 ```java // 系统错误响应 - code: 500 public static AjaxResult appletError(String message) ``` ## 已修改的方法示例 ### 1. 服务分类接口 ```java // 修改前 return success(categoryList); return error("获取服务分类列表失败:" + e.getMessage()); // 修改后 return AppletControllerUtil.appletSuccess(categoryList); return AppletControllerUtil.appletError("获取服务分类列表失败:" + e.getMessage()); ``` ### 2. Token验证相关 ```java // 修改前 return error("用户未登录或token无效"); // 修改后 return AppletControllerUtil.appletUnauthorized(); ``` ### 3. 业务验证相关 ```java // 修改前 return error("地址ID无效"); return error("参数格式错误"); // 修改后 return AppletControllerUtil.appletWarning("地址ID无效"); return AppletControllerUtil.appletWarning("参数格式错误"); ``` ### 4. 积分兑换特殊处理 ```java // 修改前 AjaxResult result = AjaxResult.error("积分不足"); result.put("code", 422); result.put("data", new ArrayList<>()); return result; // 修改后 return AppletControllerUtil.appletWarning("积分不足"); ``` ## 修改范围 ### 已完成修改的方法: 1. `getInfo()` - 获取服务分类列表 2. `config()` - 获取系统配置信息 3. `getconfig()` - 获取默认配置信息 4. `getaddresslist()` - 查询用户收货地址列表 5. `getAddressInfo()` - 根据地址ID查询用户收货地址详情 6. `editAddress()` - 修改用户收货地址 7. `addAddress()` - 新增用户收货地址 8. `exchangeIntegralProduct()` - 积分商品兑换接口 ### 待修改的方法(需要继续处理): 由于文件较大,还有以下方法需要继续修改: - 售后返修相关接口 - 订单查询相关接口 - 支付相关接口 - 用户登录验证接口 - 商品查询相关接口 - 优惠券相关接口 - 积分日志相关接口 - 通知订阅相关接口 ## 统一响应格式 ### 成功响应 (200) ```json { "code": 200, "msg": "OK", "data": {...} } ``` ### 业务提示 (422) ```json { "code": 422, "msg": "提示信息", "data": [] } ``` ### Token验证失败 (332) ```json { "code": 332, "msg": "用户未登录或token无效,请重新登录", "data": [] } ``` ### 系统错误 (500) ```json { "code": 500, "msg": "系统错误信息", "data": [] } ``` ## 注意事项 1. **Token验证失败**一律返回 332 状态码 2. **业务验证失败**(如参数错误、数据不存在、权限不足)返回 422 状态码 3. **系统异常**(如数据库异常、网络异常)返回 500 状态码 4. **成功操作**返回 200 状态码 5. **积分不足**等特殊业务场景也使用 422 状态码 ## 下一步工作 需要继续对剩余的方法进行统一响应格式处理,确保所有小程序接口都使用统一的响应格式。 # AppletController 接口说明 ## 修改的接口 ### `/api/paybefor/info/{id}` - 预支付记录查询和金额计算 **请求方式**: POST **接口描述**: 根据预支付记录ID查询详情,并根据传递的参数计算支付金额 **请求参数**: - `id` (路径参数): 预支付记录ID - `paytype` (可选): 支付方式,1=微信支付,2=余额支付,3=组合支付,默认为1 - `coupon_id` (可选): 优惠券ID - `mtcode` (可选): 美团优惠码 **请求示例**: ```json { "paytype": 1, "coupon_id": 123, "mtcode": "MT123456" } ``` **响应示例**: **微信支付示例**: ```json { "code": 200, "msg": "操作成功", "data": { "id": 1, "orderId": "ORDER20250101001", "paycode": "PAY20250101001", "allmoney": 100.00, "finalAmount": 85.10, "wxmoney": 85.10, "yemoney": 0.00, "membermoney": 5.00, "shopmoney": 2.00, "servicemoney": 3.00, "couponmoney": 10.00, "mtmoney": 9.90, "type": 1, "paytype": 1, "usersBalance": 50.00, "couponId": 123, "mtcode": "MT123456", "calculationDetail": { "originalAmount": 100.00, "memberDiscount": 5.00, "serviceDiscount": 3.00, "shopDiscount": 2.00, "couponDiscount": 10.00, "mtDiscount": 9.90, "finalAmount": 85.10 } } } ``` **组合支付示例**(用户余额30元,实际应付85.10元): ```json { "code": 200, "msg": "操作成功", "data": { "id": 1, "orderId": "ORDER20250101001", "paycode": "PAY20250101001", "allmoney": 100.00, "finalAmount": 85.10, "wxmoney": 55.10, "yemoney": 30.00, "membermoney": 5.00, "shopmoney": 2.00, "servicemoney": 3.00, "couponmoney": 10.00, "mtmoney": 9.90, "type": 1, "paytype": 3, "usersBalance": 30.00, "couponId": 123, "mtcode": "MT123456", "calculationDetail": { "originalAmount": 100.00, "memberDiscount": 5.00, "serviceDiscount": 3.00, "shopDiscount": 2.00, "couponDiscount": 10.00, "mtDiscount": 9.90, "finalAmount": 85.10 } } } ``` **响应参数**: - `id`: 预支付记录ID - `orderId`: 订单ID - `paycode`: 支付订单号 - `allmoney`: 原始总金额(固定不变,这是您最初存储的金额) - `finalAmount`: 实际应付金额(基于allmoney计算得出) - `wxmoney`: 微信支付金额 - `yemoney`: 余额支付金额 - `membermoney`: 会员优惠金额(固定不变) - `shopmoney`: 购物金抵扣金额(固定不变) - `servicemoney`: 服务金抵扣金额(固定不变) - `couponmoney`: 优惠券金额(实时计算) - `mtmoney`: 美团优惠金额(实时计算) - `type`: 订单类型 - `paytype`: 支付方式 - `usersBalance`: 用户余额 - `couponId`: 优惠券ID - `mtcode`: 美团优惠码 - `calculationDetail`: 计算明细 - `originalAmount`: 原始金额(allmoney) - `memberDiscount`: 会员优惠 - `serviceDiscount`: 服务金抵扣 - `shopDiscount`: 购物金抵扣 - `couponDiscount`: 优惠券金额 - `mtDiscount`: 美团优惠 - `finalAmount`: 最终应付金额 **业务逻辑**: 1. 验证用户登录状态和权限 2. 获取 `allmoney`(原始总金额,固定不变)和固定优惠金额(会员优惠、服务金抵扣、购物金抵扣) 3. 根据优惠券ID查询优惠券信息并验证有效性,计算优惠券优惠金额 4. 计算美团优惠金额(每次调用生成2至15的随机整数) 5. 基于 `allmoney` 减去所有优惠,计算实际应付金额: ``` 实际应付金额 = allmoney - 会员优惠 - 服务金抵扣 - 购物金抵扣 - 优惠券金额 - 美团优惠 ``` 6. 根据支付方式计算各支付渠道金额: - 微信支付:全部用微信支付 - 余额支付:验证余额是否足够,全部用余额支付 - 组合支付: - 余额足够:全部用余额支付 - 余额不足:优先扣除用户所有余额,剩余部分用微信支付 - 无余额:全部用微信支付 7. 更新预支付记录到数据库(注意:`allmoney` 保持不变) 8. 返回计算后的支付信息,包含计算明细 **错误处理**: - 用户未登录或token无效 - 预支付记录不存在 - 无权查看该预支付记录 - 优惠券无效或已被使用 - 优惠券不属于当前用户 - 优惠券已过期 - 订单金额未达到优惠券使用条件 - 余额不足 - 无效的支付方式 - 更新预支付记录失败 **注意事项**: - `allmoney` 是您最初存储的总金额,永远不会改变,所有计算都基于这个金额 - 每次调用都会基于 `allmoney` 重新计算,确保前端能实时获取最新的支付信息 - 会员优惠、服务金抵扣、购物金抵扣金额在每次计算中保持不变 - 优惠券金额和美团优惠金额根据用户选择实时计算 - 美团优惠功能每次调用生成2至15的随机整数作为优惠金额(用于测试) - 优惠券验证包括状态、归属权、过期时间、最低消费等 - 组合支付逻辑: - 余额足够:全部用余额支付(wxmoney=0, yemoney=实际金额) - 余额不足:优先扣除用户所有余额,剩余部分用微信支付(wxmoney=差额, yemoney=用户余额) - 无余额:全部用微信支付(wxmoney=实际金额, yemoney=0) - 所有金额计算都使用BigDecimal确保精度 - 返回的calculationDetail字段方便前端理解金额构成和计算过程 - 更新数据库时,`allmoney` 字段保持不变