Mollie Webhook未触发问题排查求助
我来帮你梳理几个关键的排查方向,毕竟手动访问正常但Mollie不触发的情况,大多和Mollie的请求规则、服务器拦截或代码处理逻辑有关:
先查Mollie后台的Webhook日志
登录Mollie仪表盘,找到对应的测试支付记录,查看它的Webhook调用详情——Mollie会完整记录每一次调用的尝试、返回状态码和失败原因。这是最直接的排查入口,比如有没有返回4xx/5xx错误,或者请求被拒绝的提示,都能在这里找到线索。确认Webhook URL的SSL和可达性
Mollie要求Webhook必须用HTTPS,且证书是受信任的(不能用自签证书,测试环境可以用Let's Encrypt免费证书)。另外,你可以用curl模拟Mollie的POST请求,测试服务器是否正常响应:curl -X POST -H "Content-Type: application/json" https://[mysite]/webhook.php同时检查服务器的访问日志(不是错误日志),看看有没有Mollie的IP发起的请求被拦截。很多服务器的防火墙、ModSecurity规则会拦截非浏览器的POST请求,你可以把Mollie官方公布的IP段加入白名单试试。
核心问题:处理Mollie的JSON请求体
你的代码里直接用$_POST["id"]获取支付ID,但Mollie的Webhook请求是JSON格式的POST请求,不是传统的表单键值对!手动访问是GET请求,所以插入数据库的代码能跑,但Mollie发请求时$_POST["id"]是空的,会导致后续代码报错,服务器返回500错误,Mollie就会停止重试。
正确的处理方式应该是先读取JSON请求体:// 先获取Mollie发送的JSON数据 $input = file_get_contents('php://input'); $webhookData = json_decode($input, true); // 拿到支付ID $paymentId = $webhookData['id']; $payment = $mollie->payments->get($paymentId);这大概率是导致Webhook不触发的主要原因。
检查Webhook的响应要求
Mollie要求Webhook必须快速返回200 OK的响应(最好5秒内),如果代码执行超时、抛出错误导致返回非200状态,Mollie会判定调用失败。你可以先简化代码,只返回200,测试Mollie是否能触发:http_response_code(200); echo "OK"; exit;如果这样能触发,再逐步加回业务逻辑,排查哪一步出问题。
确认测试支付的状态是否真的触发了Webhook
测试环境下,部分支付方式(比如iDEAL)需要手动模拟支付完成——你得在Mollie的测试界面点击“完成支付”,确保支付状态变为“已支付”,Mollie才会调用Webhook。不要只跳转到redirect页面就认为流程结束了。
内容的提问来源于stack exchange,提问作者GottaLovePizzas

