Sagepay(现Opayo)Form集成下repeat.vsp回调及重复支付问题
Opayo (Sagepay) Form集成:重复支付的响应捕获与实现经验
我之前帮几个客户处理过Opayo Form集成的重复支付需求,刚好能给你一些实用的解决方案:
一、如何捕获repeat.vsp的响应
你猜的方向没错,但Form集成虽然没有全局配置NotificationURL,你可以在发起repeat.vsp请求时主动指定这个参数——这是官方文档里容易被忽略的细节:
- 在构造
repeat.vsp的POST请求时,添加NotificationURL参数,值设置为你的服务器上专门接收重复支付回调的接口地址 - Opayo会将重复支付的结果(成功/失败等状态)以POST请求的形式发送到这个地址,响应格式和Server集成的Notification完全一致
- 你的服务器端需要验证响应的签名(用你的Vendor Security Key),再根据
Status字段处理后续逻辑(比如更新订单状态、记录交易日志)
二、Form集成实现重复支付的完整流程
已经有不少商家成功实现了这个场景,标准步骤是:
- 初始Form支付完成后,调用
getTransactionDetails接口,传入原交易的VendorTxCode或VPSTxId,获取对应的SecurityKey - 构造
repeat.vsp的POST请求,必填参数包括:VPSProtocol:指定版本(比如4.00)TxType:固定为REPEATVendor:你的Opayo商家账号VendorTxCode:新的唯一交易编号(不能和原交易重复)Amount:重复支付的金额Currency:交易货币(和原交易一致)SecurityKey:从getTransactionDetails获取的密钥NotificationURL:你的回调接口地址
- 将请求发送到对应环境的
repeat.vsp地址:- 测试环境:
https://test.sagepay.com/gateway/service/repeat.vsp - 生产环境:
https://live.sagepay.com/gateway/service/repeat.vsp
- 测试环境:
- 服务器接收Opayo的回调响应,验证签名后处理业务逻辑
三、注意事项
- 确保
NotificationURL是公网可访问的地址,Opayo无法回调内网地址 - 重复支付的金额、货币必须和原交易匹配(部分场景允许小额调整,需提前联系Opayo开通)
- 签名验证逻辑要和Form集成的返回URL验证逻辑一致,避免伪造回调
内容的提问来源于stack exchange,提问作者AnthonyH




