调用intuit.ipp.anywhere.setup()的最佳做法?

时间:2014-02-19 18:10:31

标签: quickbooks intuit-partner-platform quickbooks-online

这是关于进行JavaScript调用的最佳实践的问题,该调用生成标准的“连接到QuickBooks”按钮(用于通过Intuit的v3 REST API建立与QuickBooks Harmony的连接)。

如果我按照Intuit的例子,我会:

  1. 在脚本代码中引用https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js
  2. 放置< ipp:connectToIntuit>< / ipp:connectToIntuit> tagset我希望“连接到QuickBooks”按钮显示
  3. 交叉我的手指,希望intuit.ipp.anywhere.js 不会重定向到停机消息,再次仍然存在
  4. 致电intuit.ipp.anywhere.setup()
  5. 请参阅“连接到QuickBooks”按钮
  6. ...有效(对于许多“作品”的价值观),但感觉非常脆弱:

    1. 如果intuit.ipp.anywhere.js重定向到停机消息(读取:不是JavaScript)或者不可用,我将收到脚本错误。
    2. 如果我收到脚本错误(或者Intuit的脚本副本出现其他问题),则没有任何反馈给用户,只有一个空白区域应该是“连接到QuickBooks”按钮。
    3. 为了使这一切变得更有弹性,我将intuit.ipp.anywhere.js的引用和对intuit.ipp.anywhere.setup()的调用组合成一个JQuery .ajax()调用:

          $.ajax({
           url: 'https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js', 
           type: 'GET',
           dataType: 'script',
           timeout: 4000,
           success: function(response) {
            if (typeof intuit !== 'undefined') {
             intuit.ipp.anywhere.setup({
              menuProxy: 'MYMENUPROXYURL.aspx',
              grantUrl: 'MYGRANTURL.aspx'
             });
            }
           },
           error: function(x, t, m) {
             // show some friendly error message about Intuit downtime
           }        
          });
      

      ...这也有效(对于“作品”的更多值):

      1. 我对setup()的调用包含在成功处理程序中(以及对intuit对象存在的附加检查),所以如果出现问题我不应该得到脚本错误。
      2. 如果Intuit脚本的GET超时(4000ms后)或返回非脚本的内容,我将向用户显示友好的错误消息。
      3. 有没有其他人采取不同的方法? 并且Intuit重新上线了吗?

1 个答案:

答案 0 :(得分:2)

这与我们处理它的方式类似。我们将它包装在jQuery.getScript调用中,但显然.fail处理程序不适用于跨域脚本标记。我们的解决方案如下:

<script type="text/javascript>
    var timeoutID;
    timeoutID = window.setTimeout(function () {
        $("#ippConnectToIntuit").replaceWith('<p class="error-message">There was a problem communicating with QuickBooks. The service may be down or in heavy use. Try again later.</p>');
        }, 5000);
    $.getScript("https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js")
        .done(function () {
            window.clearTimeout(timeoutID);
            intuit.ipp.anywhere.setup({
                menuProxy: '/path/to/our/menu/proxy',
                grantUrl: '/path/to/our/grant/url'
            });
        });
</script>
<div id="ippConnectToIntuit"><ipp:connecttointuit></ipp:connecttointuit></div>