2010-02-02 73 views
2

我不知道這是否是可能的,我似乎無法找到任何其他幫助可指導所以這是不可能的......PHP驗證 - 通過HTTP POST值轉發給第三方結賬

我有一個結賬頁面,可將POST變量負載轉發給第三方支付處理器(WorldPay)。

我想知道是否可以在兩頁之間放置一個PHP腳本來進行驗證。

如果購物籃中的物品在填寫表單時已經售罄,它可能會在拍下錢之前趕上客戶。或者如果他們篡改表單數據很有用。

如果我在我自己的網站上這樣做,我可以使用會話向前傳遞POST數據,但由於它是外部網站,我不知道如何發送數據,而無需使用隱藏窗體創建另一個HTML頁面&刷新例如。

是否有可能「隱形」地這樣做 - 實際上並沒有顯示HTML頁面?

+0

它看起來像我想你想在這裏解決錯誤的問題。如何執行預訂籃子中的物品,預設時間以完成結賬? @digitalson描述的方法會給我一些毛骨悚然的感覺,如果它要求我爲第三方網站設置密碼,我會從你的網站上拖走屁股。 (我假設Worldpay有。) 如果預訂項目不是一個選項,我會建議採用Ajax方式,並承擔非JS用戶的風險,如果物品已售出,則只需要返回其資金在結帳期間。 – 2010-02-04 15:13:27

+0

@nickc:我正在假設這是一個**虛擬終端**而不是像Google電子錢包這樣的系統,或者是用戶必須登錄到其他網站的簡單PayPal實現。可能假定這是因爲那是我曾經用過的東西。 – prodigitalson 2010-02-04 15:42:12

+0

@nikc Ajax方式允許在回調期間保留權利,或者在php代碼中可以做的其他漂亮的東西。它非常靈活。人們可以在回調期間執行UPDATE ... SET reserved_count = reserved_count + x,如果檢出失敗,則只需反轉進程(保持跟蹤JS用戶當然!) - 這個想法應該是事務安全的(使用SELECT ... FOR更新) – hurikhan77 2010-02-04 20:19:57

回答

2

是的,你可以做到這一點鉤住形式的onsubmit鉤併發送一個Ajax調用像這樣(使用jQuery):


$('#myform')[0].onsubmit = function() { 
    if (form_check_elements(this.elements)) { /* ««« eg JS validator here */ 
    data = $('#myform').serialize(); 
    $.post('/ajax_validator.php', data, function(data, textStatus) { 
     $('#myform')[0].submit(); /* ««« check the textStatus before here and 
             eventually do not submit (wrap it in 
             an if-clause) */ 
    }); 
    return false; /* make the form not post directly */ 
    } else { 
    return false; /* do not post if JS validation fails */ 
    } 
}; 

我們用這個片段將表單數據存儲在一個會話之前,發佈到第三方,因此當第三方返回到我們的頁面時我們可以使用它。

編輯:請記住,這將只適用於JS啓用,但它是後備安全的:表單仍然提交沒有JS支持。

+0

這看起來好像完全符合法案!我有點不確定這意味着什麼:«««檢查textStatus在這裏,並最終不提交*/ 你在檢查什麼?如果php驗證程序無效,你有輸出嗎?提交的表格在什麼位置? 謝謝! – Ashley 2010-02-05 11:58:29

+0

它包含你的php腳本的http返回狀態(200,302,404),數據包含正文。測試時使用alert()來返回內容,以便確切查看返回的內容。 http://api.jquery.com/jQuery.post/ – hurikhan77 2010-02-05 14:44:37

0

我建議你去這樣的:

之前用戶引導到形式,你檢查(通過SQL查詢)在籃下的項目是否已經銷售一空。如果已經售出,請將用戶重定向到其他頁面,說明此商品已售罄,否則請讓他轉到新購買的表單。

+0

嗨Sarfaz,有時候一件東西可以在顧客填寫表格時賣出,特別是如果它是很多人試圖同時購買的限量版產品。 我有興趣瞭解是否可以製作'隱形'重定向和POST腳本。 – Ashley 2010-02-04 11:38:45

+2

如果您在訪問者輸入結算表單時沒有鎖定項目,那麼無論您獲得的時間範圍有多短,您都不會解決此問題。但是,當物品應該被解鎖時(例如,當用戶簡單地關閉窗口並且從未完成結賬時),存在問題。 – hurikhan77 2010-02-04 15:07:34

2

編輯

阿什利說:

