【PHP/Laravel】イプシロンで決済リンクを作成

PHPのコード例

① エンドポイントに投げるパラメータを用意する
(内容の詳細は一番下に記載)

$epsilonParams = [
    "contract_code" => 12345, // 契約コード
    "order_number" => 1, // 注文番号
    "user_id" => 1, // ユーザーID
    "user_name" => "テスト 太郎", // ユーザー名
    "user_mail_add" => "tarou@test.com", // ユーザーメールアドレス
    "item_price" => 10000, // 金額
    "item_name" => "ガチャ", // 商品名
    "item_code" => 123, // 商品コード
    "xml" => 1, // XMLで取得
    "st_code" => "10000-0000-00000-00000-00000-00000-00000", // 決済区分 (https://www.epsilon.jp/developer/transmission.html)
    "mission_code" => 1, // 課金区分
    "process_code" => 1, // 処理区分
];

② curlを使用して、エンドポイントに投げる
成功すると決済リンクが返ってくるので、リダイレクトする

$ch = curl_init();

// エンドポイントを指定
curl_setopt($ch, CURLOPT_URL, "https://beta.epsilon.jp/cgi-bin/order/receive_order3.cgi");
curl_setopt($ch, CURLOPT_POST, true);
// 上記で設定したパラメータを渡す
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($epsilonParams));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);

if(curl_errno($ch)){
    echo "イプシロンの注文情報作成でエラーが発生しました。". curl_error($ch);
} else {
    $xml = new \SimpleXMLElement($response);

    // 結果を解析
    foreach ($xml->result as $element) {
        $attributes = $element->attributes();

        if (isset($attributes->err_code)) {
            // エラーコード
            $err_code = (string) $attributes->err_code;
        } elseif (isset($attributes->err_detail)) {
            // エラーメッセージ
            $err_detail = (string) $attributes->err_detail;
            $err_detail = mb_convert_encoding(urldecode($err_detail), "UTF-8", "SJIS");
        } elseif (isset($attributes->redirect)) {
            // 決済用URL
            $redirect = (string) $attributes->redirect;
        }
    }

    if (!empty($err_code)) {
        echo "イプシロンの注文情報作成でエラーが発生しました。 : $err_code - $err_detail";
    } elseif (!empty($redirect)) {
        // 決済URLにリダイレクト
        return redirect()->to($redirect);
    }
}

上記はテスト決済用のサンプルなので、
本番運用時は本番用の決済エンドポイントに置き換えが必要

以下に記載の通り、本番環境のエンドポイントは契約時に共有される

テスト環境: https://beta.epsilon.jp/cgi-bin/order/receive_order3.cgi

 ※本番環境の接続先につきましては契約時に弊社サポートよりご連絡いたします。

Laravelでサービスクラスを作成した例

  • .env
    契約コードを記載
EPSILON_CONTRACT_CODE=12345
  • config/services.php
    上記を設定
  'ses' => [
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    ],

    // 追加
    'epsilon' => [
        'contract_code' => env('EPSILON_CONTRACT_CODE')
    ],
  • App/Services/EpsilonService.php
<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;

class EpsilonService
{
    /**
     * @param array $data
     * @return \Illuminate\Http\RedirectResponse|void
     * @throws \Exception
     */
    public function storeOrder(array $data)
    {
        $epsilonParams = [
            "contract_code" => $data['contract_code'], // 契約コード
            "order_number" => $data['order_number'], // 注文番号
            "user_id" => $data['user_id'], // ユーザーID
            "user_name" => $data['user_name'], // ユーザー名
            "user_mail_add" => $data['user_mail_add'], // ユーザーメールアドレス
            "item_price" => $data['item_price'], // 金額
            "item_name" => $data['item_name'], // 商品名
            "item_code" => $data['item_code'], // 商品コード
            "st_code" => "10000-0000-00000-00000-00000-00000-00000", // 決済区分
            "mission_code" => 1, // 課金区分
            "process_code" => 1, // 処理区分
            "xml" => 1, // XMLで取得
        ];
        $response = Http::get("https://beta.epsilon.jp/cgi-bin/order/receive_order3.cgi", $epsilonParams);

        if ($response->successful()) {
            $responseContent = $response->body();
            $xml = new \SimpleXMLElement($responseContent);

            // 結果を解析
            foreach ($xml->result as $element) {
                $attributes = $element->attributes();

                if (isset($attributes->err_code)) {
                    // エラーコード
                    $err_code = (string) $attributes->err_code;
                } elseif (isset($attributes->err_detail)) {
                    // エラーメッセージ
                    $err_detail = (string) $attributes->err_detail;
                    $err_detail = mb_convert_encoding(urldecode($err_detail), "UTF-8", "SJIS");
                } elseif (isset($attributes->redirect)) {
                    // 決済用URL
                    $redirect = (string) $attributes->redirect;
                }
            }

            if (!empty($err_code)) {
                throw new \Exception("イプシロンの注文情報作成でエラーが発生しました。 : $err_code - $err_detail");
            } elseif (!empty($redirect)) {
                // リダイレクトURLにリダイレクト
                return redirect()->to($redirect);
            }
        } else {
            throw new \Exception('イプシロンの注文情報作成でエラーが発生しました。');
        }
    }
}

パラメータの詳細

contract_code契約コード
イプシロン管理画面で確認できる
order_numberオーダー番号 (半角英数字)
既に登録されているものを指定するとエラーになるので
ユニークな値を指定する
user_idユーザーID (半角英数字)
既に登録しているユーザーのカードで課金したり定期課金する場合は対象のIDを指定する
上記を使用しない場合は自由に設定OK
user_name購入者の名前
user_mail_add購入者のメールアドレス
item_price決済価格 (1~9999999)
item_name商品名
item_code商品コード (半角英数字)
st_code決済区分
NNNNN-NNNN-NNNNN-NNNNN-NNNNN-NNNNN-NNNNNの形式で
利用するものを1にする
(例)
クレジット: 10000-0000-00000-00000-00000-00000-00000
コンビニ決済: 00100-0000-00000-00000-00000-00000-00000
後払い: 00000-0000-00000-00010-00000-00000-00000
上記3つ全て: 10100-0000-00000-00010-00000-00000-00000
mission_code課金区分
1: 都度課金
21~32: 定期課金
process_code処理区分
1: 初回課金
2: 登録済み課金
3: 登録のみ
4: 登録内容変更
7: 退会取消
8: 退会
xml応答形式
XML形式で応答が欲しい場合は1を指定する
https://www.epsilon.jp/developer/transmission.html

各種区分の詳細はこちら

\ 案件のご依頼・ご相談はこちらから /