2016-09-26 3 views
4

Я пытаюсь сделать пожертвование через paypal, используя URL-адрес this. Когда я вхожу в систему PayPal и делаю платеж, я получаю следующее сообщение: enter image description herePaypal не отправляется на получение платежа

У меня есть код базы данных, и вот как он выглядит.

<?php 
use PayPal\Rest\ApiContext; 
use PayPal\Auth\OAuthTokenCredential; 
use PayPal\Api\Payer; 
use PayPal\Api\Details; 
use PayPal\Api\Amount; 
use PayPal\Api\Transaction; 
use PayPal\Api\Payment; 
use PayPal\Api\RedirectUrls; 
use PayPal\Api\PaymentExecution; 

require __DIR__ . DIRECTORY_SEPARATOR . '../vendor/autoload.php'; 

/** 
* Edri PayPal Pyment 
*/ 
class Edri_PayPal_Payment 
{ 

    private $api; 

    private $payer; 

    private $details; 

    private $amount; 

    private $transaction; 

    private $payment; 

    private $redirectUrls; 


    function __construct() 
    { 
     $this->api = $this->setup_PayPal_Api(); 
    } 

    private function debug($val) 
    { 
     echo '<pre>'; 
     var_dump($val); 
     echo '</pre>'; 
    } 

    private function setup_PayPal_Api() 
    { 
     $api = new ApiContext(
      new OAuthTokenCredential(
       'MyPayPalClientID', 
       'MyClientSecret' 
      ) 
     ); 

     $api->setConfig(array(
      'mode' => 'live', 
      'http.ConnectionTimeOut' => 30, 
      'Log.LogEnabled' => false, 
      'Log.FileName' => '', 
      'Log.LogLevel' => 'FINE', 
      'validation.level' => 'log' 
     )); 

     return $api; 
    } 

    private function setupPayer() 
    { 
     $this->payer = new Payer(); 

     $this->payer->setPayment_method('paypal'); 
    } 

    private function setupDetails($amount) 
    { 
     $this->details = new Details(); 
     $this->details->setShipping('0.00') 
      ->setTax('0.00') 
      ->setsubTotal($amount); 
    } 

    private function setupAmount($amount) 
    { 

     $this->amount = new Amount(); 

     $this->amount->setCurrency('EUR') 
      ->setTotal($amount) 
      ->setDetails($this->details); 
    } 

    private function setupTransaction($amount) 
    { 

     $this->transaction = new Transaction(); 

     $this->transaction->setAmount($this->amount) 
      ->setDescription('Make a donation of €' . $amount . ' to EDRi'); 
    } 

    private function setupPayment() 
    { 
     $this->payment = new Payment(); 

     $this->payment->setIntent('sale') 
      ->setPayer($this->payer) 
      ->setTransactions(array($this->transaction)) 
      ->setRedirectUrls($this->redirectUrls); 
    } 

    private function setupRedirectUrls() 
    { 
     $this->redirectUrls = new RedirectUrls(); 

     $this->redirectUrls->setReturnUrl('https://edri.org/payment?pppa=true') 
      ->setCancelUrl('https://edri.org/payment?pppa=false'); 
    } 

    public function prepare_payment ($paymentCredtials) { 
     $amount = str_replace(',', '', number_format($paymentCredtials['edriPayment_amount'], 2)); 

     $this->setupPayer(); 
     $this->setupDetails($amount); 
     $this->setupAmount($amount); 
     $this->setupTransaction($amount); 
     $this->setupRedirectUrls(); 
     $this->setupPayment(); 

     try { 

      $this->payment->create($this->api); 

      $paymentID = $this->payment->getId(); 

     } catch (Exception $e) { 
      $this->log($e); 

      header('Location: https://edri.org/donation-oops'); 

      return false; 
     } 

     return $paymentID; 

    } 

    private function log($log){ 

     $file = __DIR__ . DIRECTORY_SEPARATOR . '../logs/paypal_log.txt'; 


     // Open the file to get existing content 
     $current = file_get_contents($file); 
     // Append a new person to the file 
     $current .= $prefix . ' ' . date('m/d/Y h:i:s a', time()) . ' //// ' . "\n"; 
     $current .= self::var_dump_str($log) . "\n"; 
     // Write the contents back to the file 
     file_put_contents($file, $current); 
    } 

    public function execute_payment($paymentCredentials) 
    { 
     $this->debug($paymentCredentials); 

     $payment = Payment::get($paymentCredentials['paymentId'], $this->api); 

     $execution = new PaymentExecution(); 

     $execution->setPayerId($paymentCredentials['PayerID']); 


     try { 

      echo $payment->execute($execution, $this->api); 

     } catch (Exception $e) { 
      $this->log($e); 

      header('Location: https://edri.org/donation-oops'); 

      return false; 
     } 

     return $payment->state = 'approved' ? true : false; 

    } 

    public function kickoff_payment() 
    { 

     foreach ($this->payment->getLinks() as $link) { 
      if ($link->getRel() == 'approval_url') { 
       $redirectUrl = $link->getHref(); 
      } 
     } 

     header('Location: ' . $redirectUrl); 
    } 

} 

Я проверил журналы, ничего не сообщается. Похоже, что API-интерфейсы тоже прекрасны.

Любое предложение сделать эту работу было бы полезно.

+0

Не могли бы вы подтвердить свой счет в PayPal с помощью [таким образом] (http://www.wikihow.com/Verify-a-PayPal-Account). Если ваш код в порядке, возможно, этот шаг может решить вашу проблему. –

ответ

3

Там есть вероятность того, что var_dump() заявление вы должны не нарушать «никакого вывода содержимого перед заголовком» правилами и, следовательно, оплата поток пользователя останавливается с кодом, прежде чем header('Location: ' . $redirectUrl); может перенаправить на PayPal, чтобы закончить работу.

Попробуйте удалить эти var_dump s и сделать вместо этого error_log(printf($val, true)), чтобы не прерывать вызов header().

Редактировать - От http://php.net/manual/en/function.header.php:

Помните, что заголовок() должна вызываться перед любой фактический вывод направляется, либо с помощью обычных HTML-теги, пустые строки в файле, или из PHP. Очень распространенная ошибка для чтения кода с включением или требованием, функциями или другой функцией доступа к файлам, а также пробелы или пустые строки, которые выводятся перед вызовом header(). Та же проблема существует при использовании одного файла PHP/HTML.

<html> 
<?php 
/* This will give an error. Note the output 
* above, which is before the header() call */ 
header('Location: http://www.example.com/'); 
exit; 
?> 
+0

Привет @ cameron-hurd Вы имеете в виду, что я должен var_dump ($ val) вышеуказанного кода и заменить его на error_log (printf ($ val, true)) – kingmakerking

+0

Правильно - 'error_log' ничего не выводит и передает' true 'как второй аргумент для' printf' возвращает, а не выводит значение. Если проблема с содержимым перед выпуском, это позволит вам обойти это, продолжая проверять значения переменной. –

+0

Я сделал замену, и теперь он печатает только слово «Array» вместо предыдущего сообщения (которое находится на рисунке) :( – kingmakerking

Смежные вопросы