Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >亚马逊灵活支付异常:呼叫者输入异常:无效签名

亚马逊灵活支付异常:呼叫者输入异常:无效签名
EN

Stack Overflow用户
提问于 2012-01-17 06:13:55
回答 2查看 1.7K关注 0票数 2

我正在尝试使用PHP来实现亚马逊的灵活支付。

下面是我发送支付请求的PHP代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

$string_to_sign = 'GET
authorize.payments-sandbox.amazon.com
/cobranded-ui/actions/start
SignatureMethod=HmacSHA256&SignatureVersion=2&callerKey=my_access_key&callerReference=YourCallerReference&paymentReason=donation&pipelineName=SingleUse&returnUrl=http%3A%2F%2Fproblemio.com&transactionAmount=4.0';

$encoded_string_to_sign = URLEncode(Base64_Encode(hash_hmac('sha256', $string_to_sign, 'my_secret_key')));

$amazon_request_sandbox = 'https://authorize.payments-sandbox.amazon.com/cobranded-ui/actions/start?SignatureVersion=2&returnUrl='.$return_url.'&paymentReason='.$payment_reason.'&callerReference=YourCallerReference&callerKey='.$my_access_key_id.'&transactionAmount=4.0&pipelineName=SingleUse&SignatureMethod=HmacSHA256&Signature='.$encoded_string_to_sign;

// When it goes to the url, it gets the invalid signature error
header('Location: '.$amazon_request_sandbox); 
?>

这似乎是按照他们的指示,但我无法克服这个错误。

谢谢!!

EN

回答 2

Stack Overflow用户

发布于 2012-04-21 17:25:26

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

$method = 'GET';
$host   = 'authorize.payments-sandbox.amazon.com';
$path   = '/cobranded-ui/actions/start';

$params = array( 
    'signatureMethod'  => 'HmacSHA256',
    'signatureVersion' => '2',
    'currencyCode'     => 'USD',
    'callerKey' => 'Your_Key_ID',
    'callerReference'  => 'YourCallerReference',
    'paymentReason'    => 'donation',
    'pipelineName'     => 'SingleUse',
    'returnUrl'        => 'http://yourcallback.com',
    'transactionAmount'=> '5',
    'version'          => '2009-01-09',
);


$params = array_map('rawurlencode', $params);


$paramStringArray = array();

foreach($params as $key => $value){

    $paramStringArray[] = $key . '=' . $value;

}




$paramString = implode('&', $paramStringArray);

$string_to_sign = $method . "\n"
        . $host . "\n"
        . $path  . "\n"
        . $paramString;
    

$signature = base64_encode(hash_hmac(
    'sha256',
    $string_to_sign,
    'Your_Super_Secret_Key',
    true
));



$amazon_request_sandbox = "https://{$host}{$path}?" . $paramString .
    '&signature=' . rawurlencode($signature);

header('Location: '.$amazon_request_sandbox); 

?>

好吧..。使用下面代码中的结构,我终于通过上面的代码解决了整个问题。在形成您的签名/URL时,需要注意三件事.

  1. 看起来参数"transactionAmount“对于一个有效的联合品牌用户界面管道是必要的,尽管没有具体的指令暗示这个问题。

  1. 如果您的参数中有/有空格,并且除了最新(5.4)版本的PHP之外,您尝试在所有参数中使用html_build_query(),您将得到一个编码方案,其中空格标记为"+“,而不是"%20”,这正是亚马逊所喜欢的。上面的代码通过在整个参数数组.

上实现rawurlencode()来解决这个问题。

  1. 参数的排序在签名的构造中是非常重要的。键(而不是值)需要按不区分大小写的字母顺序排列。还值得注意的是,尽管文档对API有什么规定,但在创建签名的查询字符串时,必须同时存在符号(&)和等于(=)。

用于签名的查询字符串: callerKey=1111111111111¤cyCode=USD&signatureVersion=2

其他我注意到的事情..。

在PHP (2010-8-28)包含的示例代码中,文件"paymentReason“中的"CBUISingleUsePipelineSample.php”属性被列为"HarryPotter 1-5 DVD set“。因为这个属性中有空格,所以当您试图访问生成的链接时,它会抛出这个恼人的“无效签名”错误,因为html_build_query()用于生成该URL的查询字符串。要解决此问题,请打开"CBUIPipeline.php",并在constructUrl()方法中查找以下行.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$queryString = http_build_query($parameters, '', '&');

代之以:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$queryString = str_replace('+', '%20', http_build_query($parameters, '', '&'));

这将解决PHP旧版本的空间编码问题(< 5.4)。在最新版本中,您可以设置一个"enc_type“标志。

最后的事最后..。

这是我在StackOverflow上的第一篇文章,所以如果我违反了协议,不要杀了我。希望能帮上忙!

票数 8
EN

