PHP实现PayPal即时到账:IPN验证流程与代码示例
本文讲解如何使用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支付集成的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









