2010-05-02 61 views
0

全部。我遇到了PayPal IPN集成問題,看起來我無法通過我的解決方案來讀取會話變量。PayPal IPN - 無法訪問會話數據?

基本上,在我的店鋪模塊腳本中,我將貝寶提供的客戶詳細信息存儲到訂單表中。不過,我也希望將訂單中訂購的產品保存到由訂單ID鏈接的單獨表格中。

但是,這是腳本的第二部分無法正常工作,我在該會話中循環訪問產品,然後將它們保存到orders_products表中。

會話數據沒有被讀取的原因嗎?

shop.php中的代碼如下:

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('[email protected]', 'IPN result', 'IPN was successful on wrestling-wear.com'); 
} else { 
    mail('[email protected]', 'IPN result', 'IPN failed on wrestling-wear.com'); 
} 

而且我使用PHP的貝寶IPN類爲這裏找到:http://www.micahcarrick.com/04-19-2005/php-paypal-ipn-integration-class.html,但validate_ipn()方法的內容如下:

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; 
    } 
} 

回答

1

如果我沒有記錯,PayPal IPN會直接向您的腳本發送通知。由於通知來自PayPal - 不是下訂單的客戶 - 他們的會話在此上下文中不存在。因此,他們所有的購物車數據都不存在於會話中。

當我在過去使用IPN時,我將所有有關它們的順序都存儲在數據庫中,並生成了一個TransactionID。這是我可以將剩餘訂單發送給PayPal的傳遞變量之一,並且它們會將其傳回。一旦我從PayPal收到IPN,我將根據TransactionID重新訂購他們的訂單,並按照我必須遵守的任何業務規則進行處理 - 發送電子郵件,創建密碼等。

+0

所以基本上,會話存儲在數據庫而不是一個tmp文件?乾杯。 – 2010-05-02 22:54:22

+0

@Martin我想你可以在任何你喜歡的地方離開會話,但你需要將交易數據複製到永久的地方,以便將它與PayPal的響應進行匹配。如果session_unset()被意外調用(丟失cookie,或許?),事務不一定會消失。 – cbednarski 2010-05-03 02:27:54

0

我目前正在研究 - 說您試圖將會話user_id插入到事務表中,最好將user_id連同訂單一起發送到PayPal。因爲如果您一旦將其重定向到Paypal就寫入數據庫,您不能保證他們實際完成了訂單。此外,我認爲PayPal會以逗號分隔的字符串將產品/訂單信息發送回去,因此您希望查看您銷售的多個獨特商品的數量,並動態獲取item_id1,item_id2,item_id3 ... so你的查詢總是在變化。糾正我,如果我錯了,我即將開始實施這個,但沒有使用類。