mewebstudio / pos

Türk bankaları için sanal pos paketi (PHP)
Other
266 stars 102 forks source link

Kuveyttürk Kısmi Iade : Satış tutarı ile iade tutarı eşleşmemektedir. #204

Closed mettleshade closed 4 months ago

mettleshade commented 5 months ago

Kuveyttürk ile 76 tllik bir ödeme yaptım canlıdan, aynı günde iade olmadığı için bir gün bekledim bugün tekrar denedim 30 tl iade etmeyi fakat

` Array ( [order_id] => [auth_code] => [proc_return_code] => DbLayerError [transaction_id] => [currency] => [error_message] => Satış tutarı ile iade tutarı eşleşmemektedir. Değerleri kontrol ediniz. [ref_ret_num] => [status] => declined [error_code] => TransactionAmountMismatchException [status_detail] => [all] => Array ( [DrawBackResult] => Array ( [Results] => Array ( [Result] => Array ( [ErrorMessage] => Satış tutarı ile iade tutarı eşleşmemektedir. Değerleri kontrol ediniz. [ErrorCode] => TransactionAmountMismatchException [IsFriendly] => [Severity] => BusinessError )

                    )

                [Success] => 
                [Value] => Array
                    (
                        [IsEnrolled] => 
                        [IsVirtual] => 
                        [ResponseCode] => DbLayerError
                        [OrderId] => 0
                        [TransactionTime] => 0001-01-01T00:00:00
                        [MerchantId] => 
                        [BusinessKey] => 0
                    )

            )

    )

) `

sonucunu aldım, readme'de belirtmişsiniz DrawBackResult yerine PartialDrawbackResult kullanıyor diye fakat yukardaki yanıtta DrawBackResult olarak geçiyor

nuryagdym commented 5 months ago

Orda yaptigim degisiklikten dolayi. Eskinde iade icin PartialDrawback kullaniyorduk, Drawback kullanacak sekilde degistirdim. Drawback tam iade icin, PartialDrawback ise bir kismini iade etmek icin. Bu tarz durum 2-3 gatewayden karsilastim, ilerde bunun icin ayri TX_TYPE olusturmayi dusunuyorum. Diger gatewaylerde genelde kismi iade ile tam iade arasinda ayrim yok.

Kutuphaneye Partial refund destegi ekleninceye kadar, kismi iade yapilmak istendiginde docs/ altindaki orneklerde oldugu gibi eventListener kullanarak Drawback degeri PartialDrawbacke degistirerek cozebilirsin.

mettleshade commented 5 months ago

Orda yaptigim degisiklikten dolayi. Eskinde iade icin PartialDrawback kullaniyorduk, Drawback kullanacak sekilde degistirdim. Drawback tam iade icin, PartialDrawback ise bir kismini iade etmek icin. Bu tarz durum 2-3 gatewayden karsilastim, ilerde bunun icin ayri TX_TYPE olusturmayi dusunuyorum. Diger gatewaylerde genelde kismi iade ile tam iade arasinda ayrim yok.

Kutuphaneye Partial refund destegi ekleninceye kadar, kismi iade yapilmak istendiginde docs/ altindaki orneklerde oldugu gibi eventListener kullanarak Drawback degeri PartialDrawbacke degistirerek cozebilirsin.

$order['transaction_type'] = 'PartialDrawback'; $pos->refund($order);

şeklinde yapınca iade olarak algılıyor ama KuveytPosRequestDataMapper'in içindeki 'TransactionType' => $order['transaction_type'] ?? $this->mapTxType(PosInterface::TX_TYPE_REFUND), şekilnde düzenledim

protected array $txTypeMappings = [
    PosInterface::TX_TYPE_PAY_AUTH => 'Sale',
    PosInterface::TX_TYPE_CANCEL   => 'SaleReversal',
    PosInterface::TX_TYPE_STATUS   => 'GetMerchantOrderDetail',
    PosInterface::TX_TYPE_REFUND   => 'Drawback', // Also there is a "PartialDrawback"
];
refund kısmını PartialDrawback yapınca kısmı iade olarka algılıyor 
createRefundRequestData fonksiyonundaki resultu iki farklı şekildede kayıt ettim hiçbir fark yok 
nuryagdym commented 5 months ago

kutuphane kodunu degistirmemeni tavsiye ederim, kutuphaneyi guncellediginde bu yaptiginde degisiklikler silinir. event listener ile kutuphane kodunu degistirmeden TransactionType'i degistirebilirsin. Bu ornek calismasi lazim:

