カテゴリー: ECサイト向け

OpenCartのカスタマイズ HTMLメールの文字化けを治す

OPENCARTで時々お客様から、メールが文字化けしてて見れない!と言われます。

サンダーバードやiPHONEなどで見ると確かにひどい文字化け・・・修正します。

/system/library/mail.php

65行目あたりのpublic function setHtml($html)に1行追加します。

public function setHtml($html) {
$html = mb_convert_encoding($html, 'ISO-2022-JP', 'auto');
$this->html = $html;
}

おわり。

これで、HTMLメールの文字化けがなくなります。

OpenCartのカスタマイズ 支払い方法を追加する

オープンカートで標準で使用できる銀行振込モジュールは1つ。

テキスト形式で、支払先とか説明を入力して、ユーザーが買い物した際には、その内容が表示&メール送信sれるわけだけど、日本の場合、銀行振込ってメインの支払い方法なことも多く、郵貯と三井とか複数用意していることも多い。

1つに纏めて、ここかここかここって入金するときに勝手に選んでもらうのなら、良いのだけれど、入金確認の問題とか、注文数も多くなってくると、口座分だけ手間がかかるので、注文時に、郵貯なのか、三井なのか、ジャパンネットなのか、選んでおいて欲しいもの。

そこで、標準のBANK TRANSFER(銀行決済)モジュールを複製編集して、注文時にユーザーに予め選んでもらうことにします。

そうしますとですね、買い物画面では、支払い選択の時に、こんな感じで、 振込先銀行ごとに選択してもらえるようになるわけです。↓↓↓

 

1つの支払い方法モジュールを追加するごとに、コピー編集して追加するPHPファイルは、 9つです。

オープンカートは、MVCLフレームワークを使用しているので、

  • Model – Database layer
  • View – Template display
  • Controller – Main controlling code base
  • Language – Localization

という4つのファイルが1セットとなって動作する仕組みです。その組が、カタログとアドミンの双方に構成されます。ただし、上位のコントローラーのコードを引き継ぐ場合など、このうちの複数ファイルが上位ファイルで代替される場合があります。

参考:http://www.opencart.com/index.php?route=documentation/documentation&path=77_6

今回の銀行モジュールの場合は、アドミン4,カタログ5の計9ファイルが追加編集される1セットのPHPファイルとなります。

もともと存在するモジュールをコピー編集するだけですので、そう難しくはありません。

じゃあ、やっていきましょう!

下記のファイルをそれぞれ同ディレクトリにコピー&リネームしていきます。リネームする名前は揃っていれば問題ないので、任意で。

  • /admin/controller/payment/bank_transfer.php  →コピーして、bank_transfer02.php を作成
  • /admin/view/template/payment/bank_transfer.tpl  →bank_transfer02.tpl
  • /catalog/controller/payment/bank_transfer.php  →bank_transfer02.php
  • /catalog/model/payment/bank_transfer.php  →bank_transfer02.php
  • /catalog/view/theme/default/template/payment/bank_transfer.tpl  →bank_transfer02.tpl
  • /admin/language/english/payment/bank_transfer.php  →bank_transfer02.php
  • /admin/language/japanese/payment/bank_transfer.php  →bank_transfer02.php
  • /catalog/language/english/payment/bank_transfer.php  →bank_transfer02.php
  • /catalog/language/english/payment/bank_transfer.php  →bank_transfer02.php

3つめ、4つ目の支払いを作成する場合も同様の手順で、5ファイル1セットで追加を行います。

/admin/controller/payment/bank_transfer02.php

2行目のControllerPaymentBankTransfer を ControllerPaymentBankTransfer02 に。

