如何解决PayPal API一直无法正常工作
我们的大多数API调用都可以成功工作并存储到我们的数据库中,但很少有。我已经收集了一些日志,我们收到了“错误400错误的请求”。
-
[29-Sep-2020 08:04:48 UTC]未验证错误101:HTTP / 1.1 400错误的请求
[29-Sep-2020 08:04:48 UTC]未验证错误101:连接:关闭
[2020年9月29日UTC]未验证错误101:内容长度:11
[2020年9月29日UTC]未验证错误101:内容类型:文本/纯文本; charset = utf-8
[2020年9月29日UTC]未验证错误101:
[29-Sep-2020 08:04:48 UTC]未验证错误101:错误的请求
-
日志:https://pastebin.com/hRjrgWGd
代码:
$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "HOST: www.paypal.com:443\r\n";
$header .= "Connection close\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com',443,$errno,$errstr,30);
//$fp = fsockopen ('ipnpb.paypal.com',30);
if (!$fp)
{
// HTTP ERROR
echo "error";
error_log("FAILED line 53");
} else {
// NO HTTP ERROR
fputs ($fp,$header . $req);
while (!feof($fp))
{
$res = fgets($fp,1024);
if (strcmp (trim($res),"VERIFIED") == 0) {
//Setup Required Variables
$txn_id = $_POST['txn_id'];
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$cust_name = $first_name .' '. $last_name;
$cust_email = $_POST['payer_email'];
$cust_id = $_POST['auction_buyer_id'];
$cust_status = $_POST['payer_status'];
$payment_date = $_POST['payment_date'];
$currency = $_POST['mc_currency'];
$address_street = $_POST['address_street'];
$address_city = $_POST['address_city'];
$address_state = $_POST['address_state'];
$address_zip = $_POST['address_zip'];
$address_country = $_POST['address_country'];
$address_status = $_POST['address_status'];
$g_ref = "";
if (isset($_POST['fulfillment_order_reference_number'])) {
$g_ref = $_POST['fulfillment_order_reference_number'];
$address_street = $_POST['fulfillment_address_line1'];
$address_city = $_POST['fulfillment_address_city'];
$address_state= $_POST['fulfillment_address_state'];
$address_zip = $_POST['fulfillment_address_zip'];
}
$item_count = $_POST['num_cart_items'];
//Misc Variables Requried for Authentication
$payment_status = $_POST['payment_status'];
$receiver_email = $_POST['receiver_email'];
$our_email = '###'; #PP EMAIL HERE
$our_email_2 = '###'; #PP EMAIL HERE
if (($payment_status == 'Completed') && (($receiver_email == $our_email) || ($receiver_email == $our_email_2)))
{
//Check Transaction Not Already Processed
// $check = $db_query->duplicate_check($txn_id);
// if ($check != 0) { exit(); }
//Distinguish between accounts
if ($receiver_email == $our_email) {
$pp_acc = "CB";
} else if ($receiver_email == $our_email_2) {
$pp_acc = "IK";
}
for ($n=1;$n<=$item_count;$n++) {
$item_name = $_POST['item_name'. $n];
$item_quantity = $_POST['quantity'. $n];
$item_number = $_POST['item_number'. $n];
$total_paid = $_POST['mc_gross_'. $n];
error_log("HIT ADD ORDER tx: $txn_id");
//Add Order to DB (Removed)
}
}
}
else if (strcmp ($res,"INVALID") == 0) {
error_log("Invalid Error 102");
}
else {
// This is where it seems to be hitting
error_log("not verified Error 101: " . $res);
}
}
}
fclose ($fp);
似乎feof($ fp)读到请求数据的末尾,但是那些没有保存到数据库的数据并没有命中VERIFIED的'if'语句,而是'else'。
我已经检查了PayPal IPN历史记录,并且所有请求都已成功发送,因此这绝对是我们的服务器问题。在2016年至2018年这不是问题,但是从那以后,我们就一直没有将其保存到数据库中。
有什么想法吗?
解决方法
如IPN Integration Guide中所述,请确保在请求标头中包含一个User-Agent:
字段,该字段的值应是大于7个字符的任何字符串
您还应该使用到ipnpb.paypal.com
的HTTPS / SSL连接(标准端口443),不确定为什么代码使用旧的www.paypal.com
端点进行IPN。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。