golang Google端点接收用于Google IAB验证的JSON,并将其存储到Google数据存储

golang Google端点接收用于Google IAB验证的JSON,并将其存储到Google数据存储,json,google-app-engine,go,google-cloud-endpoints,Json,Google App Engine,Go,Google Cloud Endpoints,我是新手,一直在尝试几乎所有的方法来获取由Go运行的Google端点,接收带有JSON的帖子进行验证,然后将其存储在Google数据存储中 Golang端点包 下面是我试图发布到Go端点的JSON示例: {\"json\": {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\

我是新手,一直在尝试几乎所有的方法来获取由Go运行的Google端点,接收带有JSON的帖子进行验证,然后将其存储在Google数据存储中

Golang端点包

下面是我试图发布到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
}
我需要能够从键json签名中获取值,以便传递

{\"json\": {\"orderId\": \"123456789.12341234\",\"packageName\":\"com.company.name\",\"productId\":\"productName\",\"purchaseTime\": 1410655975266,\"purchaseState\": 0,\"purchaseToken\": \"tokenData\"}
验证方法和签名

\"signature\": \"signatureData\"
作为验证方法的另一个参数

奇怪的是,如果我看rec.receive的值,JSON是无序的,例如productId现在位于底部,而不是其原始位置

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

顺便说一句,我已经花了大约3天的时间来研究这个问题,阅读文档,研究其他stackoverflow问题,并且一直在尝试任何方法来完成这项工作


非常感谢您的帮助

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

您可以
json.Unmarshal
将数据映射到
map[string]接口{}
中,并参考该映射的
签名
字段,如下所示:

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)
}

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

foo, ok := receipt["json"].(map[string]interface{})
// ... assertion checking, etc.
orderId, ok := foo["orderId"].(string)
// ... assertion checking again
不确定是否将JSON存储在Google数据存储中。看一看他们的例子


顺便说一句,我认为Go不能保证键值对的顺序,因此您不应该假设它们将保留其顺序。

Json As数据类型不受支持

因此,您可以选择如何存储数据

  • 正如@Lander所建议的,解组数据并将其存储为对象

  • 创建并存储为[]字节

  • 创建一个包含json的每个字段的结构,将其解组并存储
    我想不出另一种方法来做这件事

    为什么要按原样存储json?创建struct并将json解组到struct并存储该struct。非常简单和正确way@MIkCode因为我想要原样的收据。如果我需要重新验证,或者如果我将来想用它做其他事情,那么拥有这些数据是很好的。键值对“json”由Google签名。