InApp计费验证Web服务器PHP的顺序

时间:2016-02-13 07:58:26

标签: php android in-app-billing

我正在使用一个简单的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

如何以正确的方式阅读?

1 个答案:

答案 0 :(得分:1)

要验证您要确认以下内容的签名:

  1. INAPP_PURCHASE_DATA不会以任何方式发生变异。任何编码或转义更改都将导致无效的验证。确保它完整到达服务器的最佳方法是对其进行base64编码。
  2. INAPP_DATA_SIGNATURE也必须保持原样,它应该已经base64编码,因此将其发送到您的服务器应该不是问题。
  3. openssl_verify希望datasignature个参数都处于原始状态,因此在验证之前进行base64解码。
  4. 它还需要signature_alg作为最后一个参数,在这种情况下sha1WithRSAEncryption应该像默认值一样工作,但如果有疑问,请尝试其他一些sha1 algorithms来查看哪些工作正常。
  5. 我最好的猜测,为什么它现在不适合你,因为你没有收到服务器上的INAPP_PURCHASE_DATA,条件与应用程序收到的条件相同。这个Stackoverflow问题存在同样的问题。