タグ: PHP

【EC-CUBE】PAYPAL支払いがちゃんとできるかテストする

とりあえず、このエントリーは、↓の続き。

https://bton.papalabs.net/?p=1135

PAYPAL決済を導入するに当たって、EC-CUBEからPAYPALのテストサイトへつないで決済テストを行うやり方。

テストなんだよね。テストなんだけど、いっぱい設定とか準備があって、面倒なんだよね。。。
ここからは、英語ばんばんの海外サイトなので、本当のところ気が狂いそう・・・

とか言ってられないので、がんばりましょう!

1)PAYPALの「Developer Central」内の下記URLへアクセスし、

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_testing_sandbox

Sign Upメニューから、テスト用の新規アカウントを作成しましょう。

画面は英語だけど、基本的には通常のアカウント登録と同じなので、わからなくなったら、日本語の通常PAYPALサイトを参考にするとイイデスヨ。

アカウントを作ったらサンドボックスにログイン。別に本番アカウントのコピーでもOK。

左メニューで、「Sandbox」-「Home」

ページの真ん中の、Test Accounts 「Create a preconfigured buyer or seller account.」リンクから「Create a Sandbox Test Account」ページへ進む。

  • country:United States
  • Account Type:BuyerとSellerを1つずつ(かそれ以上)作る
  • Login Email:サンドボックスでのテスト用にセラーとバイヤーそれぞれ1つずつ用意する。
  • Password:決める

バイヤーとセラー両方のテストアカウントが必要なので、それぞれを1つずつ、2回登録する。

作成後、左メニューで「Sandbox」-「Test Accounts」をクリックすると、テストアカウントの確認ができるはず。「View Details」でテスト作成されたアカウントの詳細が確認できる。
クレジットカードや銀行の情報も作成されている。

表の中の、「Payment Review」と「Test Mode」をいずれも「Enabled」に変更しておきましょう。

ここまでできたら、いよいよテスト。

ページ右下の「Enter Sandbox Test Site」ボタンをクリックする。

すると、通常のPAYPALのページみたいなテストサイトがあら現れる。この画面に、先ほど作成した、バイヤーアカウントでログインすれば、購入者の動作確認ができるし、セラーアカウントでログインすれば、販売者の動作確認ができる。それぞれ、買い物をしたあと、画面に代金がどのように計上されるのか(できるのかできないのか、)確認すればいい。

さて、ここで、1つ問題が(ということでもないけど;)

前のエントリーでEC-CUBEに設定したのは、本番の設定。

つまり、テストをするためには、一時的に、

/data/class/pages/shopping/LC_Page_Shopping_Confirm.php

で接続するサイトをPAYPALの本番サイトからテストサイトのURLへ変更して、テストアカウントで接続させないといけない。

なので、先に編集した、L148~L155、テスト用には下記のようになります。

// 決済方法により画面切替
if($payment_type != “”) {
$_SESSION[“payment_id”] = $arrData[‘payment_id’];
header(“Location: ” . URL_SHOP_MODULE);
}else{
if($arrData[‘payment_id’] == ※payment_id) {
// 設定変更行して下さい ↑ if($arrData[‘payment_id’] == payment_id) {
$paypalURL = “https://www.sandbox.paypal.com/j1/cgi-bin/webscr?cmd=_xclick&” ;
$paypalURL .= “business=” . “テストアカウントに登録したメールアドレス” . “&” ;
// 設定変更行して下さい ↑$paypalURL .= “business=” . “paypalアカウントのメールアドレス” . “&” ;
$paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
// 設定変更行して下さい ↑ $paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
$paypalURL .= “invoice=” . $order_id . “&” ;
$paypalURL .= “currency_code=JPY&no_shipping=1&no_note=1&” ;
$paypalURL .= “shipping=” . $arrData[‘deliv_fee’] . “&” ;
$paypalURL .= “amount=” . ($arrData[‘payment_total’]-$arrData[‘deliv_fee’]) . “&” ;
$paypalURL .= “email=” . $arrData[“order_email”] . “&” ;
$paypalURL .= “first_name=” . urlencode(mb_convert_encoding($arrData[“deliv_name02”], “UTF-8”,CHAR_CODE)) . “&” ;
$paypalURL .= “last_name=” . urlencode(mb_convert_encoding($arrData[“deliv_name01”], “UTF-8”, CHAR_CODE)) . “&” ;

// 郵便番号から市町村を得る

$city = $objQuery->get(‘mtb_zip’, ‘city’, ‘zipcode = ?’, $arrData[‘deliv_zip01’] . $arrData[‘deliv_zip02’]);

$paypalURL .= “address1=” . urlencode(mb_convert_encoding(str_replace($city, “”, $arrData[“deliv_addr01”]), “UTF-8”, CHAR_CODE)) . “&” ;
$paypalURL .= “address2=” . urlencode(mb_convert_encoding($arrData[“deliv_addr02”], “UTF-8”, CHAR_CODE)) . “&” ;
$paypalURL .= “city=” . urlencode(mb_convert_encoding($city, “UTF-8”, CHAR_CODE)) . “&” ;
$paypalURL .= “zip=” . $arrData[“deliv_zip01”] . “-” . $arrData[“deliv_zip02”] . “&” ;
$paypalURL .= “night_phone_b=(” . $arrData[“order_tel01”] . “)” . $arrData[“order_tel02”] . “-” . $arrData[“order_tel03”] ;

header(“Location: ” . $paypalURL);
} else {
header(“Location: ” . URL_SHOP_COMPLETE);
}
}

