当前位置: 首页 > 知识库问答 >
问题:

亚马逊支付SDK无效SignatureError

甄云
2023-03-14

下面是我的php实现代码:

$amazonpay_config = array(
    'public_key_id' => 'XXXXXXXX',
    'private_key'   => 'my_private_key_path',
    'region'        => 'US',
    'sandbox'       => true
);
$payload = array(
    'webCheckoutDetails' => array(
        'checkoutReviewReturnUrl' => 'https://www.example.com/review',
        'checkoutResultReturnUrl' => 'https://www.example.com/result'
    ),
    'storeId' => 'amzn1.application-oa2-client.XXXXXXXXX'
);

$headers = array('x-amz-pay-Idempotency-Key' => uniqid());
$requestResult = [
    'error' => 1,
    'msg' => 'Error. Can not create checkout session.',
    'checkoutSession' => null,
    'payloadSign' => null
];

$client = new Client($amazonpay_config);
$resultCheckOut = $client->createCheckoutSession($payload, $headers);
$resultSignPayload = $client->generateButtonSignature($payload);

if($resultCheckOut['status'] !== 201) {
    return json_encode($requestResult, true);
}
else {
    $requestResult = [
        'error' => 0,
        'msg' => null,
        'checkoutSession' => json_decode($resultCheckOut['response']),
        'payloadSign' => $resultSignPayload
    ];
    return $requestResult;
}

这是用于生成Amazon Pay按钮的JS实现代码。

amazon.Pay.renderButton('#amazon-pay-btn', {
    // set checkout environment
    merchantId: 'XXXXXXXX',
    ledgerCurrency: 'USD',
    sandbox: true,
    checkoutLanguage: 'en_US',
    productType: 'PayOnly',
    placement: 'Cart',
    buttonColor: 'Gold',
    createCheckoutSessionConfig: {
        payloadJSON: jsonResult['checkoutSession'], 
        signature: jsonResult['payloadSign'], 
        publicKeyId: 'XXXXXXXXXXX'
    }
});

共有2个答案

萧阳波
2023-03-14

关于此问题的两条评论:

  1. 我已将有效负载定义为字符串(这是当前Amazon Pay doc声明的方式-链接)。
$payload = '{
    "webCheckoutDetails": {
        "checkoutReviewReturnUrl": "https://www.example.com/review",
        "checkoutResultReturnUrl": "https://www.example.com/result"
    },
    "storeId": "amzn1.application-oa2-client.XXXXXXXXX"
}';

而不是数组

$payload = array(
    'webCheckoutDetails' => array(
        'checkoutReviewReturnUrl' => 'https://www.example.com/review',
        'checkoutResultReturnUrl' => 'https://www.example.com/result'
    ),
    'storeId' => 'amzn1.application-oa2-client.XXXXXXXXX'
);

签名已经创建,但是当呈现按钮并单击它时,我得到以下错误。

<代码>错误消息:签名Dk4qznkoiTVqjcY8Yn1l0iLbsoIj2pEAHWVtgYrphLtFXR9BKhJJPD53It4qYOswS1T/STYMHRY5JTCHGGQVLNTDJUY0MRHKPOHTPYETWDOQGHA2QK QnSGV5LoYldQ/UKAXSG7M8S2IOR11Q2SWXUJRK2M3FGZAIZJJJYEARJYEAR97EGANYVA3JTGDFM6CJDIENBM4WKQGIH6HXORY5K/GA26494VAWZAGVZGRHZG48FOVP/XCR0MBU6V5P5V5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P6V5P KEOZRJSC hN5WKAs/C49USFKPX75CE7QBABCZT1UICZFYYX/mBuZuysUlGmnXPhLOLTPw4 SIizH/pOQyClOQyw==不匹配商户XXXXXXXX的签名字符串AMZN-PAY-RSASSA-PSS dfff7a87b93cfa78685a233f2dd59e18ad0451b2e3a90af11e500fcc0ceee924

我花了一段时间才意识到这是错误的原因。实际上,在写这个的时候,字符串中的新行就是原因。如果字符串只在一行中,它就有效。

宗政颖逸
2023-03-14

