【问题标题】:InApp Billing Verifying Order on Web Server PHPWeb 服务器 PHP 上的 InApp 计费验证订单
【发布时间】:2016-02-13 07:58:26
【问题描述】:

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

怎样才能让它以正确的方式被阅读?

【问题讨论】:

  • 只需检查 var_dump($result); 显示的内容。也给我们看看
  • @A-2-A 它显示“int(0)”现在网页显示“0 int(0)”
  • int(0) 据我所知是指未知,但它认为哪个部分是未知的?

标签: php android in-app-billing


【解决方案1】:

要验证签名,您要确保以下几点:

  1. INAPP_PURCHASE_DATA 不会以任何方式发生变异。任何编码或转义更改都将导致验证无效。确保它完好无损地到达您的服务器的最佳方法是对其进行 base64 编码。
  2. INAPP_DATA_SIGNATURE 也必须保持原样,它应该已经进行了 base64 编码,因此将其发送到您的服务器应该没有问题。
  3. openssl_verify 期望 datasignature 参数都处于原始状态,因此在验证之前先进行 base64 解码。
  4. 它还将signature_alg 作为最后一个参数,在这种情况下sha1WithRSAEncryption 应该像默认值一样工作,但如果有疑问,请尝试其他几个sha1 algorithms 看看哪些工作有效。

我最好的猜测为什么它现在不适合你是因为你在服务器上收到的INAPP_PURCHASE_DATA 与在应用程序上收到的情况相同。这个Stackoverflow 问题也有同样的问题。

【讨论】:

  • 感谢您的回答和借口,您能否详细说明您的答案并为我提供一个示例,因为我是 Java 新手。谢谢!
  • @WiTonNope 我对 Java 也不是很好,但如果您正在寻找有关如何获取 INAPP_PURCHASE_DATAINAPP_DATA_SIGNATURE 的示例,请参阅官方文档:@987654324 @。此外stackoverflow.com/questions/7360403/… 将帮助您对INAPP_PURCHASE_DATA 进行base64 编码
  • 感谢您的回复,我会检查并看看我能做些什么,希望它会起作用。再次感谢您。
猜你喜欢
  • 2013-01-04
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2023-03-29
  • 2010-11-19
相关资源
最近更新 更多