@winzou Maybe in a separated PR, should we avoid changing order state directly, and only change order state in a listener?

The flow:

1. Payment received -> change payment state -> trigger `OrderPaymentStateListener`
2. Order payment state changed to "completed" -> trigger `OrderStateListener`
3. Order state changed to "confirm"

In step #2, `OrderPaymentStateListener` will check all completed payment's total amount, and only change order payment state to completed if we received full amount.