PayPal IPN: чтение нескольких наименований и количеств товара и сохранение в базе данных - PullRequest
0 голосов
/ 11 января 2020

Ниже мой код IPN. Моя проблема в том, что я не могу добавить несколько наименований товаров или их количество в таблицу payments_paypal. На самом деле IPN не прослушивает payer_id, количество, item_name (несколько элементов).

Как мы можем $ _POST item_name1 или item_name2 et c здесь, чтобы во время проверки я мог получить его на другой странице, которая будет страницей успеха. Хотя я добился этого другим методом, но это не правильный метод. Поэтому мне интересно, почему эти переменные не приходят из ipn в виде строки, только эти переменные приходят в строку txn, smt, st, currency и все остальные отсутствуют. Если нам нужно использовать l oop здесь, как мы можем отправить значения для вставки в l oop отсюда ipn. php.

Любая помощь будет оценена.

    $raw_post_data = file_get_contents('php://input'); 
    $raw_post_array = explode('&', $raw_post_data); 
    $myPost = array(); 
    foreach ($raw_post_array as $keyval) { 
        $keyval = explode ('=', $keyval); 
        if (count($keyval) == 2) 
            $myPost[$keyval[0]] = urldecode($keyval[1]); 

    }

    $req = 'cmd=_notify-validate'; 
    if(function_exists('get_magic_quotes_gpc')) { 
        $get_magic_quotes_exists = true; 
    } 
    foreach ($myPost as $key => $value) { 
        if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { 
            $value = urlencode(stripslashes($value)); 
        } else { 
            $value = urlencode($value); 
        } 
        $req .= "&$key=$value"; 
    } 

    /* 
     * Post IPN data back to PayPal to validate the IPN data is genuine 
     * Without this step anyone can fake IPN data 
     */ 
    $paypalURL = PAYPAL_URL; 
    $ch = curl_init($paypalURL); 
    if ($ch == FALSE) { 
        return FALSE; 
    } 
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
    curl_setopt($ch, CURLOPT_SSLVERSION, 6); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 

    // Set TCP timeout to 30 seconds 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close', 'User-Agent: company-name')); 
    $res = curl_exec($ch); 

    /* 
     * Inspect IPN validation result and act accordingly 
     * Split response headers and payload, a better way for strcmp 
     */  
    $tokens = explode("\r\n\r\n", trim($res)); 
    $res = trim(end($tokens)); 
    if (strcmp($res, "VERIFIED") == 0 || strcasecmp($res, "VERIFIED") == 0) { 

        // Retrieve transaction info from PayPal 
        $item_number    = $_POST['item_number']; 
        $txn_id         = $_POST['txn_id']; 
        $payment_gross     = $_POST['mc_gross']; 
        $currency_code     = $_POST['mc_currency']; 
        $payment_status = $_POST['payment_status']; 
         $quantity   = $_POST['quantity']; 

        // Check if transaction data exists with the same TXN ID 
        $prevPayment = $db->query("SELECT payment_id FROM payments WHERE txn_id = '".$txn_id."'"); 
        if($prevPayment->num_rows > 0){ 
            exit(); 
        }else{ 
            // Insert transaction data into the database 
            $insert = $db->query("INSERT INTO payments_paypal(item_number,txn_id,payment_gross,currency_code,payment_status) VALUES('".$item_number."','".$txn_id."','".$payment_gross."','".$currency_code."','".$payment_status."')"); 
        } 

    } 

1 Ответ

0 голосов
/ 11 января 2020

Похоже, код, который вы используете в разделе // Retrieve transaction info from PayPal, чрезвычайно прост и не предназначен для поиска нескольких элементов, например, пронумерованных переменных, таких как item_name1, item_name2, et c.

Вы должны зарегистрировать текст IPN, которые вы получаете и не обрабатываете правильно, или получить их из истории вашей учетной записи PayPal: https://www.paypal.com/us/smarthelp/article/where-can-i-access-my-ipn-history-faq3692

А также ознакомьтесь с документацией имена переменных для нескольких элементов: https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/

Затем вы можете изменить свой код для чтения и обработки этих нескольких пронумерованных переменных и сохранять их в любой схеме базы данных, которую вы пожелаете, что может нужны дополнительные столбцы или что-то еще.

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