> For the complete documentation index, see [llms.txt](https://docs.ecommerce.seb.ee/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ecommerce.seb.ee/seb-docs-draft/seb-docs-public-lt/integracija/mobilusis-sdk/ios-sdk/gaires/klaidu-valdymas.md).

# Klaidų valdymas

Naudokite šį vadovą, jei norite SDK klaidą paversti praktiškai veiksmingu rezultatu.

## Kaip klaidos jus pasiekia

Klaidos gaunamos kaip `NSError` lauke `PaymentResult.error`niekada ne kaip iškelta išimtis, ir visada kartu su rezultatu. SDK neiškelia išimčių ir nereikalauja `try`.

Rezultatas, kurio būsena `.failed` su `nil` klaida reiškia, kad pats mokėjimas nepavyko. Rezultatas su klaida reiškia, kad SDK negalėjo užbaigti srauto.

Visos klaidos naudoja domeną:

```
com.egw.egwpay
```

***

## Klaidų kodai

| Kodas | Pavadinimas                | Reikšmė                                                                                  |
| ----- | -------------------------- | ---------------------------------------------------------------------------------------- |
| 1     | `invalidRequest`           | Užklausa nėra tinkama naudoti arba šiame vyksta jau mokėjimas `PaymentKit`.              |
| 2     | `statusLookupFailed`       | Nepavyko pasiekti mokėjimo būsenos. `NSUnderlyingErrorKey` saugo perdavimo klaidą.       |
| 3     | `statusLookupUnavailable`  | Nėra `apiBaseURL` sukonfigūruota ir nebuvo pateiktas pasirinktinis sprendiklis.          |
| 4     | `httpError`                | Būsenos užklausa grąžino ne 2xx atsakymą. `EGWHTTPStatusCode` saugo būsenos kodą.        |
| 5     | `malformedResponse`        | Būsenos atsakymo nepavyko nuskaityti.                                                    |
| 6     | `webViewLoadFailed`        | Atsiskaitymo puslapio nepavyko įkelti. `NSUnderlyingErrorKey` saugo priežastį.           |
| 7     | `cardValidationFailed`     | Kortelės laukas nepraėjo patikros dar prieš atliekant bet kokį tinklo kvietimą.          |
| 8     | `encryptionKeyUnavailable` | Nėra `checkoutBaseURL` sukonfigūruotas arba nepavyko gauti kortelės šifravimo rakto.     |
| 9     | `encryptionFailed`         | Kortelės duomenų nepavyko užšifruoti.                                                    |
| 10    | `cardSessionFailed`        | Nepavyko sukurti arba pratęsti kortelės sesijos. `NSUnderlyingErrorKey` saugo priežastį. |
| 11    | `cardActionUnsupported`    | Kortelės sesija paprašė veiksmo, kurio programoje negalima užbaigti.                     |
| 12    | `threeDSChallengeFailed`   | Nepavyko užbaigti 3-D Secure patvirtinimo.                                               |

Koduose nuo 1 iki 6 gali pasitaikyti bet kuriame sraute. Kodai nuo 7 iki 12 pasitaiko tik gimtojoje kortelės formoje.

Kiekviena klaida turi `NSLocalizedDescriptionKey`. Skaitykite `localizedDescription` — čia pateikiamas pranešimas, kuriame jau nurodytas nepavykęs laukas arba HTTP būsena, o pagal `code` tikrinkite, kai reikia šakoti logiką.

```swift
if let error = result.error, error.domain == PaymentError.domain {
    switch PaymentError.Code(rawValue: error.code) {
    case .httpError:
        let status = error.userInfo["EGWHTTPStatusCode"] as? Int
        // …
    case .cardValidationFailed:
        // …
    default:
        break
    }
}
```

***

## Dažniausi gedimai

### Kortelės prekės ženklas nepriimamas

**Priežastis** - Parduotuvės konfigūracija nepriima įvestos kortelės prekės ženklo. Vartai atsako HTTP 403.

**Sprendimas** - Rodykite pranešimą „ši kortelės rūšis nepriimama“ ir leiskite pirkėjui bandyti kitą kortelę. Nenaudokite programoje kliento pusės leidžiamų kortelių prekių ženklų sąrašo: parduotuvės priimami mokėjimo būdai gali keistis jūsų programos neperkompiliuojant, o vietinis sąrašas greitai pasens.

### Mokėjimo būsenos nepavyko patvirtinti

**Priežastis** - Kodas 2, 3, 4 arba 5. SDK arba neturėjo kur kreiptis, arba kreipėsi ir negavo tinkamo atsakymo. Pats mokėjimas galėjo būti sėkmingas.

**Sprendimas** - Laikykite mokėjimą vis dar atviru. Rodykite patvirtinimo būseną ir kreipkitės į savo vidinę sistemą naudodami `result.paymentId`. Niekada nerodykite to kaip nesėkmės ir niekada neleiskite pirkėjui pagal tai atsiskaityti du kartus.

### Atsiskaitymo puslapio nepavyko įkelti

**Priežastis** - Kodas 6. Žiniatinklio peržiūra negalėjo pasiekti atsiskaitymo prieglobsčio. `NSUnderlyingErrorKey` saugo pagrindinį `NSURLError`.

**Sprendimas** - Patikrinkite jūsų pateiktą atsiskaitymo URL ir įrenginio ryšį, tada pasiūlykite bandyti dar kartą. Mokėjimas nepakitęs, todėl tą patį `paymentId` ir `verificationKey` galima naudoti dar kartą.

### Kortelės laukas nepraėjo patikros

**Priežastis** - Kodas 7. Vienas iš kortelės laukų nepraėjo patikros. Pranešime nurodoma, kuris.

**Sprendimas** - Tikrinkite pirkėjui rašant naudojant `card.validationError(for:)` kad nesėkmė būtų rodoma formoje, o ne pateikimo metu. Žr. [Natyvi kortelės forma](/seb-docs-draft/seb-docs-public-lt/integracija/mobilusis-sdk/ios-sdk/naudojant-sdk/natyvioji-korteles-forma.md).

### Mokėjimas jau vykdomas

**Priežastis** - Kodas 1. `startPayment` arba `startCardPayment` buvo iškviesta, kol tame pačiame `PaymentKit` dar buvo mokėjimas ekrane.

**Sprendimas** - Išjunkite mokėjimo mygtuką mokėjimo metu arba sukurkite `PaymentKit` vienam mokėjimui. Pirmasis mokėjimas lieka nepaveiktas.

***

## Nesėkmės sekimas

Įjunkite registravimą, kai reikia sekti srautą:

```swift
let configuration = Configuration(
    apiBaseURL: URL(string: "https://your-backend.example.com"),
    environment: .sandbox,
    loggingEnabled: true
)
```

SDK registruoja srauto etapus per `os_log`. Jis niekada neregistruoja užklausų ar atsakymų turinio, kortelės duomenų, prisijungimo duomenų ar pilnų URL.

Norėdami susieti nesėkmę nuo pradžios iki pabaigos, naudokite `X-Request-Id` jūsų vidinė sistema išsiuntė, kai sukūrė mokėjimą, kartu su `paymentId` rezultate. Paties SDK kvietimai taip pat turi užklausos ID.

Kai vartai pateikė papildomos informacijos, ji pateikiama po `NSUnderlyingErrorKey`, o nesėkmingos būsenos užklausos HTTP būsena pateikiama po `EGWHTTPStatusCode`.

***

## Kartotiniai bandymai

SDK nieko nebando pakartotinai. Nepavykusi būsenos užklausa pateikiama kaip klaida, o ne kartojama.

{% hint style="warning" %}
⚠️ **Nesukurkite antro mokėjimo po neaiškios nesėkmės.** Koduose 2, 4, 5 ir 10 tikroji mokėjimo būsena lieka nežinoma, o sukūrus naują mokėjimą kyla rizika apmokestinti pirkėją du kartus. Pirmiausia patikrinkite būseną per savo vidinę sistemą ir pradėkite iš naujo tik tada, jei aiškiai matyti, kad mokėjimas neįsigaliojo.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.ecommerce.seb.ee/seb-docs-draft/seb-docs-public-lt/integracija/mobilusis-sdk/ios-sdk/gaires/klaidu-valdymas.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
