In general, token-payer(=msg.sender) receive service from smartcontract. Is it possible to seperate token payer from service-consumer with special contract and general smartcontract above? It means token-payer is user A (or contract) but service-consumer is user B. Token is erc20.
In my opinion, yes this is possible but, no, it is not necessary or desirable to add complexity to a token contract or, generally, opinions about how to use it.
Think of the token contract as the defining document that describes the minimum important properties such as supply, symbol, contract address, minimal account (where are they?) and minimal functions such as transfer.
That is, one doesn't redesign the federal reserve note for every novel business idea or vending machine design, but the notes themselves impose any opinions about a business should work - separate concerns.
Contract B can be the consumer that receives instructions from user A.
Hope it helps.