protected function process(Request $request)
    {
        $validator = Validator::make(
            [
                'order_id'  => $request->get('order_id'),
                'status'    => $request->get('status'),
                'shoptoken' => $request->get('shoptoken'),
            ],
            [
                'order_id'  => 'required|exists:' . config('shop.order_table') . ',id',
                'status'    => 'required|in:success,fail',
                'shoptoken' => 'required|exists:' . config('shop.transaction_table') . ',token,order_id,' . $request->get('order_id'),
            ]
        );
        if ($validator->fails()) {
            abort(404);
        }
        $order = call_user_func(config('shop.order') . '::find', $request->get('order_id'));
        $transaction = $order->transactions()->where('token', $request->get('shoptoken'))->first();
        Shop::callback($order, $transaction, $request->get('status'), $request->all());
        $transaction->token = null;
        $transaction->save();
        return redirect()->route(config('shop.callback_redirect_route'), ['orderId' => $order->id]);
    }