Ответ Paypal получает "Сбой"
Я интегрирую paypal в свою корзину покупок Вот моя форма передачи стоимости
<h3>By Paypal</h3><hr/>
<label>Click Here</label>
<br/>
<?php
include 'controller/connection.php';
$paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
$paypal_id = '[email protected]'; $cancel_url = 'http://my-website/index.php?action=cancel';
$return_url = 'http://my-website/store.php';
$i = 0;
$products = array();
$qry = mysql_query("select * from temp_cart where tokenId='$token'");
while ($row = mysql_fetch_array($qry)) {
$pid = $row[0];
$pname = $row[1];
$qty = $row[3];
$price = $row[4];
$amount = $row[5];
$products[] = array('pid' => $pid, 'pname' => $pname, 'qty' => $qty, 'price' => $price, 'amount' => $amount);
}
?>
<form action="<?php echo $paypal_url;?>" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="add" value="1">
<input type="hidden" name="business" value="<?php echo $paypal_id;?>">
<?php
foreach ($products as $product) {
$i++;
//echo $product['amount'];
?>
<input type="hidden" name="item_name_<?php echo $i;?>" value="<?php echo $product['pname']?>">
<input type='hidden' name='item_number_<?php echo $i;?>' value='<?php echo $product['pid'] ?>' />
<input type="hidden" name="amount_<?php echo $i;?>" value="<?php echo $product['amount']?>">
<?php
}
?>
<input type='image' src='https://www.sandbox.paypal.com/en_US/i/btn/btn_buynow_SM.gif' name='submit' style='display:{$display_button}' />
</form>
Это работает правильно. Но после оплаты, когда я перенаправляю с paypal, я получаю ответ с ОШИБКОЙ.Но в моей учетной записи "Ящик для отправки" он показывает, что я ЗАВЕРШЕН.И показывает мне ТЕЛЕЖКУ. Мой код для получения ответа от PayPal:-
<?php
session_start();
//include('connection.php');
/*
update: 06/27/2011
- updated to use cURL for better security, assumes PHP version 5.3
*/
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$pp_hostname = "www.sandbox.paypal.com";
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-synch';
$tx_token = $_GET['tx'];
$auth_token = "MY API TOKEN";
$req .= "&tx=$tx_token&at=$auth_token";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://$pp_hostname/cgi-bin/webscr");
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);
//set cacert.pem verisign certificate path in curl using 'CURLOPT_CAINFO' field here,
//if your server does not bundled with default verisign certificates.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: $pp_hostname"));
$res = curl_exec($ch);
curl_close($ch);
if(!$res){
//HTTP ERROR
}else{
// parse the data
$lines = explode("\n", $res);
$keyarray = array();
echo $lines[0];
echo "<br>";
if (strcmp ($lines[0], "SUCCESS") == 0) {
echo $lines[0];
for ($i=1; $i<count($lines);$i++){
list($key,$val) = explode("=", $lines[$i]);
$keyarray[urldecode($key)] = urldecode($val);
}
//echo "skjdhckh";
// 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
$user_email = '[email protected]';
$site_name = 'Company name';
$eol = "\r\n";
$headers = 'MIME-Version: 1.0' . $eol;
$headers .= 'Content-type: text/html; charset=iso-8859-1' . $eol;
$headers .= 'From:' . $site_name . ' <[email protected]>'. $eol;
$headers .= 'Reply-To:' . $site_name . ' <[email protected]>' . $eol;
$headers .= 'Return-Path:' . $site_name . ' <[email protected]>' . $eol;
$eol = "\r\n<br />";
$thanks_text = $eol.$eol.'Thanks!'. $eol;
if(isset($_SESSION['user']) && ($_SESSION['token']))
{
include('connection.php');
$user=$_SESSION['user'];
$_SESSION['user']=$user;
$token=$_SESSION['token'];
$_SESSION['token']=$token;
//$sub=$_SESSION['coursename'];
date_default_timezone_set('Australia/Melbourne');
$date = date('y-m-d h:i:s a', time());
$qry="update allorder set status='completed',date='$date' where token='$token' and name1='$user'";
$run_qry=mysql_query($qry);
if($run_qry)
{
/*$select_id="select email from register where username='$username'";
$run_qry2=mysql_query($select_id);
if($row=mysql_fetch_row($run_qry2))
{ */
$email=$row[0];
$email_tpl = 'Hello Buyer,' . $eol;
$email_tpl .= "We have received your payment of $amount $cc." . $eol;
$email_tpl .= "Thanks for the purchase." . $eol;
$email_tpl .= $eol . $thanks_text;
mail ($email, 'Payment Received', $email_tpl, $headers);
echo $email;
$_SESSION['username']=$user;
?>
<script language="javascript" type="text/javascript">
// Print a message
alert('Thank you for your purchase! your Payment was successfull. Now You can print and download your certificate');
// Redirect to some page of the site.
window.location = 'index.php';
</script>
<?php
//}
}
else
{
echo mysql_error();
}
}
}
else if (strcmp ($lines[0], "FAIL") == 0) {
echo 'Transaction Failed';
}
}
?>
Все работает правильно, но я получаю ответ об ошибке. пожалуйста, помогите мне, если я что-то забыл.
Заранее благодарю
1 answers
Убедитесь, что вы используете токен PDT из своей учетной записи продавца тестовой песочницы, если вы тестируете с помощью песочницы.
ПРИЧИНЫ СБОЯ, 4002 или 4003 ОТВЕТА
Убедитесь, что вы отправляете обратно значения "tx", "cmd" и Auth Чтобы PayPal вернул УСПЕХ и детали транзакции, вашему сценарию PDT необходимо отправить переменную "tx", извлеченную из строки возврата, токен аутентификации с вашей учетной записи в PayPal с помощью cmd "_notify-синхронизация".
Недопустимый Маркер Аутентификации Проверьте маркер, чтобы убедиться, что он является точным и передается обратно правильно. Убедитесь, что ваш токен представляет собой непрерывную строку и что в вашем скрипте нет разрывов строк. Для некоторых языков это может иметь значение.
Убедитесь, что вы не отправляете ответ на неправильный URL-адрес. Если вы тестируете в изолированной среде, вам необходимо убедиться, что ваши сообщения скрипта возвращаются в www.sandbox.paypal.com . Если вы находитесь в прямом эфире сайт, скрипт должен отправить обратно на www.paypal.com . Вы получите сообщение ОБ ошибке, если вы тестируете в песочнице, и ваш скрипт публикует сообщения обратно на живой сайт (или наоборот)
Проверка одного и того же "tx" более 5 раз Проверьте поведение пользователя. Другой способ получить СБОЙ - это если вы ссылаетесь на один и тот же "tx" более 5 раз. Пример: Если пользователь обновит страницу PDT 5 раз после просмотра подробных сведений, он увидит СБОЙ при последнем обновлении. Это не ошибка. Это делается специально для обеспечения безопасности, таким образом, URL-адрес, создаваемый PDT, не может быть доступен бесконечно для получения данных, специфичных для транзакции.
Недопустимое или отсутствующее значение "tx" Значение "tx" - это идентификатор транзакции, который используется для сбора платежной информации. Если это неверно или отсутствует, вы получите ответ ОБ ошибке, так как не удалось получить платежные данные.
PDT НЕ ПОЛУЧЕН
Адрес электронной почты, связанный с оплатой Чтобы PDT работал, вы должны подтвердить адрес электронной почты адрес, используемый в качестве ценности бизнеса в вашем коде кнопки. Если этот адрес электронной почты не подтвержден, PDT не будет работать, так как вы не увидите строку запроса PDT, добавленную к вашему возвращаемому URL-адресу.
Убедитесь, что вы используете правильно отформатированный URL-адрес возврата. Когда вы включаете PDT, URL-адрес, который вы используете в качестве URL-адреса автоматического возврата по умолчанию, должен быть действительным именем хоста или IP-адресом, а не URL-адресом внутренней интрасети, иначе пользователь не будет автоматически возвращен обратно на этот URL-адрес. Убедитесь, что вы используете действительный URL-адрес - это URL-адрес, по которому вы хотите, чтобы пользователь вернулся, иначе вы не увидите желаемого результата.
Кнопки оплаты в стиле подписки PDT не предназначен для работы с подписками, поэтому, если у вас есть подписка с бесплатной пробной версией, вы не увидите никаких данных на странице возврата/процессе PDT. Это связано с тем, что PDT передает платежные данные, и если во время регистрации платеж отсутствует, то из этого следует, что платежные данные для передачи отсутствуют.
Пользователь поведение PDT активируется клиентом с помощью метода возврата, нажав кнопку возврата или ничего не выбирая в тех случаях, когда клиенты входят в свои учетные записи PayPal для оплаты. Это означает, что покупатель может изменить поток возврата или выйти из браузера, и никакие данные не передаются.