mewebstudio / pos

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

QNB Finans bank Hash Mismatch! hatası #187

Closed sekizlipenguen closed 5 months ago

sekizlipenguen commented 6 months ago
Information Description
Kütüphane versiyonu 0.16.0
PHP versiyonu 8.2
Gateway ismi payforpos
Banka ismi qnb finans bank

Hatanın özeti

Hash Mismatch! hatası almaya başladım. Eski versiyon kullanıldığı için sorun olmuyordu. Şu an güncel versiyonda bu blog değişmiş bu sebeple burada sorun olduğunu düşünüyorum.

eski hata almadığım blok

public function make3DPayment(Request $request)
    {
        $request = $request->request;
        $bankResponse = null;
        //if customer 3d verification passed finish payment
        if ($this->check3DHash($this->account, $request->all()) && '1' === $request->get('3DStatus')) {
            //valid ProcReturnCode is V033 in case of success 3D Authentication
            $contents = $this->create3DPaymentXML($request->all());
            $bankResponse = $this->send($contents);
        } else {
            $this->logger->log(LogLevel::ERROR, '3d auth fail', ['md_status' => $request->get('3DStatus')]);
        }

        $this->response = $this->map3DPaymentData($request->all(), $bankResponse);

        return $this;
    }

güncel hatalı blok

  public function make3DPayment(Request $request)
    {
        $request = $request->request;
        $bankResponse = null;
        if (!$this->requestDataMapper->getCrypt()->check3DHash($this->account, $request->all())) {
            throw new HashMismatchException();
        }

        //if customer 3d verification passed finish payment
        if ('1' === $request->get('3DStatus')) {
            //valid ProcReturnCode is V033 in case of success 3D Authentication
            $contents = $this->create3DPaymentXML($request->all());
            $bankResponse = $this->send($contents);
        } else {
            $this->logger->log(LogLevel::ERROR, '3d auth fail', ['md_status' => $request->get('3DStatus')]);
        }

        $this->response = $this->responseDataMapper->map3DPaymentData($request->all(), $bankResponse);

        return $this;
    }
nuryagdym commented 6 months ago

Merhaba, kod refactor edildi, ama hash hesaplama algoritmasi degismedi. Eskiden hash degerler eslesmediginde odemeyi tamamlamiyorduk, $this->response'de odeme basariz oldugunu belirtiyorduk. Son yapilan degisimlerle ise exception firlatiyoruz, bu da odeme basarisiz olmadigi anlamina geliyor.

Su an test ortamda test ettigimde sorunsuz calisiyor.

Test ortamda calisip prod ortamda calismiyorsa buyuk ihtimalle sizde kodda bir sorun vardir.

burdaki hash data verileri dogru oldugunu kontrol ediniz, ozellikle $account verileri: https://github.com/mewebstudio/pos/blob/af545367050b091d604cce92365c9be91f13dd1f/src/Crypt/PayForPosCrypt.php#L39-L48

sekizlipenguen commented 6 months ago

Merhaba, kod refactor edildi, ama hash hesaplama algoritmasi degismedi. Su an test ortamda test ettigimde sorunsuz calisiyor.

Test ortamda calisip prod ortamda calismiyorsa buyuk ihtimalle sizde kodda bir sorun vardir.

burdaki hash data verileri dogru oldugunu kontrol ediniz, ozellikle $account verileri:

https://github.com/mewebstudio/pos/blob/af545367050b091d604cce92365c9be91f13dd1f/src/Crypt/PayForPosCrypt.php#L39-L48

Selam,

Sorunun kaynağını buldum. Aslında burada hash kontrolü yapmandan önce gelen mesajı görmemiz gerekiyor çünkü gelen mesajı yazdırdığımda: "bu sipariş numarası ile daha önce kayıt vardır" uyarısı aldım. Hash mantığımız doğru fakat bankalar onun öncesinde hata da iletiyorlar.

Destek için teşekkürler @nuryagdym

nuryagdym commented 6 months ago

@sekizlipenguen ornek response'u paylasir misiniz, ona gore guncellerim belki

sekizlipenguen commented 6 months ago

Tabiii örnek tekrar oluşturdum. @nuryagdym

Şu ikisi ile kontrol yapılabilir gibi duruyor.

  "ErrMsg" => "Verilen sipariş no önceden kullanılmıştır."
  "ProcReturnCode" => "101310"

uzun hali

