決済用プラグインの制作~(3)フォームデータのSBペイメントサービスへ送信と結果の受け取り

2020年1月9日

フォームからAjax名「payment_ajax」を通じて送られてきたAjaxデータは、class.wpmop.phpファイルの

add_action( 'wp_ajax_nopriv_payment_ajax’, array( &$this, 'ajax_payment’ ) );
add_action( 'wp_ajax_payment_ajax’, array( &$this, 'ajax_payment’ ) );

を通じて、ajax_paymentメソッドで処理されます。

この時、ajax_paymentメソッド内に直接バリデーションや支払処理を行っても良いのですが、折角ですので専用のclassを設けて見ましょう。

ファイル構造

  • wp-content(dir)
    • plugins(dir)
      • my-original-plugin(dir)
        • my-original-plugin.php・・・AjaxのデータをWPMOP-PAYMENTオブジェクトで処理させる
        • script(dir)
          • form-ajax.js
        • class(dir)
          • class.wpmop.php・・・AjaxのデータをWPMOP_PAYMENTオブジェクトで処理させる
          • class.wpmop-script.php
          • class.wpmop-payment.php・・・PAYMENTの処理を行うための専用のclass
          • payment(dir)
            • class.wpmop-payment-sbps.php・・・各決済会社それぞれのPAYMENT処理についてのClass

class.wpmop.phpファイル

このファイルでは、form-ajax.jsを読み込ませたり、form-ajax.jsにわたす変数を作成・出力したりするファイルclass.wpmop-scripts.phpをincludeしておきます。またAjaxで送られてきたデータを処理するajax_payment()関数も設定しておきます。

このajax_payment()関数では実際にフォームからAjaxで送信されてきたデータを処理するための。WPMOP_Paymentクラスをインスタンス化させるだけで、他には何もしません。

<?php
//class.wpmop-scripts.phpファイルを読み込ませる
include_once( WPMOP_CLASS_PATH . 'class.wpmop-scripts.php' );

//↓↓↓↓↓新規追加ここから

//class.wpmop-payment.phpファイルを読み込ませる
include_once( WPMOP_CLASS_PATH . 'class.wpmop-payment.php' );

//↑↑↑↑↑新規追加ここまで
class WPMOP {

    //フロントページで読み込ませるスクリプトを登録させる
    add_action( 'wp_enqueue_scripts', 'WPMOPSCRIPTS::front_page_scripts' );
    //ajax用の関数を設定 フォームでname="action"の値をpayment_ajaxにする
    add_action( 'wp_ajax_nopriv_payment_ajax', array( &$this, 'ajax_payment' ) );
    add_action( 'wp_ajax_payment_ajax', array( &$this, 'ajax_payment' ) );

    public function __construct()
    {
        add_action( 'admin_menu', array( &$this, 'my_admin_page_settings' ) );
    }
    
    public function my_admin_page_settings()
    {
        //管理画面にメニューを追加
        add_menu_page(
            'My Original Pluginメインページ',
            'My Original Plugin',
            'manage_options',
            'wpmop',
            array( &$this, 'wpmop_mainpage' ),
            '',
            99
        );

        //追加した「My Original Plugin」メニューにサブメニューを追加
        add_submenu_page(
            'wpmop',
            'サブメニュー1ページ',
            'サブメニュー1',
            'manage_options',
            'wpmop-submenu1',
            array( &$this, 'wpmop_subpage01' )
        );
    }

    //追加した管理メニューページのコンテンツ
    public function wpmop_mainpage() {
        ?>
<div class="PluginContainer ">
    <h2 class="Plugin__head">My Original Pluginメインページ</h2>    
</div>
<?php
    }    

    //追加した管理メニューサブページのコンテンツ
    public function wpmop_subpage01() {
        ?>
<div class="PluginContainer ">
    <h2 class="Plugin__head">My Original Pluginサブページ1</h2>    
</div>
<?php
    }  
    
    public function ajax_payment()
    {
//↓↓↓↓↓新規追加ここから
        new WPMOP_Payment();
//↑↑↑↑↑新規追加ここまで
/*
以下は削除
    //とりあえず、ajax_payment関数が呼び出されたら'ok'を出力
        var_dump( $_POST );
        die();
*/
    }
}

