pos icon indicating copy to clipboard operation
pos copied to clipboard

QNB Finans bank Hash Mismatch! hatası

Open sekizlipenguen opened this issue 11 months ago • 5 comments

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;
    }

sekizlipenguen avatar Mar 01 '24 09:03 sekizlipenguen

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

nuryagdym avatar Mar 01 '24 09:03 nuryagdym

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

sekizlipenguen avatar Mar 01 '24 09:03 sekizlipenguen

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

nuryagdym avatar Mar 01 '24 09:03 nuryagdym

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" => ""
]

sekizlipenguen avatar Mar 01 '24 10:03 sekizlipenguen

tmm tesekkurler, zaman bulunca ilgilenirim

nuryagdym avatar Mar 01 '24 10:03 nuryagdym

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

nuryagdym avatar Mar 30 '24 09:03 nuryagdym