Paypal支付完成后回调地址无法接收表单提交变量问题求解
解决方案
问题根因
你提交给Paypal的表单参数是支付请求参数,Paypal默认不会将这些参数自动回传到你设置的return跳转地址,所以你直接在success页读$_POST/$_GET为空是正常情况,并非Paypal禁用了相关功能。
可行解决方案(均不需要拼接GET参数)
方案1:使用Session存储订单参数(最推荐,实现最简单)
你在生成Paypal支付表单、提交给Paypal之前,就可以把后续success页需要的所有订单参数(订单号、金额、商品名称、用户ID等)写入当前用户的Session中:
// 生成支付表单前执行 $_SESSION['pending_order'] = [ 'order_id' => $_POST['ORDER'], 'amount' => round($total_payable, 2), 'item_name' => 'For Order ' . $_POST['ORDER'], 'user_id' => $_SESSION['logged_user']['user_id'], // 其他你需要的参数 ];
等用户从Paypal跳转回success.php时,直接从Session中读取即可:
<?php session_start(); // 读取待支付订单信息 $pendingOrder = $_SESSION['pending_order'] ?? []; if (!empty($pendingOrder)) { // 执行插入待支付订单的逻辑 // 插入完成后可以清空Session里的pending_order避免重复插入 unset($_SESSION['pending_order']); } ?>
这个方案完全不依赖Paypal的回传逻辑,稳定性最高,也符合你不想传GET参数的要求。
方案2:开启Paypal PDT(支付数据传输)功能
如果你需要拿到Paypal侧返回的真实交易数据,可以开启PDT功能:
- 登录Paypal商户后台,在账户设置的网站付款偏好设置中开启「付款数据传输」,获取PDT身份令牌
- 你已经设置了
rm=2,开启PDT后,Paypal跳转到return地址时会POST传输交易IDtx参数 - 在success.php中拿到
tx参数后,结合你的PDT身份令牌向Paypal发起校验请求,即可获取到这笔交易的所有参数,包括你之前提交的item_name、amount、custom等字段。
注意事项
不要依赖return页面的参数修改订单支付状态,你当前用IPN更新状态的逻辑是正确的,return页面仅用作插入待支付订单、给用户展示支付结果即可。
内容的提问来源于stack exchange,提问作者Matin Suleymanli
相关产品推荐
相关产品推荐

