PHP WordPress手动集成Stripe SEPA定期支付遇mandate参数错误求助
解决Stripe SEPA订阅中
mandate参数错误及正确配置方法 错误原因
你在调用Subscription::create()时传入了mandate参数,但该参数不属于Stripe订阅API的合法请求字段,因此返回400错误。SEPA Debit的客户授权(Mandate)需要通过规范字段传递,而非直接在订阅创建时传入mandate。
代码修正要点
- 移除无效参数:删除订阅创建代码中的
mandate和过时的default_source参数(已在Customer对象中设置默认支付方式,无需重复传递) - 正确传递客户授权信息:通过
payment_method_options.sepa_debit.mandate_options字段传递SEPA授权的客户接受信息,符合Stripe API规范 - 优化Customer创建逻辑:直接在Customer创建时设置默认支付方式,省去单独调用
save()的步骤
修正后的完整代码
$iban = $_POST['useriban']; $username = $_POST['username']; $email = $_POST['useremail']; // 创建SEPA Debit支付方式 $paymentMethod = \Stripe\PaymentMethod::create([ 'type' => 'sepa_debit', 'sepa_debit' => [ 'iban' => $iban, ], 'billing_details' => [ 'name' => $username, 'email' => $email, ], ]); // 创建客户并绑定默认支付方式 $customer = \Stripe\Customer::create([ 'name' => $username, 'email' => $email, 'payment_method' => $paymentMethod->id, 'invoice_settings' => [ 'default_payment_method' => $paymentMethod->id, ], ]); // 创建SEPA定期订阅 $subscription = \Stripe\Subscription::create([ 'customer' => $customer->id, 'items' => [ [ 'price' => 'plan_ODaZeXLlnFADJZ', // 替换为你的产品价格ID ], ], 'payment_behavior' => 'default_incomplete', // 处理SEPA异步授权逻辑,可选但推荐 'payment_method_options' => [ 'sepa_debit' => [ 'mandate_options' => [ 'customer_acceptance' => [ 'type' => 'online', 'online' => [ 'ip_address' => $_SERVER['REMOTE_ADDR'], 'user_agent' => $_SERVER['HTTP_USER_AGENT'], // 添加用户代理,满足合规要求 ], ], ], ], ], ]);
关键说明
payment_behavior设置:SEPA Debit授权需要异步验证,使用default_incomplete可以让订阅处于待激活状态,直到Stripe确认授权完成,避免订阅创建失败- 合规要求:必须记录客户接受授权的IP地址和用户代理信息,这是SEPA法规的强制要求
- Mandate自动生成:Stripe会根据你传递的客户接受信息自动创建并关联Mandate,无需手动创建Mandate对象
内容的提问来源于stack exchange,提问作者Muhammad Jamil Baig
相关产品推荐
相关产品推荐

