月: 2009年6月

【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