Modern software teams are used to APIs that behave reasonably well. You authenticate. You send a request. You get a response. Somewhere there is attractive documentation with examples in six programming languages.
Payments can occasionally work like that.
It can also involve processor-specific certification requirements, card-network rules, cryptographic key management, tokenization strategies, terminal behavior, clearing formats, settlement files, exception handling, retries, reversals, duplicate detection, reconciliation, and a surprising number of ways to successfully process a transaction incorrectly.
That last one is important. Getting a transaction approved is not the same thing as building a good payments system.
A design decision can affect interchange. A tokenization decision can affect portability. A field populated incorrectly during authorization can create downstream clearing problems. An architecture that works beautifully for your first hundred merchants can become an operational nightmare at ten thousand.
This is why payments experience matters before the code is written.