如何验证SSL证书是否阻止Exact Online API Webhook的JSON响应?
排查Exact Online Webhook Payload无法接收的问题
首先,我注意到你可能混淆了创建订阅的请求和Webhook回调的请求——这是两个完全独立的HTTP请求,不能在同一个请求周期里读取回调的payload。先纠正这个逻辑问题,再一步步排查:
1. 修正代码逻辑:分离订阅创建与回调处理
你的当前代码在save()(创建订阅)后立刻读取php://input,但此时读取的是你访问脚本的请求(比如GET请求)的输入,而非Exact发送的回调POST请求。需要把逻辑拆分:
<?php // 假设$connection、$callback、$topic已经初始化 if ($_SERVER['REQUEST_METHOD'] === 'GET') { // 处理订阅创建请求(你手动访问这个脚本时触发) $subscription = new \Picqer\Financials\Exact\WebhookSubscription($connection); $subscription->deleteSubscriptions(); $subscription->CallbackURL = $callback; $subscription->Topic = $topic; $subscription->save(); echo "Webhook subscription created successfully"; } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { // 处理Exact的回调请求(Exact主动发送) $input = file_get_contents('php://input'); // 把payload写入日志文件,避免输出丢失 file_put_contents('webhook_callback_log.txt', date('Y-m-d H:i:s') . ":\n" . $input . "\n\n", FILE_APPEND); // 必须返回200响应给Exact,否则它可能重试或标记订阅异常 http_response_code(200); echo "OK"; }
修改后,先通过GET访问脚本创建订阅,然后触发对应Topic的数据变更(比如修改一条Exact里的记录),再查看日志文件是否有内容。
2. 排查SSL证书问题
你怀疑SSL证书是根源,可以通过以下方式验证:
- 本地证书链测试:在服务器或本地执行命令:
查看输出末尾的openssl s_client -connect your-callback-domain.com:443 -servername your-callback-domain.comVerify return code,如果是0 (ok)说明证书验证正常;如果是其他错误(比如18 (self signed certificate)、20 (unable to get local issuer certificate)),则需要修复证书(比如安装完整的CA链、更换有效证书)。 - TLS版本兼容性:Exact可能只支持TLS 1.2及以上版本,测试你的服务器是否支持:
如果连接失败,需要在服务器配置(Apache/Nginx)中启用TLS 1.2+。curl -v --tlsv1.2 https://your-callback-domain.com - 检查服务器CA bundle:确保服务器的PHP配置中
openssl.cafile指向完整的CA证书包,否则PHP可能无法验证Exact的请求证书,导致请求被拦截。
3. 验证回调端点的可用性
用工具模拟Exact的回调请求,确认你的端点能正常接收JSON payload:
- 用curl发送模拟请求:
查看日志文件是否收到这个测试payload。如果模拟请求能正常记录,说明你的端点没问题,问题出在Exact的触发逻辑;如果模拟请求也无法记录,检查:curl -X POST -H "Content-Type: application/json" -d '{"test": "payload"}' https://your-callback-domain.com/your-script.php- PHP是否开启了
allow_url_fopen(不过php://input不受这个影响) - 服务器是否有安全模块(比如ModSecurity)拦截了JSON POST请求
post_max_size配置是否过小(检查php.ini)
- PHP是否开启了
4. 检查Exact Webhook的触发条件与权限
- 确认Topic权限:你的Exact账号必须拥有订阅Topic对应模块的API权限,否则Webhook不会触发。可以在Exact的API控制台中检查权限配置。
- 触发事件:Webhook只会在对应Topic的数据发生变更时触发(比如新增、修改、删除记录),订阅创建后不会自动发送测试请求。你需要手动在Exact中修改一条对应Topic的记录,触发回调。
- 查看Exact的Webhook日志:登录Exact Online,进入Webhook管理页面,查看是否有回调失败的记录(比如HTTP错误码、超时),这能直接定位Exact无法发送回调的原因。
5. 检查服务器访问日志
查看Apache/Nginx的访问日志,确认Exact的请求是否到达你的服务器:
- 如果日志中没有来自Exact IP的POST请求,说明Exact没有发送回调(可能是订阅配置错误、权限不足)
- 如果有请求但状态码是4xx/5xx,根据状态码排查:
- 403:权限拦截(比如.htaccess、安全模块)
- 500:服务器内部错误(查看PHP错误日志)
- 404:回调URL配置错误
内容的提问来源于stack exchange,提问作者AndyG




