EST支付网关(土耳其)的虚拟POS接口

dev-master 2020-01-24 14:07 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:00:32 UTC


README

基于PHP的EST虚拟POS系统接口

EST

此接口专为连接EST虚拟POS接口和通过信用卡进行订单处理而开发。

此接口仅与以下银行的虚拟POS接口兼容:工商银行中国银行农业银行建设银行交通银行。对于其他EST接口不适用。

EST是土耳其电子商务安全的支付系统和服务的提供商。几乎所有在土耳其开展电子商务的银行都通过使用EST的产品、解决方案或服务之一来执行电子商务支付。

安装

此接口可以在PHP 5.3.2或更高版本中使用。为了安装,您需要安装composer包管理器。

$ php composer.phar install

使用

为了使用此接口,您需要提供商户号用户名密码信息。为了使用每个银行的虚拟POS接口,您需要分别获取这些信息。如果您需要获取这些信息,请发送电子邮件至destek@est.com.tr

此接口可以执行以下POS操作:

  • 下单,
  • 取消订单,
  • 从订单中退还部分金额,
  • 查看已下订单的详细信息,

所有对虚拟POS系统的请求都由EST类进行管理。为了使EST类能够执行上述操作,已定义以下方法。

  • purchase() ~ 调用此方法以下单。
  • postAuth() ~ 调用此方法从卡中提取已冻结的金额。
  • cancel() ~ 调用此方法以取消订单。
  • refund() ~ 调用此方法从订单中退还部分金额。
  • getDetail() ~ 调用此方法以查看订单的详细信息。
require 'est.php';
$api = new EST("akbank", "100100000", "AKTEST", "AKTEST123", $debug=TRUE);

如果您想在真实环境中工作而不是测试服务器,请将debug参数设置为FALSE。

为了发送订单请求,需要调用.pay()方法。调用此方法需要以下参数。

