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对象的属性,最终的解决方案是,我已从付款表单中删除了银行帐户字段,但在提交到后端之前,仍在尝试清空表单中的这些字段。有点无聊,但这确实救了我,谢谢!