EC-CUBE ルミーズ決済モジュールでポイント使用時に決済できない

EC-CUBEのルミーズ決済モジュールで、ポイント利用時に決済を行うと、合計金額からはポイント利用分の金額が引かれるのですが、金額(小計)からはポイント利用分の金額が引かれないで、ルミーズに情報が渡されてしまい合計金額が不正として必ずエラーになってしまいます。

その解消方法ですが
/data/download/module/mdl_remise/card.phpの127行目辺りの

'AMOUNT' => $arrData["subtotal"], // 金額

'AMOUNT' => $arrData["subtotal"] - $arrData["use_point"], // 金額 - ご使用ポイント

とする事で金額からポイント利用分が引かれて正常に決済が行えるようになります。

Filed under: EC-CUBE — jun 10:56:08

EC-CUBE ルミーズ決済モジュール

EC-CUBEのルミーズ決済モジュールで、ルミーズからの決済完了後にサイトにリダイレクトされる際に、実際には決済が成功していないのに成功している事になってしまう不具合がありました。
具体的には、決済完了後に「X-R_CODE」の値を判断して決済の成否を判断しているのですが、実際には「X-ERRLEVEL」の値を判断する必要があります。

その現象の対処方法ですが、
/data/download/module/mdl_remise/card.phpの72行目辺りの

    // 通信時エラー
     if ($_POST["X-R_CODE"] != $arrRemiseErrorWord["OK"]) {
        $err_detail = $_POST["X-R_CODE"];
        sfDispSiteError(FREE_ERROR_MSG, "", false, "購入処理中に以下のエラーが発生しました。 <br /><br /><br />・" . $err_detail);

の部分を

    // 通信時エラー
     if ($_POST["X-R_CODE"] != $arrRemiseErrorWord["OK"] || $_POST["X-ERRLEVEL"] != "0") {
        $err_detail = $_POST["X-R_CODE"];
        sfDispSiteError(FREE_ERROR_MSG, "", false, "購入処理中に以下のエラーが発生しました。 <br /><br /><br />・" . $err_detail."(".$_POST["X-ERRLEVEL"].")");

に変更する事で正確に決済の成否を判断する事が出来るようになります。

Filed under: EC-CUBE — jun 10:32:36

EC-CUBE 会員登録時付与ポイントが付与されない

EC-CUBEで、会員登録時付与ポイントを登録しているのに会員登録時に付与されない場合の対処方法です。
(EC-CUBEバージョン 1.3.1aと1.3.3で確認)

 /html/entry/index.phpの232行目辺りの

/*
secret_keyは、テーブルで重複許可されていない場合があるので、
本会員登録では利用されないがセットしておく。
*/
$arrRegist["secret_key"] = $uniqid; // 会員登録キー
$arrRegist["create_date"] = "now()"; // 作成日
$arrRegist["update_date"] = "now()"; // 更新日
$arrRegist["first_buy_date"] = ""; // 最初の購入日

の下に

// 会員登録時付与ポイント
$point = $objConn->getOne("SELECT welcome_point FROM dtb_baseinfo");
$arrRegist["point"] = $point;

を追加する事で付与されるようになります。

モバイル版も利用している場合には、 /html/mobile/entry/index.phpの354行目辺りの

$arrRegist["secret_key"] = $uniqid; // 仮登録ID発行
$arrRegist["create_date"] = "now()"; // 作成日
$arrRegist["update_date"] = "now()"; // 更新日
$arrRegist["first_buy_date"] = ""; // 最初の購入日

の下に同様に

// 会員登録時付与ポイント
$point = $objConn->getOne("SELECT welcome_point FROM dtb_baseinfo");
$arrRegist["point"] = $point;

を追加してください。

Filed under: EC-CUBE — jun 10:12:23

CentOSへのDovecotインストール

CentOSにDovecotをインストールした時の手順です。
Postfixのインストールは、CentOSへのPostfixインストールを参考にしてください。

  1. Dovecotをyumを利用してインストールします。
    yum install dovecot
  2. dovecot.confの設定vi /etc/dovecot.conf
    利用したいサービスのみ記述してください。

    #protocols = imap imaps
    ↓
    protocols = imap imaps pop3 pop3s
    
  3. 自動起動の設定
    /etc/init.d/dovecot start
    chkconfig dovecot on
    
  4. yumでダウンロードしたパッケージの削除
    yum clean packages
    
Filed under: CentOS — jun 1:45:07

CentOSへのPostfixインストール

CentOSにPostfixをインストールした時の手順です。
メールの不正リレー対策として、SMTP-AUTHを組み込みます。

  1. CentOSにPostfixをyumを利用してインストールします。
    yum install postfix
  2. MTAをSendmailからPostfixに変更します。
    /etc/init.d/sendmail stop
    chkconfig --del sendmail

    リストからPostfixを選択します。

    alternatives --config mta
  3. main.cfの設定vi /etc/postfix/main.cf
    # myhostname - ホスト名の定義
    myhostname = host.example.jp
    
    # mydomain - ドメイン名の定義
    mydomain = example.jp
    
    # myorigin - ローカルからメール配信するときの送信元アドレスの定義
    # user@example.jp 形式にするなら myorigin = $mydomain
    # user@host.example.jp 形式にするなら myorigin = $myhostname
    myorigin = $mydomain
    
    # inet_interfaces - メール受信するインタフェイスの設定
    # デフォルトではローカルからの配信しか受け付けない。
    # リモートからメールを受け取れるようにするなら以下の記述を入れる。
    inet_interfaces = all
    
    # mydestination - どのメールアドレスをローカル配信するかの定義。
    mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
    
    mynetworks_style = subnet
    
    # mynetworks - メールリレーを受け付けるクライアントアドレスの設定
    mynetworks = 127.0.0.0/8
    
    // メールサーバー名の隠蔽化
    smtpd_banner = $myhostname ESMTP unknown
    
    # メール格納場所の指定(Courier-IMAPの場合は必ずMaildir/を指定)
    home_mailbox = Maildir/
    
    # エリアス設定を行うファイルの指定
    alias_maps = hash:/etc/aliases
    
    // SMTP-Auth設定
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = $mydomain
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
    broken_sasl_auth_clients = yes
  4. SMTP-Auth設定(SMTP-Auth用ユーザ/パスワードにシステムのユーザ/パスワードを使用する場合)vi /usr/lib/sasl2/smtpd.conf
    pwcheck_method: saslauthd
    mech_list: plain login
  5. 自動起動の設定
    /etc/init.d/saslauthd start
    chkconfig saslauthd on
    
    /etc/init.d/postfix start
    chkconfig postfix on
  6. yumでダウンロードしたパッケージの削除
    yum clean packages
Filed under: CentOS — jun 1:40:02

WordPressの表示中のページの判断方法

WordPressのテンプレート内で、トップページにだけ表示したい内容やアーカイブページにだけ表示したい内容がある場合に、表示中のページを判断する方法です。

is_admin()
表示中のページがWordPressの管理画面の場合、trueを返します。
is_home()
表示中のページがトップページの場合、trueを返します。
is_single($post)
表示中のページがエントリーの場合、trueを返します。
引数にIDを渡せば、表示中のページがエントリーで、渡されたIDのエントリーの場合、trueを返します。
is_page($page)
表示中のページがページの場合、trueを返します。
引数にIDを渡せば、表示中のページがページで、渡されたIDのページの場合、trueを返します。
is_archive()
表示中のページがアーカイブ一覧ページの場合、trueを返します。
is_category($category)
表示中のページがカテゴリーアーカイブ一覧ページの場合、trueを返します。
引数にIDを渡せば、渡されたIDのカテゴリーアーカイブ一覧ページの場合、trueを返します。
is_author($author)
表示中のページが投稿者アーカイブ一覧ページの場合、trueを返します。
is_date()
表示中のページが年月日時間アーカイブ一覧ページの場合、trueを返します。
is_day()
表示中のページが日別アーカイブ一覧ページの場合、trueを返します。
is_month()
表示中のページが月別アーカイブ一覧ページの場合、trueを返します。
is_year()
表示中のページが年別アーカイブ一覧ページの場合、trueを返します。
is_time()
表示中のページが時間別アーカイブ一覧ページの場合、trueを返します。
is_search()
表示中のページが検索結果一覧ページの場合、trueを返します。
is_404()
表示中のページが404ページの場合、trueを返します。

Filed under: WordPress — jun 2:03:48

WordPressのサイトマップ出力プラグイン

Sitemap Generator Plugin for Wordpressから「dd-sitemap-gen.txt」をダウンロードして、「dd-sitemap-gen.php」にリネームして、wp-content/plugins内に保存する。
WordPress管理画面→プラグインに「Dagon Design Sitemap Generator」が追加されているので、有効化する。
その後、WordPress管理画面→投稿→ページ作成で、サイトマップ用ページを作成して、サイトマップを表示したい部分に

< -- ddsitemapgen -->

とタグを入れればサイトマップを出力してくれます。

WordPress管理画面→各種設定→DDSitemapGenで、各種設定を行なえます。

Filed under: WordPress — jun 2:33:29

cakePHPでPCと携帯で出力文字コードを変更する方法

携帯用のサイト用のビューをShin x blogさんのサイトを参考にして、設定しPC用と携帯用のサイトをビューだけを切り替える方法で運用しています。
そこで問題になるのが文字コードです。
私の場合、PC用のサイトはスクリプトの文字コードも出力文字コードもUTF-8で統一させる場合が多いのですが、携帯用のサイトの場合に出力文字コードをUTF-8にしてしまっては、最近の機種でしか見る事が出来ません。
そこでPC用と携帯用で文字コードを切り替えて利用しています。
PC用の場合には、上の通りUTF-8で統一して、携帯用の場合には、スクリプトの文字コードは全てUTF-8にして、出力時にShift_JISに変換しています。

詳しくは、/app/app_controller.phpのafterFilterで、文字コードをUTF-8からShift_JISに変換して出力して、beforeFilterで、入力文字の文字コードをShift_JISからUTF-8に変換しています。

class AppController extends Controller {

function beforeFilter() {
// 入力データの文字コード変換
if ((isset($this->params["webservices"])
&& $this->params["webservices"] == "Mobile") {
mb_convert_variables("UTF-8", "SJIS-win", $this->data);
}

// 出力データの文字コード変換
// afterFilter で文字コード変換するためにob_startで
// 出力のバッファを行なう
ob_start();

parent::beforeFilter();
}

function afterFilter() {
parent::afterFilter();

// バッファを取得して、出力バッファをクリア
$out = ob_get_clean();

if ((isset($this->params["webservices"])
&& $this->params["webservices"] == "Mobile") {
// 出力文字コードの変換
$out = mb_convert_encoding($out, "SJIS-win", "UTF-8");
}

echo $out;
}
}

これで、携帯用のビューの場合には、出力時にShift_JISに変換して出力し、入力文字はUTF-8に変換されます。
また/app/views/pages以下のページも同様に変換したい場合には、以下の様にする事で変換する事が出来ます。

class AppController extends Controller {

function afterFilter() {
parent::afterFilter();

// バッファを取得して、出力バッファをクリア
$out = ob_get_clean();

if ((isset($this->params["webservices"])
&& $this->params["webservices"] == "Mobile")
|| ($this->params["controller"] == "pages"
&& $this->params["action"] == "display"
&& isset($this->params["url"]["url"])
&& substr($this->params["url"]["url"], 0, 8 ) == "pages/m/")) {
// 出力文字コードの変換
$out = mb_convert_encoding($out, "SJIS-win", "UTF-8");
}

echo $out;
}
}
Filed under: CakePHP — jun 1:31:31

cakePHPのControllerのaddへの引数

通常、bake.phpでControllerを作成した場合には、addメソッドに引数はないので特に問題はないですが、

http://www……./posts/add

function add() {
:
}

独自にaddメソッドに引数を追加した場合、

http://www……./posts/add/1

function add($parentid = null) {
:
}

この様にaddメソッドに引数「1」を渡すとsave時に、idが「1」のデータを更新してしまうようです。
これを回避するには、saveの前に

$this->data[”Post”][”id”] = 0;

と、通常idに存在しない「0」を渡してあげてください。

Filed under: CakePHP — jun 2:16:59

CakePHPでSmartyを利用する方法

Smartyのダウンロード(2.6.12 で動作確認)

こちらよりSmarty-2.*.**.tar.gzをダウンロード。
CakePHPの/vendorsに、smartyディレクトリを作成。
Smarty-2.*.**.tar.gzを解凍して、libs内のファイルを上で作成したsmartyディレクトリにコピー。
(/vendors/smarty/Smarty.classの様な構成になる。)

/app/tmp/smarty/にSmartyの利用するcache、compileディレクトリを作成。
/app/tmp/smarty/cache/
/app/tmp/smarty/compile/

Smarty View class (Version 1.1で動作確認)

こちらよりファイルをダウンロードしてsmarty.php にリネームして/app/views/ ディレクトリにコピー。

__constructの

$this->subDir = 'smarty'.DS;

をコメントアウト

_renderの

$this->Smarty->assign_by_ref('view', $this);



$this->Smarty->assign_by_ref('this', $this);

に変更

AppControllerへの設定

/cake/app_controller.phpを/app/app_controller.phpにコピーして

class AppController extends Controller {

var $view = 'Smarty';




これでviewに「.tpl」があればSmartyのテンプレートとして処理を行い、なければ通常通り「.thtml」を表示します。

変数のassignなどは、Smarty View classが行なってくれるので、this、html、form、sessionや利用しているモデルなどはそのまま利用する事が出来ますので、元のビューの

「< ?php echo」を「{」

「;?>」を「}」
にするだけで、ほぼ利用する事が出来ます。

{$html->input(’Member/email’, array(’size’ => ‘60′))}
の「array(’size’ => ‘60′)」の部分がエラーになる問題は、ここからファイルをダウンロードして、function.assign_assoc.phpにリネームして/vendors/smarty/libs/plugins/にコピー。

テンプレートの先頭で
{assign_assoc var=’ArrayName’ value=’size=>60′}

{assign_assoc var=’ArrayName’ glue=’::’ value=’size=>60::value=>commas, no prob’}
などとして
{$html->input(’Member/email’, $ArrayName)}
とすれば面倒ですがこの問題も解決します。

Filed under: CakePHP — jun 11:30:43