Unity中从Google Play支付收据JSON提取orderId的方法
解决Unity中解析Google Play支付收据获取orderId的问题
问题原因
你的代码错误在于直接从最外层解析结果里查找"json"键,但实际这个键是嵌套在Payload字段的内层JSON结构里的,所以会出现找不到键的错误。
正确解析步骤
- 解析最外层收据JSON,提取
Payload字段的字符串内容 - 解析
Payload对应的JSON字符串,得到包含"json"和"signature"的字典 - 解析
"json"字段的字符串内容,最终获取orderId等支付详情
修正后的代码
// 1. 解析最外层收据 var receiptRoot = (Dictionary<string, object>)MiniJson.JsonDecode(boughtProduct.receipt); // 提取Payload字符串 if (!receiptRoot.TryGetValue("Payload", out var payloadObj)) { Debug.LogError("找不到Payload字段"); return; } string payloadStr = payloadObj.ToString(); // 2. 解析Payload的JSON内容 var payloadDict = (Dictionary<string, object>)MiniJson.JsonDecode(payloadStr); // 提取内层json字符串和signature if (!payloadDict.TryGetValue("json", out var jsonObj) || !payloadDict.TryGetValue("signature", out var signObj)) { Debug.LogError("找不到json或signature字段"); return; } string innerJsonStr = jsonObj.ToString(); string signature = signObj.ToString(); Debug.Log($"签名: {signature}"); // 3. 解析内层json,获取orderId var purchaseDetails = (Dictionary<string, object>)MiniJson.JsonDecode(innerJsonStr); if (purchaseDetails.TryGetValue("orderId", out var orderIdObj)) { string orderId = orderIdObj.ToString(); Debug.Log($"获取到orderId: {orderId}"); // 这里可以处理其他支付信息,比如packageName、purchaseTime等 } else { Debug.LogError("找不到orderId字段"); }
原收据JSON示例
{"Payload":"{\"json\":\"{\\\"orderId\\\":\\\"GPA.3456-5593-26230\\\",\\\"packageName\\\":\\\"com.Game.Company\\\",\\\"productId\\\":\\\"com.game.company.unlockall\\\",\\\"purchaseTime\\\":1657566629633,\\\"purchaseState\\\":0,\\\"purchaseToken\\\":\\\"ogpffeblkohlejehffmpjdia.AO-J1OzgoZ0k9--lCtsD7a_vdqMNtpVO0M6twn8uojIt9nX5f15aT15xS8gflnTpi-7HCg9_1DLY-TFE-NyY3RP1moIGNjvinoMmBEtLAIGd13IJe3PhGjg\\\",\\\"acknowledged\\\":true}\",\"signature\":\"ADNDAJDAJDJAJDAJDJADJA==\",\"skuDetails\":\"{\\\"productId\\\":\\\"com.game.company.unlockall\\\",\\\"type\\\":\\\"inapp\\\",\\\"title\\\":\\\"Unlock All Chapters\\\",\\\"name\\\":\\\"Unlock All Chapters\\\",\\\"description\\\":\\\"Remove Ads and Unlock All Chapters\\\",\\\"price\\\":\\\"\\u20a9160.00\\\",\\\"price_amount_micros\\\":160000000,\\\"price_currency_code\\\":\\\"INR\\\",\\\"skuDetailsToken\\\":\\\"AEuhpteuwINhyl241tHPoLuXb\\\"}\"}","Store":"GooglePlay","TransactionID":"ogpffeblkohlejehzgoZ0k9--lCtsD7a_vdqMnX5f15aT15xS8gflnTpi-7HCg9_1DLY-GNjvinoMmBEtLAIGd13IJe3PhGjg"}
原尝试代码
var gpDetails = (Dictionary<string,object>)MiniJson.JsonDecode(boughtProduct.receipt); var gpJson = (string)gpDetails["json"]; var gpSign = (string)gpDetails["signature"]; Debug.Log(gpSign + " sign"); Debug.Log(gpJson + " json"); //or try this foreach (KeyValuePair<string, object> kvp in gpDetails) //or try this { Debug.Log("Key = {0}, Value = {1}"+ kvp.Key); }
内容的提问来源于stack exchange,提问作者Prathvi
相关产品推荐
相关产品推荐

