You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Paddle支付成功后Webhook未返回邮箱或客户信息问题

Paddle支付成功后Webhook未返回邮箱或客户信息问题

嘿,我之前在自定义PHP项目里集成Paddle的时候也碰到过类似的坑!你想在支付成功后拿客户邮箱发许可证,结果Webhook没返回需要的信息,对吧?给你几个实用的排查和解决方向:

1. 先确认你监听的是正确的Webhook事件

Paddle的Webhook事件分好几种,只有transaction.completed这类交易完成的事件才会完整返回客户信息。如果你监听的是其他事件(比如checkout.created),那肯定拿不到邮箱。先去Paddle后台的Webhook设置里,确认你勾选了transaction.completed这个事件。

2. 检查Webhook的字段配置

有时候Paddle默认不会返回所有客户字段,你得手动开启。在Paddle后台的Webhook设置页面,找一找有没有“Include customer data”或者类似的选项,一定要把它勾选上,这样Webhook的payload里才会包含客户邮箱、姓名这些信息。

3. 查看Paddle的Webhook日志,确认实际返回的内容

这一步很关键!去Paddle Dashboard的Webhook历史记录里,找到最近成功支付的那条请求,看看实际发送的payload里有没有customer.email这个字段。

  • 如果日志里有,但你的代码拿不到,那就是你接收代码的问题(比如JSON解析错误、字段名写错了,或者签名验证失败导致你丢弃了数据)
  • 如果日志里也没有,那就是Paddle那边的配置没开,回到第二步检查。

4. 用Paddle API兜底查询

如果Webhook实在拿不到,还有个靠谱的办法:支付成功后,用Webhook返回的交易ID(data.id)调用Paddle的Transactions API,直接查询客户信息。

给你一段PHP代码示例,参考一下:

接收Webhook并处理的代码

// 读取Paddle发送的Webhook数据
$payload = file_get_contents('php://input');
$webhookData = json_decode($payload, true);

// 先验证Paddle的签名(这一步必须做,防止恶意请求)
// 这里假设你已经实现了签名验证函数verifyPaddleSignature
if (verifyPaddleSignature($payload, $_SERVER['HTTP_PADDLE_SIGNATURE'])) {
    // 确认是交易完成事件
    if ($webhookData['event_type'] === 'transaction.completed') {
        // 先尝试从Webhook里拿邮箱
        $customerEmail = $webhookData['data']['customer']['email'] ?? null;
        
        if ($customerEmail) {
            // 这里写你的发送许可证逻辑
            sendLicenseFile($customerEmail);
        } else {
            // 兜底:用交易ID去API查询
            $transactionId = $webhookData['data']['id'];
            $customerEmail = getCustomerEmailFromPaddleAPI($transactionId);
            
            if ($customerEmail) {
                sendLicenseFile($customerEmail);
            } else {
                // 记录日志,后续手动处理
                error_log("无法获取交易 {$transactionId} 的客户邮箱");
            }
        }
    }
}

调用Paddle API查询邮箱的函数

function getCustomerEmailFromPaddleAPI($transactionId) {
    $apiKey = '你的Paddle API密钥'; // 从Paddle后台获取
    $apiUrl = "https://api.paddle.com/transactions/{$transactionId}";
    
    $ch = curl_init($apiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer {$apiKey}",
        "Content-Type: application/json"
    ]);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    $apiData = json_decode($response, true);
    return $apiData['data']['customer']['email'] ?? null;
}

几个额外提醒

  • 确保你的API密钥有访问Transactions API的权限,别用只读权限的密钥
  • 测试的时候可以用Paddle的Webhook模拟器,模拟transaction.completed事件,提前验证payload内容
  • 记得处理API请求的异常情况,比如网络超时、权限错误,别让程序直接崩了

备注:内容来源于stack exchange,提问作者nadir-codes96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:37:58