class ControllerPaymentBankTransfer02 extends Controller {

ファイル内の、payment/bank_transfer をすべて payment/bank_transfer02 へ置き換え。

/admin/view/template/payment/bank_transfer02.tpl

ファイル内の、bank_transfer をすべて、 bank_transfer02 へ置き換え。

/catalog/controller/payment/bank_transfer02.php

2行目のControllerPaymentBankTransfer を ControllerPaymentBankTransfer02 に。

class ControllerPaymentBankTransfer02 extends Controller {

ファイル内の、payment/bank_transfer をすべて payment/bank_transfer02 へ置き換え。

/catalog/model/payment/bank_transfer02.php

2行目のModelPaymentBankTransfer を ModelPaymentBankTransfer02 に。

class ModelPaymentBankTransfer02 extends Model {

ファイル内の、payment/bank_transfer をすべて payment/bank_transfer02 へ置き換え。

/catalog/view/theme/default/template/payment/bank_transfer02.tpl

ファイル内の、bank_transfer をすべて、 bank_transfer02 へ置き換え。

4つの言語ファイルは、それぞれ文言を変更します。

例えば、

$_[‘heading_title’] = ‘銀行振込み(三井住友銀行)’;

というような感じで。

これだけです。

FTPアップロードして、管理画面で、モジュールをインストールし、支払先情報などを設定していきましょう。 登録したら、買い物画面で選択できるようになっているはず。

OPENCARTのカスタマイズ 受注メールの送信内容を追加する

OPENCARTでECの実運用をしようとしたら、ちまちまとカスタマイズしないといけないことが出てきてしまった。
EC-CUBEでも有ることなので、まあ、ECって結構システムの要件幅が広いというか宿命なのかも。

今回は、受注メール関連で色々気に入らないところが出てきてそれを簡単にカスタマイズした。

OPENCARTでは、受注の自動返信メールだけ何故かHTMLメールが送られる。その後のステータス変更は全部、はぁ?これでいいの?業務連絡???みたいなテイストメールなのになぜだ?

それで、変更点だけども、細かく言っていくと、キリがないので、自分にとって後から備忘録として応用できそうなところと、同じようなことをしたい誰かのお役に立ちそうなところの折り合いをつけて、やり方とか方向性とかポイントとか、うむ、なんだな、そういうちょっと手抜きなところを書いとく。

やること。↓

1)受注確認メールで、HTML/TEXTメール双方の表示文言を編集して変える
2)受注確認メールで、HTML/TEXTメール双方の文章の頭の方に、お客様名を入れる
3)受注確認メールのTEXTの方で、もう少し体裁を整えて、配送先とか請求先とか、ご挨拶文とかも入れる

テスト太郎 様 この度はご注文ありがとうございます。」「みたいな感じで。

もうちょっとスマートな方法もあるかも知れないけど、一応多言語化してもいいように、そこら辺は考えてやっとく。

 

出来上がりの受注メールはそれぞれこんな感じ。↓

文言とか順番とかは、アレンジで。

受注確認メールで、HTML/TEXTメール双方の表示文言を編集して変える

/catalog/language/japanese/mail/order_confirm.php の編集

(※英語とか中国語とか対応する多言語も同じ要領で変えておく)
以下は例ですので、適宜好きなように変えてください。
変更のポイントは、テキストメールの時は、挨拶文を複数行にするときは、1行ごとに改行コードを繋ぎます。
HTMLのところは、普通に
タグで改行できます。

4行目の $_[‘text_greeting’]  がHTMLメールの挨拶文に当たります。
ここを下記のように変更。
%s 様」、これが、後からPHPコードで読み出し追加するお客様名の表示部分になります。
1つ目の%s記号がお客様名で、2つ目の%s記号が店舗名を表示させるコードになります。
お客様名の表示が要らない人は、%sは店舗名のところだけです。

$_['text_greeting'] =
'このメールは当店でお買い上げいただいたお客様に送信しています。

%s 様

この度は、 %s でお買い上げ頂き誠にありがとうございます。

--------------------------------------------------------------------

このメールはご注文内容確認のための自動配信メールです。

当店で担当者がお客様からのご注文を確認し、商品の確保ができましたら、

改めてご確認のメールをお送りさせていただきます。

--------------------------------------------------------------------

以下のご注文を承りましたのでご確認ください。';

5行目にテキストメール用の挨拶文を追加。こっちは最初に定義されていないので、定義自体を新たに作成します。

$_['text_greeting_text'] =
'このメールは当店でお買い上げいただいたお客様に送信しています。'."\n\n".
'%s 様'."\n".
'この度は、 %s でお買い上げ頂き誠にありがとうございます。'."\n\n".
'--------------------------------------------------------------------'."\n".
'本メールはご注文内容確認のための自動配信メールです。'."\n".
'当店で担当者がお客様からのご注文を確認し、商品の確保ができましたら、'."\n".
'改めてご確認のメールをお送りさせていただきます。'."\n".
'--------------------------------------------------------------------'."\n\n".
'以下のご注文を承りましたのでご確認ください。';

後は、日本語で編集したい箇所があれば適宜更新して保存。
ちなみに、私は、名称は全て[ ]で括るようにしました。先の出来上がりイメージを見てもらうとわかると思うのですが、HTMLメールの時は表組みになるからそのままでも良くても、テキストメールにも項目表示させたいと思うと、タイトル名称と内容との区切りが欲しかったので。
例えば、

$_['text_order_detail'] = '[注文詳細]';

こういう感じですね。

受注確認メールで、HTML/TEXTメール双方の文章の頭の方に、お客様名を入れる~体裁を整える