$cc_num = "5456165456165454"; // kart numarası
$cc_cvv = "000";
$month = "12";
$year = "12";
$amount = 10.00;
$taksit = 0; // peşin
$order_num = "qwaszx"; // sipariş numarası
$result = $api->pay($cc_num, $cc_cvv, $month, $year, $amount, $taksit, $order_num);
print_r($result);
Array
(
    [orderid] => qwaszx
    [transid] => 10177-TeYF-1-1543
    [groupid] => qwaszx
    [response] => Approved
    [return_code] => 00
    [error_msg] =>
    [host_msg] => Onay
    [auth_code] => 116745
    [result] => 1
    [transaction_time] => Array
        (
            [tm_sec] => 24
            [tm_min] => 30
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

如果我们使用相同的订单号重复发送请求,则会收到错误。

$result = $api->pay($cc_num, $cc_cvv, $month, $year, $amount, $taksit, $order_num);
print_r($result);
Array
(
    [orderid] => qwaszx
    [transid] => 10177-TfgE-1-1544
    [groupid] => qwaszx
    [response] => Error
    [return_code] => 99
    [error_msg] => Bu siparis numarasi ile zaten basarili bir siparis var.
    [host_msg] =>
    [auth_code] =>
    [result] =>
    [transaction_time] => Array
        (
            [tm_sec] => 32
            [tm_min] => 31
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

在额外参数中,您可以设置有关发票地址交付地址的详细信息。

$extra = array("shipping_address_name" => "Ev Adresim", "billing_address_name" => "Fatura Adresim");
$api->pay($cc_num, $cc_cvv, $month, $year, $amount, $taksit, $order_num, $typ="Auth", $extra=$extra);

为了在用户的信用卡上冻结一定金额,需要将typ参数发送为PreAuth

$api->pay($cc_num, $cc_cvv, $month, $year, $amount, $taksit, $order_num, $typ="PreAuth");

为了从用户卡片中提取我们冻结的金额,需要调用带有所需金额的.postAuth()方法。

$result = $api->postAuth($amount, $order_num);
print_r($result);
Array
(
    [orderid] => qwaszx
    [transid] => 10177-TpIF-1-1549
    [groupid] => qwaszx
    [response] => Approved
    [return_code] => 00
    [error_msg] =>
    [host_msg] =>
    [auth_code] => 691348
    [host_ref_num] => 017719080777
    [result] => 1
    [transaction_time] => Array
        (
            [tm_sec] => 8
            [tm_min] => 41
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

要取消订单或已进行的postAuth请求,需要调用.cancel()方法。需要提供订单号作为参数。

$result = $api->cancel($order_num);
print_r($result);
Array
(
    [orderid] => qwaszx
    [transid] => 10177-TpIF-1-1549
    [groupid] => qwaszx
    [response] => Approved
    [return_code] => 00
    [error_msg] =>
    [host_msg] =>
    [auth_code] => 691348
    [host_ref_num] => 017719080777
    [result] => 1
    [transaction_time] => Array
        (
            [tm_sec] => 8
            [tm_min] => 41
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

如果尝试取消一个不存在或之前已取消的订单,则从服务器收到以下响应。

$result = $api->cancel("123456abcdef");
print_r($result);
Array
(
    [orderid] => 123456abcdef
    [transid] => 10177-TtuB-1-1556
    [groupid] => 123456abcdef
    [response] => Error
    [return_code] => 99
    [error_msg] => İptal edilmeye uygun satış işlemi bulunamadı.
    [host_msg] =>
    [auth_code] =>
    [host_ref_num] =>
    [result] =>
    [transaction_time] => Array
        (
            [tm_sec] => 46
            [tm_min] => 45
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

为了从订单中退还特定金额,需要调用.refund()方法。

$result = $api->refund($amount = 5.00, $orderid = $order_num);
print_r($result);
Array
(
    [orderid] => qwaszx
    [transid] => 10177-TxYA-1-1558
    [groupid] => qwaszx
    [response] => Approved
    [return_code] => 00
    [error_msg] =>
    [host_msg] => Onay
    [auth_code] => 154681
    [host_ref_num] => 017719080780
    [result] => 1
    [transaction_time] => Array
        (
            [tm_sec] => 24
            [tm_min] => 49
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

如果尝试取消比订单总额更大的金额,则会收到以下响应。

$result = $api->refund($amount = 9999.0, $orderid = $order_num);
print_r($result);
Array
(
    [orderid] => qwaszx
    [transid] => 10177-TybA-1-1559
    [groupid] => qwaszx
    [response] => Error
    [return_code] => 99
    [error_msg] => Net miktardan fazlasi iade edilemez.
    [host_msg] =>
    [auth_code] =>
    [host_ref_num] =>
    [result] =>
    [transaction_time] => Array
        (
            [tm_sec] => 27
            [tm_min] => 50
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

如果您想取消使用.refund()方法进行的退款请求,则需要将退款操作返回的transidorderid值发送到.cancel()方法。

$result = $api->cancel($orderid = $order_num, $transid = '10177-TxYA-1-1558');
print_r($result);
Array
(
    [orderid] => qwaszx
    [transid] => 10177-TxYA-1-1558
    [groupid] => qwaszx
    [response] => Approved
    [return_code] => 00
    [error_msg] =>
    [host_msg] =>
    [auth_code] => 154681
    [host_ref_num] => 017719080780
    [result] => 1
    [transaction_time] => Array
        (
            [tm_sec] => 24
            [tm_min] => 49
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

要了解之前下过的订单的详细信息,需要使用.getDetail()方法。此方法需要一个订单号作为参数。

$result = $api->getDetail($order_num);
print_r($result);
Array
(
    [transid] => 10177-TK3E-1-1540
    [orderid] => testorderid01234
    [return_code] => 00
    [host_ref_num] => 017719080774
    [error_msg] => Record(s) found for testorderid01234
    [charge_type] => S
    [auth_code] => 931005
    [amount] => 10
    [transaction_time] => Array
        (
            [tm_sec] => 53
            [tm_min] => 10
            [tm_hour] => 19
            [tm_mday] => 26
            [tm_mon] => 5
            [tm_year] => 110
            [tm_wday] => 6
            [tm_yday] => 176
            [unparsed] =>
        )

)

取消和退款之间的区别

众所周知,虚拟POS设备也像真实POS设备一样,存在日结的概念。日结的概念是指,在一天之内使用POS设备进行的交易(如取款和退款等)将在日终时,自动将交易金额转入POS所有者的银行账户。

订单的取消操作只能在日结前同一日内进行。前一天订单无法取消。前一天订单只能通过调用 .refund() 方法,输入订单金额来进行退款。

如果订单被取消,则订单创建和取消的详情不会出现在持卡人的交易明细中。如果进行退款,退款操作将反映在持卡人的交易明细中。大多数银行在日终时间为晚上 22:00。但是,银行可以根据自身情况调整这个时间。