为土耳其银行提供的虚拟POS库


README

本包的目标是,通过一个公共的接口类,使所有土耳其银行虚拟POS系统可使用。

  • EST POS (Asseco) 基础架构已完全测试并准备好使用。已测试过Akbank、TEB和Ziraat银行。

  • Garanti Virtual POS 支付系统正在运行,但3D支付部分需要在生产环境中进行测试。

  • YapıKredi PosNet 系统3D支付正在运行,但尚未测试cancelrefund操作。

  • Finansbank PayFor 支持虚拟POS系统,由于Finansbank没有IP限制,您可以在localhost上运行examples目录中的示例代码进行测试。

  • VakifBank GET 7/24 MPI和VPOS 7/24 3D Secure支付运行正常,其他操作在发现问题后将进行修复。

  • InterPOS (Deniz bank) 已添加支持,在测试过程中将修复发现的问题。

  • Kuveyt POS 已添加3D Secure支付支持,在测试过程中将修复发现的问题。

主要标题

特性

  • 标准电子商务模型支付 (AbstractGateway::MODEL_NON_SECURE)
  • 3D Secure模型支付 (AbstractGateway::MODEL_3D_SECURE)
  • 3D Pay模型支付 (AbstractGateway::MODEL_3D_PAY)
  • 3D Host模型支付 (AbstractGateway::MODEL_3D_HOST)
  • 订单/支付查询 (AbstractGateway::TX_STATUS)
  • 订单/支付历史查询 (AbstractGateway::TX_HISTORY)
  • 订单/退款 (AbstractGateway::TX_REFUND)
  • 订单取消 (AbstractGateway::TX_CANCEL)

不同网关的单个操作流程

  • 要切换到不同银行,只需使用正确的AccountFactory方法来更改账户即可。
  • 要在3D3DPay3DHost支付之间切换,只需在账户配置中更改账户类型(例如AbstractGateway::MODEL_3D_PAY)。由于流程相同,因此无需更改代码。
  • 对于同一类型的操作,不同网关返回的值已格式化为相同。也就是说,您不需要更新代码。
  • 对于同一类型的操作,不同网关将发送相同格式的值。也就是说,您不需要更新代码。

最新更新

有关最新更改的详细信息,请参阅CHANGELOG

最低要求

  • PHP >= 7.1.3
  • ext-dom
  • ext-json
  • ext-openssl
  • ext-SimpleXML

安装

在您的测试服务器上;

$ mkdir pos-test && cd pos-test
$ composer require mews/pos

运行单元测试

在项目根目录中运行此命令

$ ./vendor/bin/phpunit tests

示例支付代码

config.php (配置文件)

<?php

require './vendor/autoload.php';

// API kullanıcı bilgileri
$account = \Mews\Pos\Factory\AccountFactory::createEstPosAccount(
'akbank', //pos config'deki ayarın index name'i
'yourClientID', 
'yourKullaniciAdi',
'yourSifre',
AbstractGateway::MODEL_3D_SECURE, //storetype
'yourStoreKey',
AbstractGateway::LANG_TR
);

// API kullanıcı hesabı ile paket bir değişkene aktarılıyor
try {
    $pos = \Mews\Pos\Factory\PosFactory::createPosGateway($account);
    //değere göre API URL'leri test veya production değerler kullanılır.
    $pos->setTestMode(true);
} catch (\Mews\Pos\Exceptions\BankNotFoundException | \Mews\Pos\Exceptions\BankClassNullException $e) {
    dd($e));
}

form.php (在从用户获取信用卡信息后运行的代码)

<?php

require 'config.php';

