定制 kaoken/veritrans-jp-air-web-laravel 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

kaoken/veritrans-jp-air-web-laravel

Composer 安装命令:

composer require kaoken/veritrans-jp-air-web-laravel

包简介

Laravel5で使用する決済システム VeritransJp Air-Web

README 文档

README

Travis branch composer version licence laravel version

これは、日本ベリトランスの決済システム AirWebをLaravelで使用するための物です。 詳しいAirWebに関しての実装方法などは https://www.veritrans.co.jp/developer/air/ を参照

  • 実験的に作っている物なので、このライブラリを通告なしで突然削除するかもしれない。
  • このライブラリに関して日本ベリトランスとは関係ないので、質問、お問い合わせをしないこと。
  • 仕様上、カードとコンビニ決済は、同時に使用できない。決済方法 '00' がそれにあたる。
  • 今のところ詳しい使用(構築)方法は説明しない。

コンテンツの一覧

インストール

composer: composer.json に以下のように追加:

  "require": {
    "kaoken/veritrans-jp-air-web-laravel":"1.5.*"
  },

初期設定

キュー

キューを使用するので、config/queue.phpで、必ず有効化すること!

例 php artisan queue:work --queue=payment,default --sleep=3 --tries=3

この辺は、環境に合わせて設定を!

app\Console\Kernel.php に以下のように追加:

class Kernel extends ConsoleKernel
{
    protected $commands = [
        // 追加
        \Kaoken\VeritransJpAirWeb\Console\MakeVeritransJpAirWebCommand::class,
    ];
}

config\app.php に以下のように追加:

    'providers' => [
        // 追加
        Kaoken\VeritransJpAirWeb\VeritransJpAirWebServiceProvide::class
    ],
    'aliases' => [
        // 追加
       'WebAir' => Kaoken\VeritransJpAirWeb\Facades\VeritransJpAirWeb::class
    ],
];

コマンドの実行

$ php artisan veritrans-jp:web-air:install

下記の4つのファイルはdatabase\migrationsへ追加される。

  • 2017_04_24_000000_create_air_web_payment_table.php
    • AirWeb決済情報テーブル
  • 2017_04_24_000001_create_air_web_commodity_table.php
    • 単体の商品情報テーブル
  • 2017_04_24_000002_create_air_web_payment_notification_table.php
    • 決済完了通知情報テーブル
  • 2017_04_24_000003_create_air_web_cvs_payment_notification_table.php
    • コンビニ入金通知情報テーブル

個々のWebアプリに合わせて追加修正をすること。 その後

$ php artisan migrate

※ ディレクトリのconfigveritrans-jp-air-web.phpというコンフィグファイルが作成される。

コンフィグ

config\veritrans-jp-air-web.php

