<?php
/*
 * Copyright (c) 2018-2021 Atipay, (https://www.atipay.net)

 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 * */

define('ATIPAY_URL','https://mipg.atipay.net/v1/');
define('ATIPAY_TOKEN_URL',ATIPAY_URL . 'get-token');
define('ATIPAY_REDIRECT_TO_PSP_URL',ATIPAY_URL . 'redirect-to-gateway');
define('ATIPAY_VERIFY_URL',ATIPAY_URL . 'verify-payment');

function fn_atipay_get_token($params)
{

    $r = wsRequestPost(ATIPAY_TOKEN_URL,$params);
    $return = array();
    if ($r){
        if (isset($r['status']) && !empty($r['status'])){
            $status = $r['status'];
            if ($status == 1){
                 $return['success']=1;
                 $return['token']=$r['token'];
            }else{
                $return['success']=0;
                $return['']=$r['errorDescription'];
            }
        }else{
            $return['success']=0;
            if (isset($r['faMessage']) && !empty($r['faMessage'])){
                $return['errorMessage'] = $r['faMessage'];
            }else{
                $return['errorMessage'] = "خطا در دریافت توکن پرداخت";
            }
        }

    }else{
        $return['success']=0;
        $return['errorMessage'] = "خطا در دریافت اطلاعات توکن پرداخت";
    }

    return $return;
}


function fn_atipay_redirect_to_psp_form($token)
{
    $form = _fn_generate_redirect_form($token);
    return $form;
}

function _fn_generate_redirect_form($token)
{

    $form = '<form action="'.ATIPAY_REDIRECT_TO_PSP_URL.'" method="POST" align="center" name="atipay_psp_form" id="atipay_psp_form">';
    $form .= '<input type="hidden" value="'.$token.'" name="token" >';
    $form .= "<input type='submit' value='' class='d-none'/>";
    $form .= '</form><script>document.getElementById("atipay_psp_form").submit(); </script>';

    return $form;
}

function fn_atipay_get_token_form($params, $submit_text,$action)
{
    $form = _fn_generate_get_token_form($params, $submit_text, $action);
    return $form;
}

function _fn_generate_get_token_form($params, $submit_text, $action)
{

    $form ="<form action='$action' method='POST' align='center' name='atipay_payment_form_token' id='atipay_payment_form_token' >";
    foreach ($params as $k=>$v){
        $form .= "<input type='hidden' value='$v' name='$k' >";
    }

    $form .= "<input type='submit' value='$submit_text' name='submit' >";
    $form .= "</form>";

    return $form;
}

function fn_check_callback_data($params)
{
    $result = array();
    if (isset($params['state']) && !empty($params['state'])){
        $state = $params['state'];
        if ($state == 'OK'){
            $result['success']=1;
            $result['error']="";
        }else{
            $result['success']=0;
            $result['error']= _fn_return_state_text($state);
        }
    }else{
        $result['success']=0;
        $result['error']="خطای نامشخص در پرداخت. در صورتیکه مبلغی از شما کسر شده باشد، برگشت داده می شود.";
    }

    return $result;
}

function fn_atipay_verify_payment($params,$amount)
{
    $r = wsRequestPost(ATIPAY_VERIFY_URL,$params);
    $return = array();
    if ($r){
        if (isset($r['amount']) && !empty($r['amount'])){
            if ($r['amount'] == $amount){
                $return['success']=1;
                $return['errorMessage']="";
            }else{
                $return['success']=0;
                $return['errorMessage']="خطا در تایید مبلغ پرداخت.در صورتیکه مبلغی از شما کسر شده باشد، برگشت داده می شود.";
            }
        }else{
            $return['success']=0;
            $return['errorMessage']="خطا در تایید اطلاعات پرداخت. در صورتیکه مبلغی از شما کسر شده باشد، برگشت داده می شود.";
        }
    }else{
        $return['success']=0;
        $return['errorMessage'] = "خطا در تایید نهایی پرداخت. در صورتیکه مبلغی از شما کسر شده باشد، برگشت داده می شود.";
    }

    return $return;
}

function _fn_return_state_text($state)
{
    switch ($state){
        case "CanceledByUser":
            return "پرداخت توسط شما لغو شده است.";
            break;
        case "Failed":
            return "پرداخت انجام نشد.";
            break;
        case "SessionIsNull":
            return "کاربر در بازه زمانی تعیین شده پاسخی ارسال نکرده است";
            break;
        case "InvalidParameters":
            return "پارامترهاي ارسالی نامعتبر است";
            break;
        case "MerchantIpAddressIsInvalid":
            return "آدرس سرور پذیرنده نامعتبر است";
            break;
        case "TokenNotFound":
            return "توکن ارسال شده یافت نشد";
            break;
        case "TokenRequired":
            return "با این شماره ترمینال فقط تراکنش هاي توکنی قابل پرداخت هستند";
            break;
        case "TerminalNotFound":
            return "شماره ترمینال ارسال شده یافت نشد";
            break;
        default:
            return "خطای نامشخص در عملیات پرداخت";

    }
}


function fn_check_callback_params($params)
{
    if (!isset($params['state']) ||
        !isset($params['status']) ||
        !isset($params['reservationNumber']) ||
        !isset($params['referenceNumber']) ||
        !isset($params['terminalId']) ||
        !isset($params['traceNumber'])){
        return false;
    }else{
        return true;
    }
}





function wsRequestGet($url)
{
    set_time_limit(30);

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout in seconds
    $json = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpcode == "200"){
        //nothing YET
    }else{
        $json= json_encode(array('error'=>'Y'));
    }

    return $json;
}

function wsRequestPost($url,$params)
{
    set_time_limit(30);
    $ch = curl_init($url);
    $postFields = json_encode($params);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout in seconds
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json;"));
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$postFields);
    $json = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpcode == "200"){
        return json_decode($json,true);
    }else{
        $json = array('error'=>'Y','jsonError'=>$httpcode,'message'=>$httpcode);
    }

    return $json;
}


function fn_atipay_get_invoice($invoice_id)
{
    $command = 'GetInvoice';
    $postData = array(
        'invoiceid' => $invoice_id,
    );
    $results = localAPI($command, $postData);
    return $results;

}
?>