PAYPALのURLをPAYPALのサンドボックスのURLに、PAYPALのアカウントをPAYPALのサンドボックスのアカウントに、それぞれ、一時的に変更しましょう~。

これで、LC_Page_Shopping_Confirm.phpをアップロードしたら、EC-CUBEで、決済方法にPAYPALを選んで、テスト決済してみる。
PAYPAL(サンドボックス)サイトで決済して、その後、自サイトへリダイレクトされて戻ってくる、という一連の動作ができれば、OK。何度か動作確認して問題なければ、本番に切り替える。
以上どす。

【EC-CUBE】PAYPAL支払いAPIを利用する

EC-CUBEにPAYPAL支払いを導入する。

まずは、PAYPALのWEBサイトで、ビジネスアカウント(代金の受取ができるアカウント)を取得する。ビジネスとプレミアアカウントの違いは、機能的にはあまりないが、ビジネスアカウントの場合、クレジットカードなどの決済名に社名(または店舗、団体名など)が使用できるので、ビジネスで決済したいのであれば、ビジネスアカウントを利用するほうが便利。

上級なテクだが、PAYPAL決済では、定期購読やギフト券の発行などにも対応することもできる。とりあえず、まずは、ベーシックにいくけども。。。

アカウントを作成&メール認証したら、「マイアカウント」→「個人設定」→「ウェブ ペイメントの設定」を表示し、

  1. ウェブサイト決済の自動復帰
    自動復帰:オン
    ウェブサイト決済の自動復帰
    復帰URL:
    http://ショップURL/html/shopping/complete.php
  2. 支払いデータ転送:オン
  3. 暗号化ウェブサイト決済
    暗号化されていないウェブサイト決済の受領拒否:オフ
  4. PayPalアカウントオプションサービス:オフ
  5. 連絡先電話番号:オフ
  6. 高速チェックアウトの設定
    giropayおよび銀行振替による支払いのサポート:オフ

と設定する。
次に、
「マイアカウント」→「個人設定」→「言語のエンコード」で、

  1. 「ウェブサイトの言語」   →「日本語」を選択して、下の「詳細オプション」ボタンもクリック。エンコード方式を「UTF-8」にする。
  2. その下の「PayPalから送信されたデータと同じエンコード方式を使用しますか(IPN、ダウンロード可能なログ、メールなど)?」は、「はい」でOK

最後に「マイアカウント」→「個人設定」→「支払い受領設定」でクレジットカード利用名最上の名前をショップまたは会社の名前に設定する。

PAYPAL側での設定は一旦以上。

PAYPALでは、そのほかに、個別にPAYPALで決済したいお客様向けの決済案内メールを、請求書として送付したり(テンプレート設定ができる)PAYPALの決済画面をショップオリジナルの体裁に変更したり、色々と便利な機能が使える。

必須ではないが、あったほうがお客様にとって便利なオプションもあるので、研究してみるのもいいと思う。

さて、肝心のEC-CUBEでの設定を追加していく。

