2013-05-14 7 views
5

ich versuche android in app billing v3 auf meinem remote php server zu überprüfen.android in app fakturierung v3 mit php

aber es scheint, dass etwas an meinen Codes falsch ist.

Ich denke, diese Openssl_verify-Funktion ist ein Problem.

Ergebnis ist immer fehlgeschlagen!

Ich kann nicht finden, welcher erste Parameter mit openssl_verify verifiziert werden soll. tatsächlich, ich bin verwechseln, was vernünftig Format auf dem ersten Parameter zu platzieren :(

könnten Sie mir helfen, es zu lösen?

$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed 

belows vollständigen Testcodes.

<?php 
    $responseCode = 0; 
    $encoded='{ 
      "orderId":"12999763169054705758.1111111111111", 
        "packageName":"com.xxx.yyy", 
        "productId":"test__100_c", 
        "purchaseTime":1368455064000, 
        "purchaseState":0, 
        "purchaseToken":"tcmggamllmgqiabymvcgtfsj.AO-J1OwoOzoFd-G-....." 
}'; 
$data = json_decode($encoded,true); 

$signature = "tKdvc42ujbYfLl+3sGdl7RAUPlNv....."; 

$publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2kMri6mE5+....."; 

$key = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($publicKey, 64, "\n") . "-----END PUBLIC KEY-----"; 
$key = openssl_get_publickey($key); 
if (false === $key) { 
     exit("error openssl_get_publickey"); 
} 
var_dump($key); 

$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key); // original // failed 
//$result = openssl_verify($data, base64_decode($signature), $key); // failed 
//$result = openssl_verify($encoded, base64_decode($signature), $key); // failed 
//$result = openssl_verify(base64_decode($data["purchaseToken"]), base64_decode($signature), $key); // failed 
//$result = openssl_verify(base64_decode($signature),$data["purchaseToken"], $key,OPENSSL_ALGO_SHA512); // failed 
if ($result == 1) { 
     echo "good"; 
} elseif ($result == 0) { 
     echo "bad"; 
} else { 
     echo "error"; 
} 
echo($result); 

Dank :)

Antwort

7

Sie geben den falschen Wert $data in openssl_verify() ein. Dieser Wert sollte die vollständige JSON-Zeichenfolge sein, die Sie von Google Play erhalten, nicht das darin enthaltene Kauf-Token. Es ist wichtig, dass die JSON-Zeichenfolge unberührt bleibt. Selbst wenn Sie ein Leerzeichen oder Zeilenumbrüche hinzufügen würden, würde die Signatur nicht mehr funktionieren.

Alles, was Sie brauchen, oben im Code zu tun ist, diese Zeile zu ändern:

$result = openssl_verify($data["purchaseToken"], base64_decode($signature), $key);

zu

$result = openssl_verify($data, base64_decode($signature), $key);

Und Sie sollten einen Erfolg erhalten Sie unter der Annahme verwenden Der richtige öffentliche Schlüssel und die JSON-Kaufzeichenfolge sind gültig. Ich bin mir ziemlich sicher, dass Ihre JSON-Zeichenfolge nicht die ursprüngliche Zeichenfolge von Google ist, da die von Google keine Zeilenumbrüche enthält. Es wird eine lange Zeile von JSON-Text sein. Stellen Sie sicher, dass Sie an openssl_verify() übergeben werden.

+0

+1 für zwei Dinge, Parameter und falsche JSON-Zeichenfolge. ich korrigiert beide, und behoben. danke – TaeL

+0

es ist ein bisschen verwirrend, weil in Ihrer Antwort '$ data' json zu Array dekodiert wird. Es ist wichtig, ORIGINAL JSON von Google zu verwenden (ich weiß, dass es am Ende in deiner Antwort steht, aber ich habe es beim ersten Lesen verpasst :-)) – Naxos

+0

Hast du genug Rep, um die Antwort zu verbessern? Wenn ja, bitte. Ansonsten werde ich versuchen, es zu aktualisieren, um es besser zu klären. :) –

Verwandte Themen