Symfony で payum.org を使用して Authorize.net SIM 支払い方法を使用したいと考えています。正式なゲートウェイはありませんが、オムニペイには omnipay-authorizenet があります。Payum には omnipay-bridge もあるため、payum で omnipay ゲートウェイを使用することができます。
したがって、このセットアップを使用し、authorize.net フォームを送信した後、エラーが発生します。
[date] request.CRITICAL: Uncaught PHP Exception Omnipay\Common\Exception\InvalidRequestException: "Incorrect hash" at .../authorize/vendor/omnipay/authorizenet/src/Message/SIMCompleteAuthorizeRequest.php line 42 {"exception":"[object] (Omnipay\\Common\\Exception\\InvalidRequestException(code: 0): Incorrect hash at .../authorize/vendor/omnipay/authorizenet/src/Message/SIMCompleteAuthorizeRequest.php:42)"} []
しかし、これは生成されたハッシュが正しくないためではなく、POST データなしでキャプチャ URL が 2 回呼び出されるためです。
3 つのパッケージを含む Symfony2 のクリーン インストール:
composer.json:
"payum/payum-bundle": "0.15.*",
"omnipay/authorizenet": "~2.0",
"payum/omnipay-bridge": "*@stable"
config.yml:
payum:
security:
token_storage:
AppBundle\Entity\PaymentToken: { doctrine: orm }
storages:
AppBundle\Entity\Payment: { doctrine: orm }
gateways:
authorizeGateway:
omnipay_offsite:
type: AuthorizeNet_SIM
options:
hashSecret: 'Simon'
ApiLoginId: 'xxx'
transactionkey: 'xxx'
testMode: false
developerMode: true
コントローラ:
/**
* @Route("/prepare", name="prepare")
*/
public function prepareAction()
{
$gatewayName = 'authorizeGateway';
$storage = $this->get('payum')->getStorage('AppBundle\Entity\Payment');
$payment = $storage->create();
$payment->setNumber(uniqid());
$payment->setCurrencyCode('USD');
$payment->setTotalAmount(1);
$payment->setDescription('A description');
$payment->setClientId('anId');
$payment->setClientEmail('foo@example.com');
$storage->update($payment);
$captureToken = $this->get('payum.security.token_factory')->createCaptureToken(
$gatewayName,
$payment,
'done' // the route to redirect after capture
);
return $this->redirect($captureToken->getTargetUrl());
}
/**
* @Route("/done", name="done")
*/
public function doneAction(Request $request)
{
...
}
/prepare に移動すると、authorize.net ページへのリダイレクトが一瞬表示され、カード番号 (テスト カード番号) と有効期限を指定する外部の test.authorize.net/gateway/transact.dll (https 上の) ページにリダイレクトされます。将来の日付。このフォームを送信すると、次のようになります。
An error occurred while trying to report this transaction to the merchant. An e-mail has been sent to the merchant informing them of the error. The following is the result of the attempt to charge your credit card.
This transaction has been approved.
It is advisable for you to contact the merchant to verify that you will receive the product or service.
Merchant Email Receipt に関するメールとエラーに関するメールが届きました。
Authorize.Net Developer Center Merchant,
Your script timed out while we were trying to post transaction results to it.
Transaction ID: XXX
Transaction Result: This transaction has been approved.
トランザクションが正しく処理され、キャプチャ スクリプトが呼び出され、ハッシュが一致し、ポスト データなしでキャプチャが再度呼び出されます。その後、ハッシュが一致せず、オーソライズでエラーが表示されます。
symfony プロファイラーからのリクエスト:
Token IP Method URL Time Status
fe39ec 198.241.162.104 GET .../payment/capture/vVgoUCPtgCOglv6rLwhIbUp64RZ_oIql1_KDpWjdrdk Tue, 17 Nov 2015 09:47:36 +0100 500
bba47c 198.241.162.104 GET .../payment/capture/vVgoUCPtgCOglv6rLwhIbUp64RZ_oIql1_KDpWjdrdk Tue, 17 Nov 2015 09:47:36 +0100 200
c95b83 198.241.162.104 POST .../payment/capture/vVgoUCPtgCOglv6rLwhIbUp64RZ_oIql1_KDpWjdrdk Tue, 17 Nov 2015 09:47:36 +0100 302
a87347 myip GET .../payment/capture/vVgoUCPtgCOglv6rLwhIbUp64RZ_oIql1_KDpWjdrdk Tue, 17 Nov 2015 09:47:30 +0100 200
c95d57 myip GET .../prepare Tue, 17 Nov 2015 09:47:29 +0100 302
/prepare を呼び出すと、すぐにキャプチャするようにリダイレクトされ、承認のフォームに移動します。次に、数秒後 (クレジット カード データが入力されて送信されると)、authorize (別の ip) がキャプチャへのポスト リクエストを行います。これは 302 リダイレクトです (おそらく、私たちのページに戻るための JavaScript コードを含む SIM 応答でしょうか?)。Capture は GET で 2 番目に呼び出され、計算されたハッシュが一致しません - これは 500 の応答です - Authorize は URL にとどまり、エラー メッセージを表示します。Done スクリプトは呼び出されません。
何が問題になる可能性がありますか? payum、omnipay-bridge、omnipay、authorize が組み合わされているため、これをさらにデバッグすることは困難です。
テストモードをオフにして、 http://developer.authorize.net/のアカウントでインターネットからアクセスできる環境でこれをテストしています。
アップデート:
次のように、通知トークンをコントローラーに追加すると:
/**
* @Route("/prepare", name="prepare")
*/
public function prepareAction()
{
$gatewayName = 'authorizeGateway';
$storage = $this->get('payum')->getStorage('AppBundle\Entity\Payment');
$payment = $storage->create();
$payment->setNumber(uniqid());
$payment->setCurrencyCode('USD');
$payment->setTotalAmount(1); // 1.23 EUR
$payment->setDescription('A description');
$payment->setClientId('anId');
$payment->setClientEmail('foo@example.com');
$storage->update($payment);
$captureToken = $this->get('payum.security.token_factory')->createCaptureToken(
$gatewayName,
$payment,
'done' // the route to redirect after capture
);
$tokenFactory = $this->get('payum.security.token_factory');
$notifyToken = $tokenFactory->createNotifyToken($gatewayName, $payment);
$payment->setDetails(['notifyUrl' => $notifyToken->getTargetUrl()]);
$storage->update($payment);
return $this->redirect($captureToken->getTargetUrl());
}
「Request Notify{model: ArrayObject} はサポートされていません。」というエラーが表示されます。
[2015-11-17 17:46:50] request.INFO: Matched route "payum_notify_do". {"route_parameters":{"_controller":"Payum\\Bundle\\PayumBundle\\Controller\\NotifyController::doAction","payum_token":"Lv5ovrC-8vikIB9ItDVLcNfuRzjjaD_pPiE3-6VIV8Y","_route":"payum_notify_do"},"request_uri":".../payment/notify/Lv5ovrC-8vikIB9ItDVLcNfuRzjjaD_pPiE3-6VIV8Y"} []
[2015-11-17 17:46:50] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2015-11-17 17:46:50] request.CRITICAL: Uncaught PHP Exception Payum\Core\Exception\RequestNotSupportedException: "Request Notify{model: ArrayObject} is not supported." at .../authorize/vendor/payum/core/Payum/Core/Exception/RequestNotSupportedException.php line 29 {"exception":"[object] (Payum\\Core\\Exception\\RequestNotSupportedException(code: 0): Request Notify{model: ArrayObject} is not supported. at .../authorize/vendor/payum/core/Payum/Core/Exception/RequestNotSupportedException.php:29)"} []