最近在google play上線的應用內支付被人刷了,用戶模擬發起了大量的支付請求,並且全部成功支付。搞得我最近茶飯不思。。今天總算是解決了,和大家分享一下。
我們客戶端的支付實現步驟是:
1. app端調用google支付
2. 支付成功後,調用 自己服務器的發貨接口,當然發貨接口是做了簽名校驗的。
之所以在app端調用發貨,是因爲google貌似沒有提供服務器端直接回調url的地方,所以纔給了惡意用戶模擬google返回的機會。
一開始我以爲是我們自己的發貨接口密鑰被破解了,但是後來經過app上報,發現客戶端是真實的走過了所有的google支付流程,即google的支付sdk真的返回了成功。
由於不清楚是因爲google的密鑰泄漏還是攻擊者用別的方法實現,所以客戶端這邊已經沒有辦法確認是安全的了。
好在google是提供了查詢訂單的接口的: http://developer.android.com/google/play/billing/gp-purchase-status-api.html
實現的流程在文檔中已經寫的很清楚了,我這裏就不贅述了。
判斷的方法也很簡單:
1. 判斷是否購買成功
2. 判斷返回 developerPayload 是否與傳入的值一致。最好傳入訂單號,以防止重放攻擊。