Я хочу создать простую транзакцию на своем веб-сайте, где после завершения транзакции человека я хочу, чтобы paypal перенаправлял пользователя на место на моем сайте, и я хочу, чтобы PayPal предоставил мне подробную информацию, чтобы я мог использовать PHP для его анализа и напишите им ссылку на их покупку. Я не уверен, что делает notify_url? благодаря
PayPal работает следующим образом:
У вас есть форма с кнопкой «купить». Когда нажимается, он отправляет в PayPal информацию (продукт, цену, имя учетной записи и т. Д.).
Затем покупатель соглашается заплатить вам, и когда транзакция будет завершена, PayPal отправит «IPN» (уведомление о немедленном платеже) на ваш 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 также имеет полную документацию и примеры сценариев.
Уведомлять URL-адрес должен привести к скрипту, который сохраняет возвращаемые данные из 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; }
$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']; }
При анализе ответа 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 ), а значения заданы как глобальные переменные.