doesn't your common abstraction layer become your single point of failure in this situation? The only robust economical way to do that is too use a third party multiplatform abstraction service, especially given the complexity of maintaining functional billing across multiple payment processors, you're kinda screwed if you try to implement this in house for a small business (either losing revenue to bugs or losing money to in house implementation time/costs)