使用 ColdFusion 调用 Sage Pay API 时出错

问题描述

使用 ColdFusion,我们尝试通过向 Sage Pay 提交详细信息来处理客户付款。

无论提交什么,我们都会收到错误 500 和 5080。

我们提交的 crypt 与收到的版本有一种奇怪的不同: 前 1450 个字符是相同的。 然后去掉末端的一小部分,换上一个新的更长的夹头。

我们查看了之前建议的 Base64 选项,因为接收的是 12 个字节而不是 16 个字节,但这似乎并没有解决问题。

以前有人见过这个吗?谁能建议我们可以尝试完成购买的东西?

请! 煤气

来自 Kraig Johnson 的更新

链接到规范 PDF:https://www.opayo.ie/file/21086/download-document/FORM_Integration_and_Protocol_Guidelines_130515.pdf?token=FF7jKOvWemRFvw6UhEGOH1ULUpJBiXYIZKHSkhkl2II

Sage 在指南中特别说明,

" 要求是使用提供的密码作为密钥和初始化向量,在 CBC 模式下使用 PKCS#5 填充将字符串加密为 AES(块大小 128 位),并将结果编码为十六进制。”

如果我们不先用 base64 编码,我们会得到一个无效的位长错误 - 12 字节。

stuff 是我们要编码的字符串,EncryptionPassword 是我们的密钥。

keyIVBytes = charsetDecode(EncryptionPassword,"utf-8");
base64Key = binaryEncode(keyIVBytes,"base64");
crypt=encrypt(stuff,base64Key,"AES/CBC/PKCS5Padding","hex",keyIVBytes);

解决方法

链接到规范 PDF:https://www.opayo.ie/file/21086/download-document/FORM_Integration_and_Protocol_Guidelines_130515.pdf?token=FF7jKOvWemRFvw6UhEGOH1ULUpJBiXYIZKHSkhkl2II

我是从事 SagePay 表单集成的开发人员。 Sage 在指南中特别指出,“要求是在 CBC 模式下使用 PKCS#5 填充将字符串加密为 AES(块大小 128 位),使用提供的密码作为密钥和初始化向量,并将结果编码为十六进制。 "

如果我们不先用 base64 编码,我们会得到一个无效的位长错误 - 12 字节。

“stuff”是我们要编码的字符串,EncryptionPassword 是我们的密钥。

keyIVBytes = charsetDecode(EncryptionPassword,"utf-8");
base64Key = binaryEncode(keyIVBytes,"base64");
crypt=encrypt(stuff,base64Key,"AES/CBC/PKCS5Padding","hex",keyIVBytes);
,

这是我的加密页面中的整个代码块。我做错了什么?

<cfscript>
myDT = int(timeformat(now(),'hhmmss'));
seed = int(Randomize(myDT)*10000000);
VendorTxCode = dateformat(now(),"yyddmm-") & seed;
EncryptionPassword="EFwm44ahkyxGGU2o";
stuff = "VendorTxCode=" & VendorTXCode & "&";
stuff = stuff & "Amount=" & numberformat(form.ordergt,'0.00') & "&";
stuff = stuff & "Currency=" & "GBP" & "&";
stuff = stuff & "Description=" & "GPO Retro Order [PROMO:" & ucase(form.promocode) & "] " & form.model & "[" & form.colour & "] QTY [" & form.qty & "]" & "&";
stuff = stuff & "SuccessURL=https://gporetro.com/order/order-success.cfm" & "&";
stuff = stuff & "FailureURL=https://gporetro.com/order/order-failure.cfm" & "&";
stuff = stuff & "CustomerName=" & form.firstname & ' ' & form.surname;
stuff = stuff & "CustomerEMail=" & form.email & "&";
stuff = stuff & "VendorEMail=sales@gporetro.com" & "&"
stuff = stuff & "SendEMail=1" & "&";
stuff = stuff & "EmailMessage=Thanks for your order." & "&";
stuff = stuff & "BillingSurname=" & form.surname & "&";
stuff = stuff & "BillingFirstnames=" & form.firstname & "&";
stuff = stuff & "BillingAddress1=" & trim(form.address1b) & "&";
stuff = stuff & "BillingAddress2=" & trim(form.address2b) & "&";
stuff = stuff & "BillingCity=" & form.citytownb & "&";
stuff = stuff & "BillingPostCode=" & form.postcodeb & "&";
stuff = stuff & "BillingCountry=GB" & "&";
stuff = stuff & "BillingPhone=" & form.tel & "&";
stuff = stuff & "DeliverySurname=" & form.surname & "&";
stuff = stuff & "DeliveryFirstnames=" & form.firstname & "&";
stuff = stuff & "DeliveryAddress1=" & trim(form.address1) & "&";
stuff = stuff & "DeliveryAddress2=" & trim(form.address2) & "&";
stuff = stuff & "DeliveryCity=" & form.citytown & "&";
stuff = stuff & "DeliveryPostCode=" & form.postcode & "&";
stuff = stuff & "DeliveryCountry=GB" & "&";
stuff = stuff & "DeliveryPhone=" & form.tel;
keyIVBytes = charsetDecode(EncryptionPassword,"base64");
crypt = encrypt(stuff,keyIVBytes);
</cfscript>

<form action="<cfoutput>#vspsite#</cfoutput>" enctype="multipart/form-data" name="SagePayForm" id="SagePayForm" method="post">
    <input name="VPSProtocol" type="hidden" id="VPSProtocol" value="3.00">
    <input name="Vendor" type="hidden" id="Vendor" value="Protelxltd">
    <input name="TxType" type="hidden" id="TxType" value="PAYMENT">
    <input name="crypt" type="hidden" id="crypt" value="@<cfoutput>#crypt#</cfoutput>">
</form>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...