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
相关产品推荐
相关产品推荐