// Sipariş bilgileri
$order = [
    'id'          => 'BENZERSIZ-SIPERIS-ID',
    'amount'      => 1.01,
    'currency'    => 'TRY', //TRY|USD|EUR, optional. default: TRY
    'installment' => 0, //0 ya da 1'den büyük değer, optional. default: 0

    //MODEL_3D_SECURE, MODEL_3D_PAY, MODEL_3D_HOST odemeler icin zorunlu
    //Success ve Fail URL'ler farklı olabilir ama kütüphane success ve fail için aynı kod çalıştırır.
    'success_url' => 'https://example.com/response.php',
    'fail_url'    => 'https://example.com/response.php',

    //gateway'e gore zorunlu olan degerler
    'ip'          => $ip, //EstPos, Garanti, KuveytPos, VakifBank
    'email'       => 'mail@customer.com', // EstPos, Garanti, KuveytPos, VakifBank
    'name'        => 'John Doe', // EstPos, Garanti
    'user_id'     => 'Müşteri ID', // EstPos
    'rand'        => md5(uniqid(time())), // EstPos, Garanti, PayFor, InterPos, VakifBank. Rastegele değer.
    
    //lang degeri verilmezse account (EstPosAccount) dili kullanılacak
    'lang' => AbstractGateway::LANG_TR, //LANG_TR|LANG_EN. Kullanıcının yönlendirileceği banka gateway sayfasının ve gateway'den dönen mesajların dili.
];
$session->set('order', $order);
    
// Kredi kartı bilgieri
$card = \Mews\Pos\Factory\CreditCardFactory::create(
    $pos,
    '4444555566667777',
    '25',
    '12',
    '123',
    'john',
    AbstractCreditCard::CARD_TYPE_VISA, //bankaya göre zorunlu
  );

// API kullanıcısı ile oluşturulan $pos değişkenine prepare metoduyla sipariş bilgileri tanımlanıyor.
$pos->prepare($order, \Mews\Pos\Gateways\AbstractGateway::TX_PAY, $card);

try {
    // $formData icerigi form olarak banka gateway'ne yonlendirilir.
    // /examples/template/_redirect_form.php bakınız.
    $formData = $pos->get3DFormData();
} catch (\Throwable $e) {
    dd($e);
}

response.php (从网关返回后运行的代码)

<?php

require 'config.php';

$order = $session->get('order');

$pos->prepare($order, \Mews\Pos\Gateways\AbstractGateway::TX_PAY);

// Ödeme tamamlanıyor,
// Ödeme modeli (3D Secure, 3D Pay, 3D Host, Non Secure) $account tarafında belirlenir.
// $card değeri Non Secure modelde ve Vakıfbank için 3DPay ve 3DSecure ödemede zorunlu.
$pos->payment($card);

// Ödeme başarılı mı?
$pos->isSuccess();

// Sonuç çıktısı
dump($pos->getResponse());
//response içeriği için /examples/template/_payment_response.php dosyaya bakınız.

添加不同银行的虚拟POS

在您的项目目录中

$ cp ./vendor/mews/pos/config/pos.php ./pos_ayarlar.php

或者;

在项目中创建一个配置文件(例如pos_ayarlar.php),然后将包内的./config/pos.php文件的内容复制到这里。

<?php

return [
    
    //param birimleri Gateway'ler icinde tanımlıdır, özel bir mapping istemediğiniz sürece boş bırakınız
    'currencies'    => [
//        'TRY'       => 949,
//        'USD'       => 840,
    ],

    // Banka sanal pos tanımlamaları
    'banks'         => [
        'akbank'    => [
            'name'  => 'AKBANK T.A.S.',
            'class' => \Mews\Pos\Gateways\EstPos::class,
            'urls'  => [
                'production'    => 'https://www.sanalakpos.com/fim/api',
                'test'          => 'https://entegrasyon.asseco-see.com.tr/fim/api',
                'gateway'       => [
                    'production'    => 'https://www.sanalakpos.com/fim/est3Dgate',
                    'test'          => 'https://entegrasyon.asseco-see.com.tr/fim/est3Dgate',
                ],
            ]
        ],

        // Yeni eklenen banka
        'isbank'    => [
            'name'  => 'İŞ BANKASI .A.S.',
            'class' => \Mews\Pos\Gateways\EstPos::class, // Altyapı sınıfı
            'urls'  => [
                'production'    => 'xxxx', // API Url
                'test'          => 'xxxx', // API Test Url
                'gateway'       => [
                    'production'    => 'xxxx', // 3d Kapı Url
                    'test'          => 'xxxx', // 3d Test Kapı Url
                ],
            ]
        ],
    ]
];

之后,我们需要根据新设置创建并使用我们的对象。例如