class.wpmop-payment.phpファイル

※クラス内部の最初に定義している変数について、各メソッド内でしか使わないものは最初に定義する必要はないので、後で変更するかもしれません。

このファイルでは、Ajaxを通じて送られてきたPOSTデータをバリデーションし、問題なければ各ペイメントサービスへデータを送信します。

このファイルでは、コンストラクタ(__construct()関数:WPMOP_Paymentクラスがインスタンス化されたときに最初に行われる処理)の中で行われている大まかな順序は

  1. nonceチェックを行い問題がればエラーを返す。問題なければ次の処理へ
  2. このクラスで行わせたい処理名($_POST['payment_process’])と、paymentサービス会社名($_POST['payment_service’])が指定されなければエラーを返す。
  3. paymentサービス会社名($_POST['payment_service’])に応じてファイルを読み込み、$_POST['payment_process’]で送信されてきたメソッド名の処理を行う。

となっております。

また、payment処理結果は、一旦、$return_message変数に保存され、json_encode()関数でjson変換後、echoで出力します。

出力した内容は、form-ajax.jsファイル内でJSON.parse()関数を使って処理し、successの値を判定して分岐処理する予定です。

<?php
class WPMOP_Payment {
    
    private $return_message = array();
    private $payment_service = '';
  private $is_sandbox = true; 
    public function __construct()
    {

    $this->return_message = array(
      'success' => false,
      'message' => '',
      'body' => null
    );

        //サンドボックスを使用するか判定
        $this->is_sandbox = $this->is_sandbox();
        //このクラスをオブジェクト化する時には必ずnonceフィールドを持ったフォームから送信されなければいけない。
        $my_nonce = filter_input( INPUT_POST, WPMOP_NONCE_NAME, FILTER_VALIDATE_REGEXP, array( "options" => array( "regexp" => "/^[\u\l\d]+/" ) ) );
        
        //nonceの内容をチェックして問題なければ処理を続ける。
        if( !wp_verify_nonce( $my_nonce, WPMOP_NONCE_ACTION ) )  {
            $this->return_message['message'] = 'nonce error' . $my_nonce;
            echo  json_encode( $this->return_message );
            die();
        }
        //バリデーション次の章で、本来ならばフォームの値にバリデーションをかける予定だけどとりあえず今回はそのまま使うのでコメントアウト。
        //$form_data  = new WPMOP-FormValidation( $_POST );
     $form_data = $_POST;
        
        //payment_processが指定されていなかったり、そのようなメソッドが無い場合、payment_serviceが指定されていなかったらエラーを返す      
        $payment_process = filter_input( INPUT_POST, 'payment_process', FILTER_SANITIZE_STRING );
        
        $this->payment_service = filter_input( INPUT_POST, 'select_payment_service', FILTER_SANITIZE_STRING ); 
           
        if( empty( $payment_process ) || method_exists( $this, $payment_process ) || empty( $this->payment_service ) ) {
            $this->return_message['message'] = 'no process/no service error';
            echo  json_encode( $this->return_message );
            die();
        }
     //payment serviceごとに読み込むファイルを変更
        include_once( WPMOP_CLASS_PATH . 'payment/class.wpmop-payment-' . strtolower( $this->payment_service ) . '.php' ); 
        
        //指定されたクラスのオブジェクトで各メソッドを実行 
        $payment_class = 'WPMOP_' . strtoupper( $this->payment_service );         
        $payment_object = new $payment_class;
        $payment_object->reset_template_data();
        $this->return_message = $payment_object->$payment_process( $form_data, $this->is_sandbox );
        
        //決済処理の結果とフォームデータを使用し、ペイメント処理後の作業を行わせる(データベースに保存とか)
        $this->post_payment_process( $this->return_message, $form_data );
        echo json_encode( $this->return_message );
        die();
   
    }

    //201911210の段階ではこの関数は何もしないまま次に進む。
    public function post_payment_process( $return_message, $form_data )
    {
        return false;
    }
    
    public function is_sandbox()
    {
        //本来ならば管理画面で「サンドボックスを有効にする」のチェックボックスを用意し、
        //そこの内容をget_optionで取得して返すようにすると良い。
        return true;
    }
}

class.wpmop-payment-sbps.php

以下のコードの一部は、Literally-WordPress/softbank-payment.php at master · fumikito/Literally-WordPress · GitHub を参考にさせて頂きました。

※最初に定義している変数について、各メソッド内でしか使わないものは最初に定義する必要はないので、後で変更するかもしれません。

※使用しているコードブロックの仕様で、XML宣言の?>がPHPの終了記号と判断されて色が変になっていますがご容赦ください。

このファイルでは、SBペイメントサービスを指定してきたときの様々な処理を記述していきます。

変数として

  • 送信するデータの項目をすべて並べた配列(各項目の値は空):$_send_data_template_container
  • 固定値として規定されているデータが収められた配列:$_send_data_fixed_container
  • フォームから送信されたデータのうち送信する項目だけを収めるための配列:$_send_data_form_container
  • システム側で作成しておくデータを収めるための配列:$_send_data_system_container
  • サンドボックスモード(テストモード)の時に指定されるデータを収めた配列:$_send_data_sandbox_container

を準備します。

今回使用するpayment_startメソッドでは

  1. $_send_data_form_containerの各項目にフォームから送信されてきたデータを保存
  2. $_send_data_template_containerを$_send_data_form_containerで上書き
  3. $_send_data_system_containerにシステム側で作成したデータを保存し、$_send_data_template_containerに対して上書き
  4. $_send_data_template_containerに対して$_send_data_fixed_containerで上書き
  5. サンドボックスモード(テストモード)の場合、さらに$_send_data_template_containerを$_send_data_sandbox_containerで上書き
  6. 指定のURLに$_send_data_template_containerを送信するために必要な処理の準備
  7. $_send_data_template_containerを送信。戻ってきたデータを処理

という手順で処理を行い、送信されてきたデータから必要な部分だけをり要するようにします。

また、order_idの値は、毎回異なる必要があります。sandboxモードでは、毎回この値が変わるように、

uniqid(sprintf('%s-%02d-', 'test’, rand(0,999999)), true)

で値を出力しています。(上記参考ページのコードを利用)

<?php

class WPMOP_SBPS {
    
    private $_send_data_template_container;
    
    private $_send_data_fixed_container ;
    
    private $_send_data_system_container;
    
    private $_send_data_sandbox_container;
    
    private $error_msg = array(
        '00' => 'XML 形式エラー',
        '01' => '無効な支払方法が指定されました',
        '02' => '無効な API Request ID が存在しません',
        '03' => '必須項目に値が指定されていない場合に発生',
        '04' => '許容文字属性不正(詳細は、格納可能なデータ型の定義を参照)',
        '05' => '許容桁数(バイト数)範囲外',
        '06' => 'フォーマット不正',
        '07' => '定義値外の値が指定された場合に発生',
        '08' => '使用していないエラーコード',
        '09' => 'リクエストハッシュ値不正',
        '10' => '送信されたリクエストの有効期間(デフォルト 10 分)が切れた場合に発生',
        '11' => '指定の処理対象 SBPS トランザクション ID に紐付く決済が存在しない場合に発生',
        '12' => '処理対象トラッキング ID エラー',
        '13' => '再与信にて指定不可のパラメーターに値が設定された場合に限り発生',
        '14' => '指定されたマーチャント ID・サービス ID に紐付くマーチャントプロパティシートが存在しない',
        '20' => '決済センターよりエラーが返ってきました。',
        '21' => '決済センターよりエラーが返ってきました。',
        '22' => 'クレジットカード利用限度額超過',
        '23' => '決済センターよりエラーが返ってきました。',
        '24' => '暗証番号不正',
        '25' => 'クレジットカード利用限度回数超過',
        '26' => 'クレジットカード取扱不可',
        '27' => 'クレジットカード番号・有効期限誤り',
        '28' => '取引内容取扱不可',
        '29' => '指定ボーナス回数利用不可',
        '30' => '指定ボーナス月利用不可',
        '31' => '指定ボーナス金額利用不可',
        '32' => '指定支払開始月利用不可',
        '33' => '指定分割回数利用不可',
        '34' => '指定分割金額利用不可',
        '35' => '指定初回お支払い金額利用不可',
        '36' => 'その他与信エラー',
        '37' => '自動売上が設定されているため、売上要求は不要です。',
        '38' => '既に返金処理中のため、返金処理を中止しました。',
        '39' => '与信結果が存在しないため、売上処理を中止しました。',
        '40' => '与信取消済みのため、売上処理を中止しました。',
        '41' => '売上処理が完了済みのため、処理を中止しました。',
        '42' => '売上処理の処理日時は、与信日から 3 ヶ月目末日まで有効です。',
        '48' => '使用していないエラーコード',
        '50' => '使用していないエラーコード',
        '51' => '与信結果が存在しないため、与信取消処理を中止しました。',
        '52' => '与信取消済みのため、与信取消処理を中止しました。',
        '53' => '使用していないエラーコード',
        '54' => '継続課金中のため、与信取消処理を中止しました。',
        '55' => '使用していないエラーコード',
        '57' => 'ご指定の継続課金は既に解約済みです。',
        '58' => '継続課金使用中エラー',
        '59' => '自動売上(コミットフラグ適用)の場合、コミット実施後、返金処理を実施して下さい。',
        '60' => '既に処理が完了しているため、コミット(取消)を実施出来ません。',
        '61' => 'セキュリティコード誤り',
        '62' => '使用していないエラーコード',
        '63' => '認証アシスト情報必須エラー',
        '64' => 'SmartLink センターエラー',
        '65' => '決済機関判定エラー',
        '66' => '決済機関判定エラー',
        '67' => '決済機関判定エラー',
        '68' => '決済機関判定エラー',
        '69' => '決済機関判定エラー',
        '70' => '決済機関判定エラー',
        '71' => '決済機関判定エラー',
        '72' => '決済機関判定エラー',
        '73' => '決済機関判定エラー',
        '74' => '決済機関判定エラー',
        '75' => '決済機関判定エラー',
        '76' => '決済機関判定エラー',
        '77' => '決済機関判定エラー',
        '78' => '指定された金額が、与信時金額を越えているため',
        '79' => '処理を中止しました。',
        '22' => '決済センターよりエラーが返ってきました。',
        '45' => '売上処理は、本決済では使用できません。',
        '46' => '自動売上が設定されているため、売上処理は不要です。',
        '47' => '与信結果が存在しないため、売上処理を中止しました。',
        '49' => '取消処理済みのため、売上処理を中止しました。',
        '56' => '使用していないエラーコード',
        '80' => 'GW システムエラー',
        '81' => 'API リクエストパラメータエラー',
        '82' => '使用していないエラーコード',
        '83' => 'GW レコード検索エラー',
        '84' => '決済機関レスポンスパラメータエラー',
        '85' => '決済機関接続エラー',
        '86' => '決済機関システムエラー',
        '90' => 'API システムエラー',
        '91' => '使用していないエラーコード',
        '92' => 'GW 接続エラー',
        '93' => '再入力上限回数制限エラー',
        '94' => '決済未完了エラー',
        '95' => '顧客情報整合性エラー',
        '96' => '2 重リクエストエラー'
    );

    public function __construct()
    { 
    }

    public function reset_template_data()
    {
        //この配列は、送信用のテンプレートなので値はempty
        $this->_send_data_template_container = array(
            'merchant_id' => '', //sandbox 固定値
            'service_id' => '', //sandbox 固定値
            'cust_code' => '', //システム内作成
            'order_id' => '', //sandbox 勝手に作成
            'item_id' => '', //システム内作成
            'item_name' => '', //システム内作成
            'tax' => '', //システム内作成
            'amount' => '', //システム内作成
            'free1' => '', //フォーム
            'free2' => '', //フォーム
            'free3' => '', //フォーム
            'order_rowno' => '', //システム内作成
            'sps_cust_info_return_flg' => '', //固定値
            'cc_number' => '', //sandbox 固定値
            'cc_expiration' => '', //sandbox 固定値
            'security_code' => '', //sandbox 固定値
            'cust_manage_flg' => '', //固定値
            'encrypted_flg' => '', //sandbox 固定値
            'request_date' => '', //sandbox 勝手に作成
            'limit_second' => '', //システム内作成
            'hashkey' => '' //sandbox 固定値
            );

       //この配列は正式にSBPSに登録した際に与えられる値を使用する。今回はempty。
       //$this->_set_fixed_data();でセットされる
       $this->_send_data_fixed_container = array (
            'merchant_id'               => '',                                            //sandbox 固定値
            'service_id'                => '',                                            //sandbox 固定値
            //'cust_code'                 => '',                  //システム内作成
            //'order_id'                  => '',          //sandbox 勝手に作成
            //'item_id'                   => '',          //システム内作成
            //'item_name'                 => '',                                          //システム内作成
            //'tax'                       => '',                                          //システム内作成
            //'amount'                    => '',                                          //システム内作成
            //'free1'                     => '',                                          //フォーム
            //'free2'                     => '',                                          //フォーム
            //'free3'                     => '',                                          //フォーム
            //'order_rowno'               => '',                                          //システム内作成
            'sps_cust_info_return_flg'  => 1,                                             //固定値
            //'cc_number'                 =>'',                            //フォーム sandbox 固定値
            //'cc_expiration'             => '',                                    //フォーム sandbox 固定値
            //'security_code'             => '',                                       //フォーム sandbox 固定値
            'cust_manage_flg'           => 0,                                             //固定値
            'encrypted_flg'             => 0,                                             //sandbox 固定値
            'request_date'              => date('YmdHis'),                                //sandbox  勝手に作成
            'limit_second'              => '60',                                            //固定値
            'hashkey'                   => '8435dbd48f2249807ec216c3d5ecab714264cc4a'     //sandbox 固定値
        );

        //この値は、フォームから送られてきた値を取得するためのテンプレートなので、値はempty。
        //$this->_set_form_data()で値がセットされる。
        $this->_send_data_form_container = array(
            //'merchant_id'               => '',                                         //sandbox 固定値
            //'service_id'                => '',                                         //sandbox 固定値
            //'cust_code'                 => '',                 //システム内作成
            //'order_id'                  => '',         //sandbox 勝手に作成
            //'item_id'                   => '',         //システム内作成
            //'item_name'                 => '',                                         //システム内作成
            //'tax'                       => '',                                         //システム内作成
            //'amount'                    => '',                                         //システム内作成
            'free1'                     => '',                                           //フォーム your_name 
            'free2'                     => '',                                           //フォーム your_email 
            'free3'                     => '',                                           //フォーム your_tel 
            //'order_rowno'               => '',                                         //請求番号 システム内作成
            //'sps_cust_info_return_flg'  => 1,                                          //固定値
            'cc_number'                 => '',                             //フォーム sandbox 固定値
            'cc_expiration'             => '',                                     //フォーム sandbox 固定値
            'security_code'             => '',                                        //フォーム sandbox 固定値
            //'cust_manage_flg'           => 0,                                          //固定値
            //'encrypted_flg'             => 0,                                          //sandbox 固定値
            //'request_date'              => '',                             //sandbox  勝手に作成
            //'limit_second'              => '',
            //'hashkey'                   => ''  //sandbox 固定値
        );

        //これは商品IDからプログラム側でデータを作成すべき値をまとめた配列。今回はempty
        //$this->_set_system_data();でセットされる。
        $this->_send_data_system_container = array(
            //'merchant_id'               => '',                                        //sandbox 固定値
            //'service_id'                => '',                                        //sandbox 固定値
            'cust_code'                 => '',                  //システム内作成
            'order_id'                  => '',          //sandbox 勝手に作成
            'item_id'                   => '',          //システム内作成
            'item_name'                 => '',                                          //システム内作成
            'tax'                       => '',                                          //システム内作成
            'amount'                    => '',                                          //システム内作成
            //'free1'                     => '',                                        //フォーム your_name 
            //'free2'                     => '',                                        //フォーム your_email 
            //'free3'                     => '',                                        //フォーム your_tel 
            'order_rowno'               => '',                                          //請求番号 システム内作成
            //'sps_cust_info_return_flg'  => 1,                                         //固定値
            //'cc_number'                 => '',                          //フォーム sandbox 固定値
            //'cc_expiration'             => '',                                  //フォーム sandbox 固定値
            //'security_code'             => '',                                     //フォーム sandbox 固定値
            //'cust_manage_flg'           => 0,                                         //固定値
            //'encrypted_flg'             => 0,                                         //sandbox 固定値
            //'request_date'              => '',                            //sandbox  勝手に作成
            //'limit_second'              => '',
            //'hashkey'                   => '' //sandbox 固定値
        );

        $this->_send_data_sandbox_container = array(
            'merchant_id'               => '30132',                                     //sandbox 固定値
            'service_id'                => '002',                                       //sandbox 固定値
            //'cust_code'                 => '',                //システム内作成
            'order_id'                  => $this->generate_order_id(), //sandbox 勝手に作成
            //'item_id'                   => '',        //システム内作成
            //'item_name'                 => '',                                        //システム内作成
            //'tax'                       => '',                                        //システム内作成
            //'amount'                    => '',                                        //システム内作成
            //'free1'                     => '',                                        //フォーム
            //'free2'                     => '',                                        //フォーム
            //'free3'                     => '',                                        //フォーム
            //'order_rowno'               => '',                                        //システム内作成
            //'sps_cust_info_return_flg'  => 1,                                         //固定
            'cc_number'                 => 5250729026209007,                            //フォーム sandbox 固定値
            'cc_expiration'             => '201103',                                    //フォーム sandbox 固定値
            'security_code'             => '798',                                       //フォーム sandbox 固定値
            //'cust_manage_flg'           => 0,                                         //固定
            'encrypted_flg'             => 0,                                           //sandbox 固定値
            'request_date'              => date('YmdHis'),                              //sandbox  勝手に作成
            //'limit_second'              => '',
            'hashkey'                   => '8435dbd48f2249807ec216c3d5ecab714264cc4a'   //sandbox 固定値
        );
    }
    public static function payment_start( $form_data, $is_sandbox =  true )
    {
        //フォームから送信されてきたデータをセット
        $this->_set_form_data( $form_data );
        $this->_send_data_template_container = array_merge( $this->_send_data_template_container, $this->_send_data_form_container );
        
        //プログラム内で準備すべきデータをセット
        $this->_set_system_data( $form_data );
        $this->_send_data_template_container = array_merge( $this->_send_data_template_container, $this->_send_data_system_container );

        //固定値のデータをセット        
        $this->_set_fixed_data();
        $this->_send_data_template_container = array_merge( $this->_send_data_template_container, $this->_send_data_fixed_container );
        
        //sandboxモードの場合上書きする
        if( true === $is_sandbox ){
            $this->_send_data_template_container = array_merge( $this->_send_data_template_container, $this->_send_data_sandbox_container );
        }
        //explodeして、文字コード変換
        foreach( $this->_send_data_template_container as $key => $value ){
            $$key = mb_convert_encoding( $this->_send_data_template_container[$key], 'Shift_JIS', 'UTF-8' );
        }
        
        // SHA1変換
        $result =
            $merchant_id .
            $service_id .
            $cust_code .
            $order_id .
            $item_id .
            $item_name .
            $tax .
            $amount .
            $free1 .
            $free2 .
            $free3 .
            $order_rowno .
            $sps_cust_info_return_flg .
            $cc_number .
            $cc_expiration .
            $security_code .
            $cust_manage_flg .
            $encrypted_flg .
            $request_date .
            $limit_second .
            $hashkey;
        $this->_sps_hashcode = sha1( $result );

        //送信データ構築
        $this->_postdata =
                "<?xml version='1.0' encoding='Shift_JIS' ?>" .
                "<sps-api-request id='ST01-00101-101'>" . 
                    "<merchant_id>" . $merchant_id . "</merchant_id>" .
                    "<service_id>" . $service_id . "</service_id>" .
                    "<cust_code>" . $cust_code . "</cust_code>" .
                    "<order_id>" . $order_id . "</order_id>" .
                    "<item_id>" . $item_id . "</item_id>" .
                    "<item_name>" . base64_encode($item_name) . "</item_name>" .
                    "<tax>" . $tax . "</tax>" .
                    "<amount>" . $amount . "</amount>" .
                    "<free1>" . base64_encode($free1) . "</free1>" .
                    "<free2>" . base64_encode($free2) . "</free2>" .
                    "<free3>" . base64_encode($free3) . "</free3>" .
                    "<order_rowno>" . $order_rowno . "</order_rowno>" .
                    "<sps_cust_info_return_flg>" . $sps_cust_info_return_flg . "</sps_cust_info_return_flg>" .
                    "<dtls></dtls>" .
                    "<pay_method_info>" .
                        "<cc_number>" . $cc_number . "</cc_number>" .
                        "<cc_expiration>" . $cc_expiration . "</cc_expiration>" .
                        "<security_code>" . $security_code . "</security_code>" .
                        "<cust_manage_flg>" . $cust_manage_flg . "</cust_manage_flg>" .
                    "</pay_method_info>" .
                    "<pay_option_manage>" .
                    "</pay_option_manage>" .
                    "<encrypted_flg>" . $encrypted_flg . "</encrypted_flg>" .
                    "<request_date>" . $request_date . "</request_date>" .
                    "<limit_second>" . $limit_second . "</limit_second>" .
                    "<sps_hashcode>" . $this->_sps_hashcode . "</sps_hashcode>" .
                "</sps-api-request>";

        // 接続URL
        $url = "https://stbfep.sps-system.com/api/xmlapi.do";

        // データ送信処理
        $ch = curl_init(); 
        
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_POST, true );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch, CURLOPT_USERPWD, $merchant_id . $service_id . ":" . $hashkey );
        curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
        curl_setopt( $ch, CURLOPT_TIMEOUT, 60 );
        curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: text/xml' ) ) ;
        curl_setopt( $ch, CURLOPT_SSLVERSION, 1 );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
        curl_setopt( $ch, CURLOPT_POSTFIELDS, $this->_postdata );
        
        $result = curl_exec( $ch );

        //返信データの処理
        $response = array(
            'success' => false,
            'message' => '',
            'body' => null
        );

        //curl_errnoが0より大きければ接続自体ができていない。
        if( curl_errno ( $ch ) > 0){
            $response['message'] = 'Sorry, but connection is failed. Please try again later.' . "\n ". curl_errno( $ch ).": ". curl_error($ch);
        }else{
            $xml_string = preg_replace( "/(encoding=[\'\"])Shift_JIS([\'\"])/", "$1utf-8$2", mb_convert_encoding( $result, 'utf-8', 'sjis-win' ) );
            $xml = simplexml_load_string( $xml_string );
            if( $xml ){
                if( $xml->res_result == 'OK' ){
                    $response['success'] = true;
                    $response['body'] = $xml;
                    $response['message'] = 'Transaction is succeeded.';
                }else{
                    $code = substr( $xml->res_err_code, 3, 2 );
                    if( defined( 'WP_DEBUG' ) && WP_DEBUG ){
                        $response['message'] = '['.$xml->res_err_code.'] ';
                    }
                    if( array_key_exists( $code, $this->error_msg ) && defined( 'WP_DEBUG' ) && WP_DEBUG ){
                        $response['message'] .= $this->error_msg[$code];
                    }else{
                        $response['message'] = '['.$xml->res_err_code.'] '.'Sorry, but connection is failed. Please try again later.';
                    }
                }
            }else{
                $response['message'] = 'Sorry, but connection is failed. Please try again later.';
            }
        }

        curl_close($ch);
        return $response;
    }

    private function _set_form_data( $form_data )
    {
        
        foreach( $this->_send_data_form_container as $key => $value )
        {
            $this->_send_data_form_container[$key] = !empty( $data[$key] ) ? $data[$key] : '';
        }
        
        return false;  
    }

    private function _set_system_data( $form_data )
    {
        /*
        ここでは、プログラム側で取得スべき値、例えば製品IDから、価格や商品名、型番を取得したり、
        請求番号などを作成して、$this->_send_data_system_containerに保存する。
        今回は、特に準備していないので、return falseにしておく
        */
        return false;
    }
    
    private function _set_fixed_data()
    {
        /*
        ここでは、SBペイメントサービスに登録した際に与えられるデータをセット。
        本来ならば、事前に管理画面から値を登録しておいてget_optionでそれぞれの項目を埋めていくのだけれど
        今回は、特に準備していないので、return falseにしておく
        */
        return false;
    }


    public function generate_order_id()
    {
		    return uniqid(sprintf('%s-%06d-', $this->prefix, rand(0,999999)), true);
	  }
}

送信結果

以上のコードで決済用サンプ~商品ページ | WordPressのプラグインを作ろうから送信ボタンを押すと、chromeのコンソールに以下の様な結果が出力されます。

次は、この結果をフォームページに反映させることにします。