卡券前端兑换接口文档

1. 说明

  • 文档范围:仅包含前端会员侧“卡券兑换”相关接口。
  • 会员中心入口装配文件:/Users/water/Desktop/www/shop/app/common/services/member/center/MemberCenterService.php
  • 前端兑换控制器:/Users/water/Desktop/www/shop/app/frontend/modules/cardVoucher/controllers/RechargeController.php
  • 路由机制:项目走前端模块自动路由,前端请求建议统一传 route 参数。
  • 本模块推荐路由:
    • cardVoucher.recharge.index
    • cardVoucher.recharge.bind
    • cardVoucher.recharge.scanRecharge
  • 鉴权:兑换接口需要会员登录态;会员中心入口接口按现有会员中心逻辑返回。
  • 返回格式:统一调用 successJson() / errorJson()

2. 通用返回格式

2.1 成功

{
  "result": 1,
  "msg": "获取成功",
  "data": {}
}

2.2 失败

{
  "result": 0,
  "msg": "错误提示文案"
}

3. 会员中心入口

3.1 会员中心数据

  • 路由:member.member.memberData
  • 说明:获取会员中心页面数据,营销互动区域是否返回“卡券兑换”入口,由后端统一装配。

卡券入口出现条件

  • 当前商城 uniacid 下存在卡券数据。
  • 判断逻辑文件:/Users/water/Desktop/www/shop/app/common/services/member/center/MemberCenterService.php
  • 当前判断方式:查询 yz_card_voucher_electronic_order_item.app_id = 当前商城ID 是否存在记录。

返回中的卡券入口结构

当满足条件时,会员中心数据里会附带如下入口:

{
  "name": "card-voucher",
  "title": "卡券兑换",
  "class": "icon-member_changer_centre",
  "url": "xxxxx",
  "image": "member_a(74).png",
  "mini_url": "x'x'xxxxx",
  "type_1": "service",
  "type_2": "market",
  "weight_1": 2700,
  "weight_2": 10800,
  "default_weight": 29
}

前端处理建议

  • 有该入口时显示“卡券兑换”。
  • 无该入口时不显示,不需要额外调开关接口。
  • 小程序跳转地址和 H5需要提供给后端

4. 卡券兑换首页初始化

4.1 获取兑换页基础数据

  • 路由:cardVoucher.recharge.index
  • 说明:进入卡券兑换页时调用,返回当前商城名称、支持的兑换方式、使用规则提示、是否支持扫码。

请求参数

返回 data

字段 类型 说明
app_id int 当前商城 ID
app_name string 当前商城名称
redeem_method_list array 当前商城支持的兑换方式列表
default_redeem_method int 默认兑换方式
tips array 使用规则提示,来自当前商城启用中的产品档案 usage_rule 去重结果
support_scan int 是否支持扫码,固定返回 1

redeem_method_list 单项

字段 类型 说明
value int 兑换方式值
label string 兑换方式名称

当前支持的兑换方式

value 说明
1 仅输券密
2 券号 + 券密

成功示例

{
  "result": 1,
  "msg": "获取成功",
  "data": {
    "app_id": 12,
    "app_name": "商城A",
    "redeem_method_list": [
      {
        "value": 1,
        "label": "仅输券密"
      },
      {
        "value": 2,
        "label": "券号+券密"
      }
    ],
    "default_redeem_method": 1,
    "tips": [
      "仅限本商城使用",
      "充值后不可撤销"
    ],
    "support_scan": 1
  }
}

5. 手动兑换

5.1 卡券充值到余额

  • 路由:cardVoucher.recharge.bind
  • 说明:会员手动输入券密或券号+券密后,将卡券充值到当前会员余额。
  • 事务:后端使用事务处理,充值成功后会同时写余额变动和卡券充值状态。

请求参数

字段 类型 必填 说明
redeem_method int 兑换方式:1 仅输券密,2 券号+券密
voucher_secret string 券密
voucher_code string 条件必填 redeem_method=2 时必填

兑换成功后后端处理

  • 给当前登录会员增加余额
  • 余额变动 source 使用 ConstService::SOURCE_RECHARGE_CODE
  • 卡券状态更新为已充值
  • 记录充值会员 ID、昵称、手机号、充值金额、充值时间
  • 同一张卡券不能重复充值

返回 data

