2012-01-28 39 views
6

Tôi đang sử dụng thư viện http://www.binpress.com/app/paypal-adaptive-payments-pro-codeigniter-library/140 này và tôi đang sử dụng thư viện này làm trình nghe IPn cho dự án viết mã - http://pastebin.com/pMb7Zhz3.Số phát hành IPN Paypal với thanh toán song song

Về cơ bản tôi đang thực hiện giao dịch song song bằng thư viện paypal ở trên để khi người dùng thực hiện thanh toán/tặng, nó sẽ gửi tiền tới 2 tài khoản khác nhau. Sau khi giao dịch hoàn tất, paypal gửi dữ liệu đến người nghe ipn của tôi và nó phân tích thông tin cho 1 khách hàng tốt nếu tôi để lại mã này 'IPNNotificationURL' => '' trong mã của tôi và đi vào paypal và đặt url ipn.

Tôi đang cố gắng lấy thông tin IPN cho cả hai tài khoản, mà không cần phải có cả hai tài khoản đặt url ipn trong cài đặt paypal của họ. Khi tôi đặt 'IPNNotificationURL' => 'http://example.com/paypal_ipn', tôi vẫn nhận được thông tin ipn cho 1 tài khoản, nhưng tôi nhận được cảnh báo này Array to string conversion on line 11 của người nghe của tôi. Làm thế nào tôi có thể sửa lỗi này và nếu tôi làm, tôi sẽ nhận được thông tin ipn từ cả hai tài khoản?

Dưới đây là các phương pháp thanh toán từ thư viện trên mà tôi đang sử dụng cho các khoản thanh toán song song

function Pay() 
    { 
     // Prepare request arrays 
     $PayRequestFields = array(
           'ActionType' => 'PAY',        // Required. Whether the request pays the receiver or whether the request is set up to create a payment request, but not fulfill the payment until the ExecutePayment is called. Values are: PAY, CREATE, PAY_PRIMARY 
           'CancelURL' => '',  // Required. The URL to which the sender's browser is redirected if the sender cancels the approval for the payment after logging in to paypal.com. 1024 char max. 
           'CurrencyCode' => 'USD',       // Required. 3 character currency code. 
           'FeesPayer' => 'SENDER',       // The payer of the fees. Values are: SENDER, PRIMARYRECEIVER, EACHRECEIVER, SECONDARYONLY 
           'IPNNotificationURL' => '',       // The URL to which you want all IPN messages for this payment to be sent. 1024 char max. 
           'Memo' => '',      // A note associated with the payment (text, not HTML). 1000 char max 
           'Pin' => '',          // The sener's personal id number, which was specified when the sender signed up for the preapproval 
           'PreapprovalKey' => '',        // The key associated with a preapproval for this payment. The preapproval is required if this is a preapproved payment. 
           'ReturnURL' => '',  // Required. The URL to which the sener's browser is redirected after approvaing a payment on paypal.com. 1024 char max. 
           'ReverseAllParallelPaymentsOnError' => '',  // Whether to reverse paralel payments if an error occurs with a payment. Values are: TRUE, FALSE 
           'SenderEmail' => '',    // Sender's email address. 127 char max. 
           'TrackingID' => ''         // Unique ID that you specify to track the payment. 127 char max. 
           ); 

     $ClientDetailsFields = array(
           'CustomerID' => '',         // Your ID for the sender 127 char max. 
           'CustomerType' => '',        // Your ID of the type of customer. 127 char max. 
           'GeoLocation' => '',        // Sender's geographic location 
           'Model' => '',          // A sub-identification of the application. 127 char max. 
           'PartnerName' => ''         // Your organization's name or ID 
           ); 

     $FundingTypes = array('ECHECK', 'BALANCE', 'CREDITCARD'); 

     $Receivers = array(); 
     $Receiver = array(
         'Amount' => '',            // Required. Amount to be paid to the receiver. 
         'Email' => '',        // Receiver's email address. 127 char max. 
         'InvoiceID' => '',           // The invoice number for the payment. 127 char max. 
         'PaymentType' => '',         // Transaction type. Values are: GOODS, SERVICE, PERSONAL, CASHADVANCE, DIGITALGOODS 
         'PaymentSubType' => '',          // The transaction subtype for the payment. 
         'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => ''), // Receiver's phone number. Numbers only. 
         'Primary' => ''            // Whether this receiver is the primary receiver. Values are: TRUE, FALSE 
         ); 
     array_push($Receivers,$Receiver); 

     $SenderIdentifierFields = array(
             'UseCredentials' => ''      // If TRUE, use credentials to identify the sender. Default is false. 
             ); 

     $AccountIdentifierFields = array(
             'Email' => '',  // Sender's email address. 127 char max. 
             'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => '')        // Sender's phone number. Numbers only. 
             ); 

     $PayPalRequestData = array(
          'PayRequestFields' => $PayRequestFields, 
          'ClientDetailsFields' => $ClientDetailsFields, 
          'FundingTypes' => $FundingTypes, 
          'Receivers' => $Receivers, 
          'SenderIdentifierFields' => $SenderIdentifierFields, 
          'AccountIdentifierFields' => $AccountIdentifierFields 
          ); 

     $PayPalResult = $this->paypal_adaptive->Pay($PayPalRequestData); 

     if(!$this->paypal_adaptive->APICallSuccessful($PayPalResult['Ack'])) 
     { 
      $errors = array('Errors'=>$PayPalResult['Errors']); 
      $this->load->view('paypal_error',$errors); 
     } 
     else 
     { 
      $data['result'] = $PayPalResult; 
      $this->load->view('success', $data);  
     } 
    } 