array:120 [▼ // vendor/mews/pos/src/Gateways/PayForPos.php:48
  "RequestGuid" => "0"
  "TransactionDate" => "01.03.2024 13:22:05"
  "MbrId" => "5"
  "MerchantID" => "guvenliksebebi-ile-gizlendi"
  "OrderId" => "guvenliksebebi-ile-gizlendi"
  "RequestIp" => ""
  "RequestStat" => "1,5"
  "SecureType" => "3DModel"
  "PurchAmount" => "374.99"
  "Exponent" => ""
  "Currency" => "guvenliksebebi-ile-gizlendi"
  "Description" => ""
  "OkUrl" => "guvenliksebebi-ile-gizlendi"
  "FailUrl" => "guvenliksebebi-ile-gizlendi"
  "PayerTxnId" => ""
  "PayerAuthenticationCode" => ""
  "Eci" => ""
  "MD" => ""
  "Hash" => "guvenliksebebi-ile-gizlendi+Zh/tuY="
  "TerminalID" => ""
  "TxnType" => "Auth"
  "OrgOrderId" => ""
  "SubMerchantCode" => ""
  "recur_frequency" => ""
  "recur_expiry" => ""
  "CardType" => ""
  "Lang" => "TR"
  "BonusAmount" => ""
  "InstallmentCount" => "0"
  "Rnd" => "guvenliksebebi-ile-gizlendi"
  "AlphaCode" => ""
  "Ecommerce" => "1"
  "MrcCountryCode" => ""
  "MrcName" => ""
  "MerchantHomeUrl" => ""
  "CardHolderName" => "guvenliksebebi-ile-gizlendi guvenliksebebi-ile-gizlendi"
  "IrcDet" => ""
  "IrcCode" => ""
  "Version" => ""
  "TxnStatus" => ""
  "CavvAlg" => ""
  "ParesVerified" => ""
  "ParesSyntaxOk" => ""
  "ErrMsg" => "Verilen sipariş no önceden kullanılmıştır."
  "VendorDet" => ""
  "D3Stat" => ""
  "3DStatus" => "-1"
  "TxnResult" => ""
  "AuthCode" => ""
  "HostRefNum" => ""
  "ProcReturnCode" => "101310"
  "ReturnUrl" => "guvenliksebebi-ile-gizlendi"
  "ErrorData" => ""
  "BatchNo" => "0"
  "VoidDate" => ""
  "CardMask" => ""
  "ReqId" => "0"
  "UsedPoint" => "0"
  "SrcType" => "VPO"
  "RefundedAmount" => "0"
  "RefundedPoint" => "0"
  "ReqDate" => "0"
  "SysDate" => "0"
  "F11" => "0"
  "F37" => ""
  "RRN" => ""
  "IsRepeatTxn" => ""
  "CavvResult" => ""
  "VposElapsedTime" => "0"
  "BankingElapsedTime" => "0"
  "SocketElapsedTime" => "0"
  "HsmElapsedTime" => "0"
  "MpiElapsedTime" => "0"
  "hasOrderId" => "False"
  "TemplateType" => "0"
  "HasAddressCount" => "False"
  "IsPaymentFacilitator" => "False"
  "MerchantCountryCode" => ""
  "OrgTxnType" => ""
  "F11_ORG" => "0"
  "F12_ORG" => "0"
  "F13_ORG" => ""
  "F22_ORG" => "0"
  "F25_ORG" => "0"
  "MTI_ORG" => "0"
  "DsBrand" => ""
  "IntervalType" => "0"
  "IntervalDuration" => "0"
  "RepeatCount" => "0"
  "CustomerCode" => ""
  "RequestMerchantDomain" => ""
  "RequestClientIp" => "guvenliksebebi-ile-gizlendi"
  "ResponseRnd" => "guvenliksebebi-ile-gizlendi"
  "ResponseHash" => "guvenliksebebi-ile-gizlendi="
  "BankInternalResponseCode" => ""
  "BankInternalResponseMessage" => ""
  "BankInternalResponseSubcode" => ""
  "BankInternalResponseSubmessage" => ""
  "BayiKodu" => ""
  "VoidTime" => "0"
  "VoidUserCode" => ""
  "PaymentLinkId" => "0"
  "ClientId" => ""
  "IsQRValid" => ""
  "IsFastValid" => ""
  "IsQR" => ""
  "IsFast" => ""
  "QRRefNo" => ""
  "FASTGonderenKatilimciKodu" => ""
  "FASTAlanKatilimciKodu" => ""
  "FASTReferansNo" => ""
  "FastGonderenIBAN" => ""
  "FASTGonderenAdi" => ""
  "MobileECI" => ""
  "HubConnId" => ""
  "WalletData" => ""
  "Tds2dsTransId" => ""
  "Is3DHost" => ""
  "ArtiTaksit" => "0"
  "AuthId" => ""
]
nuryagdym commented 6 months ago

tmm tesekkurler, zaman bulunca ilgilenirim

nuryagdym commented 5 months ago

v1.0.0 versiyonda, once 3D/MD statusu kontrole ediyoruz, sonra hash kontrolu yapiyoruz. Bu sekilde artik hatali HashMismatchException'i firlatmamasi gerekiyor