<?php
return [
    // マーチャントID
    'aw_merchant_id' => env('AW_MERCHANT_ID'),
    // AWへ送信するデータの検証用ハッシュキー
    'aw_merchant_hash_key' => env('AW_MERCHANT_HASH_KEY'),
    // ダミー取引フラグ ダミー取引フラグ 0 = 本番; 1 = テスト
    'aw_dummy_payment_flag' => env('AW_DUMMY_PAYMENT_FLAG', 0),

    // 売り上げフラグ:1:与信・売上、0:与信のみ。指定が無い場合は、0
    'aw_card_capture_flag' => env('AW_CARD_CAPTURE_FLAG', 1),
    // コンビニ決済の支払期限(当日からX日後)
    'aw_cvs_payment_limit' => env('AW_CVS_PAYMENT_LIMIT', 60),

    // 商品情報の商品ID未入力時に設定するダミー値
    'aw_dummy_commodity_id' => env('AW_DUMMY_COMMODITY_ID', 0),
    // 品情報のJAN_CODE未入力時に設定するダミー値
    'aw_dummy_commodity_jan_code' => env('AW_DUMMY_COMMODITY_JAN_CODE', '0'),
    // デフォルト決済方式。01 = クレジットカード、02 = コンビニ
    'aw_settlement_type' => env('AW_SETTLEMENT_TYPE', '01'),

    /**
     * 派生した場合は、クラスを変更すること
     */
    // 決済クラス
    'aw_payment_class' =>  \Kaoken\VeritransJpAirWeb\VeritransJpAirWebPayment::class,
    // 単体の商品クラス
    'aw_commodity_class' => \Kaoken\VeritransJpAirWeb\VeritransJpAirWebCommodity::class,
    // 決済完了通知クラス
    'aw_payment_notification_class' =>  \Kaoken\VeritransJpAirWeb\VeritransJpAirWebPaymentNotification::class,
    // コンビニ入金通知クラス
    'aw_cvs_payment_notification_class' =>  \Kaoken\VeritransJpAirWeb\VeritransJpAirWebCVSPaymentNotification::class,
    // 決済完了通知ジョブクラス
    'aw_payment_notification_job_class' =>  \Kaoken\VeritransJpAirWeb\Jobs\PaymentNotificationJob::class,
    // コンビニ入金通知ジョブクラス
    'aw_cvs_payment_notification_job_class' =>  \Kaoken\VeritransJpAirWeb\Jobs\CVSPaymentReceivedNotificationJob::class,
    // コンビニ決済期日を過ぎたジョブクラス
    'aw_cvs_due_date_has_passed_job_class' =>  \Kaoken\VeritransJpAirWeb\Jobs\CVSDueDateHasPassedJob::class
];

aw_settlement_typeは、'00'選択不可能で、カードかコンビニのみ。

env

env ファイルに必要に応じて追加。

# Air Webへ送信するマーチャントID
AW_MERCHANT_ID=
# Air Webへ送信するデータの検証用ハッシュキー
AW_MERCHANT_HASH_KEY=
# ダミー取引フラグ ダミー取引フラグ 0 = 本番; 1 = テスト
AW_DUMMY_PAYMENT_FLAG=1
# コンビニ決済の支払期限(当日からX日後)
AW_CVS_PAYMENT_LIMIT=7

タスクスケジュール

app\Console\Kernel.php

    protected function schedule(Schedule $schedule)
    {
        ...
        $schedule->call(function(){
            AirWeb::scheduleTask()->deleteNoPaymentNotification();
            AirWeb::scheduleTask()->queueCVSDueDateHasPassed();
        })->dailyAt('00:00');
    }
  • AirWeb::deleteNoPaymentNotification($day=7)は、 現在から$day日過ぎたair_web_paymentテーブルで 決済完了通知が届いていないレコードまたは、 通知が着たが内容が失敗していた場合削除する。
  • AirWeb::eventCVSPaymentReceivedNotification($day=0)は、 現在からコンビニ支払期日が$day日過ぎたジョブをキューに入れる。その後イベントCVSDueDateHasPassedEventが呼び出され、 Webアプリごとにリスナー部で任意の処理をする。air_web_paymentテーブルのレコードは削除しない。

ミドルウェア

app\Http\Kernel.php に以下のように追加:

    protected $routeMiddleware = [
        ...
        'access_via_veritrans_jp' => \Kaoken\VeritransJpAirWeb\Middleware\AccessViaVeritransJp::class
    ];

このルートミドルウェアは、決済完了通知コンビニ入金通知などで、VeritransJp経由だけを許す為に使用する。
使用するかしないかは、個々に任せる。

イベント

  • Kaoken\VeritransJpAirWeb\Events\CVSDueDateHasPassed
    • Kaoken\VeritransJpAirWeb\Jobs\CVSDueDateHasPassedJobから呼び出される。
    • コンビニ決済で、入金期日が過ぎたイベント
  • Kaoken\VeritransJpAirWeb\Events\CVSPaymentReceivedNotificationEvent
    • Kaoken\VeritransJpAirWeb\Jobs\CVSPaymentReceivedNotificationJobから呼び出される。
    • コンビニエンスストア、入金通知イベント
  • Kaoken\VeritransJpAirWeb\Events\PaymentNotificationEvent
    • Kaoken\VeritransJpAirWeb\Jobs\PaymentNotificationJobから呼び出される。
    • 決済完了通知イベント

