InApp Billing Проверка порядка на веб-сервере PHP

Я использую простой PHP-скрипт, чтобы проверить заказ Android для разбора загрузки для клиента.

$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)

Я сделал реальный заказ через приложение после того, как опубликовал его, и, пытаясь проверить порядок, я получаю «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... 

Я сохраняю первый вопрос, потому что мой результат все еще догадывается. После дальнейшего расследования я считаю, что подпись не читается красивым чистым способом, как отправляется Google.

signature=gwmBfgGudpG5iPp3L0OnepNlx то время как браузер читает ее как ƒ ~®v'¹ˆúw

Как можно позволить ему правильно читать?

Чтобы проверить подпись, вы хотите убедиться в следующем:

  1. INAPP_PURCHASE_DATA не мутируется. Любые изменения в кодировке или экранировании приведут к недействительной проверке. Лучший способ гарантировать, что он попадает на ваш сервер без изменений, – это base64, закодированный им.
  2. INAPP_DATA_SIGNATURE также должен оставаться неповрежденным, он должен уже закодировать base64, поэтому отправка этого на ваш сервер не должна быть проблемой.
  3. openssl_verify ожидает, что как data и аргументы signature будут в исходном состоянии, поэтому base64 расшифровывается перед проверкой.
  4. Он также принимает значение signature_alg как последний аргумент, в этом случае sha1WithRSAEncryption должен работать так же, как и по умолчанию, но если сомневаюсь, попробуйте несколько других алгоритмов sha1, чтобы увидеть, какие из них работают.

Мое лучшее предположение, почему он сейчас не работает для вас, заключается в том, что вы не получаете INAPP_PURCHASE_DATA на своем сервере в том же состоянии, в котором оно было получено в приложении. У этой проблемы с Stackoverflow была та же проблема.