贝宝;不要公开订单令牌

时间:2017-03-04 19:21:37

标签: php security paypal token shop

如果有人想从我的网站上购买东西,他必须填写一张表格,这样就可以创建这样的网址并重定向到PayPal:

https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=buy@example.com&Product_Number_11&amount=4.20&return=http://www.example.com/product/Product_Number_11/%26payment=success%26order_token=a3f7e6fc6273c368ab374c5152ff2b63&cancel_return=http://www.example.com/error.php

这会将结算明细传送给PayPal。如果付款成功,PayPal将重定向到http://www.example.com/product/Product_Number_11/&payment=success&order_token=a3f7e6fc6273c368ab374c5152ff2b63。我的网站上的脚本将获得order_token并通过将产品发送给买方来完成订单。

问题是:用户可以复制字符串http://www.example.com/product/Product_Number_11/&payment=success&order_token=a3f7e6fc6273c368ab374c5152ff2b63并在没有付费的情况下手动在浏览器中调用它。

我该怎么做才能防止这种情况发生? PayPal网站证书是正确的吗?

1 个答案:

答案 0 :(得分:0)

实际上,您无法阻止用户手动调用付款URL。 您需要做的是从PayPal本身请求验证。

每次收到付款时,首先要做的是打开与 www.paypal.com 的连接,并发送您收到的所有POST数据,并附加变量cmd:< EM> CMD = _notify-验证

以下是付款验证示例:

// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
  $value = urlencode(stripslashes($value));
  $req .= "&$key=$value";
}
// 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('ssl://www.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
  // HTTP ERROR => RETRY LATER and check $errstr
}
else {
  fputs($fp, $header.$req);
  while (!feof($fp)) {
    $res = fgets($fp, 1024);
    if (strcmp($res, "VERIFIED") == 0) {
      // PAYMENT VALIDATED & VERIFIED!
      break;
    }
    else if (strcmp($res, "INVALID") == 0) {
      // PAYMENT INVALID => INVESTIGATE MANUALLY!
      break;
    }
  }
  fclose($fp);
}

结论:如果您未从PayPal获得 VERIFIED 状态,请勿自动向客户发送产品。