Stack Overflow用户

发布于 2012-02-25 17:18:42

试试这段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

$method = 'GET';
$host   = 'authorize.payments-sandbox.amazon.com';
$path   = '/cobranded-ui/actions/start';

$params = array(
    'SignatureMethod'  => 'HmacSHA256'
    'SignatureVersion' => 2,
    'callerKey'        => 'my_access_key',
    'callerReference'  => 'YourCallerReference',
    'paymentReason'    => 'donation',
    'pipelineName'     => 'SingleUse',
    'returnUrl'        => 'http://problemio.com&transactionAmount=4.0',
);

$string_to_sign = $method . "\n"
    . $host . "\n"
    . $path . "\n"
    . http_build_query($params);

$signature = base64_encode(hash_hmac(
    'sha256',
    $string_to_sign,
    'my_secret_key'
));

$params['Signature'] = $signature;

$amazon_request_sandbox = "https://{$host}{$path}?" . http_build_query($params);

header('Location: ' . $amazon_request_sandbox);

所以我做了一些改变:

构建查询字符串的encoding)

  • trying \r\n

  • http_build_query() (确保正确的来重用您的vars与重复工作(使发现错误更容易,等等)
  • 显式\n --可能您的编辑器输入了\r\r\n

HTH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8896060

复制
相关文章
分页Page对象
发表于2016-05-262019-01-01 作者 wind /** * 分页对象,包含页码,每页条数,总条数 User: yangyan Date: 13-11-18 Time: 下午8:59 To change this * template use File | Settings | File Templates. */ public class Page implements Serializable { private static final long serialVer
前Thoughtworks-杨焱
2021/12/07
9640
ThinkPHP page分页类的学习
实例化数据对象 1.$user=M('user'); 查询总记录数 $count = $user->count();//直接读取数据表中条项总数 //或者有查询条件 $count = $user->where(查询条件)->count();//查询满足查询条件的条目数 实例化分页类 1.$Page = new \Think\Page($count, 10); 按照限定的条数,从数据库中读取相应数量的条数 如下,filed()指定从数据库中取出id,title,tit
benny
2018/03/06
1.5K0
ThinkPHP page分页类的学习
Mybatis实现分页-分页类的模板(最基础的模板)
我用的是lombok 你也可以不用去建立Get和Set方法 我的lombok maven坐标如下:
用户9006224
2022/12/21
4960
Gatsby入门指南—添加上一页下一页功能(完结篇)
到此,通过gatsby就快速的搭建了一个博客网站,我们只需书写markdown文件就能生成对应的网页了。至于网页美化,那是切图的事儿,我就不在这里墨迹了。
前端大彬哥
2019/05/29
9230
Gatsby入门指南—添加上一页下一页功能(完结篇)
到此,通过gatsby就快速的搭建了一个博客网站,我们只需书写markdown文件就能生成对应的网页了。至于网页美化,那是切图的事儿,我就不在这里墨迹了。
前端大彬哥
2019/05/29
9330
AJAX 中创建 XMLHttpRequest 对象的方法和常用属性、方法
AJAX(Asynchronous JavaScript and XML)是一种用于在网页上进行异步数据交互的技术。通过 AJAX,我们可以在不重新加载整个网页的情况下,与服务器进行数据交换并更新部分页面内容。在实现 AJAX 的过程中,创建一个 XMLHttpRequest 对象是必不可少的。
网络技术联盟站
2023/07/07
4760
java中page的对象,page对象[通俗易懂]
page对象是JSP九大内置对象之一。JSP全称JavaServerPage,是一种动态网页技术标准,以Java语言作为脚本语言。在JSP中预先定义了九个内置对象,这个九个内置对象不需要声明就可以在脚本代码和表达式中任意使用,九个内置对象分别是:request、response、session、application、out、pageContext、config、page、exception。
全栈程序员站长
2022/09/18
2.4K0
java中page的对象,page对象[通俗易懂]
Spring Boot中读取配置属性的几种方式
  本文介绍Spring Boot中读取配置属性的几种方式,项目示例中用到的application.yml和application.properties定义如下:
happyJared
2018/09/20
8.3K0
Spring Boot中读取配置属性的几种方式
C 和 C++ 中的未定义行为
theme: channing-cyan highlight: a11y-dark
鲸落c
2022/11/14
4.4K0
C#反射读取和设置类的属性
http://www.cnblogs.com/william-lin/archive/2013/06/05/3118233.html
跟着阿笨一起玩NET
2018/09/19
2K0
page指令的用法,重要属性是什么?
i) import="package.class",或者import="package.class1,...,package.classN":
马克java社区
2021/07/12
8010
用 Gatsby 创建一个博客
Gatsby 是一个令人难以置信的静态站点生成器,它允许使用React作为渲染引擎引擎来搭建一个静态站点,它真正具有现代web应用程序所期望的所有优点。它通过在构建时通过服务器端渲染将动态的 react 组件呈现为静态 HTML 内容。这意味着您的用户可以获得静态站点的所有好处,比如不使用JavaScript、搜索引擎友好性、非常快的加载速度等等,也并没有失去现代web所期望的活力和交互性。一旦呈现为静态 HTML,客户端站点的React和JavaScript会接管它并添加动态的内容。 Gatsby 最近发布了v1.0.0,推出了很多新特性。包括(但不限于)使用GraphQL创建内容查询的能力,与各种cms集成——包括WordPress、Contentful、Drupal等等。还有基于路由的代码分布使得用户体验更佳。在这篇文章中,我们将深入探讨 Gatsby 和一些新特性,并创建一个静态博客。让我们开始吧!
疯狂的技术宅
2019/03/27
2.5K0
用 Gatsby 创建一个博客
分享我的CleanArchitecture for Razor Page项目模板
这个项目是参考和整合了jasontaylordev/CleanArchitecture 和 blazorhero/CleanArchitecture 代码基础上,重构出来的新的项目,这两个项目都是非常优秀和人气很旺的关于CleanArchitecture的项目模板,我也fork了他们的项目并添加了一些自己的功能模块,我个人非常喜欢blazorhero/CleanArchitecture这个项目,前端使用的是微软的Blazor(webassembly)技术,对于.net开发人员可以很快开始工作,几乎不需要额外的学习,但在项目的进行中发现了一个致命的问题就是在(WASM模式下)性能不行,加载数据一多就容易的卡顿,但相信后面会得到优化,jasontaylordev/CleanArchitecture 项目的前端用的Angular12 由于我对angular/vue/react的技术不是很熟练,学习起来实在是感觉力不从心,在实际开发过程中遇到了很多坑,都需要用google来解决,所以最后我还是选择了自己最熟悉的开发方式asp.net MVC来对我原来的框架进行重构来实现CleanArchitecture设计模式。
阿新
2021/08/19
8960
分享我的CleanArchitecture for Razor Page项目模板
velocity分页模板
以前用后台java拼接分页代码,不利于修改。找到一份velocity模板。 1 <!-- 分页模板 --> 2 #macro(pager $url $pager) 3 <url class="page"> 4 #set($FRONT_LEN = 3) 5 #set($BEHIND_LEN = 3) 6 #set($PAGER_LEN = 7) 7 #set($last = $!{pager.pageNumber} - 1) 8 #se
Ryan-Miao
2018/03/13
1K0
TypeScript中的可选属性和只读属性
可选属性 接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。 例如给函数传入的参数对象中只有部分属性赋值了。带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面
孙亖
2018/06/07
2.9K0
2022 年10个优质的 Node.js CMS 平台分享
内容管理系统 (「CMS」) 使没有强大技术背景的人也能够轻松发布内容。我们可以使用 「CMS」 来管理我们的内容和交付。市面上有不同类型的 「CMS」,它们执行不同的目的并具有不同的功能。
徐小夕
2022/02/09
4.6K0
2022 年10个优质的 Node.js CMS 平台分享
Java-方法重载时 调用未定义的对象属性
public class TestWayReload { int id; String name; String pwd; public TestWayReload(){ System.out.println(“Hellow World!”); System.out.println("################"); }
Fisherman渔夫
2019/07/30
5.5K0
opencv无法读取图片_opencv无法读取图片
使用一下代码读取一张图片失败(不管是绝对路径还是相对路径,都失败),工程运行都没问题,就是图片读取失败。
全栈程序员站长
2022/11/04
2.4K0
Linux系统中的Page cache和Buffer cache
Mem:表示物理内存统计。 total:表示物理内存总量(total = used + free)。 used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。 free:未被分配的内存。 shared:共享内存。 buffers:系统分配但未被使用的buffers数量。 cached:系统分配但未被使用的cache数量。 -/+ buffers/cache:表示物理内存的缓存统计。 used2:也就是第一行中的used – buffers - cached也是实际使用的内存总量。 // used2为第二行 free2 = buffers1 + cached1 + free1 // free2为第二行,buffers1等为第一行 free2:未被使用的buffers与cache和未被分配的内存之和,这就是系统当前实际可用内存。 Swap:表示硬盘上交换分区的使用情况。
JavaEdge
2021/10/18
1.9K0
点击加载更多

相似问题

“无法读取未定义的属性'node‘”- Gatsby/GraphQL/Prismic

216

TypeError:无法读取Gatsby中未定义的.src/page/index.js的属性“数据”

10

Gatsby: gatsby源-graphql:无法读取未定义的属性“createPageDependency”

10

用Gatsby和模板分页

10

无法读取Gatsby、Contentful和Graphql中未定义图像的属性?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文