EC-CUBE3系にて、クーポンプラグインと、クロネコヤマト決済プラグインを併用した際に起こるバグの解決方法です。
運用中の通販サイトでクーポンを導入したのですが、お客様からの指摘でクレカ決済画面に行こうとするとエラーになることが判明。
ログを確認すると「AuthenticationCredentialsNotFoundException」?なんじゃそりゃ!?
さすがに焦って祈る思いで検索すると、解決方法を載せてくれている方がいました。
が、、、
解決方法が掲載されていたが、実は未解決だった。
↓ECオープンプラットフォーム「EC-CUBE」開発コミュニティに質問している方がいて、
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=22681&forum=16
↓別の方が修正方法を掲載してくれているのですが、
https://github.com/EC-CUBE/coupon-plugin/pull/117
この修正方法を適用すると、会員時のエラーは解決しました。
ですが実は、非会員の状態で試すとエラーが出てしまうのです。
それは、前出の質問者の方も指摘しているのですが、未回答のままで終わっているので解決してなかったのです。
非会員でもAuthenticationCredentialsNotFoundExceptionの解決方法
ということで、仕方ないので解決方法を探りまして何とか解決できましたのでご紹介します。
解決方法は、最初に貼り付けたURLのなかの質問者と回答者のやりとりがヒントになりました。
要するに「$app->isGranted()」を使用しないようにすればよいのではないかと。
もう少し詳しく言うと、「$app->isGranted()」を使用している箇所をtry catch文にして「AuthenticationCredentialsNotFoundException」が発生したら、セッションから会員情報を取得するように切り替える。ということをやればよいのではないかと考えました。
「$app->isGranted()」が使われているのは3ファイルで合計4箇所でした。
以下の3つのファイルに修正を入れて行きます。
※動作を保証するものではありませんので、修正は自己責任で行ってください。
1. Event.phpの修正
まずは、掲載どおり「Event.php」の修正を行います。
Event.phpファイルの場所
app/Plugin/Coupon/Event/Event.php
※パスはEC-CUBE3のインストールフォルダからのパス
Event.phpの修正差分
わかりにくいかもしれませんが、ファイルを掲載すると長くなってしまうので修正差分だけ載せます。ごめんなさい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 23a24 > use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException; 142,145c143,160 < if ($app->isGranted('ROLE_USER')) { < $Customer = $app->user(); < } else { < $Customer = $app['eccube.service.shopping']->getNonMember($this->sessionKey); --- > try { > if ($app->isGranted('ROLE_USER')) { > $Customer = $app->user(); > } else { > $Customer = $app['eccube.service.shopping']->getNonMember($this->sessionKey); > } > } catch (AuthenticationCredentialsNotFoundException $e) { > /* > * YamatoPayment など kernel.request event で FRONT_SHOPPING_CONFIRM_INITIALIZE > * が dispatch された場合は, TokenStorage が有効になっていないため, セッションから復元する > */ > if ($app['session']->has('_security_customer')) { > $token = unserialize($app['session']->get('_security_customer')); > $app['security']->setToken($token); > $Customer = $app->user(); > } else { > $Customer = $app['eccube.service.shopping']->getNonMember($this->sessionKey); > } 146a162 > |
2. CouponController.phpの修正
次に「$app->isGranted()」を使っている「CouponController.php」の修正を行います。
CouponController.phpファイルの場所
app/Plugin/Coupon/Controller/CouponController.php
※パスはEC-CUBE3のインストールフォルダからのパス
CouponController.phpの修正差分
これも修正差分だけ載せます。ごめんなさい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 23a24 > use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException; 281,288c282,310 < if ($app->isGranted('ROLE_USER')) { < $Customer = $app->user(); < } else { < $Customer = $app['eccube.service.shopping']->getNonMember($this->sessionKey); < if ($Coupon) { < if ($Coupon->getCouponMember()) { < $form->get('coupon_cd')->addError(new FormError('front.plugin.coupon.shopping.member')); < $error = true; --- > > try { > if ($app->isGranted('ROLE_USER')) { > $Customer = $app->user(); > } else { > $Customer = $app['eccube.service.shopping']->getNonMember($this->sessionKey); > if ($Coupon) { > if ($Coupon->getCouponMember()) { > $form->get('coupon_cd')->addError(new FormError('front.plugin.coupon.shopping.member')); > $error = true; > } > } > } > } catch (AuthenticationCredentialsNotFoundException $e) { > /* > * YamatoPayment など kernel.request event で FRONT_SHOPPING_CONFIRM_INITIALIZE > * が dispatch された場合は, TokenStorage が有効になっていないため, セッションから復元する > */ > if ($app['session']->has('_security_customer')) { > $token = unserialize($app['session']->get('_security_customer')); > $app['security']->setToken($token); > $Customer = $app->user(); > } else { > $Customer = $app['eccube.service.shopping']->getNonMember($this->sessionKey); > if ($Coupon) { > if ($Coupon->getCouponMember()) { > $form->get('coupon_cd')->addError(new FormError('front.plugin.coupon.shopping.member')); > $error = true; > } 291a314 > |
3. CouponService.phpの修正
最後にこれも「$app->isGranted()」を使っている「CouponService.php」の修正を行います。
CouponService.phpファイルの場所
app/Plugin/Coupon/Service/CouponService.php
※パスはEC-CUBE3のインストールフォルダからのパス
CouponService.phpの修正差分
これも修正差分だけです。
このファイルでは2箇所「isGranted」を使用しているので、2箇所修正が入ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 21a22 > use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException; 273,276c274,289 < if ($this->app->isGranted('ROLE_USER')) { < $CouponOrder->setUserId($Customer->getId()); < } else { < $CouponOrder->setEmail($Customer->getEmail()); --- > try { > if ($this->app->isGranted('ROLE_USER')) { > $CouponOrder->setUserId($Customer->getId()); > } else { > $CouponOrder->setEmail($Customer->getEmail()); > } > } catch (AuthenticationCredentialsNotFoundException $e) { > /* > * YamatoPayment など kernel.request event で FRONT_SHOPPING_CONFIRM_INITIALIZE > * が dispatch された場合は, TokenStorage が有効になっていないため, セッションから復元する > */ > if ($this->app['session']->has('_security_customer')) { > $CouponOrder->setUserId($Customer->getId()); > } else { > $CouponOrder->setEmail($Customer->getEmail()); > } 380,383c393,408 < if ($this->app->isGranted('ROLE_USER')) { < $result = $repository->findUseCoupon($couponCd, $Customer->getId()); < } else { < $result = $repository->findUseCoupon($couponCd, $Customer->getEmail()); --- > try { > if ($this->app->isGranted('ROLE_USER')) { > $result = $repository->findUseCoupon($couponCd, $Customer->getId()); > } else { > $result = $repository->findUseCoupon($couponCd, $Customer->getEmail()); > } > } catch (AuthenticationCredentialsNotFoundException $e) { > /* > * YamatoPayment など kernel.request event で FRONT_SHOPPING_CONFIRM_INITIALIZE > * が dispatch された場合は, TokenStorage が有効になっていないため, セッションから復元する > */ > if ($this->app['session']->has('_security_customer')) { > $result = $repository->findUseCoupon($couponCd, $Customer->getId()); > } else { > $result = $repository->findUseCoupon($couponCd, $Customer->getEmail()); > } |
EC-CUBEのバージョンなど
EC-CUBE:3.0.18
クーポンプラグイン:2.0.1
クロネコヤマト カード・後払い一体型決済モジュール:1.1.4
最後に
上記のコード修正後、非会員の状態でも会員の状態でもカード決済で購入までできました。
カード以外の代引き、銀行振込でも問題なく購入できました。
コード的にはあまりイケてない気がしますが、まあ良しとします。
今のところ紹介したコードによる不具合は出ていないですが、致命的なバグをはらんでいる可能性もありますので、修正は自己責任でお願いいたします。
不具合が出たら追記します。