まず、お客様名を表示させるための準備。

/catalog/language/japanese/mail/order_confirm.php の編集

これは今さっき上で一緒に済ませてしまいました。
$_[‘text_greeting’] の中身に%sを1つ先に足してやります。

/catalog/model/checkout/order.php の編集

●L136(HTMLメール用の挨拶文の定義箇所にお客様名の呼び出しコードを追加)

$template->data['text_greeting'] = sprintf($language->get('text_greeting'), html_entity_decode($order_query->row['store_name'], ENT_QUOTES, 'UTF-8'));

↓↓↓
$template->data['text_greeting'] = sprintf($language->get('text_greeting'), $order_query->row['firstname'].$order_query->row['lastname'], html_entity_decode($order_query->row['store_name'], ENT_QUOTES, 'UTF-8'));

●L299~L344 (テキストメール用の挨拶文の定義を変更)


//ここで挨拶文定義している。さっき日本語ファイルで追加したtext_greeting_textの定義箇所。↓
$text = sprintf($language->get('text_greeting_text'), $order_query->row['firstname'] .' '. $order_query->row['lastname'], $order_query->row['store_name'], $order_id) . "\n\n";
//見やすいように区切り線追加。↓
$text .= '--------------------------------------------------------------------' . "\n";
$text .= $language->get('text_order_id') . ' ' . $order_id . "\n";
$text .= $language->get('text_date_added') . ' ' . date($language->get('date_format_short'), strtotime($order_query->row['date_added'])) . "\n";
$text .= $language->get('text_order_status') . ' ' . $order_status_query->row['name'] . "\n";
$text .= '--------------------------------------------------------------------' . "\n";
//構成箇所を変えて先にお客様からのコメントと支払情報を表示させる。↓
if ($order_query->row['comment'] != '') {
$comment = ($order_query->row['comment'] . "\n\n" . $comment);
}
if ($comment) {
$text .= $language->get('text_comment') . "\n";
$text .= $comment . "\n";
}
$text .= '--------------------------------------------------------------------' . "\n";
//お客様名、E-MAIL、電話番号の表示↓
$text .= $language->get('text_customer_name') . ' ' . $order_query->row['firstname'] .' '. $order_query->row['lastname'] . "\n";
$text .= $language->get('text_email') . ' ' . $order_query->row['email'] . "\n";
$text .= $language->get('text_telephone') . ' ' .$order_query->row['telephone'] . "\n";

//お届け先の情報を表示↓
$text .= $language->get('text_shipping_address') . "\n"
.$textmail->data['shipping_address']. "\n";

//請求先の情報を表示↓
$text .= $language->get('text_payment_address') . "\n"
.$textmail->data['payment_address']. "\n";
$text .= '--------------------------------------------------------------------' . "\n";
$text .= $language->get('text_product') . "\n";

foreach ($order_product_query->rows as $result) {
$text .= $result['quantity'] . 'x ' . $result['name'] . ' (' . $result['model'] . ') ' . html_entity_decode($this->currency->format($result['total'], $order_query->row['currency'], $order_query->row['value']), ENT_NOQUOTES, 'UTF-8') . "\n";
$order_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_option WHERE order_id = '" . (int)$order_id . "' AND order_product_id = '" . $result['order_product_id'] . "'");
foreach ($order_option_query->rows as $option) {
$text .= chr(9) . '-' . $option['name'] . ' ' . $option['value'] . "\n";
}
}

$text .= "\n";

$text .= $language->get('text_total') . "\n";

foreach ($order_total_query->rows as $result) {
$text .= $result['title'] . ' ' . html_entity_decode($result['text'], ENT_NOQUOTES, 'UTF-8') . "\n";
}

$order_total = $result['text'];

$text .= "\n";

$text .= '--------------------------------------------------------------------' . "\n";

if ($order_query->row['customer_id']) {
$text .= $language->get('text_invoice') . "\n";
$text .= $order_query->row['store_url'] . 'index.php?route=account/invoice&order_id=' . $order_id . "\n\n";
}

if ($order_download_query->num_rows) {
$text .= $language->get('text_download') . "\n";
$text .= $order_query->row['store_url'] . 'index.php?route=account/download' . "\n\n";
}
$text .= $language->get('text_footer');

これで、ある程度体裁の整ったテキストメールになった。
メールのフッター部分に店舗のURLとかメールとか担当者とか共通して入れたい場合は、
/catalog/language/japanese/mail/order_confirm.php の

$_['text_footer'] = 'ご質問等がございます場合は、このメールアドレスに返信してください';

