我是Go的新手,并且几乎一直在尝试一切操作以获取由Go运行的Google Endpoint,接收带有JSON的POST以进行验证,然后将其存储在Google Datastore中。

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

这是我尝试发布到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.Receipt的值,那么JSON就是乱序的,例如productId现在位于底部,而不是其原始位置。

最后我要做的是获取整个JSON并将其存储在Google Datastore中。

附带说明一下,我已经花了大约三天的时间阅读文档,查看其他stackoverflow问题,并一直在尝试进行任何工作来完成这项工作。

非常感谢您的任何帮助,非常感谢!

最佳答案

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

您可以将数据json.Unmarshalmap[string]interface{}中,然后像这样引用该 map 的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

不确定是否要在Google Datastore中存储JSON。看看他们的示例here

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

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

10-09 06:19
查看更多