GMO-PG リンクタイプPlusでクレジットカード決済した時の結果通知プログラムの処理

# 概要

GMO-PGでクレジットカード決済をする際、接続方式として`リンクタイプPlus`で実現した場合、
お客様がGMOの決済サイトへ遷移してから クレジットカード情報入力 -> 確認画面で確認 -> 完了画面で「サイトに戻る」ボタンを押下
というオペレーションが必要になってきます。

ここで、「サイトに戻る」ボタンを押下しなかったり、GMOの決済サイトへ遷移してからクレジットカード情報を忘れたため入力せずに離脱（ブラウザを閉じる，タブを閉じるなど）した場合、その処理が完了したかどうかを検知する必要があります。

そのため、GMOには`結果通知プログラム`というものが用意されており、そのプログラムを利用することで、対象の注文に対して結果をシステム側で判別できる仕組みがあります。

全然詳しくは載っていませんが、以下サイトにQAが載っています。
https://faq.gmo-pg.com/service/detail.aspx?id=1050&a=102&isCrawler=1

# 結果通知プログラムを受け取るプログラム

全体的なサンプルプログラムはGitHubにあります。
https://github.com/Yu-Yamaguchi/codeigniter3-app

今回はphp + CodeIgniterを利用して結果通知プログラムからのパラメータを受け取り、デバッグログとして出力する処理をサンプルとしています。

```php:/codeigniter3/application/controllers/Gmo_result_notification.php
<?php

/**
 * GMOから呼び出される結果通知プログラム用のコントローラです。
 */
class Gmo_result_notification extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->helper('html');
        $this->load->helper('form');
        $this->load->helper('url_helper');
    }

    /**
     * 決済関連の結果通知プログラムから呼び出されるfacade
     */
    public function payment_facade ()
    {
        log_message('debug', 'call Gmo_result_notification#payment_facade()');
        $param = $this->input->post();
        log_message('debug', print_r($param, true));

        // 決済方法により処理分岐
        switch ($param['PayType']) {
            // 0:クレジット
            case '0':
                $this->result_credit($param);
                break;
            // その他（契約している決済方法に応じて分岐）
            default:
                // ....その他の処理
                break;
        }
    }

    /**
     * 決済方法＝クレジットカード決済の結果を処理します。
     */
    private function result_credit($data) {

    }
}
```

# 結果通知プログラムのGMOショップ管理画面の設定

決済関連の結果通知プログラムの設定はショップ管理画面で行います。
※GMO会員関連の結果通知プログラムの設定はサイト管理画面で行うため、ごっちゃにならないように注意してください。

![スクリーンショット 2020-10-04 10.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/4750772b-7d6f-53fa-6f1f-5cdcbbce395d.png)

メールアドレスの部分は、もし結果通知プログラムURLの設定に誤りがあったり、そもそも対象サーバーにGMOから設定したURLにアクセスできなかったりと、なんらかのエラーがあった場合、その失敗情報をメールアドレスあてに通知してくれます。

GMO側からの結果通知プログラムは、60分おきに最大５回までリトライしてくれますので、例えば5時間以上サーバーを停止するようなケースがあった場合は、このメールアドレスにきている失敗の情報を確認して、なんらかの手当が必要になるかもしれないですね。

# 実際にクレジットカード決済するとどんなログが出力されるか

実際にクレジットカード決済した際のログを出力しました。
クレジットカードの場合は以下のようなパラメータがセットされてくるようです。

手順としては、
①.リンクタイプPlusの決済画面遷移用URLを作成して（仮売上になるように）
②.ユーザーが決済画面に遷移して決済処理をする

```shell-session
DEBUG - 2020-10-04 10:21:57 --> call Gmo_result_notification#payment_facade()
DEBUG - 2020-10-04 10:21:57 --> Array
(
    [ShopID] => tshop99999999
    [ShopPass] => **********
    [AccessID] => 1b92474c4818a2d31874df671ad7b145
    [AccessPass] => ********************************
    [OrderID] => {注文ID}
    [Status] => AUTH
    [JobCd] => AUTH
    [Amount] => 10000
    [Tax] => 1000
    [Currency] => JPN
    [Forward] => 2a99662
    [Method] => 1
    [PayTimes] => 
    [TranID] => 2010041010111111111111807699
    [Approve] => 0059942
    [TranDate] => 20201004102157
    [ErrCode] => 
    [ErrInfo] => 
    [PayType] => 0
)
```

上記ログは仮売上のログですが、ショップ管理画面で`実売上`処理を画面操作で行うことで、すぐに以下のログが出力されました。
仮売上と実売上の差はあまり無いですね。

```shell-session
DEBUG - 2020-10-04 10:46:25 --> call Gmo_result_notification#payment_facade()
DEBUG - 2020-10-04 10:46:25 --> Array
(
    [ShopID] => tshop99999999
    [ShopPass] => **********
    [AccessID] => 1b92474c4818a2d31874df671ad7b145
    [AccessPass] => ********************************
    [OrderID] => {注文ID}
    [Status] => SALES
    [JobCd] => SALES
    [Amount] => 10000
    [Tax] => 1000
    [Currency] => JPN
    [Forward] => 2a99662
    [Method] => 1
    [PayTimes] => 
    [TranID] => 2010041010111111111111807699
    [Approve] => 0059942
    [TranDate] => 20201004104625
    [ErrCode] => 
    [ErrInfo] => 
    [PayType] => 0
)
```