Amazon Payments是PayPal或Active Merchant的绝佳替代品-您网站的用户可以通过其Amazon帐户向您付款,并且像使用PayPal一样,您无需在自己的数据库中存储信用卡信息。另一个优点是,它们提供了针对非营利组织的特殊服务,允许用户进行捐赠。我们将其用于ReliefHub,这是我上个月自愿工作的在线慈善网站。
今天,我将向您展示如何使用如下所示的Amazon Payments按钮创建一个简单的脚手架Rails网站:
它实际上将接受付款:用户将能够输入金额,单击“立即付款”,然后在亚马逊网站上确认交易。稍后,它们将被重定向回Rails站点,并且它们的事务将出现在索引支架视图中。
但首先是困难的部分:处理糟糕的Amazon文档,混乱的管理网页和众多注册表单。忍受我!如果您因亚马逊注册过程的痛苦和困惑而受苦,那么事实证明,在Rails 3站点中使用Amazon Payments非常容易。
步骤1:注册Amazon Web Services
如果您已经在使用S3,EC2或其他Amazon Web服务,则跳至步骤2。否则,请转到:http : //aws.amazon.com,单击“立即注册”并输入您的Amazon电子邮件地址和密码。然后,您需要填写“联系信息”表格并同意“ AWS客户协议”,以创建一个新的Web服务帐户。
步骤2:注册Amazon Payments
实际上,有两个不同的Amazon Payment Services站点:沙箱和生产。沙箱可让您测试网站上的交易,而无需使用真钱。您将具有用于Amazon Payments沙箱和生产的单独帐户ID。
现在,让我们从Amazon Payments沙盒开始。打开:https : //payments-sandbox.amazon.com
您应该在左上方的Amazon Payments徽标中看到“沙盒”一词:
稍后,当您准备部署Rails应用程序并想收集真钱时,您将需要使用生产的Amazon网站重复步骤2、3和4:https : //payments.amazon.com
在Amazon Payments主页上,单击“您的帐户”,然后使用您的Amazon电子邮件地址和密码再次登录。输入Amazon凭证后,您需要注册并再次输入您的联系信息,这次是Amazon Payments。注册后,应将您重定向到您的帐户页面,该页面将显示您的帐户余额和最近的交易信息。
步骤3:注册Amazon Flexible Payment Service(FPS)
现在让我们感到困惑的是:您需要第三次注册;这次使用“ Amazon Flexible Payments Service”。为此,请单击“开发人员”,然后单击页面右侧的“注册Amazon FPS”按钮:
现在,您已经注册了Amazon FPS,您应该立即决定不使用它。与Amazon Simple Pay相比,它非常令人困惑,复杂并且提供的附加价值很小。如果您需要在没有用户界面或按钮的情况下按计划以编程方式进行付款,则可能要考虑使用Amazon FPS。如果是这种情况,请查看github上的Remit gem,这将使Amazon FPS / Rails集成更加容易。
另一方面,Amazon Simple Pay是将付款表格添加到Rails站点的一种简单直接的方法。也就是说,除了注册过程和令人困惑的文档之外,一切都很简单!
第4步:禁用“对按钮签名”选项
为了提高安全性,Amazon Simple Pay通常要求付款请求包含表单值的加密哈希(称为“签名”)。今天,您应该禁用此值以使事情变得简单。在以后的文章中,我将展示如何在Rails站点中生成签名值,从而使您能够启用此功能。
- 返回https://payments-sandbox.amazon.com主页
- 转到:您的帐户->编辑我的帐户设置->管理开发者和卖家偏好
- 如有必要,请取消选中“对按钮签名”
- 如有必要,请单击表单底部的“确认”。
步骤5:创建Amazon Simple Pay按钮
Amazon Simple Pay非常易于使用,因为您实际上可以生成在Amazon Payments网站上创建付款表格/按钮所需的HTML。但是,我花了数小时才能单击并搜索以找到允许您生成按钮的Amazon Payments管理页面。
这是创建按钮表单的链接:https : //payments-sandbox.amazon.com/sdui/sdui/standardbutton
将此添加为书签,否则您将再也找不到它!您还可以使用其他页面为非营利组织生成“捐赠”按钮或其他类型的按钮。现在,通过填写此表单,您可以使用Amazon付款按钮之一创建付款表单,例如:
这是做什么的:
- 点击上面的链接
- 必要时使用您的Amazon凭证再次登录
- 输入所需的金额,描述和参考值,因为我们稍后将在Rails代码中对其进行更改。
- 输入您要用于“返回URL”的任何有效URL。稍后,我们将其替换为Rails路线。
- 将“放弃用户的URL”和“即时付款通知的URL”保留为空白。
- 保持其他默认值不变。
- 选择亚马逊按钮之一;当然,以后您可以用自己的按钮替换其按钮图像。
- 接下来,单击“生成HTML”并修复您收到的所有表单验证错误。
现在,您应该在文本区域中看到与此类似的HTML:
<form action = “ https://authorize.payments-sandbox.amazon.com/pba/paypipeline ” method = “ post ” >
<input type = “ hidden ” name = “ InstantReturn ” value = “ 1 ” >
<输入 类型 = “ 隐藏的” 名称 = “ collectShippingAddress ” 值 = “ 0 ” >
<输入 类型 = “隐藏的“ 名称 = ” signatureVersion “ 值 = ” 2 “ >
<输入 类型 = ” 隐藏“ 名称 = ” signatureMethod “ 值 = ” HmacSHA256 “ >
<输入 类型 = ” 隐藏的“ 名称 = ” accessKey “ 值 = ” 11SEM03K88SD016FS1G2 “ >
<输入 类型 = “ 隐藏“ 名称 = ” referenceId “ 值 = ” 测试“ >
<输入 类型 = ” 隐藏“ 名称 = ” 金额“ 值 = ” USD 10 “ >
<输入 类型 = ” 隐藏“ 名称 = ” 签名“ 值 = ” avlT64an02VS0drWiNZj36rGz88JwvFmETKveYfzjJk = “ >
<输入 类型 = “ 隐藏“ 名称 = ” isDonationWidget “ 值 = ” 0 “ >
<输入 类型 = ” 隐藏“ 名称 = ” 描述“ 值 = ” 测试“ >
<输入 类型 = ” 隐藏“ 名称 = ” amazonPaymentsAccountId “ 值 = ” KWKCCYNIVXJL42AE3FVCZCA65I3522JBV4EJVX “ >
<输入 类型 = “隐藏的“ 名称 = ” returnUrl “ 值 = ” http://test.com/return_url “ >
<输入 类型 = ” 隐藏“ 名称 = ” processImmediate “ 值 = ” 1 “ >
<输入 类型 = ” 隐藏的“ 名称 = ” cobrandingStyle “ 值 = ” 徽标“ >
<输入 类型 = “ 图片“ src = ” http://g-ecx.images-amazon.com/images/G/01/asp/beige_small_paynow_withmsg_whitebg.gif “ border = ” 0 “ >
</ form>
将HTML复制并粘贴到某个地方的文本文件中,然后将其保留。顺便说一下,此HTML中隐藏了两个重要的值:您的AWS访问密钥,以及您的Amazon Payments账户ID。您将要记下这些值,并将它们保存在某个位置。
第6步:编写Rails应用程序以收集付款
谢天谢地; 我们已经完成了Amazon Payments用户界面!现在有趣的部分:让我们构建一个Rails 3.0示例应用程序,以使用刚刚生成的Amazon按钮收集付款:
$ rails new sample_app
创建
创建 自述文件
创建 Rakefile
创建 config.ru
创建 .gitignore
创建 Gemfile$ cd sample_app
让我们创建一个模型来保存付款交易-我将仅存储今天的金额和交易ID。您还可以存储用户的电子邮件,收货地址等。
$ rails生成支架付款金额:float transaction_id:string
调用active_record
创建 数据库/迁移/20101119212749_create_payments.rb 创建 应用程序/模型/payment.rb
调用test_unit
创建 test / unit / payment_test.rb
创建 test / fixtures / payments.yml
路线 资源:payments
调用scaffold_controller
等等...$ rake db:migrate
现在编辑app / views / payments / index.html.erb并从顶部的Amazon Simple Pay中粘贴HTML:
<form action = “ https://authorize.payments-sandbox.amazon.com/pba/paypipeline ” method = “ post ” >
<input type = “ hidden ” name = “ InstantReturn ” value = “ 1 ” >
<输入 类型 = “ 隐藏的” 名称 = “ collectShippingAddress ” 值 = “ 0 ” >
<输入 类型 = “隐藏的“ 名称 = ” signatureVersion “ 值 = ” 2 “ >
<输入 类型 = ” 隐藏“ 名称 = ” signatureMethod “ 值 = ” HmacSHA256 “ >
<输入 类型 = ” 隐藏的“ 名称 = ” accessKey “ 值 = ” 11SEM03K88SD016FS1G2 “ >
<输入 类型 = “ 隐藏“ 名称 = ” referenceId “ 值 = ” ref “ >
<输入 类型 = ” 隐藏“ 名称 = ” 金额“ 值 = ” USD 10 “ >
<输入 类型 = ” 隐藏“ 名称 = ” 签名“ 值 = ” avlT64an02VS0drWiNZj36rGz88JwvFmETKveYfzjJk “ >
<输入 类型 = “ 隐藏” name = “ isDonationWidget ” value = “ 0 ” >
<输入 类型 = “ 隐藏” name = “ 描述” value = “ desc ” >
<输入 类型 = “ 隐藏” name = “ amazonPaymentsAccountId ” value = “ KWKCCYNIVXJL42AE3FVCZCA65I3522JBV4EJVX ” >
<输入 类型 = “ 隐藏“ 名称 = ” returnUrl “ 值 = ” http://test.com/return_url “ >
<输入 类型 = ” 隐藏“ 名称 = ” processImmediate “ 值 = ” 1 “ >
<输入 类型 = ” 隐藏“ 名称 = ” cobrandingStyle “ 值 = “ 徽标” >
<输入 类型 = “ 图像” src = “ http://g-ecx.images-amazon.com/images/G/01/asp/beige_small_paynow_withmsg_whitebg.gif ” border = “ 0 ” >
</ form><h1>上市付款</ h1><table>
<tr>
<th>金额</ th>
<th>交易</ th>等等...
除了重要的accessKey和amazonPaymentsAccountId值之外,您可能已经注意到还有另一个称为“ signature”的值,以及“ signatureVersion”和“ signatureMethod”。如上所述,签名实际上是所有其他形式的加密哈希。价值观。当用户提交表单时,Amazon将通过将它们与签名值进行比较来检查所有表单参数是否有效。问题在于,对于亚马逊而言,“有效”的含义等于您先前在亚马逊“创建”按钮表单中输入的内容,而不是对您的网站或业务规则真正有效的含义。
为了使Amazon Simple Pay表单可以使用不同的付款金额和不同的返回URL(例如,“ localhost:3000”对您的生产主机名),我们不能使用这种签名安全方案……至少目前还不能使用。在以后的博客文章中,我将展示一种在每次提交付款表单时动态生成签名值的方法。
现在,让我们删除与签名相关的值。请记住,我们之前在Amazon Payments站点中未选中“签名按钮”;将此设置为false可以删除签名值。
另外,您应该将Return URL更改为:“ http:// localhost:3000 / confirm_payment”。这告诉Amazon Payments在用户确认付款后如何将其重定向回我们的网站。
这是我的付款指数视图现在的样子:
<form action = “ https://authorize.payments-sandbox.amazon.com/pba/paypipeline ” method = “ post ” >
<input type = “ hidden ” name = “ InstantReturn ” value = “ 1 ” >
<输入 类型 = “ 隐藏的” 名称 = “ collectShippingAddress ” 值 = “ 0 ” >
<输入 类型 = “隐藏的“ 名称 = ” accessKey “ 值 = ” 11SEM03K88SD016FS1G2 “ >
<输入 类型 = ” 隐藏“ 名称 = ” referenceId “ 值 = ” ref “ >
<输入 类型 = ” 隐藏的“ 名称 = ” 金额“ 值 = ” USD 10 “ >
<输入 类型 = “ 隐藏” name = “ isDonationWidget ” value = “ 0 ” >
<输入 类型 = “ 隐藏” name = “ 描述” value = “ desc ” >
<输入 类型 = “ 隐藏” name = “ amazonPaymentsAccountId ” value = “ KWKCCYNIVXJL42AE3FVCZCA65I3522JBV4EJVX ” >
<输入 类型 = “ 隐藏“ 名称 = ” returnUrl “ 值 = ” http:// localhost:3000 / confirm_payment “ >
<input type = “ hidden ” name = “ processImmediate ” value = “ 1 ” >
<input type = “ hidden ” name = “ cobrandingStyle ” value = “ logo ” >
<input type = “ image ” src = “ http:// g-ecx.images-amazon.com/images/G/01/asp/beige_small_paynow_withmsg_whitebg.gif “ 边框 = “0 “ ></ form><h1>上市付款</ h1><table>
<tr>
<th>金额</ th>
<th>交易</ th>等等...
接下来,我们添加一条确认付款的新路线;编辑config / routes.rb:
SampleApp :: 应用程序 .routes.draw 做资源:付款
匹配“ confirm_payment ” => “ 付款#确认”等等...
现在让我们在付款控制器中为此编写一个新操作;修改app / controllers / payments_controller.rb:
类PaymentsController < ApplicationController
def 确认
@ 付款= 付款。new (
:transaction_amount => params [ :transactionAmount ]
,:transaction_id => params [ :transactionId ]
)
如果@ payment.save
redirect_to(@ payment,:notice => ' 付款成功创建。' )
else
redirect_to :action => “ 索引” 年底
结束
等...
这看起来类似于我们从脚手架生成器获得的创建动作。当用户从Amazon Payments网站返回时,将调用此操作,并将该交易记录在我们应用程序的付款表中。稍后对此进行更多讨论。
最后,在支付模型中,我们需要一些代码来解析从亚马逊传回的交易金额字符串:
类付款< ActiveRecord的::基地
validates_presence_of :量
validates_presence_of :TRANSACTION_ID
DEF TRANSACTION_AMOUNT = (currency_and_amount)
货币= 解析(currency_and_amount)。首先
,如果货币== ' USD '
量= 解析(currency_and_amount).last.to_f
别的
量= currency.to_f
end
self.amount = 金额,除非金额== 0.0
end
def 解析
(currency_and_amount)
@ 解析的|| = currency_and_amount.split
结束
端
亚马逊的“交易金额”参数可能包含指定货币的前缀“ USD”。但是,有时不存在。上面的代码根据需要在虚拟属性“ transaction_amount”中解析字符串,然后将相应的数量保存为数据库中的“金额”浮点值。支付模型还验证了Amazon是否同时指定了金额和交易ID,以便认为该支付有效。
现在,让我们启动该应用并尝试一下!
如果您单击“立即付款”按钮,您将被重定向到亚马逊:
您的个人或公司名称应显示在左上角,而不是我的名字。接下来,使用其他帐户登录到Amazon并确认付款…您不能使用用于设置Amazon Simple Pay的同一帐户,因为Amazon不允许某人付款。还请记住,表单操作URL中出现了“沙盒”,因此无需担心花费真钱!
单击“确认”后,您将被重定向回我们的Rails示例应用程序,并重定向到我们在“ returnUrl”表单字段中给亚马逊的页面。现在您应该看到:
现在,交易ID和金额保存在交易表中,您可以将其用于报告或在用户界面中用于其他目的。所有这些工作如下:
- 亚马逊向我们在付款表格的“ returnUrl”字段中提供的URL发送了一个GET请求。
- 在此请求中,Amazon传递了有关交易的信息,例如金额,交易ID和其他信息,例如买方的电子邮件地址,名称,运送地址,并且还提供了签名哈希,以确保您希望此请求是从亚马逊。
- 由于我们的returnUrl设置为confirm_payment_url,因此在上方的PaymentsController中调用了我们的Confirm操作。
- 这将创建一个新的付款记录,在此示例中仅设置金额和交易ID值。
- 最后,如我上面所解释的,付款模型解析来自亚马逊的“ transactionAmount”值。
第7步:使用帮助程序轻松生成付款表格
当然,我们的视图代码非常丑陋-所有这些复杂的HTML都难以阅读和混淆,而且如果我们想要在应用程序中使用多个按钮,则必须重复所有HTML。最好的做法是使用助手呈现付款表格。这段代码可以解决问题-将代码保存在app / helpers / amazon_simple_pay_helper.rb中:
模块AmazonSimplePayHelper
AMAZON_ACCESS_KEY = ' 11SEM03K88SD016FS1G2 '
AMAZON_PAYMENTS_ACCOUNT_ID = ' KWKCCYNIVXJL42AE3FVCZCA65I3522JBV4EJVX '
DEF amazon_simple_pay_form_tag (选项= {}, &块)
沙箱= ' -sandbox ' 除非导轨.ENV == ' 生产'
pipeline_url =“ HTTPS://authorize.payments #{沙箱} .amazon.com / pba / paypipeline “
html_options = { :action
=> Pipeline_url,:method => :post } .merge(options)
content = capture(&block)
输出= ActiveSupport :: SafeBuffer 。新的
output.safe_concat(tag(:form ,html_options,true ))
输出<< 内容
output.safe_concat(hidden_field_tag(' accessKey ' ,AMAZON_ACCESS_KEY))
output.safe_concat(hidden_field_tag(' amazonPaymentsAccountId ' ,AMAZON_PAYMENTS_ACCOUNT_ID)
output.safe_concat(hidden_field_tag(' immediateReturn ' ,' 1 ' ))
output.safe_concat(hidden_field_tag(' processImmediate ' ,' 1 ' ))
output.safe_concat(hidden_field_tag(' cobrandingStyle ' ,' 标志' ))
output.safe_concat(hidden_field_tag (' RETURNURL ' ,confirm_payment_url))
output.safe_concat( “ </ FORM> ” )
端
端
该帮助程序使用与标准“ form_tag” Rails视图帮助程序相同的代码,不同之处在于它提供了Amazon所需的其他字段和属性。运作方式如下:
- 首先,它计算表格操作网址-上面HTML中的亚马逊付款沙盒网址。除非您在生产服务器上运行,否则URL中将包含“沙盒”。
- 它创建了一个SafeBuffer-这可以防止Rails 3转义html。
- 然后,它将带有Amazon表单操作URL和post方法属性的新表单标签写入此缓冲区。
- 接下来,它产生所提供的块,并附加返回的所有HTML,从而使您可以照常在视图中使用块。
- 最后,它添加了Amazon所需的其他表单字段。“ returnUrl”仍设置为我们之前创建的确认付款路线。
- 您应该将两个常量AMAZON_ACCESS_KEY和AMAZON_PAYMENTS_ACCOUNT_ID移到您的环境配置文件之一中,甚至最好移到某个位置的YAML文件中。
由于这就像正常的form_tag一样,因此我的视图代码现在变得更加简单和熟悉。它看起来像任何其他Rails形式:
<%= amazon_simple_pay_form_tag DO %>
$ <%= text_field_tag ' 量' %> <BR/> <BR/>
<%= hidden_field_tag ' referenceId ',' 东西' %>
<%= hidden_field_tag ' 描述',' 别的东西' %>
<%= image_submit_tag('/ images/ pay_me.gif ')%>
<% 结尾 %>
在这里,我提供了一个不同的按钮图像,并允许用户使用真实文本字段输入任何付款金额。我还在这里指定了参考ID和描述值,因为它们可能与该视图页面上其他地方使用的业务规则和/或对象有关。要完成此操作,我可能需要在amount字段上添加一些JQuery验证。
下次,我将展示如何在表单提交给Amazon之前进行动态签名,从而为您提供Amazon“签名按钮”功能的安全优势。