【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