diff --git a/README.md b/README.md index a66c95b..7011452 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,11 @@ [Pos](https://github.com/mewebstudio/pos) ### Minimum Gereksinimler - - PHP >= 7.1.3 - - ext-dom - - ext-json - - ext-openssl - - ext-SimpleXML +- PHP >= 7.1.3 +- ext-dom +- ext-json +- ext-openssl +- ext-SimpleXML ### Kurulum ```sh diff --git a/config/laravel-pos.php b/config/laravel-pos.php index 4936cf0..b18515f 100644 --- a/config/laravel-pos.php +++ b/config/laravel-pos.php @@ -16,7 +16,7 @@ 'banks' => [ 'akbank' => [ 'name' => 'AKBANK T.A.S.', - 'class' => \Mews\Pos\EstPos::class, + 'class' => Mews\Pos\Gateways\EstPos::class, 'urls' => [ 'production' => 'https://www.sanalakpos.com/fim/api', 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/api', @@ -28,7 +28,7 @@ ], 'ziraat' => [ 'name' => 'Ziraat Bankası', - 'class' => \Mews\Pos\EstPos::class, + 'class' => Mews\Pos\Gateways\EstPos::class, 'urls' => [ 'production' => 'https://sanalpos2.ziraatbank.com.tr/fim/api', 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/api', @@ -38,9 +38,45 @@ ], ] ], + 'finansbank' => [ + 'name' => 'QNB Finansbank', + 'class' => Mews\Pos\Gateways\EstPos::class, + 'urls' => [ + 'production' => 'https://www.fbwebpos.com/fim/api', + 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/api', + 'gateway' => [ + 'production' => 'https://www.fbwebpos.com/fim/est3dgate', + 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/est3Dgate', + ], + ] + ], + 'halkbank' => [ + 'name' => 'Halkbank', + 'class' => Mews\Pos\Gateways\EstPos::class, + 'urls' => [ + 'production' => 'https://sanalpos.halkbank.com.tr/fim/api', + 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/api', + 'gateway' => [ + 'production' => 'https://sanalpos.halkbank.com.tr/fim/est3dgate', + 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/est3Dgate', + ], + ] + ], + 'teb' => [ + 'name' => 'TEB', + 'class' => Mews\Pos\Gateways\EstPos::class, + 'urls' => [ + 'production' => 'https://sanalpos.teb.com.tr/fim/api', + 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/api', + 'gateway' => [ + 'production' => 'https://sanalpos.teb.com.tr/fim/est3Dgate', + 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/est3Dgate', + ], + ] + ], 'isbank' => [ 'name' => 'İşbank', - 'class' => \Mews\Pos\EstPos::class, + 'class' => Mews\Pos\Gateways\EstPos::class, 'urls' => [ 'production' => 'https://sanalpos.isbank.com.tr/fim/api', 'test' => 'https://entegrasyon.asseco-see.com.tr/fim/api', @@ -52,19 +88,19 @@ ], 'yapikredi' => [ 'name' => 'Yapıkredi', - 'class' => \Mews\Pos\PosNet::class, + 'class' => Mews\Pos\Gateways\PosNet::class, 'urls' => [ 'production' => 'https://posnet.yapikredi.com.tr/PosnetWebService/XML', - 'test' => 'http://setmpos.ykb.com/PosnetWebService/XML', + 'test' => 'https://setmpos.ykb.com/PosnetWebService/XML', 'gateway' => [ - 'production' => 'http://posnet.ykb.com/3DSWebService/YKBPaymentService', - 'test' => 'http://setmpos.ykb.com/3DSWebService/YKBPaymentService', + 'production' => 'https://posnet.yapikredi.com.tr/3DSWebService/YKBPaymentService', + 'test' => 'https://setmpos.ykb.com/3DSWebService/YKBPaymentService', ], - ] + ], ], 'garanti' => [ 'name' => 'Garanti', - 'class' => \Mews\Pos\GarantiPos::class, + 'class' => Mews\Pos\Gateways\GarantiPos::class, 'urls' => [ 'production' => 'https://sanalposprov.garanti.com.tr/VPServlet', 'test' => 'https://sanalposprovtest.garanti.com.tr/VPServlet', @@ -74,6 +110,34 @@ ], ] ], + 'qnbfinansbank-payfor' => [ + 'name' => 'QNBFinansbank-PayFor', + 'class' => Mews\Pos\Gateways\PayForPos::class, + 'urls' => [ + 'production' => 'https://vpos.qnbfinansbank.com/Gateway/XMLGate.aspx', + 'test' => 'https://vpostest.qnbfinansbank.com/Gateway/XmlGate.aspx', + 'gateway' => [ + 'production' => 'https://vpos.qnbfinansbank.com/Gateway/Default.aspx', + 'test' => 'https://vpostest.qnbfinansbank.com/Gateway/Default.aspx', + ], + 'gateway_3d_host' => [ + 'production' => 'https://vpos.qnbfinansbank.com/Gateway/3DHost.aspx', + 'test' => 'https://vpostest.qnbfinansbank.com/Gateway/3DHost.aspx', + ], + ] + ], + 'vakifbank' => [ + 'name' => 'VakifBank-VPOS', + 'class' => Mews\Pos\Gateways\VakifBankPos::class, + 'urls' => [ + 'production' => 'https://onlineodeme.vakifbank.com.tr:4443/VposService/v3/Vposreq.aspx', + 'test' => 'https://onlineodemetest.vakifbank.com.tr:4443/VposService/v3/Vposreq.aspx', + 'gateway' => [ + 'production' => 'https://3dsecure.vakifbank.com.tr:4443/MPIAPI/MPI_Enrollment.aspx', + 'test' => 'https://3dsecuretest.vakifbank.com.tr:4443/MPIAPI/MPI_Enrollment.aspx', + ], + ], + ], ], ]; diff --git a/src/Factory/AccountFactory.php b/src/Factory/AccountFactory.php new file mode 100644 index 0000000..563b243 --- /dev/null +++ b/src/Factory/AccountFactory.php @@ -0,0 +1,77 @@ + EstPosAccount::class, + 'ziraat' => EstPosAccount::class, + 'isbank' => EstPosAccount::class, + 'finansbank' => EstPosAccount::class, + 'halkbank' => EstPosAccount::class, + 'teb' => EstPosAccount::class, + 'yapikredi' => PosNetAccount::class, + 'garanti' => GarantiPosAccount::class, + 'qnbfinansbank-payfor' => PayForAccount::class, + 'vakifbank' => VakifBankAccount::class, + ]; + + public static function create(array $account) + { + $class = self::ACCOUNTS[$account['bank']] ?? null; + + if (! $class) { + throw new BankNotFoundException(); + } + + $params = [ + $account['bank'], + $account['model'], + $account['client_id'], + ]; + + if ($account['bank'] != 'vakifbank') { + $params[] = $account['username']; + } + + $params[] = $account['password']; + + if ($account['bank'] != 'vakifbank') { + $params[] = $account['lang'] ?? 'tr'; + } + + switch ($account['bank']) { + case "garanti": + $params[] = $account['terminal_id']; + $params[] = $account['store_key'] ?? null; + $params[] = $account['refund_username'] ?? null; + $params[] = $account['refund_password'] ?? null; + break; + case "yapikredi": + $params[] = $account['terminal_id']; + $params[] = $account['pos_net_id']; + $params[] = $account['store_key']; + break; + case "vakifbank": + $params[] = $account['terminal_id']; + $params[] = $account['merchant_type'] ?? 0; + $params[] = $account['sub_merchant_id'] ?? null; + } + + if ($account['bank'] != 'vakifbank') { + $params[] = $account['store_key'] ?? null; + } + + return new $class(...$params); + } +} \ No newline at end of file diff --git a/src/Factory/CardFactory.php b/src/Factory/CardFactory.php new file mode 100644 index 0000000..b760da8 --- /dev/null +++ b/src/Factory/CardFactory.php @@ -0,0 +1,46 @@ + CreditCardEstPos::class, + 'ziraat' => CreditCardEstPos::class, + 'isbank' => CreditCardEstPos::class, + 'finansbank' => CreditCardEstPos::class, + 'halkbank' => CreditCardEstPos::class, + 'teb' => CreditCardEstPos::class, + 'yapikredi' => CreditCardPosNet::class, + 'garanti' => CreditCardGarantiPos::class, + 'qnbfinansbank-payfor' => CreditCardPayFor::class, + 'vakifbank' => CreditCardVakifBank::class, + ]; + + public static function create(array $card) + { + $class = self::CARDS[$card['bank']]; + + if (! $class) { + throw new BankNotFoundException(); + } + + $number = $card['number']; + $expireMonth = $card['month']; + $expireYear = $card['year']; + $cvv = $card['cvv']; + $cardHolderName = $card['name'] ?? null; + $cardType = $card['type'] ?? null; + + return new $class($number, $expireYear, $expireMonth, $cvv, $cardHolderName, $cardType); + } +} \ No newline at end of file diff --git a/src/LaravelPos.php b/src/LaravelPos.php index 12aa019..d66d756 100644 --- a/src/LaravelPos.php +++ b/src/LaravelPos.php @@ -3,9 +3,11 @@ namespace Mews\LaravelPos; use Illuminate\Config\Repository; +use Mews\LaravelPos\Factory\AccountFactory; +use Mews\LaravelPos\Factory\CardFactory; use Mews\Pos\Exceptions\BankClassNullException; use Mews\Pos\Exceptions\BankNotFoundException; -use Mews\Pos\Pos; +use Mews\Pos\Factory\PosFactory; use Mews\Pos\PosInterface; /** @@ -41,6 +43,8 @@ class LaravelPos */ public $response; + public $bankName; + /** * Constructor * @@ -65,6 +69,7 @@ public function instance() * Set custom configuration * * @param array $config + * * @return LaravelPos */ public function config(array $config) @@ -78,16 +83,26 @@ public function config(array $config) * Set account and create Pos Object * * @param array $account + * * @return $this * @throws BankClassNullException * @throws BankNotFoundException */ public function account(array $account) { + $env = $account['env'] ?? null; + + $this->bankName = $account['bank']; + + $account = AccountFactory::create($account); + $this->account = $account; - $this->pos = new Pos($this->account, $this->config); - $this->bank = $this->pos->bank; + $this->bank = PosFactory::createPosGateway($account); + + if ($env == 'test') { + $this->bank->setTestMode(true); + } return $this; } @@ -95,13 +110,19 @@ public function account(array $account) /** * Prepare Order * - * @param array $order - * @param array $card + * @param array $order + * @param string $txType + * @param array|null $card + * * @return $this */ - public function prepare(array $order, array $card = []) + public function prepare(array $order, string $txType, array $card = null) { - $this->pos->prepare($order, $card); + $card['bank'] = $this->bankName; + + $card = CardFactory::create($card); + + $this->bank->prepare($order, $txType, $card); return $this; } @@ -109,14 +130,21 @@ public function prepare(array $order, array $card = []) /** * Payment * - * @param array $card + * @param array|null $card + * * @return $this + * @throws \GuzzleHttp\Exception\GuzzleException + * @throws \Mews\Pos\Exceptions\UnsupportedPaymentModelException */ - public function payment(array $card = []) + public function payment(array $card = null) { - $this->pos->payment($card); + $card['bank'] = $this->bankName; + + $card = CardFactory::create($card); + + $this->bank->payment($card); - $this->response = $this->pos->bank->response; + $this->response = $this->bank->getResponse(); return $this; } @@ -128,7 +156,7 @@ public function payment(array $card = []) */ public function getGatewayUrl() { - return $this->pos->bank->gateway ?? 'null'; + return $this->bank->gateway ?? 'null'; } /** @@ -141,8 +169,8 @@ public function get3dFormData() $data = []; try { - $data = $this->pos->bank->get3dFormData(); - } catch (Exception $e) {} + $data = $this->bank->get3dFormData(); + } catch (\Exception $e) {} return $data; } @@ -154,7 +182,7 @@ public function get3dFormData() */ public function isSuccess() { - return $this->pos->bank->isSuccess(); + return $this->bank->isSuccess(); } /** @@ -164,6 +192,6 @@ public function isSuccess() */ public function isError() { - return $this->pos->bank->isError(); + return $this->bank->isError(); } }