我制作了一个简单的应用程序,以演示如何将Worldpay和Rails/Activemerchant的离站支付功能结合使用。
演示Rails应用程序-
https://github.com/daemonsy/Worldpay-Rails--Off-Site--Integration-Example
对于World Pay托管付款,基本上需要向其付款URL进行post
。将test-
添加到secure.worldpay.com以测试模式。WP要求金额、货币、安装ID和cartId以向客户呈现页面。
<form action="https://test-secure.worldpay.com/wcc/purchase" method=POST>
<!
<input type="hidden" name="testMode" value="100">
<!
<input type="hidden" name="instId" value="Your installation ID ">
<!
<input type="hidden" name="cartId" value="Your ID for the product ">
<!
<input type="hidden" name="amount" value="The cost of the product ">
<!
<input type="hidden" name="currency" value="currency code e.g. GBP, USD ">
<!
<input type=submit value=" Buy This ">
源代码: http://www.worldpay.com/support/kb/bg/htmlredirect/rhtml.html
这将创建一个简单的按钮
,将您的订单传递到World Pay,在那里客户将输入信用卡详细信息并完成购买。我已经将上述代码嵌入到订单控制器的show
页面中。例如:<input type="hidden" name="amount" value="<%=@order.amount"%>>
。因此,在提交订单后,您可以单击buy this
。有许多方法可以实现向World Pay的POST
。
之后,World Pay可以显示购物者响应页面,发送付款响应
等。为了使付款响应起作用,您可以将付款响应回调URL
设置为您的控制器之一。例如:=>http://mysite.com/payment-backend
这将是一个POST
请求,因此您需要设置控制器来处理它。这就是Activemerchant
发挥作用的地方。例如,
class BackendsController < ApplicationController
include ActiveMerchant::Billing::Integrations
protect_from_forgery :except=>[:worldpay_return]
def worldpay_return
notification = WorldPay::Notification.new(request.raw_post)
order = Order.find(notification.item_id)
if notification.acknowledge
begin
if notification.complete?
order.status = 'success'
end
rescue
order.status = "failed"
raise
ensure
order.save
end
end
render :text =>"Order status for #{order.id} is #{order.status}"
end
end
因此,通知对象将读取
request.raw_post
中的参数,并将它们设置为一个对象,您可以查询。我发现活动商家文档对于告知哪些返回参数是由其映射的很有用。
请注意,此控制器是一个非常简单的示例。World Pay为您提供了一些方法来验证响应,这得到了Active Merchant的支持。
WorldPay :: Notifications的ActiveMerchant文档
http://rdoc.info/github/Shopify/active_merchant/master/ActiveMerchant/Billing/Integrations/WorldPay
World Pay付款响应文档
http://www.worldpay.com/support/kb/bg/paymentresponse/payment_response.html
POST
请求发送到Worldpay的URL来简化流程?就像Paypal按钮API一样。 - Damon Aw