我的付款方式如下
<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教程。
https://developer.authorize.net/api/reference/features/acceptjs.html
对于“加密失败”错误的原因,我感谢您提供帮助吗?谢谢!
更新
好的,我做了一些调试。我把测试代码“console.log(”test“);”在responseHandler()函数内部,注意到它被调用了两次。我现在想知道为什么responseHandler()被调用两次。
答案 0 :(得分:0)
我也出现了同样的错误。而不是看到console
,而是转到Chrome浏览器的Network
标签,然后看到成功消息如下所示:
opaqueData
:
{dataDescriptor: "COMMON.ACCEPT.INAPP.PAYMENT",…}
请注意,在测试时,请从https://developer.authorize.net/hello_world/testing_guide/
输入沙盒的测试卡答案 1 :(得分:0)
好,所以我做了一些调试。我放置了一个测试代码“ console.log(“ test”);“在responseHandler()函数内部,并注意到它被调用了两次。我现在想知道为什么responseHandler()被调用两次。
我重复了此测试,并可以确认这是导致此错误的常见原因。的确,如果Accept.js调用了其中包含Javascript错误的函数,或者页面中存在其他Javascript错误,则会错误地两次调用responseHandler()。就我而言,我有一个sendOrder()AJAX函数,该函数假设一个变量。修复其他函数后,responseHandler()函数仅被调用一次。
答案 2 :(得分:0)
当由于页面上发生其他一些Javascript错误而使Accept.js两次触发回调函数时,您可以通过将回调函数的内容包装在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);
}
}