/data/class/pages/shopping/LC_Page_Shopping_Confirm.php

L148~L155(VER.2.4の場合)

// 決済方法により画面切替
if($payment_type != “”) {
$_SESSION[“payment_id”] = $arrData[‘payment_id’];
header(“Location: ” . URL_SHOP_MODULE);
}else{
if($arrData[‘payment_id’] == ※payment_id) {
// 設定変更行して下さい ↑ if($arrData[‘payment_id’] == payment_id) {
$paypalURL = “https://www.paypal.com/j1/cgi-bin/webscr?cmd=_xclick&” ;
$paypalURL .= “business=” . “アカウントに登録したメールアドレス” . “&” ;
// 設定変更行して下さい ↑$paypalURL .= “business=” . “paypalアカウントのメールアドレス” . “&” ;
$paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
// 設定変更行して下さい ↑ $paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
$paypalURL .= “invoice=” . $order_id . “&” ;
$paypalURL .= “currency_code=JPY&no_shipping=1&no_note=1&” ;
$paypalURL .= “shipping=” . $arrData[‘deliv_fee’] . “&” ;
$paypalURL .= “amount=” . ($arrData[‘payment_total’]-$arrData[‘deliv_fee’]) . “&” ;
$paypalURL .= “email=” . $arrData[“order_email”] . “&” ;
$paypalURL .= “first_name=” . urlencode(mb_convert_encoding($arrData[“deliv_name02”], “UTF-8”,CHAR_CODE)) . “&” ;
$paypalURL .= “last_name=” . urlencode(mb_convert_encoding($arrData[“deliv_name01”], “UTF-8”, CHAR_CODE)) . “&” ;

// 郵便番号から市町村を得る

$city = $objQuery->get(‘mtb_zip’, ‘city’, ‘zipcode = ?’, $arrData[‘deliv_zip01’] . $arrData[‘deliv_zip02’]);

$paypalURL .= “address1=” . urlencode(mb_convert_encoding(str_replace($city, “”, $arrData[“deliv_addr01”]), “UTF-8”, CHAR_CODE)) . “&” ;
$paypalURL .= “address2=” . urlencode(mb_convert_encoding($arrData[“deliv_addr02”], “UTF-8”, CHAR_CODE)) . “&” ;
$paypalURL .= “city=” . urlencode(mb_convert_encoding($city, “UTF-8”, CHAR_CODE)) . “&” ;
$paypalURL .= “zip=” . $arrData[“deliv_zip01”] . “-” . $arrData[“deliv_zip02”] . “&” ;
$paypalURL .= “night_phone_b=(” . $arrData[“order_tel01”] . “)” . $arrData[“order_tel02”] . “-” . $arrData[“order_tel03”] ;

header(“Location: ” . $paypalURL);
} else {
header(“Location: ” . URL_SHOP_COMPLETE);
}
}

こんな感じで!とりあえず、アップロードして、PAYPALの決済サイトへつながればOK。

さて、PAYPALのサイトでユーザーが決済完了すると、数秒でこちらのサイトへリダイレクトされて画面が戻ってくるようになっている。ここで注意しないといけないことは、リダイレクトされてくるタイミングで、こちらのDBでは、買い物完了という情報がPAYPALから送られてくる、ということだ。もし、短気なユーザーが「お買い物できたわ~。」と思って、ウインドウを閉じてしまったら、こちらには、決済情報はフィードバックされない;

これを解決する方法もあるのだが、ちょっと更にややこしいので、とりあえずは、ウインドウは閉じないでね、お願いね、とでも書いて、ユーザーに注意を促そう。。。

それでは、最後の仕上げ。

ソースができたら、テストを行う。ただし、PAYPALのサイトで実際に決済してしまうと、請求が来てしまう(!あたりまえ;)ので、先にテストをしておきたい。。。

PAYPALには、サンドボックスという便利なテスト機能があるので、それを利用してテストすることにする。

ここからが、英語ベースで結構面倒なんである・・・が、やっぱりお客様のお金を扱うので、ここは慎重に;

でも、長くなるので、エントリーを分けることにしまっす!→ここを見るべし

参考サイト:

http://eccube.seesaa.net/article/87548448.html
http://www.wiz.gr.jp/wordpress/82

http://blog.katsuma.tv/develop/paypal/

