0

我正在尝试匹配此处记录的 X-Square-Signature 标头:https ://docs.connect.squareup.com/api/connect/v1/#validating-notifications

我目前正在使用 OpenSSL::HMAC 来生成摘要,但事情似乎不正确。

string_to_sign = "#{request.url}#{param_hash.to_json}"
header_signature = request.headers["X-Square-Signature"]

# split into multiple lines for clarity
digest = OpenSSL::Digest.new('sha1')
hmac = OpenSSL::HMAC.digest(digest, ENV["SIGNATURE_KEY"], string_to_sign)

# stripping the newline off the end
hmac_64 = Base64.encode64(hmac).strip

出于某种原因,尽管遵循了上面 API 文档中提供的说明,但我得到了一个截然不同的摘要。我对摘要的计算似乎也与他们的 python 示例一致(https://github.com/square/connect-api-examples/blob/master/connect-examples/v1/webhooks.py#L75-L87) .

我已经验证 string_to_sign 值与我应该遵循的模式相同,并且当我手动制作帖子时它可以工作,但是我通过相同的方法生成我的签名,所以它当然会排队。

我可以忽略的摘要/签名计算过程是否有任何细节?

4

2 回答 2

1

我不确定这是否是您问题的根源,但您应该使用request.raw_post而不是param_hash.to_json. 请求正文是一个 json 对象,并且 json 对象上的属性没有规范的排序。当您将参数哈希转换回 json 时,不能保证属性的顺序与原始请求正文中的顺序相同。

再试一次

string_to_sign = "#{request.url}#{request.raw_post}"
于 2015-07-20T17:33:10.290 回答
0

听起来您正在尝试复制 Square 文档中的示例。您提到您已验证string_to_signis http://www.example.com{"merchant_id":"JGHJ0343","event_type":"PAYMENT_UPDATED","entity_id":"Jq74mCczmFXk1tC10GB"},但您是否已验证环境变量SIGNATURE_KEYEXAMPLE_SECRET_123文档中的一样?

您的代码用替换的值编写并设置环境变量计算示例中给出的哈希:DBP9woNqJpO4d4/ZFE7xveLIGPU=

于 2015-07-20T15:13:36.770 回答