我正在使用一个简单的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...
我保留了第一个问题因为我的结果仍然是猜测。经过进一步调查后,我认为这是签名没有以谷歌发送的干净方式阅读。
signature=gwmBfgGudpG5iPp3L0OnepNlx
,而浏览器正在将其视为ƒ ~®v‘¹ˆúw
如何以正确的方式阅读?
答案 0 :(得分:1)
要验证您要确认以下内容的签名:
INAPP_PURCHASE_DATA
不会以任何方式发生变异。任何编码或转义更改都将导致无效的验证。确保它完整到达服务器的最佳方法是对其进行base64编码。INAPP_DATA_SIGNATURE
也必须保持原样,它应该已经base64编码,因此将其发送到您的服务器应该不是问题。data
和signature
个参数都处于原始状态,因此在验证之前进行base64解码。signature_alg
作为最后一个参数,在这种情况下sha1WithRSAEncryption
应该像默认值一样工作,但如果有疑问,请尝试其他一些sha1 algorithms来查看哪些工作正常。 我最好的猜测,为什么它现在不适合你,因为你没有收到服务器上的INAPP_PURCHASE_DATA
,条件与应用程序收到的条件相同。这个Stackoverflow问题存在同样的问题。