Получать информацию от PayPal после транзакции - PullRequest
25 голосов
/ 12 марта 2010

Я хочу создать простую транзакцию на своем веб-сайте, где после завершения транзакции этого человека я хочу, чтобы PayPal перенаправил пользователя на место на моем сайте, и я хочу, чтобы PayPal предоставил мне детали, чтобы я мог использовать PHP разобрать его и отправить по электронной почте ссылку на их покупку. Я не уверен, что делает notify_url? Спасибо

Ответы [ 4 ]

58 голосов
/ 12 марта 2010

PayPal работает так:

У вас есть форма с кнопкой "купить". При нажатии на нее информация (продукт, цена, имя вашей учетной записи и т. Д.) Отправляется в PayPal.

Затем покупатель соглашается заплатить вам, и после завершения транзакции PayPal отправляет «IPN» (мгновенное уведомление о платеже) на ваш URL-адрес для уведомления - он отправляет данные POST на этот URL-адрес для обработки вашим сервером. Вы отвечаете в PayPal, чтобы спросить, отправили ли они данные POST (а не самозванец), и если они затем ответят, что это реальная транзакция, вы можете передать продукт клиенту. Обратите внимание, что все это происходит в фоновом режиме, пока ваш покупатель все еще находится на веб-сайте PayPal.

Существует последний необязательный этап, который заключается в том, что PayPal возвращает покупателя на ваш сайт. В этом случае они отправляют покупателя обратно на ваш URL-адрес возврата и могут (необязательно) снова возвращать данные транзакции (они называют этот PDT). И вы можете снова проверить с Paypal, является ли это действительной транзакцией, и предоставить загрузку и т. Д. В этот момент.

Самым сложным, что никто не объясняет, является то, что покупатель не перенаправляется на ваш URL-адрес. Т.е. "посетителем" URL-адреса вашего веб-сайта является PayPal, , а не покупатель , так что это не происходит во время сеанса вашего покупателя. Если вы хотите сохранить сеанс в трех частях этого процесса, вам нужно создать средство отслеживания покупателя в вашей форме и передать его PayPal в поле формы, называемом «пользовательский». Эти данные передаются вам обратно в данных IPN и PDT, и вы можете использовать их для восстановления соединения с исходным сеансом пользователя.

Вам действительно нужно реализовать как IPN, так и PDT - если электронная почта IPN не удалась, у вас есть резервная копия PDT. И если пользователь закрывает свой веб-браузер до того, как он будет перенаправлен обратно на страницу PDT, вы отправили письмо с IPN в качестве резервной копии.

Поиск по IPN и PDT, и вы найдете довольно много информации. PayPal также имеет полную документацию и примеры сценариев.

6 голосов
/ 12 марта 2010

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;
   }
2 голосов
/ 02 июля 2013
$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']; 

}
0 голосов
/ 04 января 2014

При анализе ответа 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 ), и значения будут заданы как глобальные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...