gpt4 book ai didi

json - golang Google 端点接收 JSON 以进行 Google IAB 验证并存储到 Google Datastore

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:36 38 4
gpt4 key购买 nike

我是 Go 的新手,几乎尝试了所有方法来获取由 Go 运行的 Google Endpoint,接收带有 JSON 的 POST 以进行验证,然后将其存储在 Google Datastore 中。

Golang 端点包 https://github.com/GoogleCloudPlatform/go-endpoints

这是我尝试 POST 到我的 Go 端点的 JSON 示例:

{\"json\": {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\"purchaseState\": 0,\"purchaseToken\": \"tokenData\"},\"signature\": \"signatureData\"}

这是我的 Google 端点的 Golang 代码示例:

type RawReceipt struct {
Key *datastore.Key `json:"id" datastore:"-"`
Receipt json.RawMessage `json:"json"`
}

func ReceiveJson(c endpoints.Context, rec *RawReceipt) error {
k := datastore.NewIncompleteKey(c, "DatastoreTest", nil)
_, err := datastore.Put(c, k, rec)
return err
}

我要完成的伪代码:

var data below will need to contain {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\"purchaseState\": 0,\"purchaseToken\": \"tokenData\"},\"signature\": \"signatureData\"}

func Json(rawJson *RawJson) {
data := rawJson["json"]
signature := rawJson["signature"]

if Verify(jsonData, jsonSignature) {
// Store into Datastore
// The storing part works, just need to get the right data into it
k := datastore.NewIncompleteKey(c, "DatastoreTest", nil)
_, err := datastore.Put(c, k, rec)
return err
}
}

func Verify (jsonData *JData, jsonSignature, *Jsig) bool {
//I got this part working just fine.
if fail or err return false, else true
}

我需要能够从键 jsonsignature 中获取值,这样我才能通过

{\"json\": {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\"purchaseState\": 0,\"purchaseToken\": \"tokenData\"}

验证方法和签名

\"signature\": \"signatureData\"

作为验证方法的另一个参数。

奇怪的是,如果我查看值 rec.Receipt,JSON 是乱序的,例如productId 现在位于底部,而不是原来的位置。

我需要做的最后一件事是获取整个 JSON 并将其存储在 Google 数据存储中。

作为旁注,我已经花了大约 3 天的时间来阅读文档,查看其他 stackoverflow 问题,并一直在尝试任何事情来完成这项工作。

非常感谢您的帮助!

最佳答案

我没有使用 Google App Engine 的经验,但您的核心问题似乎是反序列化 JSON,以便您可以只获取“签名”字段?

您可以将数据json.Unmarshal 放入map[string]interface{} 并引用该映射的signature 字段,例如所以:

package main

import (
"encoding/json"
"fmt"
)

const data = `{
"json": {
"orderId": "123456789.12341234",
"packageName": "com.company.name",
"productId": "productName",
"purchaseState": 0,
"purchaseTime": 1410655975266,
"purchaseToken": "tokenData"
},
"signature": "signatureData"
}`

func main() {
receipt := make(map[string]interface{})
json.Unmarshal([]byte(data), &receipt)

signature, ok := receipt["signature"].(string)
if !ok {
fmt.Println("type assertion failed")
return
}

fmt.Println(signature)
}

Playground link

在同一个示例中,您可以执行 fmt.Printf("%#v\n", receipt) 这将向您显示 receipt["json"] 是另一个 map[string]interface{}。有了这个,您可以将 json 中的字段引用为:

foo, ok := receipt["json"].(map[string]interface{})
// ... assertion checking, etc.
orderId, ok := foo["orderId"].(string)
// ... assertion checking again

不确定将 JSON 存储在 Google 数据存储中。看看他们的例子 here

顺便说一句,我认为 Go 不会对键值对的顺序做出任何保证,因此您不应该假设它们会保留它们的顺序。

关于json - golang Google 端点接收 JSON 以进行 Google IAB 验证并存储到 Google Datastore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30022002/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com