php - PHP PayPal API 更改
问题描述
我正在使用 PHP 代码(如下)但停止工作。贝宝是否改变了一些东西。它不再起作用了。
print_r($res) 给出了这个:
无效 URL 请求的 URL“[no URL]”无效。参考#9.67ac1002.1539939948.1d3bb0b6
Paypal 付款正常,Paypal 返回成功页面 URL OK。
<?php
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = "my_very_long_token_goes_here";
$req .= "&tx;=$tx_token&at;=$auth_token";
// post back to PayPal system to validate
$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";
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
// If possible, securely post back to paypal using HTTPS
// Your PHP server will need to be SSL enabled
// $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
// read the body data
$res = '';
$headerdone = false;
while (!feof($fp)) {
$line = fgets ($fp, 1024);
if (strcmp($line, "\r\n") == 0) {
// read the header
$headerdone = true;
}
else if ($headerdone)
{
// header has been read. now read the contents
$res .= $line;
}
}
// parse the data
$lines = explode("\n", $res);
$keyarray = array();
if (strcmp ($lines[0], "SUCCESS") == 0) {
for ($i=1; $i<count($lines);$i++){
list($key,$val) = explode("=", $lines[$i]);
$keyarray[urldecode($key)] = urldecode($val);
}
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
$firstname = $keyarray['first_name'];
$lastname = $keyarray['last_name'];
$itemname = $keyarray['item_name'];
$amount = $keyarray['mc_gross'];
echo ("
Thank you for your purchase!
");
echo ("Payment Details
\n");
echo ("<li>Name: $firstname $lastname</li>\n");
echo ("<li>Item: $itemname</li>\n");
echo ("<li>Amount: $amount</li>\n");
echo ("");
}
else if (strcmp ($lines[0], "FAIL") == 0) {
// log for manual investigation
}
}
fclose ($fp);
?>
解决方案
添加主机头
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
大约在 9 月 7 日,paypal 将他们的 api 移到 akamai cdn 后面,这需要一个主机头,但没有告诉任何人,也没有更新他们的所有文档。
推荐阅读
- javascript - NodeJS HTTPOnly cookie 未使用 fetch 功能发送
- javascript - 这两种 javascript 方法与 React 有什么区别
- javascript - 图像 Base64 字符串到 Uint8ClampedArray
- aws-lambda - AWS Lambda字符串插值不起作用
- intellij-idea - Cucumber 无法从 intelliJ 打开调试器端口
- python-3.x - Tkinter - 使列自动调整为最长的字段值
- fonts - KeyError:'组“font”和名称“color”的无法识别的键“font.color”'
- c++ - 直接用QPainter绘制和绘制QPixmap给出不同的结果
- python - 奇怪的修补行为
- git - 我的树被砍了