và dòng 11 là này từ pastebin trên - $value = urlencode(stripslashes($value));

+0

Bạn có thể cung cấp dòng đó và các phần có liên quan khác của mã không? – Josh

+0

Tôi hy vọng điều này sẽ giúp: http://stackoverflow.com/questions/8456218/paypal-parallel-payment-ipn – Josh

+0

Tôi đã xem bài đăng đó một vài lần. Tôi vẫn còn gặp rắc rối. – Catfish

Trả lời

3

tôi đã tìm ra cách để phân tích thanh toán thích ứng IPN trong PHP.

Tôi đã sử dụng chức năng DecodePayPalIPN() bởi donut2d https://www.x.com/developers/paypal/forums/adaptive-payments-api/php-technique-parsing-adaptive-payment-ipn-posts?page=0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C1 kết hợp với một trong những trình nghe mẫu trên trang web paypal và đây là Trình nghe IPN Codeigniter hoàn chỉnh của tôi cho các thanh toán thích ứng với giao dịch song song.

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Paypal_ipn extends CI_Controller { 

    public function index() { 

     // read the post from PayPal system and add 'cmd' 
     $req = 'cmd=_notify-validate&'.file_get_contents("php://input"); 
     $header = null; 

     // post back to PayPal system to validate 
     $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
     $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
     $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 
     $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

     $raw_post = file_get_contents("php://input"); 
     $post_array = $this->decodePayPalIPN($raw_post); 

     //log_message('error', "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
     //$log1 = var_export($post_array, true); 

     //log_message('error', $log1); 
     //log_message('error', "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 

     if(isset($post_array['sender_email'])) { 
      $sender_email = $post_array['sender_email']; 
     } 
     if(isset($post_array['status'])) { 
      $status = $post_array['status']; 
     } 
     if(isset($post_array['payment_request_date'])) { 
      $payment_request_date = $post_array['payment_request_date']; 
     } 
     if(isset($post_array['transaction'][0]['receiver'])) { 
      $receiver0 = $post_array['transaction'][0]['receiver']; 
     } 
     if(isset($post_array['transaction'][1]['receiver'])) { 
      $receiver1 = $post_array['transaction'][1]['receiver']; 
     } 
     if(isset($post_array['transaction'][0]['id'])) { 
      $id0 = $post_array['transaction'][0]['id']; 
     } 
     if(isset($post_array['transaction'][1]['id'])) { 
      $id1 = $post_array['transaction'][1]['id']; 
     } 
     if(isset($post_array['transaction'][0]['invoiceId'])) { 
      $invoiceId0 = $post_array['transaction'][0]['invoiceId']; 
     } 
     if(isset($post_array['transaction'][1]['invoiceId'])) { 
      $invoiceId1 = $post_array['transaction'][1]['invoiceId']; 
     } 
     if(isset($post_array['transaction'][0]['amount'])) { 
      $amount0 = $post_array['transaction'][0]['amount']; 
     } 
     if(isset($post_array['transaction'][1]['amount'])) { 
      $amount1 = $post_array['transaction'][1]['amount']; 
     } 
     if(isset($post_array['transaction'][0]['status'])) { 
      $status0 = $post_array['transaction'][0]['status']; 
     } 
     if(isset($post_array['transaction'][1]['status'])) { 
      $status1 = $post_array['transaction'][1]['status']; 
     } 
     if(isset($post_array['transaction'][0]['id_for_sender_txn'])) { 
      $id_for_sender_txn0 = $post_array['transaction'][0]['id_for_sender_txn']; 
     } 
     if(isset($post_array['transaction'][1]['id_for_sender_txn'])) { 
      $id_for_sender_txn1 = $post_array['transaction'][1]['id_for_sender_txn']; 
     } 
     if(isset($post_array['transaction'][0]['status_for_sender_txn'])) { 
      $status_for_sender_txn0 = $post_array['transaction'][0]['status_for_sender_txn']; 
     } 
     if(isset($post_array['transaction'][1]['status_for_sender_txn'])) { 
      $status_for_sender_txn1 = $post_array['transaction'][1]['status_for_sender_txn']; 
     } 
     if(isset($post_array['transaction'][1]['pending_reason'])) { 
      $pending_reason0 = $post_array['transaction'][1]['pending_reason']; 
     } 
     if(isset($post_array['transaction'][1]['pending_reason'])) { 
      $pending_reason1 = $post_array['transaction'][1]['pending_reason']; 
     } 


     if (!$fp) { 
      // HTTP ERROR 
     } else { 
      $counter = 0; 
      fputs ($fp, $header . $req); 
      while (!feof($fp)) { 
       $res = fgets ($fp, 1024); 

       if (strcmp ($res, "VERIFIED") == 0) { 

        log_message('error', "sender_email = $sender_email"); 
        log_message('error', "payment_request_date = $payment_request_date"); 
        log_message('error', "status = $status"); 
        log_message('error', "receiver0 = $receiver0"); 
        log_message('error', "receiver1 = $receiver1"); 
        log_message('error', "id0 = $id0"); 
        log_message('error', "id1 = $id1"); 
        log_message('error', "invoiceId0 = $invoiceId0"); 
        log_message('error', "invoiceId1 = $invoiceId1"); 
        log_message('error', "amount0 = $amount0"); 
        log_message('error', "amount1 = $amount1"); 
        log_message('error', "status0 = $status0"); 
        log_message('error', "status1 = $status1"); 
        log_message('error', "id_for_sender_txn0 = $id_for_sender_txn0"); 
        log_message('error', "id_for_sender_txn1 = $id_for_sender_txn1"); 
        log_message('error', "status_for_sender_txn0 = $status_for_sender_txn0"); 
        log_message('error', "status_for_sender_txn1 = $status_for_sender_txn1"); 
        log_message('error', "pending_reason0 = $pending_reason0"); 
        log_message('error', "pending_reason1 = $pending_reason1"); 


        // check the payment_status is Completed 
        // check that txn_id has not been previously processed 
        // check that receiver_email is your Primary PayPal email 
        // check that payment_amount/payment_currency are correct 
        // process payment 
        $counter++; 
       } 
       else if (strcmp ($res, "INVALID") == 0) { 
        log_message('error', 'WE INVALIDDDDDDDDDDDDDDDDDD'); 
        $test = var_export($res, true); 
        $test = str_replace(array("\r","\n"), '', $test); 

        log_message('error', $test); 
        log_message('error', "Problem with IPN. res = $test"); 
       } 

      } 
      fclose ($fp); 
     } 

    } 

    function decodePayPalIPN($raw_post) 
    { 
     //log_message('error', "testing"); 
     if (empty($raw_post)) { 
      return array(); 
     } # else: 
     $post = array(); 
     $pairs = explode('&', $raw_post); 
     foreach ($pairs as $pair) { 
      list($key, $value) = explode('=', $pair, 2); 
      $key = urldecode($key); 
      $value = urldecode($value); 
      # This is look for a key as simple as 'return_url' or as complex as 'somekey[x].property' 
      preg_match('/(\w+)(?:\[(\d+)\])?(?:\.(\w+))?/', $key, $key_parts); 
      switch (count($key_parts)) { 
       case 4: 
        # Original key format: somekey[x].property 
        # Converting to $post[somekey][x][property] 
        if (!isset($post[$key_parts[1]])) { 
         $post[$key_parts[1]] = array($key_parts[2] => array($key_parts[3] => $value)); 
        } else if (!isset($post[$key_parts[1]][$key_parts[2]])) { 
         $post[$key_parts[1]][$key_parts[2]] = array($key_parts[3] => $value); 
        } else { 
         $post[$key_parts[1]][$key_parts[2]][$key_parts[3]] = $value; 
        } 
        break; 
       case 3: 
        # Original key format: somekey[x] 
        # Converting to $post[somkey][x] 
        if (!isset($post[$key_parts[1]])) { 
         $post[$key_parts[1]] = array(); 
        } 
        $post[$key_parts[1]][$key_parts[2]] = $value; 
        break; 
       default: 
        # No special format 
        $post[$key] = $value; 
        break; 
      }#switch 
     }#foreach 

     return $post; 
    }#decodePayPalIPN() 
} 
Các vấn đề liên quan