エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説

      2017/03/12

ECCUBEで購入履歴に表示される決済NGの受注情報の対処方法解説

 

ECCUBEのマイページで問題となる購入履歴一覧

 
ECCUBEのカード決済で NGになったレコードもマイページに表示されます。
その正常に注文が完了しなかった注文情報(購入情報)を表示させたくないときの対処方法について解説します。
 
20150706_web_01
 
上記の画像は ECCUBE 2.12.6です。
ECCUBE 2.12.6の場合は、決済処理が正しく処理されなかった注文情報(購入情報)は、上記のとおり「ご注文状況」という項目に「注文未完了」と表示されます。
 
ですが、確認したところ ECCUBE 2.11.5では、マイページの「購入履歴一覧」にこの「ご注文状況」という項目がそもそも存在しないため、決済処理が正しく行われていない「注文未完了」の状態の注文情報(購入情報)も正常に処理された注文情報と同じように表示されてしまいます。
 
そのため、この購入履歴一覧が原因でトラブルに発展することもあり、この「注文未完了」状態の注文情報を表示させない対応方法について解説します。
 
 
正常に決済処理が終了していない場合も正常に決済が終了した場合と同じように表示される、という仕様自体がどうかしているとしか言えませんが...
 
 

対応内容

 
修正を行う対象のファイルは、以下になります。
 /data/class/pages/mypage/lc_page_mypage.php
 
対応内容は、2.12.6では 129行目、2.13系では 124行目にある、SQLの where句の指定箇所を下記のように修正を行います。
 

 
「dtb_order」の「status = 7」が「注文未完了」の状態ですので、それを where句で排除する条件設定になります。
 
 
対応する箇所はこれだけのため、非常に簡単です。
 
 


 

ECCUBEのカード決済処理の解説

 

ECCUBEの受注情報の管理

 
ECCUBEの受注情報のメイン情報は、テーブル「dtb_order」に保存されます。
この「dtb_order」の中の「status」の値が受注のステイタスとなり、公開側は先ほどのマイページの「ご注文状況」として表示されます。
 
また、管理画面では下記のように受注管理の「対応状況」の項目として表示され、「注文未完了」は「決済処理中」として編集されます。
 
20150706_web_02
 
20150706_web_03
 
 
「dtb_order」の「status」に編集されるコードリストは、テーブル「mtb_order_status」に保存されており、コードの意味は下記のようになっています。
 
  1 : 新規受付
  2 : 入金待ち
  3 : キャンセル
  4 : 取り寄せ中
  5 : 発送済み
  6 : 入金済み
  7 : 決済処理中
 
 

ECCUBEの受注処理の流れ

 
普通に注文が完了した場合の「status」は「1:新規受付」として処理されます。
 
では、どういう時に「status」が「7:決済処理中(注文未完了)」となるのしょうか?
 
それは、ステイタスのテキストと同じく、「決済の処理中」「カード決済の処理を行っている途中」に発生します。
 
 
具体的には、購入手続きの際にカード決済を選択し、カード決済に進みます。
カード決済の処理が始まった時点で「status = 7」の受注情報が作成されます。
 
そして、カード決済が正常に終了すると「status = 7」は「status = 1」に更新され、正常に購入の手続きが終了する、という流れになります。
 
そのため、カード決済を開始して「status = 7」の受注情報が作成されたものの、カード決済処理でエラーになったり、決済手続きを途中で止めたりすると、「status = 1」に更新されないため、「status = 7」のままのレコードが残ることになります。
 
 
これが「status = 7」の受注情報のレコードなのです。
 
 
なので、ECCUBEでカード決済を利用している場合は「status = 7」の受注レコードはある一定の頻度で発生すると思われますが、そのレコードはユーザのマイページの購入履歴にも表示されます。
購入履歴の情報を巡ってユーザとのトラブルを未然に防ぐためにも、マイページには「status = 7」のレコードは表示させない処理を追加する方がいいんじゃないかと思います。
 
ユーザ側にとってみても、決済に失敗した購入履歴がいつまでも残り続けるよりも、表示されない方がいいんじゃないかと思いますね。
 
 
決済の失敗履歴が残っていた方がいいと思える理由としては、
  カード決済をしたけど、途中で失敗しちゃったなぁ。
  今の注文、どう処理されたんだろう?
  失敗した処理になってるのかな?
  それとも注文だけは通っちゃってるのかな?
  もう一度決済し直すと重複の注文になったりしないかな?
なんてことを思う方に対しては、購入履歴に「注文未完了」が表示されていた方が親切かもしれませんが。
 
 
※注意※
最初の購入履歴一覧の画像は、「支払い方法」が「現金書留」となっていますが、これはテスト環境のため、「現金書留」のレコードの「Status」の値だけを変更している実験用のレコードになります。
 
 

ECCUBEの受注情報の意味不明な設定

 
今回の処理のために、マイページの購入履歴のテンプレートを確認している際に気が付きましたが、ECCUBEの 2.12.6では「システム設定」-「パラメータ設定」の画面の設定項目に「MYPAGE_ORDER_STATUS_DISP_FLAG」という項目が一番下に追加されています。
 
これは、最初に説明した、マイページにある「ご注文状況」の項目を表示するか、否かの設定を行う項目です。
 
デフォルトは「true」で表示する設定になっていますが、「false」に変更すると「ご注文状況」を非表示にすることができます。
 
こんな項目を追加するくらいなら、「status」が「7:決済処理中(注文未完了)」のものを表示しないようにする、というフラグを実装する方がよっぽど利用価値があると思うのですが。
 
ちなみに、マイページのテンプレートファイルは下記になります。
 /data/smarty/templates/default/mypage/index.tpl
 
「MYPAGE_ORDER_STATUS_DISP_FLAG」で検索するとこの追加仕様が確認できます。

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

SEO対策用タイトル、ディスクリプションの文字数カウントツール

SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。

数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!

PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。

PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う

PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。

include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由

include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。

配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例
配列の値をテキスト表示する際に「、」でつなげるときの処理方法の一例

配列の値を「、」でつないで出力する際、単純にforeachで繰り返し処理をすると「イヌ、サル、キジ、」となるが文字列最後の「、」を出力しない方法を3つ解説している。

PHP画面が真っ白 header(“Location: $url”);

PHPの開発で header(“Location: $url”);を使うと画面が真っ白になる不具合が出る場合もあります。

sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる
sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる

PHPのプログラム処理を遅延させる「sleep()」は整数秒単位。「usleep()」は1秒未満のマイクロ秒単位。では「1.5」秒はどう表現するのか。「sleep()」「usleep()」を組み合わせる。その解説。

フォルダを指定してファイルのパーミッションを変更するプログラム

フォームからフォルダ、パーミッションを指定しパーミッションを変更するサンプルプログラムの解説です。

Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説

お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。

ECCUBEでアップロードできない。upload_max_filesizeを設定する場所

テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。