下記は、使用テンプレート例 app\Listenersへ追加

<?php
/**
 * 決済 リスナー
 */
namespace App\Listeners;

use AirWeb;
use Log;
use Carbon\Carbon;
use Kaoken\VeritransJpAirWeb\Events\ CVSDueDateHasPassed;
use Kaoken\VeritransJpAirWeb\Events\CVSPaymentReceivedNotificationEvent;
use Kaoken\VeritransJpAirWeb\Events\PaymentNotificationEvent;

class PaymentEventSubscriber
{
    /**
     * 購読するリスナーの登録
     * @param \Illuminate\Events\Dispatcher $events
     */
    public function subscribe($events)
    {
        // コンビニ入金期日を過ぎた
        $events->listen(
            'Kaoken\VeritransJpAirWeb\Events\CVSDueDateHasPassed',
            'App\Listeners\PaymentEventSubscriber@onCVSDueDateHasPassed'
        );
        // コンビニエンスストア、入金通知
        $events->listen(
            'Kaoken\VeritransJpAirWeb\Events\CVSPaymentReceivedNotificationEvent',
            'App\Listeners\PaymentEventSubscriber@onCVSPaymentReceivedNotification'
        );
        // 決済完了通知
        $events->listen(
            'Kaoken\VeritransJpAirWeb\Events\PaymentNotificationEvent',
            'App\Listeners\PaymentEventSubscriber@onPaymentNotification'
        );
    }

    /**
     * コンビニ入金期日を過ぎた
     * @param CVSDueDateHasPassed $event
     * @see \Kaoken\VeritransJpAirWeb\Jobs\CVSDueDateHasPassedJob::handle()
     * @throws \Exception
     */
    public function onCVSDueDateHasPassed(CVSDueDateHasPassed $event)
    {

    }

    /**
     * コンビニエンスストア、入金通知
     * @param CVSPaymentReceivedNotificationEvent $event
     * @see \Kaoken\VeritransJpAirWeb\Jobs\CVSPaymentReceivedNotificationJob::handle()
     * @throws \Exception 
     * @note 例外後、`failed_jobs`テーブルへ追加される。
     */
    public function onCVSPaymentReceivedNotification(CVSPaymentReceivedNotificationEvent $event)
    {
        $obj = $event->obj;

    }

    /**
     * 決済完了通知
     * @param PaymentNotificationEvent $event
     * @see \Kaoken\VeritransJpAirWeb\Jobs\PaymentNotificationJob::handle()
     * @throws \Exception
     */
    public function onPaymentNotification(PaymentNotificationEvent $event)
    {
        $obj = $event->obj;

    }
}

個々のWebアプリごとに設定する。例えば、入金後、商品の発送処理などの処理をする。

失敗イベント時の処理例 app\Providers\AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Queue\Events\JobFailed;
use Kaoken\VeritransJpAirWeb\Jobs\CVSDueDateHasPassedJob;
use Kaoken\VeritransJpAirWeb\Jobs\CVSPaymentReceivedNotificationJob;
use Kaoken\VeritransJpAirWeb\Jobs\PaymentNotificationJob;
use Illuminate\Support\ServiceProvider;

