Express Payment Authorization

Rapid authorization-only workflow that validates a payment and runs a fraud check before obtaining a payment rail authorization code. Publishes EventBridge events on fraud detection and successful authorization. Does not perform settlement — suited for pre-authorization and holds.

{
  "Comment": "Express payment authorization — fast-path validate, fraud check, and authorize without settlement",
  "StartAt": "ValidatePayment",
  "States": {
    "ValidatePayment": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${ValidatePaymentFunctionArn}",
        "Payload.$": "$"
      },
      "ResultPath": "$.validation",
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 1,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "PaymentInvalid"
        }
      ],
      "Next": "IsPaymentValid"
    },
    "IsPaymentValid": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.validation.Payload.isValid",
          "BooleanEquals": true,
          "Next": "RunFraudCheck"
        }
      ],
      "Default": "PaymentInvalid"
    },
    "PaymentInvalid": {
      "Type": "Fail",
      "Error": "InvalidPayment",
      "Cause": "Payment failed field validation"
    },
    "RunFraudCheck": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${RunFraudCheckFunctionArn}",
        "Payload.$": "$.validation.Payload"
      },
      "ResultPath": "$.fraud",
      "Retry": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "IntervalSeconds": 1,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "FraudCheckError"
        }
      ],
      "Next": "IsFraudulent"
    },
    "FraudCheckError": {
      "Type": "Fail",
      "Error": "FraudCheckUnavailable",
      "Cause": "Fraud detection service was unavailable"
    },
    "IsFraudulent": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.fraud.Payload.isFraudulent",
          "BooleanEquals": true,
          "Next": "PublishFraudDetectedEvent"
        }
      ],
      "Default": "AuthorizePayment"
    },
    "PublishFraudDetectedEvent": {
      "Type": "Task",
      "Resource": "arn:aws:states:::events:putEvents",
      "Parameters": {
        "Entries": [
          {
            "EventBusName": "default",
            "Source": "thrubit.payments",
            "DetailType": "PaymentFraudDetected",
            "Detail": {
              "paymentId.$": "$.fraud.Payload.paymentId",
              "riskScore.$": "$.fraud.Payload.riskScore",
              "riskLevel.$": "$.fraud.Payload.riskLevel",
              "fraudSignals.$": "$.fraud.Payload.fraudSignals",
              "amount.$": "$.validation.Payload.amount",
              "currency.$": "$.validation.Payload.currency",
              "merchantId.$": "$.validation.Payload.merchantId"
            }
          }
        ]
      },
      "ResultPath": "$.fraudEventResult",
      "Next": "AuthorizationDeclined"
    },
    "AuthorizationDeclined": {
      "Type": "Fail",
      "Error": "FraudDetected",
      "Cause": "Payment authorization declined due to fraud signals"
    },
    "AuthorizePayment": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${AuthorizePaymentFunctionArn}",
        "Payload.$": "$.validation.Payload"
      },
      "ResultPath": "$.authorization",
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 1,
          "MaxAttempts": 2,
          "BackoffRate": 2
        }
      ],
      "Catch": [
        {
          "ErrorEquals": [
            "States.ALL"
          ],
          "ResultPath": "$.error",
          "Next": "AuthorizationError"
        }
      ],
      "Next": "PublishPaymentAuthorizedEvent"
    },
    "AuthorizationError": {
      "Type": "Fail",
      "Error": "AuthorizationFailed",
      "Cause": "Payment authorization was declined by the payment rail"
    },
    "PublishPaymentAuthorizedEvent": {
      "Type": "Task",
      "Resource": "arn:aws:states:::events:putEvents",
      "Parameters": {
        "Entries": [
          {
            "EventBusName": "default",
            "Source": "thrubit.payments",
            "DetailType": "PaymentAuthorized",
            "Detail": {
              "paymentId.$": "$.authorization.Payload.paymentId",
              "authCode.$": "$.authorization.Payload.authCode",
              "networkTransactionId.$": "$.authorization.Payload.networkTransactionId",
              "amount.$": "$.validation.Payload.amount",
              "currency.$": "$.validation.Payload.currency",
              "merchantId.$": "$.validation.Payload.merchantId",
              "customerId.$": "$.validation.Payload.customerId"
            }
          }
        ]
      },
      "ResultPath": "$.authEventResult",
      "Next": "AuthorizationApproved"
    },
    "AuthorizationApproved": {
      "Type": "Succeed"
    }
  }
}
JSON
Expand
100%

Financial Services teams can use patterns like this to build reliable, compliant, and scalable automation for payment systems and can test and refine these flows locally with Thrubit to reduce cloud cost and speed up iteration.

Related Articles

  • business person working on a virtual aws state machine
  • thrubit industry financial bank
Free Trial