php - 从 Paypal IPN 获取结果的问题

标签 php sql paypal paypal-ipn

我已经关注了 pay pal IPN 文档。创建了一个名为 payment_notify.php 的文件,它与此处找到的相同:https://developer.paypal.com/docs/classic/ipn/ht_ipn/

我的支付宝表单设置为将数据发布到:https://www.sandbox.paypal.com/cgi-bin/webscr 我将我的 pay pal 沙盒企业帐户通知 url 设置为我的网站 url/payment_notify.php。

我的代码允许用户点击立即购买按钮,将他们带到 Paypal 登录屏幕,允许他们为产品“付款”,显示一个 Paypal 屏幕,说明交易成功,然后最后返回我的网站它什么也没给我。我已尝试将 POST 变量从 paypal 插入到我的数据库中,但没有任何反应。

我是 paypal API 的新手,但这是我的尝试:

<form action="<?php echo $paypal_url; ?>" method="post">
<!-- Identify your business so that you can collect the payments. -->
<input type="hidden" name="business" value="<?php echo $paypal_id; ?>"> 
<!-- Specify details about the item that buyers will purchase. -->
<input type="hidden" name="item_number" value="<?php echo $row['id'];?>">
<input type="hidden" name="item_name" value="<?php echo $row['credit_price'].": credits"; ?>">
<input type="hidden" name="amount" value="<?php echo $row['credit_price']; ?>">
<input type="hidden" name="currency_code" value="<?echo $row['currency'];?>">           
<!-- Specify URLs -->
<input type='hidden' name='cancel_return' value="<? echo 'http://www.$_SERVER[HTTP_HOST]/cancel.php';?>">
        <input type='hidden' name='return' value="<? echo 'http://www.$_SERVER[HTTP_HOST]/success.php';?>">
        <input type='hidden' name='notify_url' value="<? echo 'http://www.$_SERVER[HTTP_HOST]/payment_notify.php';?>">

        <!-- Specify a Buy Now button. -->
        <input type="hidden" name="cmd" value="_xclick">
        <input type="image" name="submit" border="0"
        src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" alt="PayPal - The safer, easier way to pay online">
        <img alt="" border="0" width="1" height="1" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" >
    </form>

然后是我的 payment_notify 文件:

<?php
session_start();
require("db_connection.php");
// STEP 1: read POST data
// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST.
// Instead, read raw POST data from the input stream.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
  $keyval = explode ('=', $keyval);
  if (count($keyval) == 2)
    $myPost[$keyval[0]] = urldecode($keyval[1]);
}
// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
$req = 'cmd=_notify-validate';
if (function_exists('get_magic_quotes_gpc')) {
  $get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
  if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
    $value = urlencode(stripslashes($value));
  } else {
    $value = urlencode($value);
  }
  $req .= "&$key=$value";
}

// Step 2: POST IPN data back to PayPal to validate
$ch = curl_init('https://www.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

if ( !($res = curl_exec($ch)) ) {
  // error_log("Got " . curl_error($ch) . " when processing IPN data");
  curl_close($ch);
  exit;
}
curl_close($ch);
// inspect IPN validation result and act accordingly
if (strcmp ($res, "VERIFIED") == 0) {
  // The IPN is verified, process it:
  $item_name = $_POST['item_name'];
  $item_number = $_POST['item_number'];
  $payment_status = $_POST['payment_status'];
  $payment_amount = $_POST['mc_gross'];
  $payment_currency = $_POST['mc_currency'];
  $txn_id = $_POST['txn_id'];
  $receiver_email = $_POST['receiver_email'];
  $payer_email = $_POST['payer_email'];
    foreach($_POST as $key => $value) {
    echo $key . " = " . $value . "<br>";
  }

// insert the valid transaction into the database :
  $insert = "INSERT INTO tableNAME (item,txn_id,payment_gross,currency_code,paid_by,payment_status)VALUES('$item_number',$txn_id,'$payment_amount','$payment_currency','$payer_email','$payment_status')";
  $result=mysqli_query($con,$insert);

} else if (strcmp ($res, "INVALID") == 0) {
  // IPN invalid, log for manual investigation
  echo "The response from IPN was: <b>" .$res ."</b>";
}
?>

最佳答案

你必须在这里检查两件事:

  1. $ch = curl_init('https://www.paypal.com/cgi-bin/webscr'); 更改为 $ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
  2. 尝试在日志文件中获取响应结果,看看您得到的实际结果是什么。

关于php - 从 Paypal IPN 获取结果的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40026251/

相关文章:

PHP 邮件脚本每晚同一时间自动运行

php - 使用相同的 php 表单添加/查看/编辑 mysql 条目

php - 仅当 SQL 中同一日期内时才进行 GROUP BY latlong

php - Paypal 成功页面不返回任何试用期订阅数据

winforms - Paypal 与 Windows 窗体应用程序的集成

javascript - Php Mysql Ajax 插入多行

PHP,如何检查MySQL表是否有名称

mysql - Laravel 动态查询等于任何值

java - Mysql 对行组的约束

php - Paypal 中的标准工作流程与 PHP codeigniter 集成