2016-02-13 4 views
3

Я использую простой скрипт PHP для проверки заказа Android для разбора загрузки для клиента.InApp Billing Verifying Order на веб-сервере PHP

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

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

Как это возможно, чтобы оно было прочитано в правильном направлении?

+0

просто проверьте, что отображается 'var_dump ($ result);'. показать нам также –

+0

@ A-2-A показывает «int (0)», теперь на веб-странице отображается «0 int (0)» –

+0

int (0) относится к неизвестному, насколько я знаю, но какую часть он рассматривает как неизвестный ? –

ответ

1

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

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

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

+0

спасибо за ответ и оправдание, можете ли вы рассказать о своем ответе и предоставить мне пример, поскольку я новичок с Java. Спасибо! –

+0

@WiTonNope Я тоже не очень разбираюсь в Java, но если вы ищете примеры того, как получить «INAPP_PURCHASE_DATA» и «INAPP_DATA_SIGNATURE», обратитесь к официальным документам: http://developer.android.com /google/play/billing/billing_reference.html. Также http://stackoverflow.com/questions/7360403/base-64-encode-and-decode-example-code#answer-7360440 поможет вам base64 закодировать 'INAPP_PURCHASE_DATA' –

+0

спасибо за ответ, который я проверю и посмотрим, что я могу сделать, надеюсь, это сработает. Еще раз спасибо. –

Смежные вопросы