绑卡有效期至少 30 天校验

1. 背景与目标

当前部分绑卡页面只判断卡是否已经过期,统一绑卡服务端主要校验有效期字段是否填写,尚未在调用支付通道前统一限制剩余有效期。

本需求增加统一规则:新绑定银行卡的剩余有效期必须大于等于 30 个自然日。不满足时直接阻止绑卡,避免绑定后很快失效并影响后续扣款。

2. 适用范围

  • 所有接入现有绑卡流程的现金贷 App、H5 和绑卡短链入口。
  • Paystack、Monnify 及其他需要提交卡有效期的绑卡通道。
  • 首次绑卡、重新绑卡和更换银行卡。

本期不对已经绑定成功的历史卡批量重新校验,也不修改银行卡解绑、默认卡切换和自动代扣规则。

3. 有效期计算口径

银行卡只提供到期月份 MM/YY,因此统一按该月份的最后一个自然日作为卡片到期日。

剩余有效天数 = 卡片到期月份最后一日 - 服务端当前业务日期

判断规则:

  • 剩余有效天数大于等于 30:允许继续绑卡。
  • 剩余有效天数小于 30:不允许绑卡。
  • 恰好等于 30 天:允许绑卡。
  • 当前业务日期以 Africa/Lagos 时区为准,不使用用户设备时间作为最终判断依据。
  • 按自然日计算,不按 30×24 小时计算;闰年和不同月份天数按实际日历处理。

示例:

服务端业务日期用户填写统一到期日剩余有效天数结果
2026-08-2108/262026-08-3110 天不允许绑卡
2026-08-2109/262026-09-3040 天允许绑卡
2026-09-0109/262026-09-3029 天不允许绑卡
任意日期到期日恰好为当前日期后第 30 天对应月份最后一日30 天允许绑卡

4. 功能规则

  1. 用户填写有效期时,前端先校验 MM/YY 格式、月份范围和剩余有效期,尽早给出提示。
  2. 用户提交绑卡后,服务端必须按相同口径重新计算,服务端结果为最终结果。
  3. 有效期格式错误、月份不是 01–12、已经过期或剩余不足 30 天时,均不得进入支付通道绑卡。
  4. 校验不通过时,不创建有效绑卡订单、不生成新的通道交易参考号、不调用 Paystack、Monnify 或其他通道。
  5. 校验通过只代表有效期符合要求,卡号、CVV、身份、余额和通道验证仍按现有规则执行。
  6. 所有绑卡入口必须使用同一服务端判断,不能只依赖某一个 App 或 H5 的前端校验。
  7. 同一次提交在前端校验通过、服务端校验失败时,以服务端失败为准,并展示统一提示。

5. 页面处理

5.1 输入阶段

  • 有效期继续使用 MM/YY 格式。
  • 输入未完成时不提前显示“剩余不足 30 天”。
  • 输入完成且格式错误时,提示:Invalid expiry date.
  • 输入完成且剩余有效期不足 30 天时,提示:Please use a card that is valid for at least 30 more days.
  • 用户修改有效期后重新校验;满足规则时清除原提示。

5.2 提交阶段

  • 服务端返回“剩余有效期不足 30 天”时,页面停留在绑卡信息页并定位到有效期字段。
  • 保留用户已填写的非敏感页面状态;CVV 是否保留继续沿用现有安全规则。
  • 不展示支付通道原始错误,不提示用户重复提交同一有效期。

6. 异常与边界场景

场景处理规则
用户设备日期不准确前端结果仅用于即时提示,提交后以服务端 Lagos 业务日期为准
提交发生在 Lagos 日期切换前后服务端按收到绑卡请求时的业务日期重新计算
二月或闰年使用对应年份二月的实际最后一日
MM/YY 年份无法解析按有效期格式错误处理,不调用通道
前端版本未升级或接口被直接调用服务端仍执行 30 天校验并阻止通道调用
支付通道返回的卡有效期与用户填写不一致不覆盖本次输入;按现有通道异常流程处理
已绑定历史卡剩余不足 30 天本需求不追溯拦截;后续卡状态和扣款继续沿用现有规则

7. 埋点要求

场景页面及 owner事件名 / 类型唯一触发时机属性及来源指标
有效期限制提示Native:bind_card_details_native / 对应 App;H5:bind_card_details_h5 / 绑卡 H5bind_card_expiry_restriction_view / view“格式错误”或“剩余不足 30 天”提示首次变为可见时event_page 取所属页面;entry_scene 取稳定入口枚举;validation_result=invalid_format/less_than_30_days;validation_source=client/server拦截量、服务端二次拦截率及修正后提交率

禁止采集卡号、卡指纹、CVV、具体有效期、剩余天数、通道参考号、客户身份信息或原始错误文本。服务端拒绝结果必须取可信业务返回,不能用按钮点击代替。

8. 验收标准

  1. 所有新绑卡入口均按有效期月份最后一日计算剩余自然日。
  2. 剩余 29 天及以下时,前端提示且服务端阻止绑卡。
  3. 剩余恰好 30 天或超过 30 天时,可以继续现有绑卡流程。
  4. 服务端使用 Africa/Lagos 业务日期,不受用户设备日期和时区影响。
  5. 当前月、跨年、二月和闰年的计算结果符合实际日历。
  6. 前端未升级、绕过前端或直接调用服务端时,30 天规则仍然有效。
  7. 校验失败不会创建有效绑卡订单、通道参考号或调用支付通道。
  8. 校验通过后,原有卡号、CVV、身份和通道校验不受影响。
  9. 页面展示统一英文提示,并能在用户修改为合格有效期后正常提交。
  10. 埋点不包含任何卡片或客户敏感信息,客户端提示和服务端拒绝能够区分统计。

9. 当前实现参考

  • PocketBuy PayApp 已判断卡是否早于当前月份,但尚未限制剩余有效期至少 30 天。
  • 统一绑卡服务端当前主要校验有效期月份、年份非空,并处理年月传反,未在调用通道前判断剩余有效天数。
  • BNS 在绑卡成功后会根据有效期标记卡状态,但该处理不能替代本次绑卡提交前校验。

本需求实施后,30 天限制必须落在统一绑卡服务端;前端校验仅作为即时体验优化。