Integración de alianzas publicitarias en un sistema SaaS mediante desarrollo personalizado

Tablas de datos que requieren modificaciones

  • w_ad_app // Almacena datos agregados de la alianza publicitaria
  • w_ad_app_day_log // Registra estadísticas diarias por aplciación en la alianza
  • w_ad_member_app_day_log // Captura datos diarios de la alianza por usuario
  • w_ad_bill_[identificador_alianza] // Recopila facturas de la alianza específica

Alteraciones necesarias en el código fuente

  1. Añadir configuraciones predeterminadas para el control de riesgos en el archivo: niucloud-master/niucloud/addon/w_ad/app/dict/ad/AdRiskDict.php
  2. Definir un diccionario para tipos de publicidad en: niucloud-master/niucloud/addon/w_ad/app/dict/ad/AdTypeDict.php
  3. Incorporar mapeo de diccionario publicitario mediante el método rewardMoney() en: niucloud/addon/w_ad/app/service/api/ad/AdLogService.php
  4. Agregar referencias de diccionario en los métodos edit() y getPage() dentro de: niucloud/addon/w_ad/app/service/admin/ad/AdMemberAppDayLogService.php y niucloud/addon/w_ad/app/service/admin/ad/AdAppDayLogService.php
  5. Extender los campos de respuesta en getInfo() y getPage() en: niucloud/addon/w_ad/app/service/admin/ad/AdAppService.php
  6. Modificar el mapeo de diccionario en edit() y getPage() para la capa de API en: niucloud/addon/w_ad/app/service/api/ad/AdAppService.php
  7. Reforzar la lógica de retiro para cuentas congeladas en: niucloud-master/niucloud/app/api/controller/member/MemberCashOut.php

Ejemplo modificado: solicitud de retiro con validaciones

public function apply(array $params) {
    $withdrawal_config = (new CashOutService())->getConfigurations($params['account_type']);
    $limit_count = 0;
    foreach ($withdrawal_config as $config) {
        if ($config['amount'] == $params['requested_amount']) {
            $limit_count = $config['daily_limit'];
        }
    }

    $current_count = (new MemberCashOut())->whereBetweenTime('created_at')->where([
        ['amount_requested', '=', $params['requested_amount']],
        ['status', 'in', [1, 2, 3]],
        ['user_id', '=', $this->user_id]
    ])->count();

    if ($current_count >= $limit_count) {
        throw new CommonException('Límite de retiros diarios para ' . $params['requested_amount'] . ' unidades alcanzado');
    }

    $user_data = (new Member())->where('user_id', $this->user_id)->field('account_status')->findOrEmpty();
    if (!$user_data['account_status']) {
        throw new CommonException('Cuenta bloqueada: retiro no permitido');
    }

    return (new CoreMemberCashOutService())->processWithdrawal($this->site_id, $this->user_id, $params);
}

  1. Ajustar terminología en los diccionarios de idioma, cambiando referencias a monedas virtuales en: niucloud-master/niucloud/app/lang/zh-cn/dict.php
  2. Expandir la tabla de miembros con un campo para saldos en proceso de retiro, integrado en el modelo de datos
  3. Optimizar el flujo de aprobación automática basado en umbrales de monto en: niucloud-master/niucloud/app/service/core/member/CoreMemberCashOutService.php, cerca de la línea 170

Lógica de aprobación automática revisada

if ($global_config['auto_approval_enabled']) {
    $approval_service = new CoreMemberCashOutService();
    $ecpm_average = (new CoreMemberBindingService())->calculateAverageEcpm($user_id);
    $auto_approve = false;

    if ($ecpm_average <= 0.3 && $params['requested_amount'] <= 3) {
        $auto_approve = true;
    }

    $historical_total = (new MemberBinding())->where('user_id', $user_id)->field('total_withdrawn')->findOrEmpty();
    if ($params['requested_amount'] <= 5 && $historical_total['total_withdrawn'] >= 50) {
        $auto_approve = true;
    }

    if ($auto_approve) {
        $approval_service->approveWithdrawal($site_id, $withdrawal->id, 'accepted');
    }
}

  1. Habilitar ajustes de saldos virtuales desde el panel admniistrativo mediante:
    • Definir tipos de cambio en cuentas para monedas y comisiones en: niucloud-master/niucloud/app/dict/member/account_change_type.php
    • Agregar términos localizados en los archivos de idioma del módulo correspondiente
    • Implementar controladores y servicios para gestionar ajustes manuales, con rutas específicas en: niucloud-master/niucloud/app/adminapi/route/member.php
  2. Geolocalización de direcciones IP para usuarios, extrayendo región y ciudad en el modelo: niucloud-master/niucloud/app/model/member/Member.php

Implementación de mapeo IP a ubicación

public function resolveGeoLocationAttribute($value, $attributes): string {
    $ip_address = $attributes['last_login_ip'];
    try {
        $db_path = app()->getRootPath() . 'addon/w_ad/app/extend/ip2region/ip2region.xdb';
        $geo_searcher = \addon\w_ad\app\extend\ip2region\XdbSearcher::createFromFile($db_path);
        $region_data = $geo_searcher->lookup($ip_address);
        if ($region_data === null) {
            return 'Ubicación no disponible';
        }
        $parts = explode('|', $region_data);
        return $parts[2] . ', ' . $parts[3] . ', ' . $parts[4];
    } catch (Exception $e) {
        log_error('Error al procesar IP: ' . $e->getMessage());
        return 'Error en geolocalización';
    }
}

Etiquetas: SaaS PHP Base de Datos Publicidad digital NiuCloud

Publicado el 6-25 02:41