void FinalizeTransaction()
    {
        string orderId    = web.Param("orderId");
        string CustomerID = web.CustomerID();

        // check that transaction was approved and get it transactionID
        SteamApi api = new SteamApi();

        SteamXML.MicroTnxResponse resp = api.QueryTxn(orderId);
        //System.Diagnostics.Debug.WriteLine("@@@QueryTxn: " + api.lastData_);
        if (!ParseResponse(resp))
        {
            return;
        }
        if (resp.params_.status != "Approved")
        {
            Response.Write("WO_5");
            Response.Write(string.Format("bad status: {0}", resp.params_.status));
            return;
        }

        // finalize transaction in steam. NOTE: f*****g steam give http error instead of valid answer here
        resp = api.FinalizeTxn(orderId);
        //System.Diagnostics.Debug.WriteLine("@@@FinalizeTxn: " + api.lastData_);
        if (!ParseResponse(resp))
        {
            return;
        }

        // note: we can't pass transaction id as bigint here, because stream using *unsigned* int64.
        string transid = resp.params_.transid;

        // finalize transaction in DB and get new balance
        SqlCommand sqcmd = new SqlCommand();

        sqcmd.CommandType = CommandType.StoredProcedure;
        sqcmd.CommandText = "WO_SteamFinishOrder";
        sqcmd.Parameters.AddWithValue("@in_IP", LastIP);
        sqcmd.Parameters.AddWithValue("@in_CustomerID", CustomerID);
        sqcmd.Parameters.AddWithValue("@in_OrderID", orderId);
        sqcmd.Parameters.AddWithValue("@in_transid", transid);
        if (!CallWOApi(sqcmd))
        {
            return;
        }

        // return new GP balance
        reader.Read();
        int balance = getInt("Balance");

        Response.Write("WO_0");
        Response.Write(balance.ToString());
    }