[GH-ISSUE #187] QNB Finans bank Hash Mismatch! hatası #105

Closed
opened 2026-03-03 15:43:03 +03:00 by kerem · 6 comments
Owner

Originally created by @sekizlipenguen on GitHub (Mar 1, 2024).
Original GitHub issue: https://github.com/mewebstudio/pos/issues/187

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;
    }
Originally created by @sekizlipenguen on GitHub (Mar 1, 2024). Original GitHub issue: https://github.com/mewebstudio/pos/issues/187 | 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; } ```
kerem closed this issue 2026-03-03 15:43:03 +03:00
Author
Owner

@nuryagdym commented on GitHub (Mar 1, 2024):

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:
github.com/mewebstudio/pos@af54536705/src/Crypt/PayForPosCrypt.php (L39-L48)

<!-- gh-comment-id:1972859007 --> @nuryagdym commented on GitHub (Mar 1, 2024): 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
Author
Owner

@sekizlipenguen commented on GitHub (Mar 1, 2024):

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:

github.com/mewebstudio/pos@af54536705/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

<!-- gh-comment-id:1972866472 --> @sekizlipenguen commented on GitHub (Mar 1, 2024): > 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
Author
Owner

@nuryagdym commented on GitHub (Mar 1, 2024):

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

<!-- gh-comment-id:1972868242 --> @nuryagdym commented on GitHub (Mar 1, 2024): @sekizlipenguen ornek response'u paylasir misiniz, ona gore guncellerim belki
Author
Owner

@sekizlipenguen commented on GitHub (Mar 1, 2024):

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" => ""
]
<!-- gh-comment-id:1972938826 --> @sekizlipenguen commented on GitHub (Mar 1, 2024): 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" => "" ] ```
Author
Owner

@nuryagdym commented on GitHub (Mar 1, 2024):

tmm tesekkurler, zaman bulunca ilgilenirim

<!-- gh-comment-id:1972952943 --> @nuryagdym commented on GitHub (Mar 1, 2024): tmm tesekkurler, zaman bulunca ilgilenirim
Author
Owner

@nuryagdym commented on GitHub (Mar 30, 2024):

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

<!-- gh-comment-id:2027994469 --> @nuryagdym commented on GitHub (Mar 30, 2024): v1.0.0 versiyonda, once 3D/MD statusu kontrole ediyoruz, sonra hash kontrolu yapiyoruz. Bu sekilde artik hatali _HashMismatchException'i_ firlatmamasi gerekiyor
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/pos#105
No description provided.