/** * @param string $api_key * @param string $currency */ public function __construct($api_key, $currency = 'jpy') { Payjp::setApiKey($api_key); $this->currency = $currency; }
function before_process() { global $messageStack, $order, $currencies; try { if (is_readable(DIR_WS_MODULES . 'payment/vendor/autoload.php')) { require_once DIR_WS_MODULES . 'payment/vendor/autoload.php'; } else { if (is_readable(DIR_WS_MODULES . 'payment/payjp-php/init.php')) { require_once DIR_WS_MODULES . 'payment/payjp-php/init.php'; } else { // PayJPのPHPライブラリがない $messageStack->add_session('checkout_payment', MODULE_PAYMENT_WEBPAYJP_ERROR_LIBRARY_NOT_FOUND, 'error'); zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false)); } } \Payjp\Payjp::setApiKey(MODULE_PAYMENT_PAYJP_API_SECRETKEY); // トークンを使って顧客オブジェクトを作っておく $customer = \Payjp\Customer::create(array('card' => $_SESSION['payjp_token'], "email" => $order->customer['email_address'])); // トークン決済 $charge_opt = array('amount' => $currencies->value($order->info['total']), 'currency' => 'jpy', 'customer' => $customer->id, "description" => $order->products[0]['model'] . (count($order->products) >= 2 ? MODULE_PAYMENT_PAYJP_TEXT_CHARGE_MULTI_PRODUCT_ETC : '')); if (defined('MODULE_PAYMENT_PAYJP_CAPTURE') and MODULE_PAYMENT_PAYJP_CAPTURE == 'False') { $charge_opt['capture'] = MODULE_PAYMENT_PAYJP_CAPTURE; } if (defined('MODULE_PAYMENT_PAYJP_CAPTURE') and MODULE_PAYMENT_PAYJP_CAPTURE == 'False' and defined('MODULE_PAYMENT_PAYJP_EXPIRY_DAYS') and MODULE_PAYMENT_PAYJP_EXPIRY_DAYS != '') { $charge_opt['expiry_days'] = MODULE_PAYMENT_PAYJP_EXPIRY_DAYS; } $charge = \Payjp\Charge::create($charge_opt); $_SESSION['payment_payjp'][] = array('type' => 'CHARGE', 'customer_id' => $customer->id, 'id' => $charge->id, 'fingerprint' => $charge->card->fingerprint); } catch (\Payjp\ErrorResponse\ErrorResponseException $e) { $error = $e->data->error; switch ($error->type) { case 'card_error': // カードに関するエラー $messageStack->add_session('checkout_payment', MODULE_PAYMENT_PAYJP_API_ERROR_CARD, 'error'); break; case 'client_error': // リクエストエラー $messageStack->add_session('checkout_payment', MODULE_PAYMENT_PAYJP_API_ERROR_CLIENT, 'error'); break; case 'sever_error': // PAY.JPや決済ネットワーク側のエラー $messageStack->add_session('checkout_payment', MODULE_PAYMENT_PAYJP_API_ERROR_SERVER, 'error'); break; default: // 未知のエラー $messageStack->add_session('checkout_payment', MODULE_PAYMENT_PAYJP_API_ERROR_UNKNOWN, 'error'); break; } zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false)); } catch (\Payjp\ApiException $e) { // APIからのレスポンスが受け取れない場合。接続エラーなど $messageStack->add_session('checkout_payment', MODULE_PAYMENT_PAYJP_API_ERROR_CONNECT_FAILD, 'error'); zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false)); } catch (\Exception $e) { // PAY.JP とは関係ない例外の場合 $messageStack->add_session('checkout_payment', MODULE_PAYMENT_PAYJP_API_ERROR_INVALID, 'error'); zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true, false)); } return false; }
} else { /* * 下記 $aurhorize_url へのアクセスがAuthorization Requestとなります。 * URLパラメータの詳細については https://pay.jp/docs/payjp-oauth-api の「OAuth API利用の流れ」の章をご参照ください。 */ $_SESSION['state'] = md5(uniqid()); $authorization_request_params = array('response_type' => 'code', 'client_id' => CLIENT_ID, 'scope' => 'accounts cards addresses', 'state' => $_SESSION['state']); $aurhorize_url = AUTHORIZATON_ENDPOINT . '?' . http_build_query($authorization_request_params); } /* * フォームがPOSTされたらサーバーサイドで決済処理を行う */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $token = $_POST['payjp-token']; $amount = $_POST['amount']; \Payjp\Payjp::setApiKey(APIKEY_SECRET); try { $charge = \Payjp\Charge::create(['card' => $token, 'amount' => $amount, 'currency' => 'jpy']); echo "決済が完了しました。<br>Charge ID = {$charge->id}\n"; error_log(var_export($charge, true)); } catch (\Payjp\Error\InvalidRequest $e) { echo "トークンは既に使用済みです。\n"; } exit; } ?> <!doctype html> <html> <head> <meta charset="utf-8">
<?php /* 決済を行うには `Charge` API を使用します。 下の例では、購入者の名前や配送先欄が用意されているフォーム内に PAY.JP Checkout を設置しています。 カード情報だけを PAY.JP 上に預け、アプリケーション側では PAY.JP Checkout から発行された Token を使用して決済を行います。 */ require_once 'vendor/autoload.php'; // `data-key` の部分は本番で使う際には管理画面内に個別で発行しているものに置き換えてください。 // https://github.com/payjp/user-docs/tree/master/tutorial const DATA_KEY = 'pk_test_0383a1b8f91e8a6e3ea0e2a9'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $token = $_POST['payjp-token']; $amount = $_POST['amount']; \Payjp\Payjp::setApiKey('sk_test_c62fade9d045b54cd76d7036'); try { $charge = \Payjp\Charge::create(['card' => $token, 'amount' => $amount, 'currency' => 'jpy']); echo "決済が完了しました。<br>Charge ID = {$charge->id}\n"; error_log(var_export($charge, true)); } catch (\Payjp\Error\InvalidRequest $e) { echo "トークンは既に使用済みです。\n"; } exit; } /* 2度目以降の決済時など、カード情報の入力を再度行いたくない場合は 最初の決済時に `Customer` オブジェクトと `Card` オブジェクトを作成し、 Customer ID をアプリケーション内の顧客情報と紐付けておきます。 $customer = \Payjp\Customer::retrieve('Customer ID');