绑卡有效期至少 30 天校验
1. 背景与目标
当前部分绑卡页面只判断卡是否已经过期,统一绑卡服务端主要校验有效期字段是否填写,尚未在调用支付通道前统一限制剩余有效期。
本需求增加统一规则:新绑定银行卡的剩余有效期必须大于等于 30 个自然日。不满足时直接阻止绑卡,避免绑定后很快失效并影响后续扣款。
2. 适用范围
- 所有接入现有绑卡流程的现金贷 App、H5 和绑卡短链入口。
- Paystack、Monnify 及其他需要提交卡有效期的绑卡通道。
- 首次绑卡、重新绑卡和更换银行卡。
本期不对已经绑定成功的历史卡批量重新校验,也不修改银行卡解绑、默认卡切换和自动代扣规则。
3. 有效期计算口径
银行卡只提供到期月份 MM/YY,因此统一按该月份的最后一个自然日作为卡片到期日。
剩余有效天数 = 卡片到期月份最后一日 - 服务端当前业务日期判断规则:
- 剩余有效天数大于等于 30:允许继续绑卡。
- 剩余有效天数小于 30:不允许绑卡。
- 恰好等于 30 天:允许绑卡。
- 当前业务日期以
Africa/Lagos时区为准,不使用用户设备时间作为最终判断依据。 - 按自然日计算,不按 30×24 小时计算;闰年和不同月份天数按实际日历处理。
示例:
| 服务端业务日期 | 用户填写 | 统一到期日 | 剩余有效天数 | 结果 |
|---|---|---|---|---|
| 2026-08-21 | 08/26 | 2026-08-31 | 10 天 | 不允许绑卡 |
| 2026-08-21 | 09/26 | 2026-09-30 | 40 天 | 允许绑卡 |
| 2026-09-01 | 09/26 | 2026-09-30 | 29 天 | 不允许绑卡 |
| 任意日期 | 到期日恰好为当前日期后第 30 天 | 对应月份最后一日 | 30 天 | 允许绑卡 |
4. 功能规则
- 用户填写有效期时,前端先校验
MM/YY格式、月份范围和剩余有效期,尽早给出提示。 - 用户提交绑卡后,服务端必须按相同口径重新计算,服务端结果为最终结果。
- 有效期格式错误、月份不是
01–12、已经过期或剩余不足 30 天时,均不得进入支付通道绑卡。 - 校验不通过时,不创建有效绑卡订单、不生成新的通道交易参考号、不调用 Paystack、Monnify 或其他通道。
- 校验通过只代表有效期符合要求,卡号、CVV、身份、余额和通道验证仍按现有规则执行。
- 所有绑卡入口必须使用同一服务端判断,不能只依赖某一个 App 或 H5 的前端校验。
- 同一次提交在前端校验通过、服务端校验失败时,以服务端失败为准,并展示统一提示。
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 / 绑卡 H5 | bind_card_expiry_restriction_view / view | “格式错误”或“剩余不足 30 天”提示首次变为可见时 | event_page 取所属页面;entry_scene 取稳定入口枚举;validation_result=invalid_format/less_than_30_days;validation_source=client/server | 拦截量、服务端二次拦截率及修正后提交率 |
禁止采集卡号、卡指纹、CVV、具体有效期、剩余天数、通道参考号、客户身份信息或原始错误文本。服务端拒绝结果必须取可信业务返回,不能用按钮点击代替。
8. 验收标准
- 所有新绑卡入口均按有效期月份最后一日计算剩余自然日。
- 剩余 29 天及以下时,前端提示且服务端阻止绑卡。
- 剩余恰好 30 天或超过 30 天时,可以继续现有绑卡流程。
- 服务端使用
Africa/Lagos业务日期,不受用户设备日期和时区影响。 - 当前月、跨年、二月和闰年的计算结果符合实际日历。
- 前端未升级、绕过前端或直接调用服务端时,30 天规则仍然有效。
- 校验失败不会创建有效绑卡订单、通道参考号或调用支付通道。
- 校验通过后,原有卡号、CVV、身份和通道校验不受影响。
- 页面展示统一英文提示,并能在用户修改为合格有效期后正常提交。
- 埋点不包含任何卡片或客户敏感信息,客户端提示和服务端拒绝能够区分统计。
9. 当前实现参考
- PocketBuy PayApp 已判断卡是否早于当前月份,但尚未限制剩余有效期至少 30 天。
- 统一绑卡服务端当前主要校验有效期月份、年份非空,并处理年月传反,未在调用通道前判断剩余有效天数。
- BNS 在绑卡成功后会根据有效期标记卡状态,但该处理不能替代本次绑卡提交前校验。
本需求实施后,30 天限制必须落在统一绑卡服务端;前端校验仅作为即时体验优化。