331 lines
9.2 KiB
Markdown
331 lines
9.2 KiB
Markdown
# 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` 字段保持不变 |