代码有几个问题,主要是您没有正确地将有效负载和签名传递给前端。对于有效负载,您使用的是jsonResult['check out会话'],而它应该是jsonResult['payloadSign']。虽然这不包含有效负载,但从PHP代码来看,它显然是您在其中放置的签名。完整的代码示例应该更像这样(未测试)。

后端:

$headers = array('x-amz-pay-Idempotency-Key' => uniqid());
$requestResult = [
    'error' => 1,
    'msg' => 'Error. Can not create checkout session.',
    'signature' => null,
    'payload' => null
];

$client = new Client($amazonpay_config);
$resultCheckOut = $client->createCheckoutSession($payload, $headers);
$resultSignature = $client->generateButtonSignature($payload);

if($resultCheckOut['status'] !== 201) {
    return json_encode($requestResult, true);
}
else {
    $requestResult = [
        'error' => 0,
        'msg' => null,
        'signature' => $resultSignature,
        'payload' => $payload
    ];
    return json_encode($requestResult);
}

前端:

amazon.Pay.renderButton('#amazon-pay-btn', {
    // set checkout environment
    merchantId: 'XXXXXXXX',
    ledgerCurrency: 'USD',
    sandbox: true,
    checkoutLanguage: 'en_US',
    productType: 'PayOnly',
    placement: 'Cart',
    buttonColor: 'Gold',
    createCheckoutSessionConfig: {
        payloadJSON: JSON.stringify(jsonResult['payload']), 
        signature: jsonResult['signature'], 
        publicKeyId: 'XXXXXXXXXXX'
    }
});

我不确定您如何将$Request estResult传回前端,可能需要一些额外的JSON编码/解码才能获得正确的字符串。为防止签名不匹配错误,请确保用于后端签名生成的有效负载字符串和分配给“payloadJSON”参数的有效负载字符串完全匹配(特别是注意空格、转义字符、换行符等)。

 类似资料:
  • 我正在为web集成amazon pay SDK python。 我已经阅读了亚马逊支付的所有留档,但是我不知道如何在前端/后端代码中给出或创建按钮签名。这是我的前端代码,用于创建亚马逊支付一次性结账按钮。 如果有人实现了这一点,请给出您有价值的答案...

  • 希望在应用程序中集成amazon pay(基于美国)。已经有了贝宝和刷卡选项。当提到亚马逊支付沙箱时,它说要先在亚马逊支付注册。注册过程将通过其他步骤进入亚马逊卖家中心帐户,在这些步骤中会询问与业务相关的问题。 从开发的角度来看,我们如何将amazon pay集成到我们的应用程序中?是否有可用的示例api/代码及其程序?欢迎任何指导。

  • 实施亚马逊支付小部件没有地址引用文档https://developer.amazon.com/docs/eu/amazon-pay-onetime/no-address-widget.html 用seller central的注册应用程序值替换了clientid和sellerid,但得到的错误是“您无法使用与您的卖家帐户关联的用户名和密码。请使用其他买家帐户。” 这是使用的代码

  • 我已经将Pay与Amazon与我的Web应用程序集成在一起,但我已经确定,只有在我执行代码调试时才能捕获资金,如果我没有断点,则不会发生。对我来说,这表明有必要暂停。我正在使用定期付款。相关代码部分如下: 因此,如果在捕获行的

  • 因此,我试图将登录和支付与Amazon小部件集成,但遇到了一些问题。 所以,我把我的卖家帐户都设置在 https://sellercentral.amazon.de/gp/ 我有权访问我的API凭据,我需要获得一个LWA客户端。所以,我已经在 https://sellercentral.amazon.com/gp/homepage.htm 以创建应用程序。我已经设置了应用程序,在web设置上我已经

  • 我正在为一个网站更新amazonpay实施,以实现新的授权流程,该流程已成功实施。然而,我发现之前的钱包小部件工作不正常。 shipping和wallet窗口小部件都会呈现,但滚动钱包以选择不同的支付方式(并测试授权流程的其他结果)不起作用。 具体来说,当我单击右箭头以显示下一个方法时,唯一的更改是显示左箭头,在这个过程中,显示或结果没有任何更改。 由于这些都是亚马逊生成的脚本中的内容,因此我不知