android в биллинге приложений v3 с php

Я пытаюсь выполнить андроид в проверке фактов 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); 

благодаря 🙂

Вы передаете неправильное значение $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() .