use Log;
use Queue;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Queue::failing(function (JobFailed $event){
            // Air Web Veritrans Jp
            if( $event->connectionName === 'payment' ){
                $e = $event->exception;
                $a['error']['msg'] = $e->getMessage();
                $a['error']['code'] = $e->getCode();
                $a['error']['file'] = $e->getFile();
                $a['error']['line'] = $e->getLine();
                $a['error']['trace'] = $e->getTrace();

                if( $event->job instanceof CVSDueDateHasPassedJob){
                    $a['obj'] = $event->job->obj;
                    Log::error("Veritrans Jp コンビニ決済で、入金期日が過ぎた",$a);
                }else if( $event->job instanceof CVSPaymentReceivedNotificationJob){
                    $a['item'] = $event->job->items;
                    Log::error("Veritrans Jp コンビニ入金通知",$a);
                }else if( $event->job instanceof PaymentNotificationJob){
                    $a['item'] = $event->job->items;
                    Log::error("Veritrans Jp 決済完了通知",$a);
                }
            }
        });
    }
}

ここでは、ログのみだが、失敗時メール送信など追加してもよい。

コントローラー

トレイトのKaoken\VeritransJpAirWeb\CVSPaymentReceivedNotificationKaoken\VeritransJpAirWeb\PaymentNotification を追加し、Veritans Jp Air Webからの通知受け取るようにする。

下記は、app\Http\Controllers\AirWebController.phpへ追加した例である。

<?php
/**
 * Veritans Jp Air Web に関する処理
 * @see https://air.veritrans.co.jp/map/settings/service_settings
 */
namespace App\Http\Controllers;

use Log;
use \Illuminate\Http\Request;
use App\Library\Http\Controllers\Controller;
use Kaoken\VeritransJpAirWeb\CVSPaymentReceivedNotification;
use Kaoken\VeritransJpAirWeb\PaymentNotification;

class AirWebController extends Controller
{
    use PaymentNotification, CVSPaymentReceivedNotification;

    /**
     * 決済完了通知
     * @param Request $request
     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
     */
    public function postPaymentNotification(Request $request)
    {
        return $this->paymentNotification($request);
    }


    /**
     * コンビニ入金通知
     * @param Request $request
     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
     */
    public function postCVSPaymentReceivedNotification(Request $request)
    {
        return $this->cvsPaymentReceivedNotification($request);
    }


    /**
     * 決済完了後の移動先
     * @param Request $request
     * @param int $threadId スレッドID
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function postFinishPayment(Request $request, $threadId)
    {
//        Log::info('決済完了後');
        return redirect('/');
    }

    /**
     * 未決済時の移動先
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function getUnFinishPayment(Request $request)
    {
        return redirect('/');
    }
    /**
     * 決済エラー時の移動先
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function postErrorPayment(Request $request)
    {
        return redirect('/');
    }
}

ルート

コントローラーの構成を元に作った例 routes\web.phpへ追加した例

Route::group([
        'middleware' => ['access_via_veritrans_jp']
    ]
    function() {
        // 決済完了通知を受信するためのもの
        Route::post('notification/handling','AirWebController@postPaymentNotification' );
        // コンビニ入金通知を受信するためのもの
        Route::post('cvs-payment-received','AirWebController@postCVSPaymentReceivedNotification' );
    }
);
// 正常に支払い手続きが終了した購入者へ表示するURL
Route::post('payment/finish','AirWebController@postFinishPayment' );
// 決済入力画面から「戻る」をクリックした購入者へ表示する
Route::get('payment/unfinish','AirWebController@getUnFinishPayment' );
// 正常に支払い手続きが終了しなかった購入者へ表示する
Route::post('payment/error','AirWebController@postErrorPayment' );

ミドルウェアを使用しない場合は、ミドルウェアaccess_via_veritrans_jpを空に。

ライセンス

MIT

kaoken/veritrans-jp-air-web-laravel 适用场景与选型建议

kaoken/veritrans-jp-air-web-laravel 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 21 次下载、GitHub Stars 达 1, 最近一次更新时间为 2017 年 05 月 07 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「laravel」 「veritrans-jp」 「air-web」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 kaoken/veritrans-jp-air-web-laravel 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 kaoken/veritrans-jp-air-web-laravel 我们能提供哪些服务?
定制开发 / 二次开发

基于 kaoken/veritrans-jp-air-web-laravel 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 21
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 3
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2017-05-07