この部分に、同じ要領で追記していけばいいかと思います。
注文ステータスを変更したときに送るアップデートメールのテキスト内容もこういう要領で直していきます。
なぜかアップデートのときはテキストメールだけ送られるんですね;
/catalog/language/japanese/mail/order_update.php を編集しましょう。
こっちでも注文情報とか出したいですね。。。日本語ファイルだけじゃなくて、この追加もしたほうがいいですね。
う~む。じゃあ、それは後日。やってみてから。

『OpenCart』でお問合せ確認メールの送信先にショップを追加・・・そして。

カスタマイズの内容

OpenCartのお問い合わせフォームから問い合わせが送信されると、デフォルトでは、

1)送信者名はお客様。そして送信者には敬称なしのお客様名が入る
2)送信先は店舗。そして内容の確認メールはお客様には送信されない
3)お問い合わせ内容確認メールのタイトルが変。(「問合せ お客様名<しかも呼び捨て>」ってどうなのよ。。。

ということで、これを下記のようにカスマイズします。

1)送信者名は店舗名。そして送信者にも店舗名が入る
2)送信先は、お客様と店舗の両方宛に内容の同じ確認メールが送信される
3)お問い合わせ内容確認メールのタイトルは、「[店舗名]お問い合わせを受け付けました。」と変更

編集するファイルは2つです。

・/catalog/controller/information/contact.php
・/catalog/language/japanese/information/contact.php

それでは始めます。こっちから。

/catalog/controller/information/contact.php の編集

L19)確認メールの送信先にお問い合わせしたお客様の入力したEメールアドレスも追加。

$mail->setTo($this->config->get('config_email'));

$mail->setTo($this->config->get('config_email').','.$this->request->post['email']);

L20)確認メールの送信元アドレスを店舗のアドレスに変更。

$mail->setFrom($this->request->post['email']);

$mail->setFrom($this->config->get('config_name'));

L21)上記に合わせて送信者を店舗名に変更。

$mail->setSender($this->request->post['name']);

$mail->setSender($this->config->get('config_name'));

L22)確認メールのタイトルを変更。

$mail->setSubject(sprintf($this->language->get('email_subject'), $this->request->post['name']));

$mail->setSubject(sprintf($this->language->get('email_subject'), $this->config->get('config_name')));

/catalog/language/japanese/information/contact.php の編集

L19) 「お問合せ 山田花子」みたいなのから「[店舗名]お問合せを受け付けました」とお客様宛ての体裁になるように変更。

$_['email_subject'] = 'お問合せ %s';

$_['email_subject'] = '[%s] お問合せを受け付けました ';

ついでに、おかしなところも直しておく。(変更後のコードだけ書きます。)
システムコードに設定されている文字数とこの日本語ファイルで記載されている文字数が違いますので、その辺モゴモゴとか。。。
L10)

$_['text_message'] = '

お客さまのメールは店舗に送信されました!

';

L22)

$_['error_name'] = 'お名前は3文字以上32文字以下でお願いします!';

L24)

$_['error_enquiry'] = 'お問合せ内容は10文字以上3000文字以内でお願いします!';

以上です。日本語の編集や確認メールの送信仕様には好みもあるかと思いますが、私は、確認メールは、お客様と店舗の両方に来て欲しかったし、店舗からお客様に向けた受付の確認メール、という体裁にしたかったので、上記のプチカスタムを行いました。

『OpenCart』にSSLを導入する

それで、っと。(何が?とかキビシク突っ込んであげてください;)

SSL入れていきます。

自分で書いてたルート証明とかの情報がちょっと古くなっているので、再検索。
携帯対応ということも考慮にいれて、変わらず、
「Equifax Secure Certificate Authority」ルートの入っているSSL証明を探す。

で上がった候補が、
・QUICKSSLpremium
・rapidSSL
・alphaSSL
この3つのどれか。

どれもリーズナブルだけど、欲しいスペックに不満なし。
でも、できるだけ安いほうがいいから、やっぱり海外で再販業者を探す。
(日本のサイトで申しこめば、タブン結構丁寧な導入解説とかあるはずなので、参照してください。)

http://www.namecheap.com/ssl-certificates/geotrust-ssl-certificates.aspx
↑ここから、rapidSSLを購入することにします。
rapidSSLは、最近ルート証明が「Equifax Secure Certificate Authority」に変わったので、携帯の対応範囲が格段に広がったので、いいんじゃないかなと思う。
私は先にドメインを取ってしまったんだけど、このサイトから、ドメインを取ると1年のSSL証明が2ドルとか3ドルみたいな激安でオプション追加できたりする。バリュー。。。

全体的な流れ

