submitTransfer

Overview

    +-------------+           +----------+           +------------+
    |  Customer   |----(2)--->| Customer |----(3)--->|  PayMitto  |
    | Application |<---(8)----|  API(5)  |<---(4)----|    API     |
    +-------------+           +----------+           +------------+
           |                      | |
           |                      | |                +------------+
           |                      |  ---------(6)--->|  PayMitto  |
           |                       <----------(7)----|    API     |
           |                                         +------------+
           |
           |                  +------------+
            <----------(1)----|  PayMitto  |
            -----------(9)--->|    SDK     |
                              +------------+
  1. SDK calls back the submitTransfer callback with the transfer request data to send the transfer.
  2. Customer application makes a network request to the Customer API to initiate the creation
    of a transfer.
  3. Customer API makes a network request to the PayMitto API to read quote details.
  4. PayMitto API returns the quote details or an error.
  5. Customer API makes performs additional prerequisites, such as verification of funds.
  6. Customer API makes a network request to the PayMitto API to create a transfer.
  7. PayMitto API returns the transfer details or an error.
  8. Customer API returns the transfer details or an error
  9. Customer application returns the transfer details or throws an error

Parameter passed through the callback

TypeDescription
PayMittoTransferRequestA representation of the main identifiers to build and send the transfer.

Expected objects to be sent by the app in the callback response to the sdk (TransferSubmissionResult)

ParameterTypeDescription
transferIdStringThe transfer ID.
PayMittoErrorPayMittoErrorA generic representation of an error for the PayMitto SDK.

Sample Implementation


private val submitTransfer:  suspend (PayMittoTransferRequest) -> TransferSubmissionResult = { transferRequest: PayMittoTransferRequest ->
    try {
        
        // calls the Quote Details API
        val quoteDetails = readQuoteDetails(transferRequest.quoteHistoryId)
        
        // calls your funtion to call the server
        submitPayMittoTransfer(
            transferRequest = transferRequest,
            quoteDetails = quoteDetails
        )

    } catch (e: QuoteDetailsException) {
        TransferSubmissionResult.Error(e.error)
    }
}

/**
 * Reloads a quote before trying to submit a transfer.
 */
private suspend fun readQuoteDetails(quoteHistoryId: String): ReadQuoteDetailsResponse {
    val response = service.readQuoteDetails(
        url = "https://sandbox-api.readyremit.com/v1/quote/$quoteHistoryId",
        token = "Bearer $tokenValue",
        acceptLanguage = PayMitto.getSdkLanguageLocale()?.getLocalizationForApi()
            ?: Localization.enUS.getLocalizationForApi(), // or the language you set in PayMittoConfiguration
        contentType = "application/json"
    )

    if (response.isSuccessful) {
        return response.body()!!
    } else {
        // Parsing json error response
        val errorResponse = mapError(response.errorBody()?.string())

        throw QuoteDetailsException(
            PayMittoError(
                errorResponse.code,
                errorResponse.message,
                errorResponse.description
            )
        )
    }
}

/**
 * Submits the transfer.
 */
private suspend fun submitPayMittoTransfer(
    transferRequest: PayMittoTransferRequest,
    quoteDetails: ReadQuoteDetailsResponse
): TransferSubmissionResult {
    
    // call the API
    val response = service.transfer(
        token = "Bearer $tokenValue",
        transferRequest = TransferRequest(
            transferRequest.fields?.map { TransferRequest.Field(it.id, it.type, it.value) },
            transferRequest.quoteBy,
            transferRequest.quoteHistoryId,
            transferRequest.recipientAccountId,
            transferRequest.recipientId,
            transferRequest.sourceAccountId,
            transferRequest.nonce,
            quoteDetails.sendAmount.value,
            quoteDetails.destinationCountryISO3Code,
            quoteDetails.destinationCurrencyISO3Code,
            quoteDetails.sourceCurrencyIso3Code,
            quoteDetails.transferMethod
        )
    )

    if (response.isSuccessful) {
        return TransferSubmissionResult.Success(response.body()!!.transferId)
    } else {
        // Parsing json error response
        val errorResponse = mapError(response.errorBody()?.string())
        return TransferSubmissionResult.Error(
            PayMittoError(
                errorResponse.code,
                errorResponse.message,
                errorResponse.description
            )
        )
    }
}