2011-05-19 74 views
0

凌亂,複雜的問題,但在這裏。我正在與Google Checkout進行整合項目,還有一項Google Checkout GWT服務,它返回Checkout網絡界面用於將美元兌換成當地貨幣的貨幣兌換率。此端點在https://market.android.com/publish/gwt/託管,並在螢火蟲我看到這個要去服務器盯着:提取GWT服務的結果

7|0|6|https://market.android.com/publish/gwt/|FCCA4108CB89BFC2FEC78BA7363D4AF6|com.google.wireless.android.vending.developer. 

shared.MerchantService|getCurrencyExchangeRates|com.google.common.money.CurrencyCode/112449834|java.util.ArrayList/4159755760 

|1|2|3|4|2|5|6|5|235|6|13|5|18|5|81|5|53|5|72|5|102|5|121|5|177|5|175|5|205|5|204|5|55|5|86|-1| 

,這被返回

//OK[235,3,'D0JA',2,86,3,'CXXg',2,55,3,'DW2A',2,204,3,'X9NA',2,205,3,'EuvA',2,175,3,'VIig',2,177,3,'E2Dw',2,121,3,'E4ziA',2,1 

02,3,'do$Q',2,72,3,'T82w',2,53,3,'Ds0Q',2,81,3,'Cq5g',2,18,3,'Dlfg',2,13,1,["com.google.common.collect.RegularImmutableList/4 

40499227","com.google.common.money.SimpleMoney/627983206","com.google.common.money.CurrencyCode/112449834"],0,7] 

原諒奇格式:不能完全得到代碼塊以正確格式。

徘徊網絡幾個小時結束我能夠確定RegularImmutableList類在番石榴圖書館(在http://code.google.com/p/guava-libraries/)。我正在尋找的是:

  1. 我找不到任何地方的com.google.common.money.SimpleMoneycom.google.common.money.CurrencyCode類:沒有人見過他們嗎?
  2. GWT線格式似乎是一個奇怪的JSON字符串。我看到Google Groups消息的各種引用都在討論有關連線格式的描述,但無法找到潛在的消息或任何能夠讓我反轉的連貫引用:任何人都可以輕鬆參考?如果我至少能夠理解編碼是什麼,那麼如果沒有上述問題1中的類文件,我可能會離開。
  3. 我開始漫遊Android Market api庫http://code.google.com/p/android-market-api/,他們認爲他們必須完成一些Android Market通信集成,並且他們似乎已經使用protobufs完成了這項工作。 GWT/protobufs通信位有沒有像樣的參考?

這種瘋狂的根本原因是我需要能夠從Google Checkout中獲取定期匯率值,因此當我以外幣進口銷售交易時,我可以按照當時的流行匯率進行轉換交易時間。目前的Checkout報告格式不提供此功能,所以大多數人最終會使用與Google使用的不相符的替代匯率來源。這顯然是Google Checkout集成界面的一個缺點,但如果我們開始使用Google Checkout界面的缺點,我們將在這裏整整一週。我的意圖是輪詢Checkout界面,查看新履行的訂單,然後請求適當的匯率表,以便我可以近乎實時地計算出收款是什麼。我已經得到了投票,但不能完全超過匯率。

回答

0

你在看什麼是GWT-RPC序列化格式。不幸的是它沒有公開記錄。幸運的GWT是開源的,所以你可以看源代碼,看看它是如何產生的。

注意:這種格式可能會在GWT版本之間改變(我知道它在2.2版本中)。這也是Google不記錄它的最有可能的原因 - 如果他們這樣做了,他們需要保持向後兼容。

  1. 您看到的類名是Google Checkout內部使用的Java類。當GWT被編譯成JS時,名稱會被破壞,所以你不會再看到它們。
  2. 如上所述,這是GWT-RPC。
  3. 你想要做的是對Google內部API進行逆向工程。我不會那樣做,因爲,a。它可能會改變,恕不另行通知,打破你的應用程序,並b。我確信Goog不會喜歡它,它可能違反了服務協議(你讀過它了嗎?)。
+0

嗯。沒有希望。它是一個只提供信息的面向用戶的API,我將它與他們現有的接口一起明確地使用它,但我會去尋找服務協議,看看它是否有反對意見。我真的很喜歡它,如果我不必做任何這些廢話,但自2011年3月以來,我(和其他人)一直在努力解決這個集成問題,並且考慮到Google Checkout路線圖的不透明性,我將繼續努力並嘗試製作一些進展。 – Femi 2011-05-19 19:10:31

+0

是的我看到人們一直在討論這一點:http://www.google.com/support/forum/p/checkout-merchants/thread?tid=0e75cc0a1868bbad&hl=zh-CN – 2011-05-19 19:28:58

1

在嘗試創建腳本以批量上傳應用內產品(CSV上傳經常失敗並帶有隱含的錯誤消息)時,我已經設法瞭解GWT AJAX協議。

它其實很簡單,除了它需要你知道所有使用的類的結構。或者猜測一下,就像Google使用的內部類一樣。 :)

我將使用問題中的示例詳細解釋協議。


請求格式

7|0|6|https://market.android.com/publish/gwt/|FCCA4108CB89BFC2FEC78BA7363D4AF6|com.google.wireless.android.vending.developer.shared.MerchantService|getCurrencyExchangeRates|com.google.common.money.CurrencyCode/112449834|java.util.ArrayList/4159755760|1|2|3|4|2|5|6|5|235|6|13|5|18|5|81|5|53|5|72|5|102|5|121|5|177|5|175|5|205|5|204|5|55|5|86|-1| 

該請求是具有以下含義的令牌的管分隔的列表:

  1. - 協議版本
  2. - 旗幟。 是FLAG_ELIDE_TYPE_NAMES,是FLAG_RPC_TOKEN_INCLUDED
  3. 6個 - 串令牌計數
  4. 6字符串標記:
    1. https://market.android.com/publish/gwt/
    2. FCCA4108CB89BFC2FEC78BA7363D4AF6
    3. com.google.wireless.android.vending.developer.shared.MerchantService
    4. getCurrencyExchangeRates
    5. com.google.common.money.CurrencyCode/112449834
    6. java.util.ArrayList/4159755760
  5. 實際編碼的請求,它從上述列表中使用基於1的索引引用字符串:
    1. - https://market.android.com/publish/gwt/ - 基URL
    2. - FCCA4108CB89BFC2FEC78BA7363D4AF6 - 一些散列,在GWT源文件中引用爲serializationPolicyStrongName
    3. - com.google.wireless.android.vending.developer.shared.MerchantService - 服務名
    4. - getCurrencyExchangeRates - 方法名稱
    5. - 參數計數。參數類型如下:
      1. - com.google.common.money.CurrencyCode/112449834
      2. - java.util.ArrayList/4159755760
    6. 序列化參數。每個對象都由它的類名和序列化字段列表表示,或者通過對先前遇到的對象的負整數反向引用來表示。在我們的情況下,我們有兩個對象:
      1. - com.google.common.money.CurrencyCode/112449834,其中僅具有一個整數字段:
      2. - java.util.ArrayList/4159755760,其具有一個整數長度字段,隨後13序列化的列表項。需要注意的是其中12個是序列化,就像上面的一個CurrencyCode對象,最後一個是反向引用(-1)改爲(去)序列化這一要求,即CurrencyCode(235)
    7. 我們遇到的第一個對象

應答格式

//OK[235,3,'D0JA',2,86,3,'CXXg',2,55,3,'DW2A',2,204,3,'X9NA',2,205,3,'EuvA',2,175,3,'VIig',2,177,3,'E2Dw',2,121,3,'E4ziA',2,102,3,'do$Q',2,72,3,'T82w',2,53,3,'Ds0Q',2,81,3,'Cq5g',2,18,3,'Dlfg',2,13,1,["com.google.common.collect.RegularImmutableList/440499227","com.google.common.money.SimpleMoney/627983206","com.google.common.money.CurrencyCode/112449834"],0,7] 

響應格式與請求格式非常相似,只是它的JS格式數組(儘管不是JSON,因爲它使用無效的單引號),並且它的編號爲的編號爲。 字段含義如下:

  1. - 協議版本
  2. - 標誌,相同請求
  3. 字符串標記的陣列:
    1. com.google.common.collect.RegularImmutableList/440499227
    2. com.google.common.money.SimpleMoney/627983206
    3. com.google.common.money.CurrencyCode/112449834
  4. 然後進入類型的一個序列化對象1 - com.google.common.collect.RegularImmutableList/440499227與一個整數長度字段,接着類 13個序列化對象 - com.google.common.money.SimpleMoney/627983206。每個SimpleMoney對象有兩個字段,例如:
    1. 'Dlfg' - 長整型字段編碼爲base64數字。這種特殊的一個是
    2. 3,18 - 與整場CurrencyCode對象
0

我在VB做了一些代碼,可能是有用的爲你實現如何解析GWT序列化字符串。 「Datos」包含您收到的字符串。

aAux = Split(Datos, ",[") 
aAux(1) = Replace(aAux(1), "],0,7]", "") 
aAux(0) = Replace(aAux(0), "//OK[", "") 
aAux(0) = Replace(aAux(0), "'", "") 

aDescripcion = Split(aAux(1), """,""") 
aValor = Split(aAux(0), ",") 
InvertirArray aValor 

For X = 0 To UBound(aValor) 
    If Not IsNumeric(aValor(X)) Then 
     Exit For 
    End If 
    If adescripcion(Int(aValor(X))-1) = "gov.senasa.embalajemadera.shared.domain.Pais/3238585366" Then 
     For Y = X + 1 To UBound(aValor) 
      If Int(aValor(Y)) = "" Then '- Do what you want 
      end if 
      If adescripcion(Int(aValor(Y))) = "java.lang.Integer/3438268394" Then 
     '- Do what you want 
     Next Y 
    End If 
Next X 

當然,你必須把它適應您的需求,你必須發揮一點點與列...

InvertirArray:

Public Sub InvertirArray(ByRef Arr() As String) 
'- el array va tiene que empezar en 0 
Dim X As Long 
Dim Hasta As Long 
Dim Tmp As String 

If UBound(Arr) Mod 2 = 0 Then 
    '- Es impar 
    Hasta = UBound(Arr) + 1 
Else 
    Hasta = UBound(Arr) 
End If 

For X = LBound(Arr) To UBound(Arr) \ 2 
    Tmp = Arr(X) 
    Arr(X) = Arr(UBound(Arr) - X) 
    Arr(UBound(Arr) - X) = Tmp 
Next X 
end sub 

當然,你需要解碼和編碼長數字和日期。所以:

Public Function EncodeDateGwt(Numero As Double, Optional isDate As Boolean = False) As String 

Dim s As String 
Dim a As Double 
Dim i As Integer 
Dim u As Integer 
Dim Base As String 
Numero = IIf(isDate, Numero * 1000, Numero) 
Base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$" 
Do While Val(Numero) <> 0 
    a = Numero 
    i = 0 
    Do While a >= 64 
     i = i + 1 
     a = a/64 
    Loop 
    If i <> u - 1 And u <> 0 Then EncodeDateGwt = EncodeDateGwt & String(u - i - 1, Left(Base, 1)) 
    a = Int(a) 
    EncodeDateGwt = EncodeDateGwt + Mid(Base, a + 1, 1) 
    Numero = Numero - a * (64^i) 
    u = i 
Loop 
EncodeDateGwt = EncodeDateGwt & String(i, Left(Base, 1)) 
End Function 

Public Function DecodeDateGwt(Texto As String, Optional isDate As Boolean = False) As Long 

Dim Base As String 
Dim a As Integer 
Base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$" 
For a = 1 To Len(Texto) 
    DecodeDateGwt = DecodeDateGwt + (InStr(Base, Mid(Texto, a, 1)) - 1) *  (Len(Base)^((Len(Texto) - (a)))) 
Next 
DecodeDateGwt = IIf(isDate, DecodeDateGwt/1000, DecodeDateGwt) 
'devuelve timestamp 
End Function 

如果你需要什麼編碼/解碼是一個日期,那麼你需要之前做到這一點:

Call encodegwtdate(date2unix("20/02/2016"),true) 



Public Function Date2Unix(ByVal vDate As Date) As Long 
Date2Unix = DateDiff("s", Unix1970, vDate) 
End Function 

Public Function Unix2Date(vUnixDate As Long) As Date 
Unix2Date = DateAdd("s", vUnixDate, Unix1970) 
End Function 

希望你解決這個問題。順便說一句,有誰知道什麼負數意味着什麼?