@makasim I was trying to implement your idea. I am naming the event `sylius.checkout.purchase.complete` to keep consistant with [other events](https://github.com/Sylius/Sylius/blob/master/src/Sylius/Bundle/CoreBundle/Checkout/SyliusCheckoutEvents.php). 

* Since other checkout events are all using `GenericEvent`, in order to be able to set `Response` to the event, so I guess I have to create a new event  `Sylius\Bundle\PayumBundle\Event\ResponseEvent` that extend `GenericEvent`.
* Should we pass PurchaseStep (`$this`) as a argument to the event, so people can call `$step->complete()` in event listener?

```php
$completeEvent = new GenericEvent($order);
$this->dispatchEvent(SyliusCheckoutEvents::PURCHASE_COMPLETE, $completeEvent);

if ($completeEvent->hasResponse()) {
    return $completeEvent->getResponse();
}

$this->getCartProvider()->abandonCart();
return $this->complete();
```

Thank you for the feedback.