Я использую простой 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
Как можно позволить ему правильно читать?
Чтобы проверить подпись, вы хотите убедиться в следующем:
INAPP_PURCHASE_DATA
не мутируется. Любые изменения в кодировке или экранировании приведут к недействительной проверке. Лучший способ гарантировать, что он попадает на ваш сервер без изменений, – это base64, закодированный им. INAPP_DATA_SIGNATURE
также должен оставаться неповрежденным, он должен уже закодировать base64, поэтому отправка этого на ваш сервер не должна быть проблемой. data
и аргументы signature
будут в исходном состоянии, поэтому base64 расшифровывается перед проверкой. signature_alg
как последний аргумент, в этом случае sha1WithRSAEncryption
должен работать так же, как и по умолчанию, но если сомневаюсь, попробуйте несколько других алгоритмов sha1, чтобы увидеть, какие из них работают. Мое лучшее предположение, почему он сейчас не работает для вас, заключается в том, что вы не получаете INAPP_PURCHASE_DATA
на своем сервере в том же состоянии, в котором оно было получено в приложении. У этой проблемы с Stackoverflow была та же проблема.