2013-05-14 32 views
5

Tôi đang thử android trong thanh toán ứng dụng v3 xác minh trên máy chủ php từ xa của tôi.android trong thanh toán ứng dụng v3 với php

nhưng có vẻ như đã xảy ra lỗi ở mã của tôi.

tôi nghĩ rằng hàm openssl_verify này là vấn đề.

kết quả luôn thất bại!

tôi không thể tìm thấy thông số đầu tiên để xác minh bằng openssl_verify. trên thực tế, tôi đang nhầm lẫn giữa định dạng hợp lý là những gì để đặt vào tham số đầu tiên :(

bạn có thể giúp tôi để giải quyết nó?

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

belows mã kiểm tra đầy đủ.

<?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); 

nhờ :)

Trả lời

7

Bạn đang chuyển sai giá trị $data vào openssl_verify(). Giá trị này phải là chuỗi JSON đầy đủ mà bạn nhận được từ Google Play chứ không phải mã thông báo mua bên trong nó. Điều quan trọng là chuỗi JSON không bị ảnh hưởng, vì ngay cả khi bạn thêm dấu cách hoặc dòng mới vào nó, chữ ký sẽ không còn hoạt động nữa.

Tất cả bạn cần làm trong mã của bạn ở trên là thay đổi dòng này:

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

để

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

Và bạn sẽ nhận được một thành công, giả sử bạn đang sử dụng khóa công khai chính xác và chuỗi mua JSON là hợp lệ. Tôi khá chắc chắn chuỗi JSON của bạn không phải là chuỗi gốc từ Google tuy nhiên, như những chuỗi từ Google không chứa newlines. Nó sẽ là một dòng dài của văn bản JSON. Hãy chắc chắn rằng đó là những gì bạn đang chuyển đến openssl_verify().

+0

+1 cho hai thứ, thông số và chuỗi json sai. i sửa cả hai và cố định. cảm ơn – TaeL

+0

nó là một chút bối rối bởi vì trong câu trả lời của bạn '$ data' được giải mã json thành mảng. Điều quan trọng là sử dụng ORIGINAL JSON từ Google (tôi biết rằng câu trả lời của bạn ở cuối câu trả lời, nhưng tôi đã bỏ lỡ nó trong lần đọc đầu tiên :-)) – Naxos

+0

Bạn có đủ đại diện để cải thiện câu trả lời không? Nếu vậy bằng mọi cách hãy làm. Nếu không, tôi sẽ cố gắng cập nhật nó để làm rõ nó tốt hơn. :) –

Các vấn đề liên quan