json
{
"Comment":"Order processing with retries, callback, approval, compensation",
"StartAt":"AuthorizePayment",
"States":{
"AuthorizePayment":{
"Type":"Task",
"Resource":"arn:aws:states:::lambda:invoke",
"Parameters":{"FunctionName":"AuthorizePayment","Payload.$":"$"},
"Retry":[{"ErrorEquals":["TransientError"],"IntervalSeconds":2,"BackoffRate":2,"MaxAttempts":5}],
"Catch":[{"ErrorEquals":["AuthorizationFailed"],"Next":"DoneFailure"},{"ErrorEquals":["States.ALL"],"Next":"CompensateRefund"}],
"Next":"ReserveInventory"
},
"ReserveInventory":{
"Type":"Task","Resource":"arn:aws:states:::lambda:invoke",
"Parameters":{"FunctionName":"ReserveInventory","Payload.$":"$"},
"Retry":[{"ErrorEquals":["TransientError"],"IntervalSeconds":2,"BackoffRate":2,"MaxAttempts":5}],
"Catch":[{"ErrorEquals":["InventoryUnavailable"],"Next":"CompensateRefund"},{"ErrorEquals":["States.ALL"],"Next":"CompensateRefund"}],
"Next":"CheckApprovalNeeded"
},
"CheckApprovalNeeded":{
"Type":"Choice",
"Choices":[{"Variable":"$.order.amount","NumericGreaterThan":"$.config.approvalThreshold","Next":"HumanApproval"}],
"Default":"ExternalFulfillment"
},
"HumanApproval":{
"Type":"Task",
"Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken",
"Parameters":{"FunctionName":"StartApprovalWorkflow","Payload":{"token.$":"$$.Task.Token","order.$":"$"}},
"TimeoutSeconds":259200,
"Catch":[{"ErrorEquals":["States.ALL"],"Next":"CompensateRefund"}],
"Next":"ExternalFulfillment"
},
"ExternalFulfillment":{
"Type":"Task",
"Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken",
"Parameters":{"FunctionName":"InvokeFulfillmentProvider","Payload":{"token.$":"$$.Task.Token","order.$":"$"}},
"Retry":[{"ErrorEquals":["TransientError"],"IntervalSeconds":5,"BackoffRate":2,"MaxAttempts":6}],
"Catch":[{"ErrorEquals":["FulfillmentFailed"],"Next":"CompensateRefund"},{"ErrorEquals":["States.ALL"],"Next":"CompensateRefund"}],
"Next":"DoneSuccess"
},
"CompensateRefund":{
"Type":"Parallel",
"Branches":[
{"StartAt":"RefundPayment","States":{"RefundPayment":{"Type":"Task","Resource":"arn:aws:states:::lambda:invoke","Parameters":{"FunctionName":"RefundPayment","Payload.$":"$"},"End":true}}},
{"StartAt":"ReleaseInventory","States":{"ReleaseInventory":{"Type":"Task","Resource":"arn:aws:states:::lambda:invoke","Parameters":{"FunctionName":"ReleaseInventory","Payload.$":"$"},"End":true}}}
],
"Catch":[{"ErrorEquals":["States.ALL"],"Next":"DoneFailure"}],
"Next":"DoneFailure"
},
"DoneSuccess":{"Type":"Succeed"},
"DoneFailure":{"Type":"Fail"}
}
}