authorize.net PHP Hello World 错误
authorize.net PHP Hello World bug
我正在尝试让 PHP Hello World example 正常工作。我从 authorize.net 站点下载了代码,并使用了 Composer 和给定的 composer.json
文件。
当我 运行 命令 composer update 时,我收到一条警告消息:
Package goetas/xsd2php is abandoned, you should avoid using it. Use goetas-webservices/xsd2php instead.
Package goetas/xsd-reader is abandoned, you should avoid using it. Use goetas-webservices/xsd-reader instead.
尽管有警告,我还是尝试 运行使用 charge-credit-card.php 程序,但我收到此错误:
Fatal error: Class 'Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler' not found in /var/www/public/newsite/vendor/authorizenet/authorizenet/lib/net/authorize/api/controller/base/ApiOperationBase.php on line 82
我尝试修改 composer.json 文件以消除该错误,但我给自己挖了一个更深的坑。
这里是 composer.json 文件供参考。
{
"require":
{ "php": ">=5.2.0",
"ext-curl": "*",
"authorizenet/authorizenet": "1.8.8",
"jms/serializer": "xsd2php-dev as 0.18.0"},
"require-dev":
{
"goetas/xsd2php": "2.*@dev",
"goetas/xsd-reader": "2.*@dev"},
"repositories":
[{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}]}
这里是 PHP 程序,我正在 运行ning...
<?php
require 'vendor/autoload.php';
use net\authorize\api\contract\v1 as AnetAPI;
use net\authorize\api\controller as AnetController;
define("AUTHORIZENET_LOG_FILE","phplog");
// Common setup for API credentials
$merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
$merchantAuthentication->setName("123456789");
$merchantAuthentication->setTransactionKey("abcdefghijklmnop");
$refId = 'ref' . time();
// Create the payment data for a credit card
$creditCard = new AnetAPI\CreditCardType();
$creditCard->setCardNumber("4111111111111111" );
$creditCard->setExpirationDate( "2038-12");
$paymentOne = new AnetAPI\PaymentType();
$paymentOne->setCreditCard($creditCard);
// Create a transaction
$transactionRequestType = new AnetAPI\TransactionRequestType();
$transactionRequestType->setTransactionType("authCaptureTransaction");
$transactionRequestType->setAmount(151.51);
$transactionRequestType->setPayment($paymentOne);
$request = new AnetAPI\CreateTransactionRequest();
$request->setMerchantAuthentication($merchantAuthentication);
$request->setRefId( $refId);
$request->setTransactionRequest($transactionRequestType);
// if I comment out the line below, no error occurs
$controller = new AnetController\CreateTransactionController($request);
// $response = $controller->executeWithApiResponse(\net\authorize\api\constants\ANetEnvironment::SANDBOX);
echo "<p>Hello there 10. The reference id is " . $refId . "</p>";
?>
这是 运行ning composer install
的控制台输出
Loading composer repositories with package information
Reading composer.json of jms/serializer (0.16.0)
Reading composer.json of jms/serializer (0.15.0)
Reading composer.json of jms/serializer (0.14.0)
Reading composer.json of jms/serializer (0.13.0)
Reading composer.json of jms/serializer (0.12.0)
Reading composer.json of jms/serializer (0.11.0)
Reading composer.json of jms/serializer (event-sdispatcher)
Reading composer.json of jms/serializer (graph-refactor)
Reading composer.json of jms/serializer (master)
Reading composer.json of jms/serializer (ok-for-lignano)
Reading composer.json of jms/serializer (patch-1)
Reading composer.json of jms/serializer (psr4)
Reading composer.json of jms/serializer (remove-hndl)
Reading composer.json of jms/serializer (serializer-master)
Reading composer.json of jms/serializer (xsd2php)
Updating dependencies (including require-dev)
- Installing doctrine/lexer (v1.0.1)
Loading from cache
- Installing doctrine/annotations (v1.3.0)
Loading from cache
- Installing phpoption/phpoption (1.5.0)
Loading from cache
- Installing phpcollection/phpcollection (0.5.0)
Loading from cache
- Installing jms/parser-lib (1.0.0)
Loading from cache
- Installing jms/metadata (1.5.1)
Loading from cache
- Installing jms/serializer (dev-xsd2php f339d96)
Cloning f339d96f7e359e2837ed8b752348cc84823a9966
- Installing goetas-webservices/xsd-reader (v0.1.2)
Loading from cache
- Installing zendframework/zend-eventmanager (3.0.1)
Loading from cache
- Installing zendframework/zend-code (2.6.3)
Loading from cache
- Installing doctrine/inflector (v1.1.0)
Loading from cache
- Installing symfony/yaml (v3.1.6)
Loading from cache
- Installing psr/log (1.0.2)
Loading from cache
- Installing symfony/debug (v3.1.6)
Loading from cache
- Installing symfony/polyfill-mbstring (v1.2.0)
Loading from cache
- Installing symfony/console (v3.1.6)
Loading from cache
- Installing goetas/xsd2php (dev-master 7e1ab0a)
Cloning 7e1ab0a2d007991b0c6d326e9f67ec90c020b5e5
- Installing goetas/xsd-reader (dev-master c5bcc02)
Cloning c5bcc02d1a07f26533991e7b0d6c51a98d78c02c
- Installing authorizenet/authorizenet (1.8.8)
Loading from cache
zendframework/zend-eventmanager suggests installing container-interop/container-interop (^1.1.0, to use the lazy listeners feature)
zendframework/zend-eventmanager suggests installing zendframework/zend-stdlib (^2.7.3 || ^3.0, to use the FilterChain feature)
zendframework/zend-code suggests installing zendframework/zend-stdlib (Zend\Stdlib component)
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/process ()
authorizenet/authorizenet suggests installing phpdocumentor/phpdocumentor (For generating API documentation)
Package goetas/xsd2php is abandoned, you should avoid using it. Use goetas-webservices/xsd2php instead.
Package goetas/xsd-reader is abandoned, you should avoid using it. Use goetas-webservices/xsd-reader instead.
Writing lock file
Generating autoload files
为了解决这个问题,我想看看是否有其他人报告过,so I had a search about in GitHub. That revealed this bug report 听起来完全正确:
GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler does not exist any more?
对此,作者点to this documentation to solve unsatisfied dependencies using Composer. So I modified the composer.json
to add the missing line (and ran it through a formatter):
{
"require": {
"php": ">=5.2.0",
"ext-curl": "*",
"authorizenet/authorizenet": "1.8.8",
"jms/serializer": "xsd2php-dev as 0.18.0",
"goetas-webservices/xsd2php-runtime":"^0.2.2"
},
"require-dev": {
"goetas/xsd2php": "2.*@dev",
"goetas/xsd-reader": "2.*@dev"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}
]
}
不幸的是 运行ning composer install
导致依赖冲突:
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for jms/serializer xsd2php-dev as 0.18.0 -> satisfiable by jms/serializer[dev-xsd2php].
- goetas-webservices/xsd2php-runtime v0.2.2 requires jms/serializer ^1.2 -> satisfiable by jms/serializer[1.4.x-dev].
- Can only install one of: jms/serializer[1.4.x-dev, dev-xsd2php].
- Installation request for goetas-webservices/xsd2php-runtime ^0.2.2 -> satisfiable by goetas-webservices/xsd2php-runtime[v0.2.2].
用简单的英语来说,这意味着:
- xsd2php-运行time 希望序列化程序为 1.2
- 我们已在 0.18.0 请求序列化程序
由于我们只能真正控制自己的要求,我想知道我们是否可以将自己对 serializer
的要求提高到 1.2,因此:
{
"require": {
"php": ">=5.2.0",
"ext-curl": "*",
"authorizenet/authorizenet": "1.8.8",
"jms/serializer": "xsd2php-dev as 1.2",
"goetas-webservices/xsd2php-runtime":"^0.2.2"
},
"require-dev": {
"goetas/xsd2php": "2.*@dev",
"goetas/xsd-reader": "2.*@dev"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}
]
}
这有点冒险,因为我们不知道这是否会导致 Authorize.net 演示脚本出现 运行 次失败,但至少现在安装会 运行 .不幸的是,出现了相同的 运行 时间错误:
PHP Fatal error: Class 'Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler' not found in /home/jon/Development/Personal/authorize.net/vendor/authorizenet/authorizenet/lib/net/authorize/api/controller/base/ApiOperationBase.php on line 82
我想知道这是否是自动加载失败,所以让我们看一下。我们想要 Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler
,但是如果我们查看我们的新依赖项 class,就会发现命名空间已更改为 GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler
。通常我们只会将版本 0.2.2 更改为更早的版本,但是如果你看 at the release history,最早的版本是 0.1.0,它是在命名空间更改后推送的。
所以此时我们有两个选择:
- 将
goetas-webservices/xsd2php-runtime
添加为 VCS 依赖项并指定 Git 提交哈希以签出(这将导致库过时且可能不受支持);
- 修改
authorizenet
依赖中需要的库,然后请Authorise.net大佬上游修改(更好,但需要他们配合,可能会阻碍你的进度)
我的意见是,本指南应该是 "quick start",但已被 Authorize.net 略微遗弃,如果搜索引擎的一点侦探工作揭示了其他人,我也不会感到惊讶有同样的困境。我个人会选择第二个选项,因为 ApiOperationBase
中的修复是微不足道的。
更改这些行:
use Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler;
use Goetas\Xsd\XsdToPhp\Jms\Handler\XmlSchemaDateHandler;
这些:
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\XmlSchemaDateHandler;
现在程序将 运行:
$ php pay.php
<p>Hello there 10. The reference id is ref1478722350</p>
我建议您联系 Authorize.net 并记录错误;如果他们使用 GitHub 问题,请在那里创建一个问题并将他们指向这个答案。希望他们也能换掉这两个被遗弃的包,如果他们真的很好,他们会建立一个持续集成系统,如果将来再次出现这种依赖性问题,就会崩溃。
您正在安装的 Authorize.Net PHP SDK 的版本对过时的组件有一些依赖性,以及您在安装时遇到的一些与名称空间相关的问题运行 "charge-credit-card.php" 脚本。 Authorize.Net PHP SDK (1.9.0) 的最新版本修复了这些问题。
所以,最大的问题只是 "Hello World" 页面上的示例 composer.json 没有安装较新版本,而是安装了不再有效的旧版本 SDK。
将 "Hello World" 页面上的 composer.json 示例替换为以下内容应该会使一切正常:
{
"require": {
"authorizenet/authorizenet": "1.9.0",
"jms/serializer": "dev-serializer-master as 1.0"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}
]
}
只需替换composer.json,执行composer update
或删除"vendor"目录,然后重做composer install
。
我们希望尽快在 "Hello World" 页面上对此进行更改。
我最近开始使用 php 中的 authorize.net api,安装了 composer,这是我的 composer.json,它可以很好地运行 Hello World 示例
{
"require": {
"symfony/console": "^3.3",
"authorizenet/authorizenet": ">=1.9.3"
}
}
我正在尝试让 PHP Hello World example 正常工作。我从 authorize.net 站点下载了代码,并使用了 Composer 和给定的 composer.json
文件。
当我 运行 命令 composer update 时,我收到一条警告消息:
Package goetas/xsd2php is abandoned, you should avoid using it. Use goetas-webservices/xsd2php instead.
Package goetas/xsd-reader is abandoned, you should avoid using it. Use goetas-webservices/xsd-reader instead.
尽管有警告,我还是尝试 运行使用 charge-credit-card.php 程序,但我收到此错误:
Fatal error: Class 'Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler' not found in /var/www/public/newsite/vendor/authorizenet/authorizenet/lib/net/authorize/api/controller/base/ApiOperationBase.php on line 82
我尝试修改 composer.json 文件以消除该错误,但我给自己挖了一个更深的坑。
这里是 composer.json 文件供参考。
{
"require":
{ "php": ">=5.2.0",
"ext-curl": "*",
"authorizenet/authorizenet": "1.8.8",
"jms/serializer": "xsd2php-dev as 0.18.0"},
"require-dev":
{
"goetas/xsd2php": "2.*@dev",
"goetas/xsd-reader": "2.*@dev"},
"repositories":
[{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}]}
这里是 PHP 程序,我正在 运行ning...
<?php
require 'vendor/autoload.php';
use net\authorize\api\contract\v1 as AnetAPI;
use net\authorize\api\controller as AnetController;
define("AUTHORIZENET_LOG_FILE","phplog");
// Common setup for API credentials
$merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
$merchantAuthentication->setName("123456789");
$merchantAuthentication->setTransactionKey("abcdefghijklmnop");
$refId = 'ref' . time();
// Create the payment data for a credit card
$creditCard = new AnetAPI\CreditCardType();
$creditCard->setCardNumber("4111111111111111" );
$creditCard->setExpirationDate( "2038-12");
$paymentOne = new AnetAPI\PaymentType();
$paymentOne->setCreditCard($creditCard);
// Create a transaction
$transactionRequestType = new AnetAPI\TransactionRequestType();
$transactionRequestType->setTransactionType("authCaptureTransaction");
$transactionRequestType->setAmount(151.51);
$transactionRequestType->setPayment($paymentOne);
$request = new AnetAPI\CreateTransactionRequest();
$request->setMerchantAuthentication($merchantAuthentication);
$request->setRefId( $refId);
$request->setTransactionRequest($transactionRequestType);
// if I comment out the line below, no error occurs
$controller = new AnetController\CreateTransactionController($request);
// $response = $controller->executeWithApiResponse(\net\authorize\api\constants\ANetEnvironment::SANDBOX);
echo "<p>Hello there 10. The reference id is " . $refId . "</p>";
?>
这是 运行ning composer install
的控制台输出Loading composer repositories with package information
Reading composer.json of jms/serializer (0.16.0)
Reading composer.json of jms/serializer (0.15.0)
Reading composer.json of jms/serializer (0.14.0)
Reading composer.json of jms/serializer (0.13.0)
Reading composer.json of jms/serializer (0.12.0)
Reading composer.json of jms/serializer (0.11.0)
Reading composer.json of jms/serializer (event-sdispatcher)
Reading composer.json of jms/serializer (graph-refactor)
Reading composer.json of jms/serializer (master)
Reading composer.json of jms/serializer (ok-for-lignano)
Reading composer.json of jms/serializer (patch-1)
Reading composer.json of jms/serializer (psr4)
Reading composer.json of jms/serializer (remove-hndl)
Reading composer.json of jms/serializer (serializer-master)
Reading composer.json of jms/serializer (xsd2php)
Updating dependencies (including require-dev)
- Installing doctrine/lexer (v1.0.1)
Loading from cache
- Installing doctrine/annotations (v1.3.0)
Loading from cache
- Installing phpoption/phpoption (1.5.0)
Loading from cache
- Installing phpcollection/phpcollection (0.5.0)
Loading from cache
- Installing jms/parser-lib (1.0.0)
Loading from cache
- Installing jms/metadata (1.5.1)
Loading from cache
- Installing jms/serializer (dev-xsd2php f339d96)
Cloning f339d96f7e359e2837ed8b752348cc84823a9966
- Installing goetas-webservices/xsd-reader (v0.1.2)
Loading from cache
- Installing zendframework/zend-eventmanager (3.0.1)
Loading from cache
- Installing zendframework/zend-code (2.6.3)
Loading from cache
- Installing doctrine/inflector (v1.1.0)
Loading from cache
- Installing symfony/yaml (v3.1.6)
Loading from cache
- Installing psr/log (1.0.2)
Loading from cache
- Installing symfony/debug (v3.1.6)
Loading from cache
- Installing symfony/polyfill-mbstring (v1.2.0)
Loading from cache
- Installing symfony/console (v3.1.6)
Loading from cache
- Installing goetas/xsd2php (dev-master 7e1ab0a)
Cloning 7e1ab0a2d007991b0c6d326e9f67ec90c020b5e5
- Installing goetas/xsd-reader (dev-master c5bcc02)
Cloning c5bcc02d1a07f26533991e7b0d6c51a98d78c02c
- Installing authorizenet/authorizenet (1.8.8)
Loading from cache
zendframework/zend-eventmanager suggests installing container-interop/container-interop (^1.1.0, to use the lazy listeners feature)
zendframework/zend-eventmanager suggests installing zendframework/zend-stdlib (^2.7.3 || ^3.0, to use the FilterChain feature)
zendframework/zend-code suggests installing zendframework/zend-stdlib (Zend\Stdlib component)
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/process ()
authorizenet/authorizenet suggests installing phpdocumentor/phpdocumentor (For generating API documentation)
Package goetas/xsd2php is abandoned, you should avoid using it. Use goetas-webservices/xsd2php instead.
Package goetas/xsd-reader is abandoned, you should avoid using it. Use goetas-webservices/xsd-reader instead.
Writing lock file
Generating autoload files
为了解决这个问题,我想看看是否有其他人报告过,so I had a search about in GitHub. That revealed this bug report 听起来完全正确:
GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler does not exist any more?
对此,作者点to this documentation to solve unsatisfied dependencies using Composer. So I modified the composer.json
to add the missing line (and ran it through a formatter):
{
"require": {
"php": ">=5.2.0",
"ext-curl": "*",
"authorizenet/authorizenet": "1.8.8",
"jms/serializer": "xsd2php-dev as 0.18.0",
"goetas-webservices/xsd2php-runtime":"^0.2.2"
},
"require-dev": {
"goetas/xsd2php": "2.*@dev",
"goetas/xsd-reader": "2.*@dev"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}
]
}
不幸的是 运行ning composer install
导致依赖冲突:
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for jms/serializer xsd2php-dev as 0.18.0 -> satisfiable by jms/serializer[dev-xsd2php].
- goetas-webservices/xsd2php-runtime v0.2.2 requires jms/serializer ^1.2 -> satisfiable by jms/serializer[1.4.x-dev].
- Can only install one of: jms/serializer[1.4.x-dev, dev-xsd2php].
- Installation request for goetas-webservices/xsd2php-runtime ^0.2.2 -> satisfiable by goetas-webservices/xsd2php-runtime[v0.2.2].
用简单的英语来说,这意味着:
- xsd2php-运行time 希望序列化程序为 1.2
- 我们已在 0.18.0 请求序列化程序
由于我们只能真正控制自己的要求,我想知道我们是否可以将自己对 serializer
的要求提高到 1.2,因此:
{
"require": {
"php": ">=5.2.0",
"ext-curl": "*",
"authorizenet/authorizenet": "1.8.8",
"jms/serializer": "xsd2php-dev as 1.2",
"goetas-webservices/xsd2php-runtime":"^0.2.2"
},
"require-dev": {
"goetas/xsd2php": "2.*@dev",
"goetas/xsd-reader": "2.*@dev"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}
]
}
这有点冒险,因为我们不知道这是否会导致 Authorize.net 演示脚本出现 运行 次失败,但至少现在安装会 运行 .不幸的是,出现了相同的 运行 时间错误:
PHP Fatal error: Class 'Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler' not found in /home/jon/Development/Personal/authorize.net/vendor/authorizenet/authorizenet/lib/net/authorize/api/controller/base/ApiOperationBase.php on line 82
我想知道这是否是自动加载失败,所以让我们看一下。我们想要 Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler
,但是如果我们查看我们的新依赖项 class,就会发现命名空间已更改为 GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler
。通常我们只会将版本 0.2.2 更改为更早的版本,但是如果你看 at the release history,最早的版本是 0.1.0,它是在命名空间更改后推送的。
所以此时我们有两个选择:
- 将
goetas-webservices/xsd2php-runtime
添加为 VCS 依赖项并指定 Git 提交哈希以签出(这将导致库过时且可能不受支持); - 修改
authorizenet
依赖中需要的库,然后请Authorise.net大佬上游修改(更好,但需要他们配合,可能会阻碍你的进度)
我的意见是,本指南应该是 "quick start",但已被 Authorize.net 略微遗弃,如果搜索引擎的一点侦探工作揭示了其他人,我也不会感到惊讶有同样的困境。我个人会选择第二个选项,因为 ApiOperationBase
中的修复是微不足道的。
更改这些行:
use Goetas\Xsd\XsdToPhp\Jms\Handler\BaseTypesHandler;
use Goetas\Xsd\XsdToPhp\Jms\Handler\XmlSchemaDateHandler;
这些:
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\XmlSchemaDateHandler;
现在程序将 运行:
$ php pay.php
<p>Hello there 10. The reference id is ref1478722350</p>
我建议您联系 Authorize.net 并记录错误;如果他们使用 GitHub 问题,请在那里创建一个问题并将他们指向这个答案。希望他们也能换掉这两个被遗弃的包,如果他们真的很好,他们会建立一个持续集成系统,如果将来再次出现这种依赖性问题,就会崩溃。
您正在安装的 Authorize.Net PHP SDK 的版本对过时的组件有一些依赖性,以及您在安装时遇到的一些与名称空间相关的问题运行 "charge-credit-card.php" 脚本。 Authorize.Net PHP SDK (1.9.0) 的最新版本修复了这些问题。
所以,最大的问题只是 "Hello World" 页面上的示例 composer.json 没有安装较新版本,而是安装了不再有效的旧版本 SDK。
将 "Hello World" 页面上的 composer.json 示例替换为以下内容应该会使一切正常:
{
"require": {
"authorizenet/authorizenet": "1.9.0",
"jms/serializer": "dev-serializer-master as 1.0"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/goetas/serializer.git"
}
]
}
只需替换composer.json,执行composer update
或删除"vendor"目录,然后重做composer install
。
我们希望尽快在 "Hello World" 页面上对此进行更改。
我最近开始使用 php 中的 authorize.net api,安装了 composer,这是我的 composer.json,它可以很好地运行 Hello World 示例
{
"require": {
"symfony/console": "^3.3",
"authorizenet/authorizenet": ">=1.9.3"
}
}