好的,我看了一下cURL 手冊,並編寫了這個非常簡單的 腳本來將POST值轉發到第三方結帳的 。雖然這只是 顯示結帳 頁的內容。 URL地址顯示當前運行的 腳本,而不是 轉發到第三方站點。也 所有他們相對鏈接的圖形 將無法​​正常工作。使用cURL可以實現'真正'轉發 ?

簡短的回答 - 沒有

如果您想在非現場流程的中間步驟做事情(自定義html /消息,驗證數據等),那麼您需要描述您的付款流程,然後您需要處理cURL會執行的整個流程允許你這樣做。

使用cURL,您不「轉發」請求 - 您對請求進行「代理」排序。所以瀏覽器的URL永遠不會改變,相關的圖形也不會工作。通過使用cURL或類似的東西,你永遠不會讓用戶最終用戶知道他們甚至在觸摸外部頁面。您將處理對服務器上該外部服務器的所有請求,然後僅向用戶顯示外部服務器的響應,或者解析該響應,以便您可以以自定義的方式使用該響應中的數據。

本質上,這意味着如果secure.wp3.rbsworldpay.com/wcc/purchase正在返回一個表單,需要用戶進一步交互,您必須在服務器上模擬此表單並顯示該表單。然後,當用戶提交表單時,您再次使用cURL向外部服務器發出請求 - 這次是發佈用戶提交的下一輪數據。因此,例如讓說:

  • secure.wp3.rbsworldpay.com/wcc/purchase顯示車
  • secure.wp3.rbsworldpay.com/wcc/confirm顯示要做出
  • secure.wp3.rbsworldpay.com/wcc/success支付的最終確認和secure.wp3.rbsworldpay.com/wcc/error顯示交易是成功還是失敗的分別。

然後你實際工作將需要作出2個請求外部爲你的交易過程的一部分,這可以概括如下所示:在您的站點

  1. 用戶的商店,並增加了物品到購物車
  2. 用戶點擊結帳和您驗證推車/用戶數據
  3. 如果從#2的數據是有效的打包了數據,並通過捲曲
  4. 張貼到secure.wp3.rbsworldpay.com/wcc/purchase如果從#3的捲曲反應是successf您可以使用cURL響應中的數據構建自己的確認頁面並將其顯示給用戶。
  5. 用戶向您的服務器提交購買確認。
  6. 您將在#5中提交給服務器的數據打包並通過cURL將其發送到secure.wp3.rbsworldpay.com/wcc/confirm
  7. 如果來自#6的cURL響應成功,那麼您將解析從外部服務器返回的預期「錯誤」或「成功」消息,並顯示它們或您自己的自定義錯誤消息。
  8. 沖洗和重複錯誤;-)的情況下

一般來說大多數付款處理器具有處理的選項,支持這一基本過程往往返回容易解析數據,XML,JSON或純文本,而不是HTML。你可能想看看這個。很多時候,他們會經常爲各種編程語言構建庫,以幫助簡化集成過程。


是的它肯定是我對正常使用curl擴展做這樣的東西,或利用curl HTTP客戶端類。您可能希望使自己更容易一些,並使用這些類庫之一 - 例如Zend_Http_Client。它不僅支持curl,還支持套接字和代理。

+0

好的,我看了一下cURL手冊並編寫了這個非常簡單的腳本來將POST值轉發到第三方結帳。 雖然這只是顯示結帳頁面的內容。 URL地址顯示當前正在運行的腳本,而不是轉發到第三方站點。他們所有相對連接的圖形也無法工作。 使用cURL可以實現「真正的」轉發嗎? – Ashley 2010-02-04 10:58:41

+0

這是腳本: $ query =「」; foreach($ _ REQUEST as $ k => $ v){ \t $ query = $ query。$ k。「=」。$ v。「&」; } $ query = substr($ query,0,-5); $ url =「https://secure.wp3.rbsworldpay.com/wcc/purchase」; $ ch = curl_init(); curl_setopt($ ch,CURLOPT_URL,$ url); curl_setopt($ ch,CURLOPT_FOLLOWLOCATION,1); curl_setopt($ ch,CURLOPT_POST,1); //設置POST方法 curl_setopt($ ch,CURLOPT_POSTFIELDS,$ query); //添加POST字段 $ result = curl_exec($ ch); curl_close($ ch); echo $ result; – Ashley 2010-02-04 10:59:32

+0

看到我上面的修改。此外,如果你有代碼需要塊格式化,你應該修改你的問題,以便更容易解讀:-) – prodigitalson 2010-02-04 14:34:35

0

我更喜歡PEAR的HTTP_Request2包,它基本上將cURL和/或套接字包裝在一些簡單的對象中。發佈工作很好。您可以使用它將POST請求反彈到您的驗證檢查器,然後轉到付款處理器。