私たちのアプリでは、アプリ内購入があります。クライアントは Google Play からの購入を要求し、Google Play から受け取ったすべての情報 (領収書、ナンス付き、注文など、および署名) をサーバーに送信し、検証のために C# で記述します。この投稿のコード例を使用しています
問題は、検証が失敗することです。
注: クライアントはすべてのデータを JSON 形式で送信します。それを機能させるために、Google Play から返された文字列を次のように操作します。
クライアント側で
data = data.replace("\"", "\\\"");
サーバー側で
data = data.Replace("\\", "");
編集: JSON コード例、アプリからサーバーへ
{
"data": "{\\\"nonce\\\":3768004882572571381,\\\"orders\\\":[{\\\"notificationId\\\":\\\"android.test.purchased\\\",\\\"packageName\\\":\\\"com.company.appname\\\",\\\"orderId\\\":\\\"transactionId.android.test.purchased\\\",\\\"purchaseState\\\":0,\\\"productId\\\":\\\"android.test.purchased\\\",\\\"purchaseTime\\\":1335790350398}]}",
"signature": "ML6ocr89x3+oT3ZKnQBEE2mNEVj6LHwt+L4I/bnhl+xCpJcjhsAIhfAumeCKwXonJV4Oh9n3Sa7SVT0F7S9XcgE2xGcf2zOZmxHB1wQcyM7fQiGj39Cyb2zuYf3T6Cs1eerDzHaO1teVQZyIhBPJf4cszD/WikSpHcF8zBTvV58FkRVwl2NR4CEvI2FrKFek8Xq2O4CsclCpS5UJorMKRAer9pcSD1BkFzynQJffbaDcRLFZ7i9vABV+GZ/xWxMGPuYYE77GYk8Q2fejgmwiZ3ysY0VjEfGRCpSA==",
"userId": 1
}
編集済み: そのテストは失敗します。検証済みはブール変数であり、true であると想定されています
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
RSAParameters rsaKeyInfo = new RSAParameters()
{
Exponent = Convert.FromBase64String(ConfigurationManager.AppSettings["RsaKeyInfo.Exponent"]),
Modulus = Convert.FromBase64String(ConfigurationManager.AppSettings["RsaKeyInfo.Modulus"])
};
rsa.ImportParameters(rsaKeyInfo);
verified = rsa.VerifyData(Encoding.ASCII.GetBytes(data), "SHA1", Convert.FromBase64String(signature));
}