2015-05-04 171 views
0

我是新来的快去一直试图几乎所有获得多数民众赞成由去运行,我的谷歌端点,接收POST使用JSON进行验证,然后将其存储在Google数据存储中。golang谷歌端点收到JSON用于谷歌IAB验证和存储到谷歌数据存储

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

这里的JSON我试图张贴到我的围棋端点的一个例子:

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

下面是对谷歌的端点我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和存储在谷歌数据存储。

作为一个方面说明,我已经在这是怎么回事,现在3天左右的阅读虽然文档,寻找其他计算器的问题,并一直在努力什么让这个工作。

任何及所有的帮助(s)为大大感谢!

+0

你为什么要存储json? 创建结构并将json解组到结构并存储结构。 简单而正确的方法 – MIkCode

+0

@MIkCode因为我想要原始收据。如果我需要重新验证,或者如果我将来想用其他方式做其他事情,我很高兴收到这些数据。键值对“json”由Google签名。 –

回答

0

我没有与谷歌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在谷歌数据存储。给他们的例子here偷看。

另一方面,我不认为Go对键值对的排序做出了任何保证,因此您不应该认为它们将保留它们的排序。

0

JSON作为数据类型不支持data type

所以,你有几个选项如何存储你的数据

  1. 为@Lander建议,解组数据,并将其存储为对象。

  2. 创建RawMessage并将其存储为[]字节

  3. 创建一个包含json的每个字段的结构,对其进行解组并存储它。

我不能找出另一种方式来做到这一点?