Grails E_WC_14:Accept.js加密失败?
我有一张付款单,如下所示Grails E_WC_14:Accept.js加密失败?,grails,authorize.net,accept.js,Grails,Authorize.net,Accept.js,我有一张付款单,如下所示 <body> <g:if test="${flash.message}"> <div class="message">${flash.message}</div> </g:if> <div class="content"> <h1>Secure Checkout</h1> <g:form name="pa
<body>
<g:if test="${flash.message}">
<div class="message">${flash.message}</div>
</g:if>
<div class="content">
<h1>Secure Checkout</h1>
<g:form name="paymentForm"
method="POST"
action="processAcceptPayment" >
<input type="text" name="cardNumber" id="cardNumber" placeholder="cardNumber"/> <br><br>
<input type="text" name="expMonth" id="expMonth" placeholder="expMonth"/> <br><br>
<input type="text" name="expYear" id="expYear" placeholder="expYear"/> <br><br>
<input type="text" name="cardCode" id="cardCode" placeholder="cardCode"/> <br><br>
<input type="hidden" name="dataValue" id="dataValue" />
<input type="hidden" name="dataDescriptor" id="dataDescriptor" />
<button type="button" onclick="sendPaymentDataToAnet()">Pay</button>
</g:form>
</div>
<g:javascript>
function sendPaymentDataToAnet() {
var authData = {};
authData.clientKey = "valid key";
authData.apiLoginID = "valid id";
var cardData = {};
cardData.cardNumber = document.getElementById("cardNumber").value;
cardData.month = document.getElementById("expMonth").value;
cardData.year = document.getElementById("expYear").value;
cardData.cardCode = document.getElementById("cardCode").value;
var secureData = {};
secureData.authData = authData;
secureData.cardData = cardData;
// If using banking information instead of card information,
// send the bankData object instead of the cardData object.
//
// secureData.bankData = bankData;
Accept.dispatchData(secureData, responseHandler);
}
function responseHandler(response) {
if (response.messages.resultCode === "Error") {
var i = 0;
while (i < response.messages.message.length) {
console.log(
response.messages.message[i].code + ": " +
response.messages.message[i].text
);
i = i + 1;
}
} else {
paymentFormUpdate(response.opaqueData);
}
}
function paymentFormUpdate(opaqueData) {
document.getElementById("dataDescriptor").value = opaqueData.dataDescriptor;
document.getElementById("dataValue").value = opaqueData.dataValue;
document.getElementById("cardNumber").value = "";
document.getElementById("expMonth").value = "";
document.getElementById("expYear").value = "";
document.getElementById("cardCode").value = "";
document.getElementById("accountNumber").value = "";
document.getElementById("routingNumber").value = "";
document.getElementById("nameOnAccount").value = "";
document.getElementById("accountType").value = "";
document.getElementById("paymentForm").submit();
}
</g:javascript>
</body>
${flash.message}
安全结帐
支付
函数sendPaymentDataToAnet(){
var authData={};
authData.clientKey=“有效密钥”;
authData.apiLoginID=“有效id”;
var cardData={};
cardData.cardNumber=document.getElementById(“cardNumber”).value;
cardData.month=document.getElementById(“expMonth”).value;
cardData.year=document.getElementById(“expYear”).value;
cardData.cardCode=document.getElementById(“cardCode”).value;
var secureData={};
secureData.authData=authData;
secureData.cardData=cardData;
//如果使用银行信息而不是卡信息,
//发送bankData对象而不是cardData对象。
//
//secureData.bankData=银行数据;
接受、发送数据(secureData、responseHandler);
}
功能响应手柄(响应){
if(response.messages.resultCode==“Error”){
var i=0;
while(i
这将生成如下表单
<body>
<g:if test="${flash.message}">
<div class="message">${flash.message}</div>
</g:if>
<div class="content">
<h1>Secure Checkout</h1>
<g:form name="paymentForm"
method="POST"
action="processAcceptPayment" >
<input type="text" name="cardNumber" id="cardNumber" placeholder="cardNumber"/> <br><br>
<input type="text" name="expMonth" id="expMonth" placeholder="expMonth"/> <br><br>
<input type="text" name="expYear" id="expYear" placeholder="expYear"/> <br><br>
<input type="text" name="cardCode" id="cardCode" placeholder="cardCode"/> <br><br>
<input type="hidden" name="dataValue" id="dataValue" />
<input type="hidden" name="dataDescriptor" id="dataDescriptor" />
<button type="button" onclick="sendPaymentDataToAnet()">Pay</button>
</g:form>
</div>
<g:javascript>
function sendPaymentDataToAnet() {
var authData = {};
authData.clientKey = "valid key";
authData.apiLoginID = "valid id";
var cardData = {};
cardData.cardNumber = document.getElementById("cardNumber").value;
cardData.month = document.getElementById("expMonth").value;
cardData.year = document.getElementById("expYear").value;
cardData.cardCode = document.getElementById("cardCode").value;
var secureData = {};
secureData.authData = authData;
secureData.cardData = cardData;
// If using banking information instead of card information,
// send the bankData object instead of the cardData object.
//
// secureData.bankData = bankData;
Accept.dispatchData(secureData, responseHandler);
}
function responseHandler(response) {
if (response.messages.resultCode === "Error") {
var i = 0;
while (i < response.messages.message.length) {
console.log(
response.messages.message[i].code + ": " +
response.messages.message[i].text
);
i = i + 1;
}
} else {
paymentFormUpdate(response.opaqueData);
}
}
function paymentFormUpdate(opaqueData) {
document.getElementById("dataDescriptor").value = opaqueData.dataDescriptor;
document.getElementById("dataValue").value = opaqueData.dataValue;
document.getElementById("cardNumber").value = "";
document.getElementById("expMonth").value = "";
document.getElementById("expYear").value = "";
document.getElementById("cardCode").value = "";
document.getElementById("accountNumber").value = "";
document.getElementById("routingNumber").value = "";
document.getElementById("nameOnAccount").value = "";
document.getElementById("accountType").value = "";
document.getElementById("paymentForm").submit();
}
</g:javascript>
</body>
我输入测试信用卡号并单击“支付”
我在javascript控制台中遇到以下错误
我刚刚在官方页面上学习accept.js教程
关于“加密失败”错误的原因,我非常感谢您的帮助?谢谢
更新:
好的,我做了更多的调试。我在responseHandler()函数中放了一个测试代码“console.log(“test”);”,并注意到它被调用了两次。我现在想知道为什么responseHandler()会被调用两次 我也出现了同样的错误。我没有看到
控制台
,而是转到Chrome浏览器的网络
选项卡,然后看到成功消息已经出现,如下所示:
opaqueData
:
{dataDescriptor: "COMMON.ACCEPT.INAPP.PAYMENT",…}
请注意,测试时,请输入来自的沙盒测试卡
好的,我做了更多的调试。我在responseHandler()函数中放了一个测试代码“console.log(“test”);”,并注意到它被调用了两次。我现在想知道为什么responseHandler()会被调用两次
我重复了这个测试,可以确认这是这个错误的常见原因。同样,如果Accept.js调用的函数中存在Javascript错误,或者页面中存在其他Javascript错误,则Accept.js会错误地调用responseHandler()两次。在我的例子中,我有一个sendOrder()AJAX函数,它假设了一个变量。一旦我修复了另一个函数,responseHandler()函数只被调用了一次。当Accept.js由于页面上发生其他Javascript错误而触发回调函数两次时,您可以通过将回调函数的内容包装在try/catch块中,非常快地在页面上跟踪该错误的来源:
Accept.dispatchData(secureData, responseHandler);
...
function responseHandler(response) {
try {
if (response.messages.resultCode === "Error") {
var i = 0;
while (i < response.messages.message.length) {
console.log(
response.messages.message[i].code + ": " +
response.messages.message[i].text
);
i = i + 1;
}
}
} catch (error) {
console.log(error);
}
}
Accept.dispatchData(secureData,responseHandler);
...
功能响应手柄(响应){
试一试{
if(response.messages.resultCode==“Error”){
var i=0;
while(i
您使用的是哪种表单?您自己的付款表单或托管的付款信息表单?您是否导入了Accept.js
?我使用的是自定义表单,并且在head中导入了Accept.js。我遇到了同样的问题。似乎Accept.js会使用页面上的任何JavaScript错误,并将此一般错误记录在相应位置。在responseHandler错误条件下,我在Firefox开发工具中使用断点并查看调用堆栈以发现实际的底层错误,从而找到了我的违规代码。我知道这是一篇两年前的文章,但它确实帮助我找出了我今天做错的地方。首先,我添加了上面的try-catch,然后被告知我正在尝试设置null对象的属性,最终的解决方案是,我已从付款表单中删除了银行帐户字段,但在提交到后端之前,仍在尝试清空表单中的这些字段。有点无聊,但这确实救了我,谢谢!