ozgur/est

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

dev-master 2015-07-28 20:32 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:05:57 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()方法进行的退款请求,请将退款操作中返回的transid和orderid值发送到.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,但银行可以根据自身情况调整这个时间。