Paypal IPN Obtendo confirmação em branco (deve ser “VERIFICADO” ou “INVÁLIDO”)

Estou apenas testando o IPN do Paypal aqui. Tenho configurado o Sandbox. Estou enviando pedidos falsos de IPN, e está recebendo o IPN. Então, eu estou obtendo isso para retornar as informações para verificação, e eu estou escrevendo a resposta para um arquivo de texto para que eu possa verificá-lo sozinho. O IPN está triggersndo bem e a resposta está sendo escrita no arquivo de texto.

Há apenas um problema … A resposta está em branco.

A resposta deve ser recebida como “VERIFICADA” ou “INVALIDA”, e estas são as únicas 2 respostas possíveis … então, o que está acontecendo = S. Qualquer ajuda é muito apreciada.

O código inteiro é postado abaixo:

$ipn_post_data = $_POST; $response = ""; // Choose url $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; // Set up request to PayPal $request = curl_init(); curl_setopt_array($request, array ( CURLOPT_URL => $url, CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $ipn_post_data), CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_HEADER => FALSE, CURLOPT_SSL_VERIFYPEER => TRUE, CURLOPT_CAINFO => 'cacert.pem', )); // Execute request and get response and status code $response = curl_exec($request); $status = curl_getinfo($request, CURLINFO_HTTP_CODE); // Close connection curl_close($request); $fh = fopen( "ipntest.txt", 'a+' ); $date = date( "YMj H:i" ); fwrite( $fh, $date . " Response: " . $response . "\n" ); fclose( $fh ); if($status == 200 && $response == 'VERIFIED') { // All good! Proceed... } else { // Not good. Ignore, or log for investigation... } 

Saída de arquivo de texto:

 2012-Nov-26 23:24 Response: 2012-Nov-26 23:25 Response: 

Eu já estava usando este código anteriormente, tentei fazê-lo funcionar por uma semana, então não é apenas uma falha temporária ou algo assim …

Saúde Gente.

Então, apenas para referência futura, para pessoas com esse mesmo problema:

O problema aqui não era ter um arquivo de CA.

Não tenho certeza do que exatamente um arquivo CA faz, mas eu sei que tem algo a ver com o certificado SSL do Paypal e estabelecer uma conexão SSL. Quando comecei a analisar os erros da CURL, vi o seguinte:

 [27-Nov-2012 21:46:11 UTC] cURL error: [77] error setting certificate verify locations: CAfile: /etc/ssl/certs/api_cert_chain.crt CApath: /etc/ssl/certs 

A solução rápida que encontrei foi baixar a class IpnListener.php . (Isso foi recomendado por eldblz . Isso fez com que o IPN fosse mais fácil e forneceu uma solução para o meu não ter um CAFile. Se você baixar o pacote inteiro do IpnListener.php, ele inclui uma pasta chamada cert que inclui o api_cert_chain.crt que você precisa, e já está configurado para uso.

Sempre usei o seguinte e funciona bem …

 // Validate with curl $curl_result=$curl_err=''; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'https://'.$ppHost.'/cgi-bin/webscr'); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $req); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req))); curl_setopt($ch, CURLOPT_HEADER , 1); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $curl_result = curl_exec($ch); $curl_err = curl_error($ch); curl_close($ch); //are we verified? If so, let's process the IPN if (strpos($curl_result, "VERIFIED")!==false) $valid = true; else $valid = false; 

Você precisaria ter certeza de que $ ppHost nesta amostra estava correto, dependendo se a transação veio da checkbox de proteção ou dos servidores ao vivo e, em seguida, preencha $ req e $ ssl em conformidade.

 class Paypal_IPN { /** @var string $_url The paypal url to go to through cURL private $_url; /** * @param string $mode 'live' or 'sandbox' */ public function __construct($mode = 'live') { if ($mode == 'live') $this->_url = 'https://www.paypal.com/cgi-bin/webscr'; else $this->_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; } public function run() { $postFields = 'cmd=_notify-validate'; foreach($_POST as $key => $value) { $postFields .= "&$key=".urlencode($value); } $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $this->_url, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postFields )); $result = curl_exec($ch); curl_close($ch); $fh = fopen('result.txt', 'w'); fwrite($fh, $result . ' -- ' . $postFields); fclose($fh); echo $result; } } 

Chame isso em outro arquivo php:

 run(); ?>