https://www.paypalobjects.com/WEBSCR-580-20090611-1/ja_JP/JP/pdf/PP_WebsitePaymentsStandard_Datasheet.pdf

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_testing_sandbox

PHPで出力色々

  1. PHPでPhotoshopのPSDファイルを画像に変換してブラウザに出力。
    http://www.catswhocode.com/blog/php-display-adobe-psd-
    files-on-a-web-page

    php_-display-adobe-psd-files-on-a-web-page

  2. PHPからWord、Excel、PowerPointのドキュメントを生成するサンプル
    http://www.whenpenguinsattack.com/2007/07/02/how-to-create-microsoft-office-documents-with-php/

    how-to-create-an-open-book-with-illustratore28099s-3d-extrude-bevel-tool-vectortuts

  3. PHPでExcelファイルを生成できるライブラリPHPExcel
    http://www.codeplex.com/PHPExcel

    phpexcel-openxml-create-excel2007-documents-in-php-spreadsheet-engine-home
    http://journal.mycom.co.jp/articles/2009/03/06/phpexcel/index.html (参考:マイコミジャーナル)
    http://phpspot.org/blog/archives/2009/03/phpexcelphpexce.html (参考:PHP開発日記)

いろんなことができるんだねっ☆

PHPで実装するレコメンドエンジンについての覚書

「この商品を買った人は、こんな商品も買ってます」

アマゾンでお役立ちの、アレ。

レコメンドエンジン機能という。

これは、協調フィルタリングという手法で実現されているらしいです。

協調フィルタリング(Collaborative Filtering, CF)は、多くのユーザの嗜好情報を蓄積し、あるユーザと嗜好の類似した他のユーザの情報を用いて自動的に推論を行う方法論である。趣味の似た人からの意見を参考にするという口コミの原理に例えられることが多い。

なるほど。

で、実は、この機能を簡単に実装できるPHPのライブラリがありました。

VOGOO: http://www.vogoo-api.com/

フリーとプロ版があり、ふりーは、mySQLとポスグレの2つのDBに対応しているので、EC-CUBEにくっつけて使えそう。

サイトは、英語だけど、サイト内には、チュートリアルもあって、使い方なんかも詳しくかかれているっぽいので、時間が取れたら、ちょっと調べてみることにするワ。

とりあえず、覚書として残す。

参考:http://www.richcontext.jp/rss/richcontext.jsp (こんなのもある)

【EC-CUBE】初回の買い物は、ポイント●倍にする

EC-CUBEを再びカスタマイズ。
初回の買い物は、ポイント●倍にして、その倍率は、管理画面のパラメータ設定で変えられるようにする。

その1)初回の買い物かどうか、判定してポイントを●倍にするロジックを追加。

/data/class/SC_CartSession.phpの function getAllProductsPoint() に下記コードを追加。
L206あたり。

$id = $_SESSION[$this->key][$i][‘id’][0];
$point = SC_Utils_Ex::sfPrePoint($price, $point_rate, POINT_RULE, $id);
$total+= ($point * $quantity);
}
$objQuery = new SC_Query();
$objCustomer = new SC_Customer();
//customer_idを検証
$customer_id = $objCustomer->getValue(“customer_id”);
$order_count = $objQuery->count(“dtb_order”, “customer_id= ? and del_flg = 0”, array($customer_id));
if ($order_count == 0) {
$total = $total*FIRST_POINT;
}
return $total;
}

// カートへの商品追加

その2)管理画面のパラメータ設定にポイント倍率設定用の項目を増やす。

DBの、mtb_constantsを開いて、カラムを1行追加。

id FIRST_POINT
name 1
rank 523※一番最後に追加
remarks 初回購入ポイント倍率

nameの値が倍率になる。デフォルトは”1″(倍)。

倍率を変更するときは、管理画面のパラメータ設定で値を変えればOK。

その他の注意点としては、キャンセルがあったときなどにポイントの手動付け替えなど、色々懸念することが出てきてしまうので、

  • ポイント付与のタイミングを発送済みか支払い確認済みなどのステータスになったとき、などに変更しておいたほうがいい
  • 注文のキャンセルがあったときは、自動でポイントが付け替えられるほうがいい

こういうことも一緒にカスタマイズしておいたほうがいい。この辺は、次のバージョンあたりで解消されそうな気もするけども。