---
# System prepended metadata

title: IVR LOGIN WORKFLOW VE KULLANIM DÖKÜMANI
tags: [ivr-login, usage-document]

---

# IVR LOGIN WORKFLOW VE KULLANIM DÖKÜMANI

## İÇERİK
* [Tanım](#Tanım)
* [İş Akışı](#İş-Akışı)
* [Workflow Kullanımı](#Workflow-Kullanımı)
    * [Authorize / Token Alma](#Authorize)
    * [1. Login Start](#1-Login-Start)
        * [1.1 Login Start Response](#11-Login-Start-Response)
    * [2. Login Type](#2-Login-Type)
        * [2.1 Login Type Response](#21-Login-Type-Response)
    * [3. Check Sms Otp](#3-Check-Sms-Otp)
        * [3.1 Check Sms Otp Response](#31-Check-Sms-Otp-Response)
    * [4. Authorize](#4-Authorize)
        * [4.1 Authorize Response](#41-Authorize-Response)
    * [Hub Kullanımı](#Hub-Kullanımı)

### Tanım
IVR üzerinden müşterinin doğrulanması ve internet bankacılığı işlemlerinin yapılabilmesi için token üretilmesini kapsamaktadır.

### İş Akışı
![image](https://hackmd.io/_uploads/SJpKLrTwC.png)
Tüm iş akışı workflow üzerinden tasarlanmıştır. 
- "IVR Login Start" eventi ile akış başlatılır.
- Müşterinin TCKN bilgisi ile debit, kredi kartı ve internet bankacılığı hesapları kontrol edilir. Ve cliente bu bilgi paylaşılır.
- IVR'da paylaşılan bilgiye göre anons okunur ve müşteriden pin tuşlaması beklenir.
- Tuşnan pin kodu, "Login Type" eventine gönderilerek, pin kontrolü sağlanır ve müşterinin aktif ve kayıt bir cihazı varsa PUSH, yoksa aktif mobil numarasına OTP kodu gönderilir ve cliente bilgi paylaşılır. Eğer her ikise sistemlerde aktif değilse, hata mesajı döner ve işlem sonlanır.
- Müşteriye OTP veya PUSH bilgisine göre anons okunur ve otp ve push işlemini gerçekleştirmesi beklenir.
- PUSH ve OTP talebi alınarak kontrol edilir, işlemler geçerli ise bir authorization code üretilerek clienta paylaşılır.


### Workflow Kullanımı
Workflowu tetiklemek için kullanılacak servislerinde reqeust ve response örneklerini aşağıda paylaşışmıştır. Workflow state durumlarını takip etmek için 2 yöntem bulunmaktadır.
1. Long Pooling
2. Hub


#### Authorize
Workflow servislerini kullanabilmek için önce bir token alınır. Alınan bu token her workflow başlamada yeniden alınmalıdır ve token Workflow Servislerinde "**Authorize**" header'ına "**Berear ACCESS_TOKEN**" şeklinde eklenmelidir.

**POST** /Token
**Request Body**
```json
{
    "client_id":"CLIENT_NAME",
    "client_secret":"***********",
    "code":null,
    "grant_type":"client_credentials",
    "scopes":["openid","profile"]
}
```
**Response** 200
```json
{
    "access_token": "*********",
    "id_token": null,
    "refresh_token": "*****",
    "token_type": "Bearer",
    "expires_in": 3600,
    "refresh_token_expires_in": 3600,
    "scope": null
}
```

#### Workflow Servisleri

#### Servis Startdaları
**Header**


| Header Key | Description |
| -------- | -------- |
| X-Device-Id | Her kullanıcı için IWS uygulamasında oturum açıldığında bir defa guid bir değer oluşturulur. |
| X-Token-Id | Her kullanıcı için IWS uygulamasında oturum açıldığında bir defa guid bir değer oluşturulur. |
| User | Her kullanıcı için IWS uygulamasında oturum açıldığında bir defa guid bir değer oluşturulur. |
| Behalf-Of-User | Her kullanıcı için IWS uygulamasında oturum açıldığında bir defa guid bir değer oluşturulur. |

**Params:**
| Param Key | Description |
| -------- | -------- |
| instanceId | Workflow başlatılıp tamamlanana kadar aynı instance id değeri kullanılır. Benzersiz bir guid değerdir. |
| transitionName | Workflowun her adımında beklenen transition/event adıdır. |

#### 1. Login Start
Token alındıktan sonra workflow başlatmak için kullanılacak servistir. Bu servis müşterinin hesapları kontrol eder ve geri döner.

**POST** /workflow/instance/:instanceId/transition/amorphie-ivr-login-start

**Request Body**
```json
{
    "CitizenshipNo": "11111111111",
    "CallUuid": "44176742296441767422964417674229"
}
```
**Response** 200
```json
{
    "result": {
        "status": "Success",
        "message": "Instance Has been Updated",
        "messageDetail": ""
    },
    "data": null
}
```
#### 1.1 Login Start Response
"Login Start" servisi çağrıldıktan sonra response'u alabilmek için LongPooling servisine istek atılarak sonucu elde edilir.

**POST** /longpooling/ivr-login-flow?InstanceId=:instanceId

**Response** 200
```json
{
    "mfatype": "public",
    "base-state": "Completed",
    "id": "ed8caddc-9d4a-4b6f-82af-db3c721a31dd",
    "subject": "worker-completed",
    "data": {
        "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "recordId": "ed8caddc-9d4a-4b6f-82af-db3c721a31dd",
        "eventInfo": "worker-completed",
        "instanceId": "ed8caddc-9d4a-4b6f-82af-db3c721a31dd",
        "entityName": "ivr-login-flow",
        "data": {
            "code": 200,
            "data": {
                "callUuid": "44176742296441767422964417674229",
                "card": false,
                "citizenshipNo": "11111111111",
                "ibank": true
            },
            "message": "Success"
        },
        "time": "2024-07-11T12:19:55.8883209Z",
        "state": "amorphie-ivr-login-got-customer-channels-state",
        "transition": "amorphie-ivr-login-start",
        "stateTransitions": [
            "amorphie-ivr-login-type"
        ],
        "baseStatus": 2,
        "page": {
            "operation": "Open",
            "type": "push-replacement",
            "pageRoute": {
                "language": "en-EN",
                "label": "get-channels"
            },
            "timeout": 0
        },
        "message": "",
        "errorCode": "",
        "additionalData": {},
        "workflowName": "ivr-login-flow",
        "viewSource": "transition",
        "requireData": false,
        "buttonType": "Forward"
    },
}
```

> Sonuçlar her zaman, `data.data` nested objesinden alınmalıdır. Diğer bilgiler workflow süreci ile ilgilidir ve workflow hakkında bilgiler içerir.


#### 2. Login Type
Kullanıcıdan alınan pin kodunu doğrular ve otp yöntemini belirleyerek işletir.

**POST** /workflow/instance/:instanceId/transition/amorphie-ivr-login-type

**Request Body**
```json
{
    "CitizenshipNo": "11111111111",
    "CallUuid": "44176742296441767422964417674229",
    "OtpCode": "123456"
}
```
**Response** 200
```json
{
    "result": {
        "status": "Success",
        "message": "Instance Has been Updated",
        "messageDetail": ""
    },
    "data": null
}
```
#### 2.1 Login Type Response
"Login Type" servisi çağrıldıktan sonra response'u alabilmek için LongPooling servisine istek atılarak sonucu elde edilir.

**POST** /longpooling/ivr-login-flow?InstanceId=:instanceId

**Response** 200
```json
{
    "data": 
    {
        "code": 200,
        "data": {
            "otpType": "SmsOtp",
            "phoneNumber": "905451111111"
        },
        "message": "Success"
    }
}
```

#### 3. Check Sms Otp
**OtpType = SmsOtp ise;**
SMS olarak iletilen otp kodunu doğrular.

**POST** /workflow/instance/:instanceId/transition/amorphie-ivr-login-check-sms-otp

**Request Body**
```json
{
    "CitizenshipNo": "11111111111",
    "CallUuid": "44176742296441767422964417674229",
    "OtpCode": "123456"
}
```
**Response** 200
```json
{
    "result": {
        "status": "Success",
        "message": "Instance Has been Updated",
        "messageDetail": ""
    },
    "data": null
}
```
#### 3.1 Check Sms Otp Response
"Check Sms Otp" servisi çağrıldıktan sonra response'u alabilmek için LongPooling servisine istek atılarak sonucu elde edilir.

**POST** /longpooling/ivr-login-flow?InstanceId=:instanceId

**Response** 200
```json
{
    "data": 
    {
        "code": 200,
        "data": {
            "valid": true
        },
        "message": "Success"
    }
}
```

#### 4. Authorize
Tüm validasyon işlemleri doğrulandığında internet bankacılığını açabilmek için authorization_code üretir.

**POST** /workflow/instance/:instanceId/transition/amorphie-ivr-login-authorize

**Request Body**
```json
{
    "ResponseType": "code",
    "ClientId": "CLIENT_NAME",
    "Scope": ["openid","profile","openId"],
    "UserName": "11111111111"
}
```
**Response** 200
```json
{
    "result": {
        "status": "Success",
        "message": "Instance Has been Updated",
        "messageDetail": ""
    },
    "data": null
}
```
#### 4.1 Authorize Response
"Authorize" servisi çağrıldıktan sonra response'u alabilmek için LongPooling servisine istek atılarak sonucu elde edilir.

**POST** /longpooling/ivr-login-flow?InstanceId=:instanceId

**Response** 200
```json
{
    "data": 
    {
        "code": 200,
        "data": {
            "code": "=yrlmsmFklfjDDWD5683mdD"
        },
        "message": "Success"
    }
}
```

#### Hub Kullanımı
Workflow'da oluşan state'lerin datasını ve meta verisini elde etmek için real-time olarak hub'dan bilgi alınabilir. DeviceId ve TokenId bilgisinde oluşan tüm workflow intance statelerini dinler.

**Hub Listener:** wss:/hubs/genericHub?X-Device-Id=:deviceId&X-Token-Id=:tokenId

**Message**
```json
{
  "type": 1,
  "target": "SendMessage",
  "arguments": [
    "{\"id\":\"afc50289-9f6c-43a2-9e99-613c1c12b89b\",\"source\":\"workflow\",\"type\":\"workflow\",\"subject\":\"worker-started\",\"data\":{\"userId\":\"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\"recordId\":\"afc50289-9f6c-43a2-9e99-613c1c12b89b\",\"eventInfo\":\"worker-started\",\"instanceId\":\"afc50289-9f6c-43a2-9e99-613c1c12b89b\",\"entityName\":\"ivr-login-flow\",\"data\":{\"CitizenshipNo\":\"11111111111\",\"CallUuid\":\"44176742296441767422964417674229\",\"OtpCode\":\"123456\",\"ResponseType\":\"code\",\"ClientId\":\"IbIvnApp\",\"Scope\":[\"retail-customer\",\"openid\",\"profile\",\"openId\"],\"UserName\":\"11111111111\"},\"time\":\"2024-07-12T08:56:58.885132Z\",\"state\":\"amorphie-ivr-login-start-state\",\"transition\":\"amorphie-ivr-login-start\",\"baseStatus\":256,\"page\":null,\"message\":\"\",\"errorCode\":\"\",\"additionalData\":{},\"workflowName\":\"ivr-login-flow\",\"viewSource\":\"transition\",\"requireData\":false,\"buttonType\":\"Forward\"}}"
  ]
}
```

`arguments` alanında bilgiyi JSON parse ederek state datası alınabilir.

> Long Pooling ve Hub aynı response şemasına sahiptir.


