You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何验证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.com
    
    查看输出末尾的Verify return code,如果是0 (ok)说明证书验证正常;如果是其他错误(比如18 (self signed certificate)20 (unable to get local issuer certificate)),则需要修复证书(比如安装完整的CA链、更换有效证书)。
  • TLS版本兼容性:Exact可能只支持TLS 1.2及以上版本,测试你的服务器是否支持:
    curl -v --tlsv1.2 https://your-callback-domain.com
    
    如果连接失败,需要在服务器配置(Apache/Nginx)中启用TLS 1.2+。
  • 检查服务器CA bundle:确保服务器的PHP配置中openssl.cafile指向完整的CA证书包,否则PHP可能无法验证Exact的请求证书,导致请求被拦截。

3. 验证回调端点的可用性

用工具模拟Exact的回调请求,确认你的端点能正常接收JSON payload:

  • 用curl发送模拟请求:
    curl -X POST -H "Content-Type: application/json" -d '{"test": "payload"}' https://your-callback-domain.com/your-script.php
    
    查看日志文件是否收到这个测试payload。如果模拟请求能正常记录,说明你的端点没问题,问题出在Exact的触发逻辑;如果模拟请求也无法记录,检查:
    • PHP是否开启了allow_url_fopen(不过php://input不受这个影响)
    • 服务器是否有安全模块(比如ModSecurity)拦截了JSON POST请求
    • post_max_size配置是否过小(检查php.ini)

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

火山引擎 最新活动