Получение отмены подписки PayPal - PullRequest
3 голосов
/ 25 октября 2011

У меня много проблем при попытке отменить подписку. Это IPN, который я использую, который я получил со страницы примера кода Paypal. Я добавил скрипт mySQL, чтобы вычесть 4000 кредитов, когда пользователь заканчивает подписку. Когда я проверяю код с другой учетной записью PayPal, 4000 кредитов не вычитаются, как только я отменяю подписку.
IPN PayPal неправильный или кнопка неправильная или ЧТО!?

<?php
  session_start();
  // 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'];
//////////////////////////////////////////////I added this here also. Check if its canceled
  if("subscr_cancel" = $_POST['txn_type']){

if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// check the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
  /////I added this mysql
       $password = secret  
    $username = secret
    $websites= "websites";
    $database = "k29803_1";
   mysql_connect("localhost", $username, $password) or die(mysql_error());
   mysql_select_db($database);

  $query = "SELECT * FROM users WHERE username= '$_SESSION[username]' AND password = '$_SESSION[password]'";
  $results = mysql_query($query)or die(mysql_error());
    if(mysql_num_rows($results)==1){
        $add_credits = "UPDATE users SET credits = credits +1000
        WHERE username= '$_SESSION[username]' AND password = '$_SESSION[password]'";
        mysql_query($add_credits) or die(mysql_error());


      }

}
else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
}
fclose ($fp);
}
  }
  ?>

Кнопка выглядит следующим образом

 <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="NQMGM2LCZUQRE">

  <input type="hidden" name="item_name" value="1" />
    <input type="hidden" name="item_number" value="01" />
    <input type="hidden" name="amount" value="1.99" />
    <input type="hidden" name="currency_code" value="USD" />
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

Я перенаправлен на эту страницу, но я просто не получаю вычтенные значения MYSQL

Ответы [ 2 ]

0 голосов
/ 15 апреля 2012

Ваш код содержит ошибку здесь:

  if("subscr_cancel" = $_POST['txn_type']){

Смотрите сравнение:

  if("subscr_cancel" == $_POST['txn_type']){
0 голосов
/ 25 октября 2011

Основная проблема, которую я вижу, заключается в том, что вы используете переменные сеанса. Обратите внимание, что запрос, который попадает в ваш PHP-код, будет поступать непосредственно с сервера PayPal и не имеет ничего для текущего зарегистрированного пользователя.

Вам необходимо передать информацию о пользователе в PayPal, чтобы PayPal мог передать ее обратно на ваш сервер в рамках запроса IPN. Другая вещь, которую вы можете сделать, это проверить некоторые значения, приходящие в IPN, например, адрес электронной почты плательщика (payer_email) или parent_txn_id, или payer_id.

Я не уверен насчет подписок, но IPNs для возврата и отмены будут включать parent_txn_id, который предоставляет txn_id первоначальной покупки, так что вы можете использовать его для поиска учетной записи пользователя.

Что вам нужно сделать, так это убедиться, что при совершении покупки вы сохраняете всю информацию из IPN и связываете ее с помощью txn_id или аналогично учетной записи пользователя. Когда происходит отмена, используйте parent_txn_id или любое другое значение, которое вы используете, чтобы найти учетную запись в базе данных, а затем примените изменения к учетной записи пользователя.

Я вижу ряд других проблем с кодом выше.

$query = "SELECT * FROM users WHERE username= '$_SESSION[username]' AND password = '$_SESSION[password]'";

Вам необходимо использовать mysql_real_escape_string для всех переменных, которые вы добавляете в запрос. Вы должны сделать это:

$query = "SELECT * FROM users WHERE username='".mysql_real_escape_string($username)."' AND password = '.mysql_real_escape_string($password).'";

Во-вторых, ссылки на массивы должны использовать кавычки вокруг имени ключа:

$_SESSION[password] => $_SESSION['password']

В-третьих, вам, вероятно, следует искать пользователя в базе данных по его идентификатору строки в таблице пользователей (у вас есть первичный ключ «id», установленный как автоинкремент, верно?) Вместо его имени пользователя и пароля. После аутентификации пользователя вам не следует хранить его пароль в переменной сеанса.

...