//yeni ayar yolu ya da degeri
$yeni_ayarlar = require './pos_ayarlar.php';
$pos = \Mews\Pos\Factory\PosFactory::createPosGateway($account, $yeni_ayarlar);

示例代码

/examples目录中。

3D支付示例代码通常会将卡信息通过POST方式发送到网站服务器(index.php => form.php),然后被处理并导向网关。这样确保了不同银行之间的实现不会发生变化(统一的信用卡表单和相同的处理流程)。一般来说,可以直接将卡信息导向网关,而不是先发送到网站服务器(通常,银行示例代码就是这样实现的)。但是,

  • 当有多个银行选项或者客户想要更换银行时,需要根据情况更新卡信息表单。
  • 此外,YKB POSNet和VakıfBank POS要求通过网站服务器发送卡信息。

故障排除

会话重置

如果使用Cookie会话,当用户从网关返回网站时,会话可能会被重置。您需要在Response中设置samesite值。[解决方案](https://stackoverflow.com/a/51128675/4896948)。

共享主机中的IP地址未定义错误

在共享主机中,除了您在Cpanel中看到的IP地址外,物理服务器还有一个额外的IP地址。这个IP地址在Cpanel中不会显示,您需要从您的托管服务提供商那里了解。如果遇到这个错误,请确保在银行网关中允许该IP地址。

通用文化

NonSecure、3D Secure、3DPay和3DHost支付模式之间的区别

  • 3D - 根据银行的不同可能会有不同的名称,例如3D Full。从网关(输入3D密码的页面)返回后,会向银行网关发送一个额外的请求(授权请求)以完成支付。如果不发送此请求,则支付不会完成。
  • 3DPay - 根据银行的不同可能会有不同的名称,例如3D Half。从网关返回后,支付被认为是完成的。不需要像3D支付那样发送额外的授权请求。
  • 3DHost - 将用户引导到银行的页面进行信用卡输入,输入信用卡信息后,会被引导到银行的3D网关页面,然后返回到您的网站。导向完成后,支付将被视为完成。
  • NonSecure - 支付操作在用户不进行3D认证的情况下完成。
  • NonSecure、3D和3DPay - 支付中,信用卡信息由您的网站获取。而3DHost支付中,信用卡信息由银行网页获取。

授权、预授权、预授权取消操作之间的区别

  • 授权 - 我们所熟悉并广泛使用的操作。一次性的支付操作完成。为此,总是需要从用户那里获取信用卡信息。库中的对应操作是AbstractGateway::TX_PAY
  • 预授权 - 而不是直接从用户那里提取资金,而是在交易完成后冻结资金。为此,总是需要从用户那里获取信用卡信息。库中的对应操作是AbstractGateway::TX_PRE_PAY
  • 预授权取消 - 在预授权完成后取消冻结的资金。在预授权之后,例如一周后,可以发送Post Otorizasyon请求。为此,不需要从用户那里获取信用卡信息。一些网关请求orderId值,而另一些则请求预授权结果返回的银行侧的orderId。如果卖家想要取消预授权请求,则需要发送cancel请求。库中的Post Otorizasyon操作对应的是AbstractGateway::TX_POST_PAY
  • 这三种操作类型支持所有支付模式(NonSecure、3D、3DPay和3DHost)。

退款和取消操作之间的区别

  • 退款 - 用于退还已完成的支付。可以在支付完成后的一定时间后(例如12小时)进行。退款操作需要金额是必须的,因为支付和退款金额可能不同。库中的对应操作是AbstractGateway::TX_REFUND
  • 取消 - 用于取消已完成的支付。必须在一定时间内(例如12小时)进行。如果网关在这段时间后改变了规则,则需要使用退款操作。通常不需要金额信息,但某些网关可能会请求。库中的对应操作是AbstractGateway::TX_CANCEL

使用Docker测试环境

您的机器上需要安装Docker。在项目的根目录下运行docker-compose up命令即可。 注意:localhost端口号80必须空闲。如果没有问题,可以通过https:///akbank/3d/index.php这样的方式访问代码示例。 https:/// URL会查看项目的examples目录。

路线图

  • 将准备文档

期待您的宝贵评论、建议和贡献。

如果您发现任何问题或需要添加POS系统,请创建issue。

许可

MIT