<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های ArefMohajerRad</title>
        <link>https://virgool.io/feed/@ArefMohajer</link>
        <description>برنامه نویس،طراح وب،عاشق کارآفرینی</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:57:55</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1421127/avatar/mrCd99.jpeg?height=120&amp;width=120</url>
            <title>ArefMohajerRad</title>
            <link>https://virgool.io/@ArefMohajer</link>
        </image>

                    <item>
                <title>sandbox درگاه زرین پال</title>
                <link>https://virgool.io/@ArefMohajer/sandbox-%D8%AF%D8%B1%DA%AF%D8%A7%D9%87-%D8%B2%D8%B1%DB%8C%D9%86-%D9%BE%D8%A7%D9%84-lnypdjxdrkuk</link>
                <description>zarinpal_function.php:&lt;?php
/*
 * ZarinPal Advanced Class

 * author  : aref mohajer
 * e-mail  : amohajerrad@@gmail.com

*/

class zarinpal
{
    private function curl_check()
    {
        return (function_exists(&#039;curl_version&#039;)) ? true : false;
    }

    private function soap_check()
    {
        return (extension_loaded(&#039;soapx&#039;)) ? true : false;
    }

    private function error_message($code, $desc, $cb, $request=false)
    {
        if (empty($cb) &amp;&amp; $request === true)
        {
            return &amp;quotلینک بازگشت ( CallbackURL ) نباید خالی باشد&quot;
        }

        if (empty($desc) &amp;&amp; $request === true)
        {
            return &amp;quotتوضیحات تراکنش ( Description ) نباید خالی باشد&quot;
        }


        $error = array(
            &amp;quot-1&amp;quot   =&gt; &amp;quotاطلاعات ارسال شده ناقص است.&amp;quot,
            &amp;quot-2&amp;quot   =&gt; &amp;quotIP و يا مرچنت كد پذيرنده صحيح نيست&amp;quot,
            &amp;quot-3&amp;quot   =&gt; &amp;quotبا توجه به محدوديت هاي شاپرك امكان پرداخت با رقم درخواست شده ميسر نمي باشد&amp;quot,
            &amp;quot-4&amp;quot   =&gt; &amp;quotسطح تاييد پذيرنده پايين تر از سطح نقره اي است.&amp;quot,
            &amp;quot-11&amp;quot  =&gt; &amp;quotدرخواست مورد نظر يافت نشد.&amp;quot,
            &amp;quot-12&amp;quot  =&gt; &amp;quotامكان ويرايش درخواست ميسر نمي باشد.&amp;quot,
            &amp;quot-21&amp;quot  =&gt; &amp;quotهيچ نوع عمليات مالي براي اين تراكنش يافت نشد&amp;quot,
            &amp;quot-22&amp;quot  =&gt; &amp;quotتراكنش نا موفق ميباشد&amp;quot,
            &amp;quot-33&amp;quot  =&gt; &amp;quotرقم تراكنش با رقم پرداخت شده مطابقت ندارد&amp;quot,
            &amp;quot-34&amp;quot  =&gt; &amp;quotسقف تقسيم تراكنش از لحاظ تعداد يا رقم عبور نموده است&amp;quot,
            &amp;quot-40&amp;quot  =&gt; &amp;quotاجازه دسترسي به متد مربوطه وجود ندارد.&amp;quot,
            &amp;quot-41&amp;quot  =&gt; &amp;quotاطلاعات ارسال شده مربوط به AdditionalData غيرمعتبر ميباشد.&amp;quot,
            &amp;quot-42&amp;quot  =&gt; &amp;quotمدت زمان معتبر طول عمر شناسه پرداخت بايد بين 30 دقيه تا 45 روز مي باشد.&amp;quot,
            &amp;quot-54&amp;quot  =&gt; &amp;quotدرخواست مورد نظر آرشيو شده است&amp;quot,
            &amp;quot100&amp;quot  =&gt; &amp;quotعمليات با موفقيت انجام گرديده است.&amp;quot,
            &amp;quot101&amp;quot  =&gt; &amp;quotعمليات پرداخت موفق بوده و قبلا PaymentVerification تراكنش انجام شده است.&amp;quot,
        );

        if (array_key_exists(&amp;quot{$code}&amp;quot, $error))
        {
            return $error[&amp;quot{$code}&amp;quot];
        } else {
            return &amp;quotخطای نامشخص هنگام اتصال به درگاه زرین پال&quot;
        }
    }

    private function zarinpal_node()
    {
        if ($this-&gt;curl_check() === true)
        {
            $ir_ch = curl_init(&amp;quothttps://www.zarinpal.com/pg/services/WebGate/wsdl&amp;quot);
 curl_setopt($ir_ch, CURLOPT_TIMEOUT, 1);
 curl_setopt($ir_ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ir_ch, CURLOPT_RETURNTRANSFER, true);
 curl_exec&#40;$ir_ch&#41;;
            $ir_info = curl_getinfo($ir_ch);
 curl_close($ir_ch);

            $de_ch = curl_init(&amp;quothttps://de.zarinpal.com/pg/services/WebGate/wsdl&amp;quot);
 curl_setopt($de_ch, CURLOPT_TIMEOUT, 1);
 curl_setopt($de_ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($de_ch, CURLOPT_RETURNTRANSFER, true);
 curl_exec&#40;$de_ch&#41;;
            $de_info = curl_getinfo($de_ch);
 curl_close($de_ch);

            $ir_total_time = (isset($ir_info[&#039;total_time&#039;]) &amp;&amp; $ir_info[&#039;total_time&#039;] &gt; 0) ? $ir_info[&#039;total_time&#039;] : false;
            $de_total_time = (isset($de_info[&#039;total_time&#039;]) &amp;&amp; $de_info[&#039;total_time&#039;] &gt; 0) ? $de_info[&#039;total_time&#039;] : false;

            return ($ir_total_time === false || $ir_total_time &gt; $de_total_time) ? &amp;quotde&amp;quot : &amp;quotir&quot;
        } else {
            if (function_exists(&#039;fsockopen&#039;))
            {
                $de_ping   = $this-&gt;zarinpal_ping(&amp;quotde.zarinpal.com&amp;quot, 80, 1);
                $ir_ping   = $this-&gt;zarinpal_ping(&amp;quotwww.zarinpal.com&amp;quot, 80, 1);

                $de_domain     = &amp;quothttps://de.zarinpal.com/pg/services/WebGate/wsdl&quot;
                $ir_domain     = &amp;quothttps://www.zarinpal.com/pg/services/WebGate/wsdl&quot;

                $ir_total_time = (isset($ir_ping) &amp;&amp; $ir_ping &gt; 0) ? $ir_ping : false;
                $de_total_time = (isset($de_ping) &amp;&amp; $de_ping &gt; 0) ? $de_ping : false;

                return ($ir_total_time === false || $ir_total_time &gt; $de_total_time) ? &amp;quotde&amp;quot : &amp;quotir&quot;
            } else {
                $webservice = &amp;quothttps://www.zarinpal.com/pg/services/WebGate/wsd&quot;
                $headers   = @get_headers($webservice);

                return (strpos($headers[0], &#039;200&#039;) === false) ? &amp;quotde&amp;quot : &amp;quotir&quot;
            }
        }
    }

    private function zarinpal_ping($host, $port, $timeout)
    {
        $time_b    = microtime(true);
        $fsockopen     = @fsockopen&#40;$host, $port, $errno, $errstr, $timeout&#41;;

        if (!$fsockopen)
        {
            return false;
        }  else {
            $time_a = microtime(true);
            return round((($time_a - $time_b) * 1000), 0);
        }
    }

    public function redirect($url)
    {
        @header(&#039;Location: &#039;. $url);
        echo &amp;quot&lt;meta http-equiv=&#039;refresh&#039; content=&#039;0; url={$url}&#039; /&gt;&quot;
        echo &amp;quot.href = &#039;{$url}&#039;;&quot;
        exit;
    }

    public function request($MerchantID, $Amount, $Description=&amp;quot&amp;quot, $Email=&amp;quot&amp;quot, $Mobile=&amp;quot&amp;quot, $CallbackURL, $SandBox=false, $ZarinGate=false)
    {
        $ZarinGate = ($SandBox == true) ? false : $ZarinGate;

        if ($this-&gt;soap_check() === true)
        {
            $node  = ($SandBox == true) ? &amp;quotsandbox&amp;quot : $this-&gt;zarinpal_node();
            $upay  = ($SandBox == true) ? &amp;quotsandbox&amp;quot : &amp;quotwww&quot;

            $client = new SoapClient(&amp;quothttps://{$node}.zarinpal.com/pg/services/WebGate/wsdl&amp;quot, [&#039;encoding&#039; =&gt; &#039;UTF-8&#039;]);

            $result = $client-&gt;PaymentRequest([
                &#039;MerchantID&#039;     =&gt; $MerchantID,
                &#039;Amount&#039;         =&gt; $Amount,
                &#039;Description&#039;    =&gt; $Description,
                &#039;Email&#039;          =&gt; $Email,
                &#039;Mobile&#039;         =&gt; $Mobile,
                &#039;CallbackURL&#039;    =&gt; $CallbackURL,
            ]);

            $Status       = (isset($result-&gt;Status)     &amp;&amp; $result-&gt;Status != &amp;quot&amp;quot)     ? $result-&gt;Status : 0;
            $Authority        = (isset($result-&gt;Authority)   &amp;&amp; $result-&gt;Authority != &amp;quot&amp;quot)   ? $result-&gt;Authority : &amp;quot&quot;
            $StartPay     = (isset($result-&gt;Authority)   &amp;&amp; $result-&gt;Authority != &amp;quot&amp;quot)   ? &amp;quothttps://{$upay}.zarinpal.com/pg/StartPay/&amp;quot. $Authority : &amp;quot&quot;
            $StartPayUrl   = (isset($ZarinGate)         &amp;&amp; $ZarinGate == true)           ? &amp;quot{$StartPay}/ZarinGate&amp;quot : $StartPay;

            return array(
                &amp;quotNode&amp;quot        =&gt; &amp;quot{$node}&amp;quot,
                &amp;quotMethod&amp;quot   =&gt; &amp;quotSOAP&amp;quot,
                &amp;quotStatus&amp;quot   =&gt; $Status,
                &amp;quotMessage&amp;quot  =&gt; $this-&gt;error_message($Status, $Description, $CallbackURL, true),
                &amp;quotStartPay&amp;quot     =&gt; $StartPayUrl,
                &amp;quotAuthority&amp;quot =&gt; $Authority
            );
        } else {
            $node  = ($SandBox == true) ? &amp;quotsandbox&amp;quot : &amp;quotir&quot;
            $upay  = ($SandBox == true) ? &amp;quotsandbox&amp;quot : &amp;quotwww&quot;

            $data = array(
                &#039;MerchantID&#039;     =&gt; $MerchantID,
                &#039;Amount&#039;         =&gt; $Amount,
                &#039;Description&#039;    =&gt; $Description,
                &#039;CallbackURL&#039;    =&gt; $CallbackURL,
            );

            $jsonData = json_encode($data);
            $ch = curl_init(&amp;quothttps://{$upay}.zarinpal.com/pg/rest/WebGate/PaymentRequest.json&amp;quot);
 curl_setopt($ch, CURLOPT_USERAGENT, &#039;ZarinPal Rest Api v1&#039;);
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#039;POST&#039;);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array(&#039;Content-Type: application/json&#039;, &#039;Content-Length: &#039; . strlen($jsonData)));

            $result = curl_exec&#40;$ch&#41;;
            $err   = curl_error($ch);
 curl_close($ch);

            $result = json_decode($result, true);

            if ($err)
            {
                $Status       = 0;
                $Message      = &amp;quotcURL Error #:&amp;quot . $err;
                $Authority        = &amp;quot&quot;
                $StartPay     = &amp;quot&quot;
                $StartPayUrl   = &amp;quot&quot;
            } else {
                $Status       = (isset($result[&amp;quotStatus&amp;quot])    &amp;&amp; $result[&amp;quotStatus&amp;quot] != &amp;quot&amp;quot)    ? $result[&amp;quotStatus&amp;quot] : 0;
                $Message      = $this-&gt;error_message($Status, $Description, $CallbackURL, true);
                $Authority        = (isset($result[&amp;quotAuthority&amp;quot])     &amp;&amp; $result[&amp;quotAuthority&amp;quot] != &amp;quot&amp;quot)     ? $result[&amp;quotAuthority&amp;quot] : &amp;quot&quot;
                $StartPay     = (isset($result[&amp;quotAuthority&amp;quot])     &amp;&amp; $result[&amp;quotAuthority&amp;quot] != &amp;quot&amp;quot)     ? &amp;quothttps://{$upay}.zarinpal.com/pg/StartPay/&amp;quot. $Authority : &amp;quot&quot;
                $StartPayUrl   = (isset($ZarinGate)         &amp;&amp; $ZarinGate == true)           ? &amp;quot{$StartPay}/ZarinGate&amp;quot : $StartPay;
            }

            return array(
                &amp;quotNode&amp;quot        =&gt; &amp;quot{$node}&amp;quot,
                &amp;quotMethod&amp;quot   =&gt; &amp;quotCURL&amp;quot,
                &amp;quotStatus&amp;quot   =&gt; $Status,
                &amp;quotMessage&amp;quot  =&gt; $Message,
                &amp;quotStartPay&amp;quot     =&gt; $StartPayUrl,
                &amp;quotAuthority&amp;quot =&gt; $Authority
            );
        }
    }

    public function verify($MerchantID, $Amount, $SandBox=false, $ZarinGate=false)
    {
        $ZarinGate = ($SandBox == true) ? false : $ZarinGate;

        if ($this-&gt;soap_check() === true)
        {
            $au    = (isset($_GET[&#039;Authority&#039;]) &amp;&amp; $_GET[&#039;Authority&#039;] != &amp;quot&amp;quot) ? $_GET[&#039;Authority&#039;] : &amp;quot&quot;
            $node  = ($SandBox == true) ? &amp;quotsandbox&amp;quot : $this-&gt;zarinpal_node();

            $client = new SoapClient(&amp;quothttps://{$node}.zarinpal.com/pg/services/WebGate/wsdl&amp;quot, [&#039;encoding&#039; =&gt; &#039;UTF-8&#039;]);

            $result = $client-&gt;PaymentVerification([
                &#039;MerchantID&#039;     =&gt; $MerchantID,
                &#039;Authority&#039;      =&gt; $au,
                &#039;Amount&#039;         =&gt; $Amount,
            ]);

            $Status       = (isset($result-&gt;Status)     &amp;&amp; $result-&gt;Status != &amp;quot&amp;quot)     ? $result-&gt;Status  : 0;
            $RefID           = (isset($result-&gt;RefID)      &amp;&amp; $result-&gt;RefID != &amp;quot&amp;quot)      ? $result-&gt;RefID   : &amp;quot&quot;
            $Message      = $this-&gt;error_message($Status, &amp;quot&amp;quot, &amp;quot&amp;quot, false);

            return array(
                &amp;quotNode&amp;quot        =&gt; &amp;quot{$node}&amp;quot,
                &amp;quotMethod&amp;quot   =&gt; &amp;quotSOAP&amp;quot,
                &amp;quotStatus&amp;quot   =&gt; $Status,
                &amp;quotMessage&amp;quot  =&gt; $Message,
                &amp;quotAmount&amp;quot   =&gt; $Amount,
                &amp;quotRefID&amp;quot    =&gt; $RefID,
                &amp;quotAuthority&amp;quot =&gt; $au
            );
        } else {
            $au    = (isset($_GET[&#039;Authority&#039;]) &amp;&amp; $_GET[&#039;Authority&#039;] != &amp;quot&amp;quot) ? $_GET[&#039;Authority&#039;] : &amp;quot&quot;
            $node  = ($SandBox == true) ? &amp;quotsandbox&amp;quot : &amp;quotir&quot;
            $upay  = ($SandBox == true) ? &amp;quotsandbox&amp;quot : &amp;quotwww&quot;

            $data = array(&#039;MerchantID&#039; =&gt; $MerchantID, &#039;Authority&#039; =&gt; $au, &#039;Amount&#039; =&gt; $Amount);
            $jsonData = json_encode($data);
            $ch = curl_init(&amp;quothttps://{$upay}.zarinpal.com/pg/rest/WebGate/PaymentVerification.json&amp;quot);
 curl_setopt($ch, CURLOPT_USERAGENT, &#039;ZarinPal Rest Api v1&#039;);
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#039;POST&#039;);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array(&#039;Content-Type: application/json&#039;, &#039;Content-Length: &#039; . strlen($jsonData)));

            $result = curl_exec&#40;$ch&#41;;
            $err   = curl_error($ch);
 curl_close($ch);

            $result = json_decode($result, true);

            if ($err)
            {
                $Status       = 0;
                $Message      = &amp;quotcURL Error #:&amp;quot . $err;
                $Status       = &amp;quot&quot;
                $RefID           = &amp;quot&quot;
            } else {
                $Status       = (isset($result[&amp;quotStatus&amp;quot]) &amp;&amp; $result[&amp;quotStatus&amp;quot] != &amp;quot&amp;quot) ? $result[&amp;quotStatus&amp;quot] : 0;
                $RefID           = (isset($result[&#039;RefID&#039;])     &amp;&amp; $result[&#039;RefID&#039;] != &amp;quot&amp;quot)     ? $result[&#039;RefID&#039;]     : &amp;quot&quot;
                $Message      = $this-&gt;error_message($Status, &amp;quot&amp;quot, &amp;quot&amp;quot, false);
            }

            return array(
                &amp;quotNode&amp;quot        =&gt; &amp;quot{$node}&amp;quot,
                &amp;quotMethod&amp;quot   =&gt; &amp;quotCURL&amp;quot,
                &amp;quotStatus&amp;quot   =&gt; $Status,
                &amp;quotMessage&amp;quot  =&gt; $Message,
                &amp;quotAmount&amp;quot   =&gt; $Amount,
                &amp;quotRefID&amp;quot    =&gt; $RefID,
                &amp;quotAuthority&amp;quot =&gt; $au
            );
        }
    }
}request.php:&lt;?php
/*
 * ZarinPal Advanced Class
 *

* author  : aref mohajer  * e-mail  : amohajerrad@gmail.com
*/

require_once(&amp;quotzarinpal_function.php&amp;quot);

$MerchantID    = &amp;quotxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&quot;
$Amount       = 100;
$Description   = &amp;quotتراکنش زرین پال&quot;
$Email           = &amp;quot&quot;
$Mobile       = &amp;quot&quot;
$CallbackURL   = &amp;quothttps://club.sabzgasht.com/zarin/verify.php&quot;
$ZarinGate        = false;
$SandBox      = true;

$zp    = new zarinpal();
$result = $zp-&gt;request($MerchantID, $Amount, $Description, $Email, $Mobile, $CallbackURL, $SandBox, $ZarinGate);

if (isset($result[&amp;quotStatus&amp;quot]) &amp;&amp; $result[&amp;quotStatus&amp;quot] == 100)
{
 // Success and redirect to pay
 $zp-&gt;redirect($result[&amp;quotStartPay&amp;quot]);
} else {
 // error
 echo &amp;quotخطا در ایجاد تراکنش&quot;
    echo &amp;quot&lt;br /&gt;کد خطا : &amp;quot. $result[&amp;quotStatus&amp;quot];
    echo &amp;quot&lt;br /&gt;تفسیر و علت خطا : &amp;quot. $result[&amp;quotMessage&amp;quot];
}verify.php:&lt;?php
/*
 * ZarinPal Advanced Class

 * author  : aref mohajer
 * e-mail  : amohajerrad@gmail.com

*/
require_once(&amp;quotzarinpal_function.php&amp;quot);

$MerchantID    = &amp;quotxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&quot;
$Amount       = 100;
$ZarinGate        = false;
$SandBox      = true;

$zp    = new zarinpal();
$result = $zp-&gt;verify($MerchantID, $Amount, $SandBox, $ZarinGate);

if (isset($result[&amp;quotStatus&amp;quot]) &amp;&amp; $result[&amp;quotStatus&amp;quot] == 100)
{
 // Success
 echo &amp;quotتراکنش با موفقیت انجام شد&quot;
    echo &amp;quot&lt;br /&gt;مبلغ : &amp;quot. $result[&amp;quotAmount&amp;quot];
    echo &amp;quot&lt;br /&gt;کد پیگیری : &amp;quot. $result[&amp;quotRefID&amp;quot];
    echo &amp;quot&lt;br /&gt;Authority : &amp;quot. $result[&amp;quotAuthority&amp;quot];
} else {
 // error
 echo &amp;quotپرداخت ناموفق&quot;
    echo &amp;quot&lt;br /&gt;کد خطا : &amp;quot. $result[&amp;quotStatus&amp;quot];
    echo &amp;quot&lt;br /&gt;تفسیر و علت خطا : &amp;quot. $result[&amp;quotMessage&amp;quot];
}</description>
                <category>ArefMohajerRad</category>
                <author>ArefMohajerRad</author>
                <pubDate>Mon, 27 Dec 2021 12:11:31 +0330</pubDate>
            </item>
            </channel>
</rss>