Node.js站点Stripe Checkout按钮集成reCAPTCHA防机器人方案咨询
Stripe Checkout无本地表单场景接入reCAPTCHA拦截机器人的实现方案
该场景完全可以实现拦截,核心逻辑是切断「前端点击按钮直接跳转Stripe托管页」的直连路径,把跳转逻辑改成人机校验后置触发,不需要依赖本地表单提交,具体实现分三层:
前端改造
- 移除3个服务支付按钮上原有的Stripe默认跳转绑定,所有按钮初始绑定自定义点击事件,同时给每个按钮打上对应服务的唯一标识参数。
- 接入reCAPTCHA,优先选v3版本做无感校验,不干扰正常用户支付流程;如果攻击量高可以搭配v2复选框版本做二次拦截。页面加载时先初始化reCAPTCHA资源,资源加载完成前保持支付按钮为禁用状态,避免异常点击。
- 用户点击支付按钮时,不直接触发Stripe跳转,先调用reCAPTCHA方法获取校验token:
- v3版本调用
grecaptcha.execute(站点公钥, {action: 'create_stripe_checkout'})获取token - v2版本等用户完成校验滑块/复选框操作后,从组件实例拿取响应token
- v3版本调用
- 拿到token后,将token、当前选中的服务ID两个参数,通过POST请求发送到自有Node.js服务的创建支付会话接口,比如
/api/pay/create-session。 - 接口请求过程中给按钮加loading状态,避免用户重复点击。
Node.js后端逻辑
- 把你之前PHP环境下的reCAPTCHA校验逻辑平移到Node.js即可:收到前端请求后,先取请求来源的真实用户IP,把reCAPTCHA secret密钥、前端传来的token、用户IP三个参数提交到reCAPTCHA校验接口做验证。
- 校验规则:v3版本得分低于0.5的请求直接返回403拒绝;v2版本校验失败的请求直接返回错误提示,一律不生成Stripe支付会话。
- 只有reCAPTCHA校验通过的请求,才做下一步参数校验:确认前端传来的服务ID属于你站点上线的3个有效服务范畴,过滤非法构造的请求。
- 参数校验通过后,再调用Stripe服务端SDK生成Checkout Session,把生成的会话URL返回给前端。
- 接口层必须加频率限制:单IP1分钟内最多允许请求3次创建会话接口,单设备指纹10分钟内超过5次请求直接临时拉黑,进一步压缩机器人批量刷的空间。
跳转逻辑收尾
- 前端拿到后端返回的200响应和Stripe Checkout会话URL后,直接通过
window.location.href跳转到Stripe托管支付页即可,用户侧感知和原来的直跳逻辑没有区别。 - 如果后端返回校验失败、频率超限的错误,直接在当前页弹提示告知用户访问存在异常,不执行跳转。
额外防护补充
不要把reCAPTCHA作为唯一防护手段,配合Stripe自带的风控规则效果更好:
- 在Stripe后台开启高风险支付自动拦截,强制开启CVC校验、账单邮编校验,把公开的测试卡段加入自定义拦截规则
- 配置Stripe Checkout时要求用户必填联系邮箱,后端收到支付成功的webhook回调时,核对短时间内同IP、同邮箱的支付频次,异常订单直接标记为欺诈做退款处理
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

