草庐IT

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

coder 2024-07-10 原文

我是 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/

有关json - golang Google 端点接收 JSON 以进行 Google IAB 验证并存储到 Google Datastore的更多相关文章

  1. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  2. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  3. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  4. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  5. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  6. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

  7. ruby - 使用 JSON gem 将自定义对象转换为 JSON - 2

    我正在学习如何使用JSONgem解析和生成JSON。我可以轻松地创建数据哈希并将其生成为JSON;但是,在获取一个类的实例(例如Person实例)并将其所有实例变量放入哈希中以转换为JSON时,我脑袋放屁。这是我遇到问题的例子:require"json"classPersondefinitialize(name,age,address)@name=name@age=age@address=addressenddefto_jsonendendp=Person.new('JohnDoe',46,"123ElmStreet")p.to_json我想创建一个.to_json方法,这样我就可以获

  8. ruby - 如何理解 Ruby 中的发送者和接收者? - 2

    我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo

  9. ruby-on-rails - 如何使用驼峰键名称从 Rails 返回 JSON - 2

    我正在构建一个带有Rails后端的JS应用程序,为了不混淆snake和camelcases,我想通过从服务器返回camelcase键名来规范化这一切。因此,当从API返回时,user.last_name将返回user.lastName。我如何实现这一点?谢谢!编辑:添加Controller代码classApi::V1::UsersController 最佳答案 我的方法是使用ActiveModelSerializer和json_api适配器:在你的Gemfile中,添加:gem'active_model_serializers'创建

  10. ruby-on-rails - 如何将数组输出为 JSON? - 2

    我有以下内容:@array.inspect["x1","x2","adad"]我希望能够将其格式化为:client.send_message(s,m,{:id=>"x1",:id=>"x2",:id=>"adad"})client.send_message(s,m,???????)如何在????????中获得@array输出?空间作为ID?谢谢 最佳答案 {:id=>"x1",:id=>"x2",:id=>"adad"}不是有效的散列,因为您有键冲突它应该是这样的:{"ids":["x1","x2","x3"]}更新:@a=["x1

随机推荐