PHP实现PayPal即时到账:IPN验证流程与代码示例

沿途有光
沿途有光
发布时间:2026-10-15 | 3人浏览过
原创

本文讲解如何使用PHP接入PayPal支付系统实现即时到账功能。重点说明如何构建提交表单以及利用IPN机制验证交易真伪的核心代码流程。

向PayPal发起支付请求

在商家网站的结算页面中,需要创建一个HTML表单,将订单信息以POST方式发送至PayPal官方指定的地址。以下为Ecshop系统中常见的PayPal支付表单结构:

<form target="_blank" method="post" action="https://www.paypal.com/cgi-bin/webscr" style="text-align: center;">
    <input type="hidden" value="_xclick" name="cmd"/>
    <!-- 替换为商家注册邮箱 -->
    <input type="hidden" value="your_email@example.com" name="business"/>
    
    <input type="hidden" value="商品名称或ID" name="item_name"/>
    <input type="hidden" value="价格金额" name="amount"/>
    <input type="hidden" value="USD" name="currency_code"/>
    
    <!-- 支付完成后的跳转地址 -->
    <input type="hidden" value="https://yoursite.com/respond.php" name="return"/>
    
    <input type="hidden" value="发票编号" name="invoice"/>
    <input type="hidden" value="utf-8" name="charset"/>
    
    <!-- 不显示运费设置 -->
    <input type="hidden" value="1" name="no_shipping"/>
    <input type="hidden" value="" name="no_note"/>
    
    <!-- 关键:设置IPN通知URL -->
    <input type="hidden" value="https://yoursite.com/ipn_handler.php" name="notify_url"/>
    
    <!-- 0=表单重定向(GET), 1=服务器重定向(POST) -->
    <input type="hidden" value="1" name="rm"/>
    
    <input type="hidden" value="取消支付的回调地址" name="cancel_return"/>
    
    <input type="submit" value="立即使用 paypal 支付"/>
</form>

注意以下参数配置:
- cmd:设置为 _xclick 表示购买按钮模式。
- notify_url:必须指定服务器端接收PayPal异步通知的地址,这是实现自动入账的关键。
- return:用户支付完成后浏览器跳转的地址。

使用IPN机制验证交易真实性

由于用户支付可能因网络中断等原因导致return跳转失败,或者防止伪造请求直接修改数据库,因此不能仅依赖前端跳转。应当通过PayPal IPN(Instant Payment Notification)服务,由PayPal服务器主动向你的notify_url发送POST请求来确认支付状态。

第一步:构造验证请求

在接收PayPal参数的脚本中,首先获取所有POST数据,并在头部追加一个 cmd=_notify-validate 字段。这一步告诉PayPal服务器:“我要你帮我验证之前发给我的这些数据是否真实有效”。

// 读取PayPal System传来的POST数据,并添加'cmd'验证命令
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
    // 清理数据中的特殊字符并进行URL编码
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}

第二步:将数据发回PayPal验证

使用 fsockopen 连接到PayPal的SSL安全端口,发送上述构造好的请求字符串。PayPal会回复“VERIFIED”(已验证)或“INVALID”(无效)。

// 定义HTTP头信息
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

// 连接PayPal服务器
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

if (!$fp) {
    // 网络连接失败的错误处理
} else {
    // 发送请求
    fputs ($fp, $header . $req);
    
    while (!feof($fp)) {
        $res = fgets ($fp, 1024);
        
        if (strcmp ($res, "VERIFIED") == 0) {
            // 交易真实存在,继续执行下面的安全检查
        } else if (strcmp ($res, "INVALID") == 0) {
            // 交易数据可能被篡改或不存在,记录日志备查
        }
    }
    fclose ($fp);
}

第三步:执行本地安全检查

只有当返回结果为 VERIFIED 时,才能信任这笔交易。但为了确保资金和订单安全,还需要对收到的数据进行二次校验:

  • 检查 payment_status 是否为 Completed。
  • 确保 txn_id(交易ID)在你的数据库中从未处理过,防止重复发货。
  • 核对 receiver_email 是否为你的商家收款主账户。
  • 确认 mc_gross(付款金额)和 mc_currency 与你的订单要求一致。

若全部符合,即可在此阶段更新数据库订单状态为“已支付”,并向用户发送邮件或触发其他业务逻辑。

总结

实现PHP与PayPal的即时到账对接,关键在于规范填写表单参数以及正确实施IPN验证流程。切勿在用户跳转页(return URL)直接完成订单入库操作,应坚持以服务器端的IPN验证结果为准。以上就是PHP调用PayPal实现即时到账与验证的详细内容,更多关于PHP支付集成的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表