Javascript 向Intuit/Quickbooks支付API提交令牌化卡数据时出错

Javascript 向Intuit/Quickbooks支付API提交令牌化卡数据时出错,javascript,php,quickbooks,payment-processing,intuit,Javascript,Php,Quickbooks,Payment Processing,Intuit,我正在将Intuit/Quickbooks支付API集成到现有的电子商务网站中。由于PCI的要求,我需要在卡数据到达服务器之前通过JavaScript标记卡数据,然后使用该标记而不是实际的卡数据提交费用 为什么我从Payments API收到“token is invalid”错误 第一次尝试 我按照上的说明操作,其中描述了如何使用因纽特人提供的JavaScript文件来标记卡数据 intuit.ipp.payments.tokenize( qbAppToken{ 卡片:{ 编号:$(“#标记

我正在将Intuit/Quickbooks支付API集成到现有的电子商务网站中。由于PCI的要求,我需要在卡数据到达服务器之前通过JavaScript标记卡数据,然后使用该标记而不是实际的卡数据提交费用

为什么我从Payments API收到“token is invalid”错误

第一次尝试 我按照上的说明操作,其中描述了如何使用因纽特人提供的JavaScript文件来标记卡数据


intuit.ipp.payments.tokenize(
qbAppToken{
卡片:{
编号:$(“#标记化_cc-number”).val(),
expMonth:$(“#标记化_cc-expMonth”).val(),
expYear:$(“#标记化_cc-expYear”).val(),
cvc:$(“#标记化_cc-cvc”).val(),
地址:{
streetAddress:$(“#标记化_cc-address-street”).val(),
城市:$(“#标记化_cc-address-city”).val(),
区域:$(“#标记化_cc-address-region”).val(),
国家:$(“#标记化_cc-address-country”).val(),
postalCode:$(“#令牌化_cc-address-postalCode”).val()
}
}
},
功能(令牌、响应){
控制台日志(响应);
if(令牌!=null){
console.log(令牌);
$cardToken.val(代币);
$paymentForm[0]。提交();
}否则{
console.log(“标记化期间出错”+response.code+”;“+response.message+”;“+response.detail+”;“+response.moreinfo”);
}
});
我取回了一张卡片令牌:

f9e7a378-c3f2-4343-b0a8-ee376d4ed472

我将该令牌插入我的表单并将表单提交给我的服务器,然后服务器使用卡令牌通过CURL向支付API提交费用

我正在向端点提交:

https://sandbox.api.intuit.com/quickbooks/v4/payments/charges

数组
(
[金额]=>6992.83
[货币]=>美元
[捕获]=>真
[令牌]=>f9e7a378-c3f2-4343-b0a8-ee376d4ed472
[上下文]=>数组
(
[手机]=>错误
[isEcommerce]=>正确
)
)
然而,我从Payments API得到的回复是“令牌无效”:

{
“错误”:[{
“代码”:“PMT-4000”,
“类型”:“无效的请求”,
“消息”:“令牌无效。”,
“详细信息”:“令牌”,
“信息链接”:https://developer.intuit.com/v2/docs?redirectID=PayErrors"
}]
}
以下是完整的回答:

HTTP/1.1400错误请求
服务器:nginx
日期:2019年6月5日星期三18:13:20 GMT
内容类型:application/json;字符集=utf-8
内容长度:175
连接:保持活力
保持活动状态:超时=5
严格的运输安全:最大年龄=15552000
intuit_tid:[修订]
设置Cookie:ADRUM_BT=R:0 |客户端GUID:9ae895d4-44ee-4175-bb47-4e37e95162a819 | btId:755 |后端快照类型:f;Expires=2019年6月5日星期三18:13:49 GMT;路径=/
{“errors”:[{“code”:“PMT-4000”,“type”:“invalid_request”,“message”:“token is invalid.”,“detail”:“token”,“infoLink”:https://developer.intuit.com/v2/docs?redirectID=PayErrors"}]}
我注意到,对于JavaScript卡标记化来说,“本节仅适用于OAuth 1.0应用程序。”这可能是一个问题。但我看不到有人提到如何为OAuth 2.0应用程序标记卡数据

解读错误 我假设“令牌无效”错误指的是我的卡令牌,而不是我的应用程序身份验证令牌。我的假设基于两件事:

  • 当我更改我的应用程序身份验证令牌时,会出现另一个错误:

    {
      "code": "AuthenticationFailed",
      "type": "INPUT",
      "message": null,
      "detail": null,
      "moreInfo": null
    }
    
  • Intuit开发者关系部表示Intuit的JavaScript文件中的令牌端点“不正确”,这表明我收到的卡令牌存在问题

  • 联系开发商关系 Intuit开发商关系部表示:

    出现该错误的原因是javascript文件没有在正确的环境中正确创建令牌

    QuickBooks支付API有两种不同的环境。一个称为沙箱环境,另一个称为生产环境。要为沙盒环境创建令牌,您需要使用以下URL:https://sandbox.api.intuit.com/quickbooks/v4/payments/tokens

    但是,在该javascript中,令牌的URL为:https://transaction-api-e2e.payments.intuit.net/v2/tokens,这是不正确的。这是我们使用的内部测试环境。在e2e中创建的令牌不适用于沙箱。这就是为什么您得到的令牌是无效错误

    又一次尝试 在查看API资源管理器和之后,我尝试在不使用Intuit的JavaScript库的情况下生成卡片令牌

    这与开发人员关系引用的API资源管理器中的端点使用相同的端点,尽管不存在,所以我认为这是一个输入错误

    发布v4/支付/代币
    对于IE8/IE9-POST/quickbooks/v4/payments/tokens/ie
    内容类型:application/json
    生产基地URL:https://api.intuit.com
    沙盒基本URL:https://sandbox.api.intuit.com

    jQuery.ajax({
    url:“https://sandbox.api.intuit.com/quickbooks/v4/payments/tokens",
    类型:“POST”,
    contentType:'应用程序/json',
    数据类型:“json”,
    数据:JSON.stringify(cardData)
    }).done(函数(msg){
    ...
    });
    
    结果是一样的。
    我得到的似乎是卡令牌,但当我通过CURL提交费用时,我仍然得到:

    {
    “错误”:[{
    “代码”:“PMT-4000”,
    “类型”:“无效的请求”,
    “消息”:“令牌无效。”,
    “详细信息”:“令牌”,
    “信息链接”:https://developer.intuit.com/v2/docs?redirectID=PayErrors"
    }]
    }
    
    怎么了

    我有一张Intuit的公开票,还有一张。如果我从他们那里收到任何进一步的信息,我会更新这篇文章。

    如果你在下面使用javascript文件标记信用卡信息,
    https://js.appcenter.intuit.com/Content/IA/intuit.ipp.payments-0.0.3.js
    ,请注意开发商关系部的回应:

    …在该javascript中
    {
     "value": "7e92f015-820b-4e70-81b9-8ce840c76389"
    }
    
    {
    "created": "2019-06-17T16:18:43Z",
    "status": "CAPTURED",
    "amount": "10.55",
    "currency": "USD",
    "token": "7e92f015-820b-4e70-81b9-8ce840c76389",
    "card": {
        "number": "xxxxxxxxxxxx1111",
        "name": "emulate=0",
        "address": {
            "city": "Sunnyvale",
            "region": "CA",
            "country": "US",
            "streetAddress": "Road Street",
            "postalCode": "94086"
        },
        "cardType": "Visa",
        "expMonth": "02",
        "expYear": "2020",
        "cvc": "xxx"
    },
    "avsStreet": "Pass",
    "avsZip": "Pass",
    "cardSecurityCodeMatch": "NotAvailable",
    "id": "E4JTLAV2QAFF",
    "context": {
        "mobile": false,
        "deviceInfo": {},
        "recurring": false,
        "isEcommerce": true
    },
    "authCode": "546816"
    }