/** @var \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher */
$eventDispatcher->addListener(
    \Mews\Pos\Event\RequestDataPreparedEvent::class,
    function (\Mews\Pos\Event\RequestDataPreparedEvent $event) {
       //istersen burda original tutar ile refund edilmek istenen tutarlari karsilastiririp ona gore bu alttaki kodlari calistirabilirsin:
        $requestData                                   = $event->getRequestData();
        $requestData['VPosMessage']['TransactionType'] = 'PartialDrawback';
        $event->setRequestData($requestData);
    });
   $pos->refund($order);

$eventDispatcher $pos istance'i olusturmakta kullandiginin aynisi.

mettleshade commented 5 months ago

Attığınız kodu ekledim AbstractGateway.php 315'inci satıra file_put_contents('a2.txt',json_encode($data)); kodunu ekledim bankaya giden datayı görmek için kod doğru şekilde gidiyor fakat halen iade olarak dönüş yapıyor banka. KuveytPosRequestDataMapper.php dosyasında direk değiştirdiğim zaman kısmi iade oluyor nerde neyi atlıyorum çözemedim :)

mettleshade commented 5 months ago

@nuryagdym sorunu buldum, KuveytPos.php dosyasında sendSoapRequest kullanılarak atılıyor bu istek

  1. satırda $result = $client->__soapCall($this->requestDataMapper->mapTxType($txType), ['parameters' => ['request' => $contents]]); kodundaki $this->requestDataMapper->mapTxType($txType) 'Drawback' olarak geçiyor, $contents'te PartialDrawback olsada banka Drawback olarak görüyor
nuryagdym commented 5 months ago

anladim, unuttum burasini, o zaman KuveytPosRequestDataMapper'de Drawback'i PartialDrawback'e degistirmen gerekecek.

Bu issue acik kalsin, partial refund uzerinde musait oldugumda calisirim

mettleshade commented 5 months ago

Kütüphane kodlarına müdahele etmeden yapmaya çalıştım ama başarılı bir sonuça alamadım, siz burayla ilgili güncelleme çıkana kadar kütüphaneyi güncellemeden kod değişikliği yapıp devam edeceğim. Güncelleme çıkınca güncelleyip deneriz

nuryagdym commented 5 months ago

@mettleshade PartialDrawback ile tam iadeyi yapabiliyor muyuz? kontrol eder misin

mettleshade commented 5 months ago

@nuryagdym olmuyor daha öncedende denemiştim ama şimdi tekrar denedim Screenshot_10

nuryagdym commented 5 months ago

@mettleshade bendeki test ortam bilgileri calismamaya basladi. Aklima bir cozum geldi ama test ortam bilgileri calismadigi icin test edemiyorum. Bu yuzden sana anlatayim sen dener misin. Yapman gereken degisiklikler:

  1. https://github.com/mewebstudio/pos/blob/e1733994ff052d7eeac0f2808bfabaacf22fe0c7/src/Gateways/KuveytPos.php#L263 bu satir su sekilde degisecek: $result = $client->__soapCall($contents['VPosMessage']['TransactionType'], ['parameters' => ['request' => $contents]]);
  2. refund kod su sekilde olacak
    /** @var \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher */
    $eventDispatcher->addListener(
      \Mews\Pos\Event\RequestDataPreparedEvent::class,
      function (\Mews\Pos\Event\RequestDataPreparedEvent $event) {
         //istersen burda original tutar ile refund edilmek istenen tutarlari karsilastiririp ona gore bu alttaki kodlari calistirabilirsin:
          $requestData                                   = $event->getRequestData();
          $requestData['VPosMessage']['TransactionType'] = 'PartialDrawback';
          $event->setRequestData($requestData);
      });
     $pos->refund($order);

Eger yukardaki degisiklikler calisirsa, ayrica ustteki degisikliklere ek olarak bu satiri da silip dener misin https://github.com/mewebstudio/pos/blob/e1733994ff052d7eeac0f2808bfabaacf22fe0c7/src/DataMapper/RequestDataMapper/KuveytPosRequestDataMapper.php#L328

mettleshade commented 5 months ago

@nuryagdym En kısa zamanda deneyip dönüş yapıyorum.

mettleshade commented 5 months ago

@nuryagdym ilk 2 adımı yaptım başarılı, 3. adımı TransactionType sildim yine bir sıkıntı yok güncellemeye eklenebilir.

nuryagdym commented 4 months ago

v1.3.0 kismi iade destegi ekledim. event listenere gerek yok. refund order verisine ekstra olarak order_amount degeri eklenmesi gerekiyor. yani