2011-06-08 20 views
2

我正在開發一個項目,要求我的應用程序在用戶付費時向他的PayPal帳戶付款。這個流程支付給用戶,可靠和安全嗎?

以下是我做到了到目前爲止:

  1. 的(記錄)用戶轉到支付頁面會列出他的所有付款(接受或不)
  2. 他進入他的PayPal電子郵件和他的應用(我的)密碼(用於安全)
  3. POST頁面獲取該用戶的status =「UNPAID」的所有付款列表,並將狀態更新爲「WORKING」(以避免用戶刷新頁面整個過程完成並重新發送相同數量的錢)
  4. 我們計算的總噸數升量在該列表中付出(一個簡單的for
  5. 量通過Paypal自適應支付API(請求:PAY)發送到貝寶
  6. 的響應被檢查,如果已完成,則列表狀態被設置爲「已完成「,如果不是,列表將恢復爲」UNPAID「(如果在此期間發生了第二次付款請求,則通過WHERE id IN(x, y, z)進行SQL更新。然後
  7. 的消息被顯示給用戶

但我需要你們的幫助,我是一個有風險的問題前,我想避免的,我就知道你會怎麼做:

  • 如果用戶在進程頁面上點擊刷新,我不想給他發送兩次(或更多)金額(「工作」鎖在這裏,但是如果用戶在我之前點擊刷新會發生什麼設置鎖?)
  • 很少可能:如果用戶在鎖定「WORKING」之後點擊f5,但在請求paypal之前發生了什麼,以及收到新的付款。通過遵循我所做的,只有一個項目(新)將被設置爲WORKING,但其他所有其他付款將會丟失

你會怎麼做?使其100%可靠的最佳方法是什麼?

感謝您的幫助

注:

4間6的步驟通過PlayFramework jobs製成,具有now()awaiting()結果

回答

2

叫您可以:

  • 防止雙重post via JQuery
  • 使用checkAuthenticity()方法來驗證請求
  • 做一個GET處理POST之後重定向(所以他們甚至不能錯誤地提交相同的2倍)
  • 做支付處理異步(見下文)

對於付款,不是調用作業,而是在隊列(或數據庫中的表)中設置付款的ID,並且每分鐘處理一次該數據處理該數據的作業。當用戶執行POST時,您將重定向到一個頁面,該頁面顯示您正在處理付款,並會在出現問題時通知您。您稍後可以通過使用彗星的UI警告或通過郵件通知用戶。

通過這種方式,您不會將請求鏈接到處理,並且如果您執行順序處理,則不會遇到線程/競爭問題,以及能夠檢測陳舊請求(已完成的付款)。