<SSL証明書を買って支払う> → <CSRキーを生成してSSL証明機関へ送る> → <SSL証明機関から発行された証明書とサーバのプライベートキーなど合計4つのキーファイルをサーバにインストールする>

レンタルサーバサービス側でCSRキーを発行する

レンタルサーバの管理画面から、SSLのメニューを探し、CSRキーとプライベートキーを発行する。
画面内からコピーペーストできる場合もあるし、メールで送られてくる場合もある・
この手順は、手順自体が、レンタルサーバのサービス業者によって色々。メールで先方に依頼する場合もある。
※取得するSSLのドメインは、サブドメインまで含めて。www.○○○.comという形で。

SSL証明買って、、、CSRの送信

1)SSL証明書買います。

上記、私の購入した先は、英語ですけど難しくはないので、ユーザー登録、注文して決済してください。ユーザ登録したメアドに、確認メールが届く。

SSL証明会社へCSRを送信する

届いたメールの中のSSL Certificates: というタイトルの文を参照しながら、「SSL listing page」というリンクをクリック。
サービスの管理画面に入る。
購入したSSL証明が一覧になっているので、その中から使用するSSLの「Activate Now」リンクをクリック。今回は1つ購入しただけなので迷うことはない;
(※アクティベートして利用を開始した日から1年有効となる)
必要な内容を入力していく。
※webmaster@ドメイン、root@ドメイン、admin@ドメイン、postmaster@ドメインなど管理者用の特定のメールアドレスが必要になるので、先にレンタルサーバの管理画面の方で、メアドを作成しておいて下さい。この場で画面を見て作成しても構いません。

先ほどレンタルサーバ会社で発行したCSR(証明書のリクエストキー)を
「—–BEGIN CERTIFICATE REQUEST—–」から
「—–END CERTIFICATE REQUEST—–」まで全て含めて送信する。

サイトの管理者によるリクエストの承認を行う

完了したら、ここで登録した、先程の、webmaster@ドメイン、root@ドメイン、admin@ドメイン、postmaster@ドメインなど管理者用のメールアドレス宛に、SSL証明書を発行してもよいか問い合わせる承認依頼メールが届く。

その確認メール内の、
(申込者の名前) requests that you come to the URL below to review and approve this certificate request:
***リンク***
このリンク部分をクリックして、確認画面へ行き、内容を確認して、SSL証明のリクエストを承認する。

今度は、申込者のメールアドレスの方に、承認が受け付けられた旨の連絡と、証明書のキー2種類が、CSRと同じテキストの形式で届く。
このSSL照明会社(ジオトラスト)のサービスの場合は、届いたメールの下の方にあるが、メールへのファイル添付で届く場合やSSL証明会社の管理画面からダウンロードしてくる場合もある。

レンタルサーバサービス側で全てのキーを登録する

これで、

レンタルサーバサービス(自サーバ)で発行された
・CSRキー
・プライベートキー

の2つと、

SSL証明会社で発行された
・WEBサーバ証明書
・CAキー

の2つ、合計で4つのキーファイルが揃った。

この4つのキー全てを、WEBサーバに送信すれば、SSLの証明書のインストールは完了。
私の利用しているサービスの場合は、レンタルサーバの管理画面で、4つのキーをそれぞれ登録するフォームがあり、そこへコピペすれば、SSLが使えるようになる。このステップも、4つをテキストファイルにして、レンタルサーバ会社へメールで送る場合やFTPなどで特定の場所へアップロードして、連絡する場合など、色々。

OPENCARTでSSL設定

OPENCARTの管理画面でSSLを有効にする

OPENCARTの管理画面へログイン。
「システム」タブ→「設定」をクリックして、設定メニュー内の、「サーバー」設定タブ内のメニューから、1つ目の、「SSLを使用する」を「はい」にして、保存。

/admin/config.phpを編集

FTPでアクセスし、
/admin/config.php ファイルをダウンロードしてきて編集する。
8行目、9行目の、

define('HTTPS_SERVER', 'http://○○○com/admin/');
define('HTTPS_IMAGE', 'http://○○○com/image/');

define(‘HTTPS_SERVER’, ‘https://○○○com/admin/’);
define(‘HTTPS_IMAGE’, ‘https://○○○com/image/’);

に変更して、アップロードしなおす。

OPENCARTの管理画面にHTTPS://でアクセス、ログインし直してみて、表示できているか確認。
フロント画面から、買い物してみて、カート画面に移った時に自動的に、HTTPS://のSSL接続になっているか確認。

この時に、SSL証明エラーが出ている場合は、正しく証明書がインストールされていません。
画面が接続エラーで表示できない場合は、サーバがSSL対応に変更されていないということです。

以上です。