2017-10-24 20 views
0

私は、ユーザーが購入できるいくつかのinapp項目を備えたモバイルアプリを持っています。ユーザーがいくつかのinappプロダクトを購入すると、アプリはJSON領収書をサーバーに保存して、Google開発者公開キー(サーバーに保存されている)とのオンライン検証を行います。Android InApp購入確認

アプリはサーバに(レシート別名)署名とデータを送信します。

$signature = 'E2dxlmSe0d45eJpN4FKSUxNPYXM5A1zohpVL60Hd+5jd43j4YMhBlVRLwFeDaBKZnkJ39rYYesWoOu8Z5ysczAIiQO7Myko7UJYVYKvB5GqM8a0iEDjCdCpSRSqLUmaEHKwUJFfjcgw1K5L2gM/m3u8l7Jy25IB+HFVIikO50jiy8SMRh7S+s6PgEAXqG6K6vTpuTC5ECweuQ45VTdb0jNyWOzEW/I1nA5fAB/mmp5j3B6k7nN81NMh/3oUJHba/wWGlbkWtItmDU6/jMdpd1CVViNBhKe0ktwnSRz3XF607/AfZM6JteOKhC6TquWhVNuWpKJWdJbP7Q+RVS0YKog=='; 

$data = '{"orderId":"GPA.xxxx-xxxx-xxxx-xxxxx","packageName":"xxx.xxx.xxx","productId":"xxx","purchaseTime":1508881024560,"purchaseState":0,"purchaseToken":"didpmjkaldaddakgfabdohdj.AO-J1Ozqb8hZAa-_FLd-sQJgXhwruU3tVEYU0sqhlgXHb8I9wI35xDeQFgFI0Zpoaurw4Ry7zahymvge1U0WlEqqvvAKvwAo0Wk1MtawzAiqVdy2RTvwFGo"}'; 

ここに私が署名検証のために使用しているPHPのコードです:

$pkey = "..."; 
$apkey = "-----BEGIN PUBLIC KEY-----\n".chunk_split($pkey, 64, "\n")."-----END PUBLIC KEY-----"; 
$pubkeyid = openssl_get_publickey($apkey); 
$ok = openssl_verify($data, $signature, $pubkeyid); 
openssl_free_key($pubkeyid); 
echo $ok; 

そしてもちろん、それはdoesnのは、仕事はありません。 OpenSSL関数は0を返します(OKの場合は1ではなく)。オンライン文書https://developer.android.com/google/play/billing/billing_integrate.html によると、確認する必要があるのはINAPP_PURCHASE_DATAです。これはreceiptです。ここにdocからの例:

'{ 
    "orderId":"GPA.1234-5678-9012-34567", 
    "packageName":"com.example.app", 
    "productId":"exampleSku", 
    "purchaseTime":1345678900000, 
    "purchaseState":0, 
    "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ", 
    "purchaseToken":"opaque-token-up-to-1000-characters" 
}' 

これは私のアプリが送信するものです。さて、署名検証では完全なビットデータが必要なので、どうやってこのような文字列をOpenSSL関数に "送信"するのですか?ドキュメントでは、データに改行とインデントがありますが、私のJSON構造はまったく同じですが、改行もインデントもない単純な文字列として記録されています。これはJSONと同じですが、暗号署名検証の観点とは非常に異なります。誰かがそれをする方法を説明してくださいできますか?

  • dataが無いインデントとプレーンな文字列でなければならずラインには、OpenSSL機能

に渡す前

  • 署名がBASE64が復号化される必要がある壊れる:

  • 答えて

    0

    は、問題を解決しましたしたがって、代わりに:

    $ok = openssl_verify($data, $signature, $pubkeyid); 
    

    私はこれを行う必要があります:

    $ok = openssl_verify($data, base64_decode($signature), $pubkeyid);