PayPal IPN - sorun oturum veri erişimini sahip?

2 Cevap php

hepsi. Bunu ben oturum değişkenleri okumak için benim çözüm alınamıyor görünüyor PayPal IPN entegrasyonu ile ilgili sorunlar yaşıyorum.

Bir siparişleri masaya PayPal tarafından sağlanan Temel olarak, benim dükkan modülü komut, ben müşterinin bilgilerini saklayabilirsiniz. Ancak, ben de sipariş kimliği ile bağlantılı ayrı bir tabloya bir işlemde sipariş ürünlerini kaydetmek istiyoruz.

Ancak, o zaman oturumda ürünleri ile döngü ve orders_products masaya bunları kaydetmek, nerede çalışma değil senaryonun ikinci parçası.

Oturum verileri okunan değil bir nedeni var mı?

Aşağıdaki gibi shop.php içindeki kodu:

if ($paypal->validate_ipn()) {
    $name = $paypal->ipn_data['address_name'];
    $street_1 = $paypal->ipn_data['address_street'];
    $street_2 = "";
    $city = $paypal->ipn_data['address_city'];
    $state = $paypal->ipn_data['address_state'];
    $zip = $paypal->ipn_data['address_zip'];
    $country = $paypal->ipn_data['address_country'];
    $txn_id = $paypal->ipn_data['txn_id'];
    $sql = "INSERT INTO orders (name, street_1, street_2, city, state, zip, country, txn_id)
            VALUES (:name, :street_1, :street_2, :city, :state, :zip, :country, :txn_id)";
    $smt = $this->pdo->prepare($sql);
    $smt->bindParam(':name', $name, PDO::PARAM_STR);
    $smt->bindParam(':street_1', $street_1, PDO::PARAM_STR);
    $smt->bindParam(':street_2', $street_2, PDO::PARAM_STR);
    $smt->bindParam(':city', $city, PDO::PARAM_STR);
    $smt->bindParam(':state', $state, PDO::PARAM_STR);
    $smt->bindParam(':zip', $zip, PDO::PARAM_STR);
    $smt->bindParam(':country', $country, PDO::PARAM_STR);
    $smt->bindParam(':txn_id', $txn_id, PDO::PARAM_INT);
    $smt->execute();
    // save products to orders relationship
    $order_id = $this->pdo->lastInsertId();
    // $cart = $this->session->get('cart');
    $cart = $this->session->get('cart');
    foreach ($cart as $product_id => $item) {
        $quantity = $item['quantity'];
        $sql = "INSERT INTO orders_products (order_id, product_id, quantity) VALUES ('$order_id', '$product_id', '$quantity')";
        $res = $this->pdo->query($sql);
    }
    $this->session->del('cart');
    mail('martin@mcbwebdesign.co.uk', 'IPN result', 'IPN was successful on wrestling-wear.com');
} else {
    mail('martin@mcbwebdesign.co.uk', 'IPN result', 'IPN failed on wrestling-wear.com');
}

Ve ben burada buldum gibi PHP için PayPal IPN sınıfını kullanarak ediyorum: http://www.micahcarrick.com/04-19-2005/php-paypal-ipn-integration-class.html, ancak aşağıdaki gibi validate_ipn() yönteminin içeriği olan:

public function validate_ipn()
{
    $url_parsed = parse_url($this->paypal_url);
    $post_string = '';
    foreach ($_POST as $field => $value) {
        $this->ipn_data[$field] = $value;
        $post_string.= $field.'='.urlencode(stripslashes($value)).'&';
    }
    $post_string.= "cmd=_notify-validate"; // append IPN command
    // open the connection to PayPal
    $fp = fsockopen($url_parsed[host], "80", $err_num, $err_str, 30);
    if (!$fp) {
        // could not open the connection. If logging is on, the error message will be in the log
        $this->last_error = "fsockopen error no. $errnum: $errstr";
        $this->log_ipn_results(false);
        return false;
    } else {
        // post the data back to PayPal
        fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n");
        fputs($fp, "Host: $url_parsed[host]\r\n");
        fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
        fputs($fp, "Content-length: ".strlen($post_string)."\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        fputs($fp, $post_string . "\r\n\r\n");
        // loop through the response from the server and append to variable
        while (!feof($fp)) {
            $this->ipn_response.= fgets($fp, 1024);
        }
        fclose($fp); // close connection
    }
    if (eregi("VERIFIED", $this->ipn_response)) {
        // valid IPN transaction
        $this->log_ipn_results(true);
        return true;
    } else {
        // invalid IPN transaction; check the log for details
        $this->last_error = 'IPN Validation Failed.';
        $this->log_ipn_results(false);
        return false;
    }
}

2 Cevap

Eğer doğru hatırlıyorsam, PayPal IPN doğrudan komut için bir bildirim gönderir. Bu bağlamda, oturum yok - sipariş DEĞİL müşteri - bildirim PayPal geliyor beri. Bu nedenle, tüm sepeti verileri oturumunda yok.

Ben geçmişte IPN'i kullanmış olduğunuz zaman, veritabanında kendi sırasına hakkında her şeyi saklanır ve bir TransactionID oluşturulur. Bu benim PayPal düzenin geri kalanı ile kapalı gönderebilirsiniz geçiş değişkenlerden biridir ve onlar geri geçecek. Ben PayPal IPN aldı sonra ben TransactionID dayalı düzen rehidrasyona ve takip vardı ne iş kuralları ile ilerledi - bir e-posta göndermek, parolalar oluşturmak, vb

Şu anda bu üzerinde çalışıyorum - bu sipariş ile birlikte Paypal user_id gönderilen iyi olabilir, sizin işlem tablolarına prospektüste oturum user_id almak için çalışıyoruz söylüyorlar. Eğer kısa sürede Paypal yönlendirilir gibi DB yazarsanız hiçbir garantisi var çünkü aslında sipariş tamamladı. Buna ek olarak, PayPal bir virgülle sınırlandırılmış bir dize ürün / sipariş bilgilerini geri göndermek düşünüyorum, bu yüzden size satılan ancak birçok benzersiz öğeleri saymak bakmak isterim, ve dinamik yani ... item_id1, item_id2, item_id3 olsun sorgu her zaman değişiyor. Yanılıyorsam, ben ancak sınıfları kullanmadan bu uygulamaya başlamak üzereyim beni düzeltin.