foreach ($item_ids as $v) {
            db_query("UPDATE {$tables['download_keys']} SET expires = '" . (time() + $config['egoods']['download_key_ttl'] * 3600) . "' WHERE item_id = '{$v['item_id']}'");
        }
    }
    $pids = cw_query("SELECT {$tables['order_details']}.item_id, {$tables['order_details']}.product_id, {$tables['products']}.distribution FROM {$tables['order_details']}, {$tables['products']} WHERE {$tables['order_details']}.doc_id = '{$doc_id}' AND {$tables['order_details']}.product_id = {$tables['products']}.product_id AND {$tables['products']}.distribution != ''");
    if ($pids) {
        $keys = array();
        foreach ($pids as $v) {
            if (cw_query_first_cell("SELECT COUNT(*) FROM {$tables['download_keys']} WHERE item_id = '{$v['item_id']}'")) {
                continue;
            }
            $keys[$v['item_id']]['download_key'] = keygen($v['product_id'], $config['egoods']['download_key_ttl'], $v['item_id']);
            $keys[$v['item_id']]['distribution_filename'] = basename($v['distribution']);
        }
        if (!empty($keys)) {
            $order = cw_order_data($doc_id);
            if (!empty($order)) {
                foreach ($order['products'] as $k => $v) {
                    if (isset($keys[$v['item_id']])) {
                        $order['products'][$k] = cw_array_merge($v, $keys[$v['item_id']]);
                    }
                }
                $smarty->assign('products', $order['products']);
                $smarty->assign('order', $order['order']);
                $smarty->assign('userinfo', $order['userinfo']);
                cw_call('cw_send_mail', array($config['Company']['orders_department'], $order['userinfo']['email'], "mail/egoods_download_keys_subj.tpl", "mail/egoods_download_keys.tpl"));
            }
        }
    }
    cw_header_location("index.php?target={$target}&mode=details&doc_id=" . $doc_id);
}
function cw_payment_check_results($payment_data)
{
    $log_payment_failure = false;
    if (!empty($payment_data['sess_id'])) {
        if (cw_check_webinput() == "err") {
            $log_payment_failure = true;
            if ($payment_data['code'] == 1) {
                $__transaction_status = "successful";
                $payment_data['code'] = 3;
            } elseif ($payment_data['code'] == 3) {
                $__transaction_status = "queued";
            } else {
                $__transaction_status = "declined";
            }
            $payment_data['billmes'] = "Gateway reported of {$__transaction_status} transaction but it's response came from the IP that is not specified in the list of valid IPs: " . cw_get_valid_ip($_SERVER['REMOTE_ADDR']) . "\n-- response ----\n" . $payment_data['billmes'];
        }
        $sessurl = APP_SESSION_NAME . "=" . $payment_data['sess_id'] . "&";
        cw_session_id($payment_data['sess_id']);
    } else {
        $sessurl = '';
    }
    $cart =& cw_session_register('cart', array());
    $secure_oid =& cw_session_register("secure_oid");
    $bill_error = $reason = '';
    $fatal = false;
    if (!empty($payment_data)) {
        $saved_payment_data = $payment_data;
    } else {
        $saved_payment_data = false;
    }
    if (empty($secure_oid)) {
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
        $payment_data['billmes'] = "error: your order was lost";
        $reason = $payment_data['billmes'];
        $fatal = true;
    } elseif (empty($cart) && empty($payment_data['skey'])) {
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
        $payment_data['billmes'] = "Error: Your cart was lost";
        $reason = $payment_data['billmes'];
        $fatal = true;
    } elseif ($payment_data['code'] == 3) {
        $reason = $payment_data['billmes'];
    } elseif ($payment_data['code'] == 2) {
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
        $reason = $payment_data['billmes'];
    } elseif ($payment_data['code'] == 1) {
        if (isset($payment_return) && !empty($payment_return) && $payment_data['code'] != 2) {
            if (isset($payment_return['total'])) {
                $sum = 0;
                foreach ($secure_oid as $_oid) {
                    $o = cw_order_data($_oid);
                    $sum += $o['order']['total'];
                }
                if ($sum != doubleval($payment_return['total'])) {
                    $payment_data['code'] = 2;
                    $payment_data['billmes'] .= "; Payment amount mismatch.";
                }
            }
            if ($payment_data['code'] != 2 && isset($payment_return['currency']) && isset($payment_return['_currency']) && !empty($payment_return['_currency']) && $payment_return['currency'] != $payment_return['_currency']) {
                $payment_data['code'] = 2;
                $payment_data['billmes'] .= "; Payment amount mismatch.";
            }
        }
        if ($payment_data['code'] == 1) {
            $payment_data['billmes'] = "Approved: " . $payment_data['billmes'];
        } else {
            $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_error");
            $reason = $payment_data['billmes'];
            $payment_data['billmes'] = "Declined: " . $payment_data['billmes'];
        }
    } else {
        # unavailable
        $bill_error = cw_get_langvar_by_name("lbl_error_ccprocessor_unavailable");
        $payment_data['billmes'] = "Error: Payment gateway is unavailable";
    }
    if (!$fatal) {
        cw_load('doc');
        $status_after_capture = cw_call('cw_payment_doc_status_after_capture', array($payment_data));
        $order_status = $bill_error ? "F" : ($payment_data['code'] == 3 ? "Q" : $status_after_capture);
        if (in_array($order_status, array('P', 'Q', $status_after_capture)) && !empty($payment_data['is_preauth'])) {
            $order_status = 'A';
            // Authorized
        }
        if ($payment_data['code'] == 1 || $payment_data['code'] == 3) {
            if (empty($payment_data['skey'])) {
                $cart = array();
            }
        }
        $advinfo = array();
        $advinfo[] = "Reason: " . $payment_data['billmes'];
        if ($payment_data['avsmes']) {
            $advinfo[] = "AVS info: " . $payment_data['avsmes'];
        }
        if ($payment_data['cvvmes']) {
            $advinfo[] = "CVV info: " . $payment_data['cvvmes'];
        }
        if (isset($cmpi_result)) {
            $advinfo[] = "3-D Secure Transaction:";
            if (isset($cmpi_result['Enrolled'])) {
                $advinfo[] = "  TransactionId: " . $cmpi_result['TransactionId'];
                $advinfo[] = "  Enrolled: " . $cmpi_result['Enrolled'];
            } else {
                $advinfo[] = "  PAResStatus: " . $cmpi_result['PAResStatus'];
                $advinfo[] = "  PAResStatusDesc: " . $cmpi_result['PAResStatusDesc'];
                $advinfo[] = "  CAVV: " . $cmpi_result['Cavv'];
                $advinfo[] = "  SignatureVerification: " . $cmpi_result['SignatureVerification'];
                $advinfo[] = "  Xid: " . $cmpi_result['Xid'];
                $advinfo[] = "  EciFlag: " . $cmpi_result['EciFlag'];
            }
            if (!empty($cmpi_result['ErrorNo'])) {
                $advinfo[] = "  ErrorNo: " . $cmpi_result['ErrorNo'];
            }
            if (!empty($cmpi_result['ErrorDesc'])) {
                $advinfo[] = "  ErrorDesc: " . $cmpi_result['ErrorDesc'];
            }
        }
        cw_call('cw_doc_change_status', array($secure_oid, $order_status, join("\n", $advinfo)));
    }
    if (!empty($payment_data['extra_order_data'])) {
        foreach ($secure_oid as $oid) {
            cw_call('cw_doc_place_extras_data', array($oid, $payment_data['extra_order_data']));
        }
        unset($payment_data['extra_order_data']);
    }
    cw_session_unregister("secure_oid");
    cw_session_save();
    return array('bill_error' => $bill_error, 'sessurl' => $sessurl, 'reason' => $reason, 'doc_ids' => $secure_oid);
}