2013-05-14 2 views
5

Я пытаюсь настроить Android-биллинг v3 на моем удаленном сервере php.android in app billing v3 с php

но, кажется, что-то неправильно в моих кодах.

Я думаю, что эта функция openssl_verify является проблемой.

Результат всегда провалился!

Я не могу найти, какой первый параметр нужно проверить с помощью openssl_verify. на самом деле, я «м путать то, что разумно формат для размещения в первом параметре :(

могли бы вы помочь мне решить эту проблему?

$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed 

сильфонных полных тестовых кодов.

<?php 
    $responseCode = 0; 
    $encoded='{ 
      "orderId":"12999763169054705758.1111111111111", 
        "packageName":"com.xxx.yyy", 
        "productId":"test__100_c", 
        "purchaseTime":1368455064000, 
        "purchaseState":0, 
        "purchaseToken":"tcmggamllmgqiabymvcgtfsj.AO-J1OwoOzoFd-G-....." 
}'; 
$data = json_decode($encoded,true); 

$signature = "tKdvc42ujbYfLl+3sGdl7RAUPlNv....."; 

$publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2kMri6mE5+....."; 

$key = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($publicKey, 64, "\n") . "-----END PUBLIC KEY-----"; 
$key = openssl_get_publickey($key); 
if (false === $key) { 
     exit("error openssl_get_publickey"); 
} 
var_dump($key); 

$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed 
//$result = openssl_verify($data, base64_decode($signature), $key); // failed 
//$result = openssl_verify($encoded, base64_decode($signature), $key); // failed 
//$result = openssl_verify(base64_decode($data["purchaseToken"]), base64_decode($signature), $key); // failed 
//$result = openssl_verify(base64_decode($signature),$data["purchaseToken"], $key,OPENSSL_ALGO_SHA512); // failed 
if ($result == 1) { 
     echo "good"; 
} elseif ($result == 0) { 
     echo "bad"; 
} else { 
     echo "error"; 
} 
echo($result); 

спасибо :)

ответ

7

Вы ошиблись $data значение openssl_verify(). Это значение должно быть полной строкой JSON, которую вы получаете из Google Play, а не токеном покупки внутри него. Важно, чтобы строка JSON была не затронута, так как даже если бы вы добавляли в нее пробел или символы новой строки, подпись больше не работала бы.

Все, что вам нужно сделать в коде выше, чтобы изменить эту строку:

$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key);

к

$result = openssl_verify($data, base64_decode($signature), $key);

И вы должны получить успеха, предполагается, что вы используете правильный открытый ключ и строка покупки JSON действительны. Я почти уверен, что ваша строка JSON не является исходной строкой из Google, однако, поскольку в Google нет новых строк. Это будет длинная строка текста JSON. Убедитесь, что это то, что вы проходите до openssl_verify().

+0

+1 для двух вещей, параметров и неправильной строки json. Я исправляю и то и другое. спасибо – TaeL

+0

Это немного запутанно, потому что в вашем ответе '$ data' декодируется json для массива. Очень важно использовать ORIGINAL JSON от Google (я знаю, что это в вашем ответе в конце, но я пропустил его во время первого чтения :-)) – Naxos

+0

У вас есть достаточно репутации, чтобы улучшить ответ? Если так, пожалуйста, сделайте это. В противном случае я попытаюсь обновить его, чтобы уточнить его лучше. :) –