如果有人想从我的网站上购买东西,他必须填写一张表格,这样就可以创建这样的网址并重定向到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网站证书是正确的吗?
答案 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 状态,请勿自动向客户发送产品。