所需的系统称为 SagePay Form,与 PayPal 的 BuyNow 按钮 + PDT 流程相似。首先,您需要创建一个 FORM,如下所示:
<form action="https://live.sagepay.com/gateway/service/vspform-register.vsp" method="POST" id="SagePayForm" name="SagePayForm">
<input type="hidden" name="VPSProtocol" value="2.23" />
<input type="hidden" name="TxType" value="PAYMENT" />
<input type="hidden" name="Vendor" value="<?= $YOUR_VENDOR_LOGIN_NAME ?>" />
<input type="hidden" name="Crypt" value="<?= $PAYMENT_CRYPT ?>">
<input type="image" src="images/buynow-sagepay.png" />
</form>
(可以在此处将实时 URL 与测试 URL 交换:https://test.sagepay.com/gateway/service/vspform-register.vsp https://test.sagepay.com/gateway/service/vspform-register.vsp)
至于 $PAYMENT_CRYPT,您必须首先创建一个字符串,如下所示:
VendorTxCode=406227821909
&Amount=32.00
&Currency=USD
&Description=1 ACME Widget
&SuccessURL=http://example.com/success.php
&FailureURL=http://example.com/fail.php
&BillingSurname=Smith
&BillingFirstnames=John
&BillingAddress1=123 Main Street
&BillingCity=Anywhere
&BillingPostCode=29555
&BillingCountry=USA
&DeliverySurname=Smith
&DeliveryFirstnames=John
&DeliverAddress1=123 Main Street
&DeliveryCity=Anywhere
&DeliveryPostCode=29555
&DeliveryCountry=USA
为什么他们需要这些信息而 PayPal 不需要,这有点愚蠢,但是哦,好吧。文档明确表示,如果他们没有收到合法的值,例如验证该城市和国家的真实邮政编码,并且也用于问题争议仲裁,那么事情就会出错。
请注意,在我的示例中,没有像 PP 那样的税收或运费明细,因此您需要在显示此立即购买按钮之前根据需要显示该信息,或者可能在您的确认页面或您发送的确认电子邮件上显示。他们确实有一个“&Basket=”参数,可以在其中指定税费,但它对于您自己可以在表单页面上显示的内容来说是多余的,而且不是必需的。因此,&Amount 值必须是总值,而不是净值。也没有数量值(可以使用 &Basket 参数来指定)。您很可能会发现 &Basket 参数对于您在结账过程中已可以在自己的表单上显示的内容来说是多余的。所以,这就是为什么我的例子没有包含它。
至于 VendorTxCode,您可以创建该代码,以便您可以将订单跟踪回相应的客户。
然后,使用 SagePay 提供的加密密码,使用 XOR + Base64 编码对 $PAYMENT_CRYPT 进行加密。他们有一个 AES + Binhex 加密选项,但它有点过分了,你的服务器必须启用 mcrypt 库。一些共享托管计划STILL还没有启用!
他们提供了一个 XOR 示例,但这是您在计算机科学课程中无数次看到的典型示例,其中您重复循环访问密码的每个 ASCII 代码和数据的每个 ASCII 代码,并取另一个的补码位(XOR 过程) 。完成后,通过 Base64 编码进行传输以实现安全的 POST 传输。 Base64 编码使用 PHP 的内置函数。
由此产生的响应更像是 PayPal 的 PDT 流程,而不是 PayPal 的 IPN 流程。他们确实将某人定向到 success.php 和 failed.php 以及通过 GET 的加密 URL 响应,您可以对其进行解密和解析(base64 解码 + XOR),但困难在于客户可以在等待页面打开之前关闭表单。重定向。在这种情况下,人们会在 SagePay 的控制面板中看到这一点,并且必须为客户手动完成交易。
在 success.php 和 failed.php 上,您想做什么取决于您。一旦查询字符串 &crypt 参数未加密,您就可以通过查看 Status 参数是否为“OK”来解析事务是否完成。
请注意,您不必直接访问 success.php。您可以将其设置为 success.php?custom=value ,以传递您可以解析的交易的额外信息。他们的代码会自动解决这个问题,并在最后添加 &crypt= 参数。 fail.php 也是如此。
他们确实有办法让 SagePay 向客户和供应商发送电子邮件,但这确实有点过分了,因为您可以在执行订单时使用 mail() 语句在自己的 PHP 代码中执行相同的操作。
参考:请注意,以下文档 URL 将来可能会更改。要获取该文档的最新版本,请访问该网站,注册为开发人员(过程需要 1 分钟),然后搜索“表单协议”。
http://www.sagepay.com/sites/default/files/downloads/sagepayformprotocolandintegrationguidelines_0.pdf http://www.sagepay.com/sites/default/files/downloads/sagepayformprotocolandintegrationguidelines_0.pdf
编辑:新链接(2017 年 10 月 25 日) - https://www.sagepay.co.uk/file/25041/download-document/FORM_Integration_and_Protocol_Guidelines_270815.pdf https://www.sagepay.co.uk/file/25041/download-document/FORM_Integration_and_Protocol_Guidelines_270815.pdf