我正试图让PayPal的IPN工作,但它不断返回INVALID
而不是VERIFIED
,我看不出我做错了什么。
目前,我有2个php文件,使用来自paypal开发者网站的示例代码。代码似乎运行良好,我正在使用sandbox
所以我可以看到付款被转移,所以我不明白为什么我得到INVALID
。
有人可以查看代码,因为我看不出我做错了什么。
1。 basic_payment.php(将付款数据发送到PayPal的文件)
<?php require_once ("paypalplatform.php"); $actionType = "PAY"; $cancelUrl = "http://[my server details go here]/cancel.php"; $returnUrl = "http://[my server details go here]/success.php"; $currencyCode = "GBP"; $receiverEmailArray = array( 'seller_15456764326_biz@mail.com' ); $receiverAmountArray = array( '2' ); $receiverPrimaryArray = array(); $senderEmail = ""; $feesPayer = ""; $ipnNotificationUrl = "http://[my server details go here]/ipn.php"; $memo = ""; $pin = ""; $preapprovalKey = ""; $reverseAllParallelPaymentsOnError = ""; $trackingId = generateTrackingID(); $receiverInvoiceIdArray = array( $trackingId ); $resArray = CallPay ($actionType, $cancelUrl, $returnUrl, $currencyCode, $receiverEmailArray, $receiverAmountArray, $receiverPrimaryArray, $receiverInvoiceIdArray, $feesPayer, $ipnNotificationUrl, $memo, $pin, $preapprovalKey, $reverseAllParallelPaymentsOnError, $senderEmail, $trackingId ); $ack = strtoupper($resArray["responseEnvelope.ack"]); if($ack=="SUCCESS") { if ("" == $preapprovalKey) { $cmd = "cmd=_ap-payment&paykey=" . urldecode($resArray["payKey"]); RedirectToPayPal ( $cmd ); } else { $payKey = urldecode($resArray["payKey"]); $paymentExecStatus = urldecode($resArray["paymentExecStatus"]); } } ?>
2。 ipn.php(监听paypals响应的文件)
<?php $ipn_post_data = $_POST; $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; $request = curl_init(); curl_setopt_array($request, array ( CURLOPT_URL => $url, CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $ipn_post_data), CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_HEADER => FALSE, )); $response = curl_exec($request); $status = curl_getinfo($request, CURLINFO_HTTP_CODE); curl_close($request); $to = "oshirowanen@mail.com"; $from = "me@desktop.com"; $subject = "response"; $message = "<pre>".print_r($status,true)." - ".print_r($response,true)."</pre>\n"; $header = 'To: Oshirowanen <oshirowanen@mail.com>' . "\r\n"; $header .= 'From: Me <me@desktop.com>' . "\r\n"; mail($to,$subject,$message,$header); ?>
错误消息:
Apache错误日志 - 没有错误
这就是我在ipn.php中添加电子邮件以尝试捕获某些内容的原因,并且它正在返回:
<pre>200 - INVALID</pre>
谁能看到我做错了什么?
答案 0 :(得分:1)
使用basic sample code 4b,
从基本示例代码中清除$ipnNotificationUrl = "";
,因为我在那里添加了一个我自己添加的值,
在沙盒中创建了卖家帐户,而不是业务专业帐户,
设置卖家帐户以启用ipn网址
使用以下PHP 5.2 sample code作为ipn侦听器
在监听器中添加了2行,如here所述,可以在下面看到2行:
将cacert.pem
证书从here下载到我的服务器并将其放在与ipn listener相同的目录中:
第6点提到的2行:
CURLOPT_SSL_VERIFYPEER => TRUE,
CURLOPT_CAINFO => 'cacert.pem',
我不知道为什么沙盒业务专业版帐户不允许我设置ipn网址,但卖家帐户会这样做。
答案 1 :(得分:1)
这对我来说也引起了混乱。
你在谈论的是两种不同的IPTN
消息:
第一个,你问题中的一个,它的url在ipnNotificationUrl中配置,转到中间化事务的站点。通过将参数发送回Paypal无法验证此问题;由于您可以自己将参数添加到该URL,因此可以实施HMAC
安全机制。
如果在设置中启用了IPTN
,则第二个是您解决方案中的一个,转到收款的帐户。可以通过将参数发送回Paypal来验证这个。
如果您为这两个邮件设置了相同的网址,则可以同时获取这两个邮件,但只有一个可以使用Paypal进行验证。如果卖方和网站是不同的实体,换句话说,如果网站只是买方和卖方之间的交易中介,则网站收到第一个,卖方收到第二个。