2016-02-13 37 views
3

我正在使用一個簡單的PHP腳本來驗證Android訂單以解析客戶的下載。InApp計費在Web服務器上驗證訂單PHP

$receipt = $_GET['purchaseData']; 
$billInfo = json_decode($receipt,true); 
$signature = $_GET['dataSignature']; 
$public_key_base64 = "xxxxxxxxxxxxxxxx"; 
$key = "-----BEGIN PUBLIC KEY-----\n". 
     chunk_split($public_key_base64, 64,"\n"). 
     '-----END PUBLIC KEY-----'; 

$key = openssl_get_publickey($key); 

$signature = base64_decode($signature); 

//$result = openssl_verify($billInfo, $signature, $key); 
$result = openssl_verify($receipt, $signature, $key); 
if (0 === $result) { 
     echo "0"; 
    } else if (1 !== $result) { 
     echo "1"; 
    } else { 
     echo "Hello World!"; 
    } 

//added the var_dump($result); as asked by A-2-A 
var_dump($result); 

結果是0int(0)

我通過App做一個真正的訂單後,我出版了它,並試圖驗證順序時,我得到「0」的結果。

我嘗試直接HTTP訪問

https://domain.com/thankyou.php?purchaseData={"packageName":"com.example.app","orderId":"GPA.1234-5678-1234-98608","productId":"product","developerPayload":"mypurchasetoken","purchaseTime":1455346586453,"purchaseState":0,"developerPayload":"mypurchasetoken","purchaseToken":"ggedobflmccnemedgplmodhp...."}&dataSignature=gwmBf... 

我保持第一的問題,因爲我的結果仍然是猜測。經過進一步調查,我認爲這是簽名不被谷歌發送的一個很好的乾淨的方式閱讀。

signature=gwmBfgGudpG5iPp3L0OnepNlx,而瀏覽器閱讀它作爲ƒ ~®v‘¹ˆúw

怎麼可能讓它能夠以正確的方式閱讀?

+0

只是檢查'var_dump($ result);'顯示什麼。向我們展示 –

+0

@ A-2-A它顯示「int(0)」現在網頁顯示「0 int(0)」 –

+0

int(0)指的是我所知道的未知數,但它認爲它是未知數? –

回答

1

確認要確保以下的簽名:

  1. INAPP_PURCHASE_DATA不以任何方式突變。任何編碼或轉義更改都將導致驗證無效。確保它完好無損地保存到服務器的最好方法是用base64編碼它。
  2. INAPP_DATA_SIGNATURE也必須保持完好,它應該已經base64編碼,所以發送到您的服務器應該不成問題。
  3. openssl_verify預計datasignature參數都處於其原始狀態,因此base64在驗證之前進行解碼。
  4. 它也需要signature_alg作爲最後一個參數,在這種情況下,sha1WithRSAEncryption應該與默認值一樣工作,但如果有疑問,請嘗試其他幾個sha1 algorithms以查看哪些工作正常。

我最好的猜測爲什麼它不適合您現在的問題是,你沒有的,因爲它是在應用程序收到了同樣的情況你的服務器上接收的INAPP_PURCHASE_DATA。這Stackoverflow問題有同樣的問題。

+0

感謝您的答案和藉口,請你詳細說明你的答案,併爲我提供一個例子,因爲我是一個Java新手。謝謝! –

+0

@WiTonNope我對Java並不擅長,但如果你正在尋找的是如何獲得'INAPP_PURCHASE_DATA'和'INAPP_DATA_SIGNATURE'的例子,那麼請參考官方文檔:http://developer.android.com /google/play/billing/billing_reference.html。另外http://stackoverflow.com/questions/7360403/base-64-encode-and-decode-example-code#answer-7360440將幫助你base64編碼的'INAPP_PURCHASE_DATA' –

+0

感謝我會檢查的答覆和看看我能做些什麼,希望它能奏效。再次感謝你。 –