字段 类型 说明
member_id int 当前会员 ID
redeem_amount string 本次充值金额,保留 2 位小数
voucher_code string 券号
app_name string 所属商城名称

成功示例

{
  "result": 1,
  "msg": "充值成功",
  "data": {
    "member_id": 9527,
    "redeem_amount": "100.00",
    "voucher_code": "DZ202606260001",
    "app_name": "商城A"
  }
}

6. 扫码兑换

6.1 扫码充值到余额

  • 路由:cardVoucher.recharge.scanRecharge
  • 说明:前端先识别二维码内容,再把扫码结果原文传给后端,由后端解析卡券参数并完成充值。

请求参数

字段 类型 必填 说明
scan_result string 扫码得到的原始内容,支持完整 URL 或仅 query 参数字符串

后端支持解析的二维码参数

字段 说明
order_no 卡券订单号,可选
stock_no 备券单号,可选
voucher_code 券号,必需
voucher_secret 券密,必需

二维码内容示例

完整链接:

https://xxx.com/app/index.php?i=12&route=cardVoucher/recharge&order_no=EV202606260001&stock_no=BK202606260001&voucher_code=DZ202606260001&voucher_secret=ABC123456

仅参数字符串:

order_no=EV202606260001&stock_no=BK202606260001&voucher_code=DZ202606260001&voucher_secret=ABC123456

返回 data

与手动兑换一致:

字段 类型 说明
member_id int 当前会员 ID
redeem_amount string 本次充值金额
voucher_code string 券号
app_name string 所属商城名称

7. 后端校验逻辑

以下校验由后端统一处理,前端不需要自行判断业务真伪,但建议按错误提示直接透出。

7.1 基础校验

  • 未登录:请先登录
  • 会员不存在:会员不存在
  • 扫码结果为空:扫码结果不能为空
  • 扫码链接缺少参数:扫码链接缺少卡券参数
  • 兑换方式为空或非法:兑换方式不能为空
  • 券密为空:券密不能为空
  • 券号为空:券号不能为空
  • 卡券不存在或校验失败:卡券不存在或校验失败

7.2 商城归属校验

  • 只允许兑换属于当前商城的卡券
  • 错误提示:当前卡券不属于本商城

7.3 卡券状态校验

  • 禁用:当前卡券已禁用,无法充值
  • 作废:当前卡券已作废,无法充值
  • 未激活:当前卡券未激活,无法充值
  • 未到可用时间:当前卡券未到可用时间
  • 已过期:当前卡券已过期,无法充值
  • 已充值过:当前卡券已充值,不能重复使用

7.4 金额校验

  • 若卡面金额异常或拆分后金额小于等于 0
  • 错误提示:卡券充值金额不正确

8. 充值金额规则

后端金额计算逻辑如下:

  • 如果卡项自身 face_amount > 0,本次充值金额直接取该金额
  • 如果卡项 face_amount <= 0,则按订单总面额 total_face_amount / sale_count 平摊
  • 最终金额保留 2 位小数

9. 前端对接建议

9.1 页面流程

  1. member.member.memberData 判断是否显示“卡券兑换”入口
  2. 进入兑换页后调 cardVoucher.recharge.index 获取页面配置
  3. 用户选择兑换方式
  4. 手动输入时调用 cardVoucher.recharge.bind
  5. 扫码时前端拿到二维码原文后调用 cardVoucher.recharge.scanRecharge
  6. 成功后刷新会员余额信息

9.2 错误处理建议

  • 业务错误直接使用后端 msg 提示
  • 对“当前卡券不属于本商城”“已过期”“未激活”“已充值”这类提示不要二次改写
  • 扫码失败时,前端优先判断是否拿到 scan_result;只要拿到了就交给后端校验

9.3 UI 提示建议

  • 手动兑换页建议展示 tips
  • support_scan=1 时展示“扫码兑换”入口
  • 兑换成功后展示充值金额和券号

10. 代码参考

  • 会员中心入口装配:/Users/water/Desktop/www/shop/app/common/services/member/center/MemberCenterService.php
  • 会员中心接口:/Users/water/Desktop/www/shop/app/frontend/modules/member/controllers/MemberController.php
  • 卡券兑换控制器:/Users/water/Desktop/www/shop/app/frontend/modules/cardVoucher/controllers/RechargeController.php