2012-02-18 61 views
0

我一直在研究這個文件一段時間,我真的很困惑。我不知道我在做什麼錯誤的付款不更新用戶的硬幣和插入到mySQL的交易。支付寶無法驗證的IPN + mysql

我已經使用sandbox paypal上的測試工具來測試IPN,並且它返回成功。如果我遺漏了其他任何信息 - 請告訴我。

我的config.php文件(這只是連接到MySQL數據庫)

<?php 
session_start(); 
    include("database.php"); 
    if(!(@mysql_connect("$host","$user","$pass") && @mysql_select_db("$tablename"))) { 
?> 

這裏是我的IPN.php

<?php 
require("config.php"); 

// 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); 

// assign posted variables to local variables 
$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']; 
$custom = $_POST['custom']; 

if (!$fp) { 
// HTTP ERROR 
} else { 
fputs ($fp, $header . $req); 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 
if (strcmp ($res, "VERIFIED") == 0) { 
$pack = mysql_fetch_object(mysql_query("SELECT * FROM `c_pack` WHERE `name`='{$item_name}' AND `coins`='{$item_number}'")); 
$user = mysql_fetch_object(mysql_query("SELECT * FROM `users` WHERE `id`='{$custom}'")); 
if (
    ($receiver_email == $site->paypal) && 
    ($payment_amount == $pack->price) && 
    ($payment_status == 'Completed') 
    ) { 
mysql_query("UPDATE `users` SET `coins`=`coins`+'{$pack->coins}' WHERE `id`='{$custom}'");   
mysql_query("INSERT INTO `transactions` (user, points, pack, money, date) VALUES('{$user->login}', '{$pack->coins}', '{$item_name}', '{$payment_amount}', NOW())"); 
} 
} 
else if (strcmp ($res, "INVALID") == 0) { 
// log for manual investigation 
} 
} 
fclose ($fp); 
} 
?> 

回答

1

HAHA愚蠢的我,把SSL需要://sandbox.paypal .com - 這是爲其他人的未來參考..記得設置你的按鈕和fp沙箱。花了我5個小時弄清楚了這一點。

// 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.sandbox.paypal.com', 443, $errno, $errstr, 30);