Linkpoint payment gateway 能否在未来日期扣款?
结论
可以为未来日期的 invoice 安排扣款,但仅创建一张日期在未来的 invoice,通常不会让 LinkPoint 自动延迟扣款。
具体能否实现,取决于 LinkPoint 商户账户是否具备以下至少一种能力:
- 定期付款或计划付款;
- 通过 token 或客户付款档案安全保存银行卡信息;
- 由你的系统在指定日期调用支付接口扣款。
如果账户不支持这些功能,就需要先取得用户授权,再通过符合 PCI DSS 要求的支付服务保存付款凭证,并在 invoice 到期时通过定时任务发起交易。不要把完整卡号或 CVV 直接存入自己的数据库。
为什么不能现在授权、以后再扣款
信用卡 authorization 通常有有效期。如果现在预授权,等到较晚的 invoice 日期再 capture,授权可能已经过期,交易也会因此失败。因此,“现在 authorize、未来 capture”只适用于网关和收单行允许的短期结算窗口,不能用来处理任意未来日期的扣款。
未来扣款一般按以下流程完成:
- 用户现在提交银行卡信息,并明确授权商户在未来扣款。
- 网关或合规的支付凭证服务返回 token。
- 系统保存 token、invoice ID 和计划扣款时间。
- 到期后,系统使用 token 发起一笔新的支付交易。
invoice 日期只是业务数据,本身不会触发网关交易。
实现步骤
1. 确认 LinkPoint 账户能力
LinkPoint 是较早期的支付产品名称。不同商户账户、接口及后续迁移平台支持的功能可能不同,需要向支付服务商或收单机构确认:
- 是否支持 card tokenization 或 Card Vault;
- 是否支持 recurring billing 或 scheduled payment;
- token 能否用于 merchant-initiated transaction;
- 首次保存银行卡时需要执行验证交易还是实际交易;
- 后续扣款需要提交哪些授权或交易标识;
- 是否支持 webhook,以及如何查询最终交易状态。
如果没有对应的接口文档,不要自行猜测 LinkPoint 的参数名称。
2. 获取持卡人的明确授权
结账页面需要清楚说明:
- 扣款金额;
- 预计扣款日期;
- 商户名称;
- 取消或修改授权的方式;
- 扣款失败后的重试规则。
如果金额可能变化,还需要提前说明金额的计算方式和允许范围。
3. 保存 token,而不是银行卡资料
银行卡信息应直接提交到网关提供的托管页面、SDK 或安全表单。你的系统只保存类似以下内容:
invoice_id
customer_id
payment_token
charge_at
amount
currency
status
不要保存 CVV。即使卡号已经加密,自行保存完整卡号仍会大幅扩大 PCI DSS 的合规范围。
4. 在到期日触发扣款
以下伪代码不依赖特定 SDK。createCharge()、字段名称和返回结构都需要按照实际 LinkPoint 或其后续平台的接口文档替换。
<?php
$invoice = findDueInvoice($invoiceId);
if ($invoice === null || $invoice->status !== 'scheduled') {
return;
}
$idempotencyKey = 'invoice-' . $invoice->id . '-payment-1';
$result = $gateway->createCharge([
'payment_token' => $invoice->payment_token,
'amount' => $invoice->amount,
'currency' => $invoice->currency,
'invoice_id' => $invoice->id,
'idempotency_key'=> $idempotencyKey,
]);
if ($result->approved) {
markInvoicePaid(
$invoice->id,
$result->transaction_id
);
} else {
markPaymentFailed(
$invoice->id,
$result->error_code
);
}
定时任务可以定期查询已经到达扣款时间的 invoice:
SELECT *
FROM invoices
WHERE status = 'scheduled'
AND charge_at <= CURRENT_TIMESTAMP;
每笔 invoice 都要使用稳定的幂等键,以免任务重跑或网络超时导致重复扣款。
如果 LinkPoint 支持计划付款
如果商户后台或 API 明确提供 scheduled payment/recurring billing,可以在用户提交银行卡时创建付款计划,由网关在指定日期执行。系统仍需保存网关返回的计划 ID,并通过 webhook 或交易查询确认扣款结果。创建计划后,不能直接把 invoice 标记为已支付。
计划付款能否只执行一次、是否允许指定任意日期,以及是否支持动态金额,都要以当前账户对应的接口文档为准。
注意事项
- 不要用长期预授权代替未来扣款,除非支付服务商明确确认授权有效期能够覆盖这段时间。
- 不要记录 CVV、完整卡号、磁道数据,也不要在请求日志中留下敏感信息。
- 定时任务需要处理超时、拒付、余额不足、银行卡过期和 token 失效等情况。
- 如果扣款结果不明确,应先查询原交易,不要马上再次提交。
- webhook 必须验证签名,并能正确处理重复投递。
- 金额应使用最小货币单位或精确的十进制定点类型,避免浮点误差。
- 保存用户授权记录、扣款时间、交易 ID 和失败原因,便于审计和客服处理。
- 如果当前 LinkPoint 账户不支持 tokenization 或计划付款,可以在到期前向客户发送付款链接,或改用支持安全保存付款凭证及未来商户发起扣款的支付平台。
备注:内容仅供参考。
