Я хочу создать простую транзакцию на своем веб-сайте, где после завершения транзакции человека я хочу, чтобы PayPal перенаправлял пользователя на то, чтобы перейти на место на моем сайте, и я хочу, чтобы PayPal предоставил мне подробную информацию, чтобы я мог использовать PHP разобрать его и отправить по электронной почте ссылку на их покупку. Я не уверен, что делает notify_url? Благодаря
Получать информацию из PayPal после транзакции
Ответ 1
PayPal работает следующим образом:
У вас есть форма с кнопкой "купить". Когда нажимается, он отправляет информацию (продукт, цену, имя учетной записи и т.д.) В PayPal.
Затем покупатель соглашается заплатить вам, и когда транзакция будет завершена, PayPal отправит ваш IP-адрес (мгновенное уведомление об оплате) на ваш URL-адрес уведомления - он отправит данные POST на этот URL-адрес для вашего сервера для обработки. Вы отвечаете в PayPal, чтобы спросить, отправили ли они данные POST (а не самозванец), и если они ответят, что это настоящая транзакция, вы можете выпустить продукт для клиента. Обратите внимание, что все это происходит в фоновом режиме, пока ваш покупатель все еще находится на веб-сайте PayPal.
Существует заключительная фаза, которая заключается в том, что PayPal возвращает покупателя на ваш сайт. В этом случае они отправляют покупателя обратно на ваш "возвращаемый" URL-адрес, и они могут (необязательно) снова передать данные транзакции (они называют этот PDT). И вы можете снова проверить с Paypal, если это действительная транзакция и предоставить загрузку и т.д. В этот момент.
Самый сложный бит, который никто не объясняет, заключается в том, что покупатель не перенаправляется на ваш URL-адрес уведомления. то есть "посетитель" на своем веб-сайте уведомляет URL-адрес PayPal, а не покупателя, поэтому это не происходит как часть вашей сессии покупателя. Если вы хотите продолжить сеанс в трех частях этого процесса, вам необходимо создать средство отслеживания покупателя в вашей форме и передать его в PayPal в поле формы "custom". Эти данные передаются вам в данных IPN и PDT, и вы можете использовать это, чтобы восстановить соединение с исходным сеансом пользователя.
Вам действительно нужно реализовать как IPN, так и PDT - если IPN-адрес электронной почты не удался, тогда у вас есть PDT в качестве резервной копии. И если пользователь закрывает свой веб-браузер до того, как он будет перенаправлен обратно на вашу страницу PDT, вы отправили электронное письмо IPN в качестве резервной копии.
Поиск по IPN и PDT, и вы найдете довольно много информации. PayPal также имеют полную документацию и примеры сценариев.
Ответ 2
Уведомлять URL-адрес должен привести к script, который сохраняет возвращенные данные из PayPal, например:
/** Fetch order from PayPal (IPN reply)
* @return int received ID of inserted row if received correctly, 0 otherwise
*/
function FetchOrder()
{
$transactionID=$_POST["txn_id"];
$item=$_POST["item_name"];
$amount=$_POST["mc_gross"];
$currency=$_POST["mc_currency"];
$datefields=explode(" ",$_POST["payment_date"]);
$time=$datefields[0];
$date=str_replace(",","",$datefields[2])." ".$datefields[1]." ".$datefields[3];
$timestamp=strtotime($date." ".$time);
$status=$_POST["payment_status"];
$firstname=$_POST["first_name"];
$lastname=$_POST["last_name"];
$email=$_POST["payer_email"];
$custom=$_POST["option_selection1"];
if ($transactionID AND $amount)
{
// query to save data
return $this->insertID;
}
else
{
return 0;
}
}
Вы также можете выбрать подтверждение заказа позже:
/** Verify PayPal order (IPN)
* PayPal returns VERIFIED or INVALID on request
* @return bool verified 1 if verified, 0 if invalid
*/
function VerifyOrder()
{
$_POST["cmd"]="_notify-validate";
$ch=curl_init();
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_USERAGENT,"your agent - replace");
curl_setopt($ch,CURLOPT_URL,"https://www.paypal.com/cgi-bin/webscr");
curl_setopt($ch,CURLOPT_POST, 1);
foreach ($_POST as $key=>$value)
{
$string.="&".$key."=".urlencode(stripslashes($value));
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $string);
$result=curl_exec($ch);
if ($result=="VERIFIED") return 1;
else return 0;
}
Ответ 3
$tx=$_REQUEST['tx'];
$paypal_url='https://www.paypal.com/cgi-bin/webscr?cmd=_notify-synch&tx='.$tx.'&at=token here';
$curl = curl_init($paypal_url);
$data = array(
"cmd" => "_notify-synch",
"tx" => $tx,
"at" => "token here"
);
$data_string = json_encode($data);
curl_setopt ($curl, CURLOPT_HEADER, 0);
curl_setopt ($curl, CURLOPT_POST, 1);
curl_setopt ($curl, CURLOPT_POSTFIELDS, $data_string);
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1);
$headers = array (
'Content-Type: application/x-www-form-urlencoded',
'Host: www.paypal.com',
'Connection: close'
);
curl_setopt ($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt ($curl, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($curl);
$lines = explode("\n", $response);
$keyarray = array();
if (strcmp ($lines[0], "SUCCESS") == 0) {
for ($i=1; $i<count($lines);$i++){
list($key,$val) = explode("=", $lines[$i]);
$keyarray[urldecode($key)] = urldecode($val);
}
$first_name=$keyarray['first_name'];
$last_name=$keyarray['last_name'];
$payment_status=$keyarray['payment_status'];
$business=$keyarray['business'];
$payer_email=$keyarray['payer_email'];
$payment_gross=$keyarray['payment_gross'];
$mc_currency=$keyarray['mc_currency'];
}
Ответ 4
При анализе ответа PDT я использую parse_str. Поскольку тело ответа кодируется url, это просто вопрос замены разрывов строк на амперсанды - как этот
$result = curl_exec($ch);
//replace the breaks with '&'
$r_string = str_replace("\n", "&", $result);
//parse the response into a key->value array
parse_str($r_string, $this->details);
if(!isset($this->details['SUCCESS'])){
//the "SUCCESS" or "FAIL" response is the first key
return FALSE;
}
else{
//the values of the response are now in an array
return TRUE;
}
в зависимости от приложения вы можете даже оставить второй параметр ($ this- > details), а значения заданы как глобальные переменные.