2结帐全能支付 - 授权失败


2Checkout OmniPay - Authorization Failed

我在使用 OmniPay API 时收到来自 2Checkout 的授权失败响应。

我成功地将Stripe与OmniPay连接起来,所以我开始连接2Checkout。当你这样做时,Github上的初始软件包会警告你从用户collizo4sky那里获取更新的版本。所以,我做到了,然后让它稍微工作而没有致命错误。

在我的 Web 表单中,我正确生成了一个令牌,2Checkout 的沙盒日志证实了这一点。然后,我在OmniPay中使用此代码尝试向卡收费:

use Omnipay'Omnipay;
$sMerchantTransID = rand(11111111,99999999);
$oGateway = Omnipay::create('TwoCheckoutPlus_Token');
$oGateway->setPrivateKey($config->TWOCHECKOUT_PRIVATE_KEY);
$oGateway->setAccountNumber($config->TWOCHECKOUT_SELLERID);
$oGateway->setTestMode(true);
$oResponse = $oGateway->purchase(array(
    'amount' => $sPrice,
    'currency' => 'USD',
    'token' => $sToken,
    'transactionId' => $sMerchantTransID
))->send();
if (!$oResponse->isSuccessful()) {
    die('ERROR: ' . $oResponse->getMessage());
}

但是,消息返回"授权失败"。因此,我进入了 OmniPay API 的源代码,用于 collizo4sky 的软件包......

omnipay/vendor/collizo4sky/omnipay-2checkout/src/Message/TokenPurchaseRequest.php

。并添加了一些 sendData() 类方法的日志文件调试。这是它的响应,请注意,出于明显的隐私原因,我更改了一些值:

array (
  'sellerId' => '901414261',
  'privateKey' => 'EAEC8615-4C48-4D98-B7E5-4B6D8865E1BA',
  'merchantOrderId' => 65639323,
  'token' => 'FDI1ZTM3N2UtY2VkZS00NTM1LWE5MTctYzI4MjA5YWI4Yjhm',
  'currency' => 'USD',
  'total' => '519.00',
)

是的,sellerID 和私钥来自沙盒帐户,当我首先在 Web 表单中生成令牌时,可发布密钥也是如此。

因此,无论如何,当将其提交到沙盒 URL 时,它会返回以下响应:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Cache-Control: no-cache, no-store, must-revalidate
Date: Fri, 22 Apr 2016 03:30:37 GMT
Expires: 0
Pragma: no-cache
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
{"validationErrors":null,"response":null,"exception":{"errorMsg":"Authorization Failed","httpStatus":"400","exception":false,"errorCode":"600"}}

我做错了什么?

编辑:

然后我尝试使用他们提供的 2Checkout 支持的 PHP 库。我做了完全相同的交易,它也返回"授权失败"。

我想知道即使我

使用的是沙盒,这是否是我帐户上的设置?我的意思是,我还没有在生产中得到批准,并且在那之前一直试图让沙盒运行,以便我可以做一个演示。

我还在沙箱中重新生成了 API 密钥并重试,但失败了。

我使用的信用卡是他们在沙盒 API 密钥下的沙盒上提供的信用卡,我使用的 CVV 为 123,到期日期为 12/18。然后我想也许它想要一个 4 位数的年份,所以我更新了它并重试,这也失败了,并出现相同的一致错误"授权失败"。

当我检查"授权失败"的含义时,似乎信用卡是问题所在。

到目前为止,我的直觉告诉我,我做的一切都是正确的,这是我帐户上的一个标志,这就是问题所在。我的意思是,如果我的常规帐户尚未获得批准,沙盒是否仍然有效?

我可以通过交易的唯一方法是在"帐户>站点管理"下的沙盒设置中手动将演示模式设置为"关闭",然后至少传入一个帐单地址。我很想知道如何没有账单地址要求(例如对于数字下载商品),但还没有找到一种方法来做到这一点,或者如果这可能的话。

请注意,如果您将演示模式设置为"开",并且不发送账单地址,则交易将正常进行,但随后不会在"销售"选项卡下显示为销售。这不是很有用,因为当您上线时,您想要可以退款的实际销售,而演示模式不会模拟实际费用,只是对该卡的授权。(至少我是这么想出来的。

transactionId 参数上,我在这里使用了一条快捷方式。请将其设置为系统中的唯一编号(例如用UNIX时间生成的某些数字),否则最终可能会发生冲突。

我还尝试只注释掉电子邮件或电话,或两者兼而有之,但这不起作用 - 你会得到"参数错误"。然后,我尝试只发送card下的这些字段:billingNameemailbillingPostcodebillingCountry——这也因"参数错误"而失败。然后我添加了billingState - "参数错误"。然后,添加了billingCity - "参数错误"。因此,为了使交易通过,除非有人可以向我展示一些设置覆盖或技术,否则账单地址是必需的,并且还必须包括电子邮件和电话,这让我大吃一惊。我敢肯定,这对某些人来说是一个阻碍,比如那些试图出售数字下载等无形资产的人。另请注意,我尝试了官方 2Checkout 创建的 PHP API,并再次尝试了所有这些测试,并再次收到"参数错误",除非使用了完整的账单地址(包括电子邮件和电话)。我敢肯定,这种完整的账单地址要求以及电子邮件和账单电话对一些企业来说将是一个遗憾。

编辑:如果我猜对了,这个答案是在2Checkout工作的人的官方答案,本身?它确实看起来是那样的。无论如何,他说账单地址肯定是必需的,因为正如他所说,"这是我们的银行合作伙伴进行地址验证的要求。

编辑2:您需要尝试真正的实时交易,但我发现至少在沙盒模式下,如果我为官方 2Checkout PHP 库的 phoneNumber 字段或 OmniPay API 中的billingPhone传递一个空字符串,那么交易就可以了。他们只想看到该参数,尽管它可以为空。但不要相信我的话 - 在实时交易中测试它(并自己退款)以重新确认,因为我只是在沙盒中这样做。这个答案似乎正式证实了 2Checkout 本身他们允许这样做。

固定代码:

use Omnipay'Omnipay;
$sMerchantTransID = rand(11111111,99999999);
$oGateway = Omnipay::create('TwoCheckoutPlus_Token');
$oGateway->setPrivateKey($config->TWOCHECKOUT_PRIVATE_KEY);
$oGateway->setAccountNumber($config->TWOCHECKOUT_SELLERID);
$oGateway->setTestMode(true); // turns on Sandbox access
$oResponse = $oGateway->purchase(array(
    'amount' => $sPrice,
    'currency' => 'USD',
    'token' => $sToken,
    'transactionId' => $sMerchantTransID,
    'card' => array(
        'billingName' => $sName,
        'billingAddress1' => $sStreet1,
        'billingAddress2' => $sStreet2,
        'billingCity' => $sCity,
        'billingState' => $sState,
        'billingPostcode' => $sZip,
        'billingCountry' => $sCountry,
        'email' => $sEmail,
        'billingPhone' => $sPhone
    )
))->send();
if (!$oResponse->isSuccessful()) {
    die('ERROR: ' . $oResponse->getMessage());
}