You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel应用中实现可嵌入的自定义徽章组件

嘿,这个需求其实和DMCA徽章的思路完全一致,咱们一步步拆解,在Laravel里实现这个可嵌入的推广徽章功能:

一、先搞定数据库存储

首先需要一张表来记录用户的网站URL和徽章关联信息,比如创建一个badge_embeds表,执行以下迁移:

Schema::create('badge_embeds', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
    $table->string('website_url')->unique(); // 存储用户的网站域名/完整URL
    $table->string('verification_code')->nullable(); // 用于网站验证的唯一码
    $table->boolean('is_verified')->default(false); // 标记网站是否已验证
    $table->timestamps();
});
二、核心后端逻辑

1. 生成用户专属的嵌入代码

用户在后台获取嵌入代码时,咱们要生成类似DMCA的代码片段,包含徽章链接、图片和脚本。可以写一个控制器方法:

public function getEmbedCode(Request $request)
{
    // 先确认用户已验证过网站
    $embed = $request->user()->badgeEmbeds()->where('is_verified', true)->firstOrFail();
    $badgeImageUrl = route('badge.image', $embed->id);
    $badgeLinkUrl = route('badge.redirect', $embed->id);
    $scriptUrl = route('badge.script', $embed->id);

    // 返回格式化的嵌入代码
    return response()->json([
        'code' => <<<HTML
<a href="$badgeLinkUrl" title="你的推广标语" class="your-custom-badge">
    <img src="$badgeImageUrl" alt="你的推广描述" />
</a>
<script src="$scriptUrl"></script>
HTML
    ]);
}

2. 徽章图片与跳转路由

  • 图片路由:返回用户的推广徽章图片,同时可以做访问验证(比如检查请求来源是否是用户的验证网站):
Route::get('/badge/image/{embedId}', [BadgeController::class, 'serveImage'])->name('badge.image');

// 控制器方法
public function serveImage($embedId)
{
    $embed = BadgeEmbed::findOrFail($embedId);
    // 验证请求来源是否属于用户已验证的网站
    $referer = request()->header('Referer');
    if ($referer && !str_contains($referer, parse_url($embed->website_url, PHP_URL_HOST))) {
        // 未授权访问返回默认占位图
        return response()->file(public_path('images/unauthorized-badge.png'));
    }
    // 返回正式徽章图片
    return response()->file(public_path('images/promotion-badge.png'));
}
  • 跳转路由:处理徽章点击跳转,同时可以统计点击次数:
Route::get('/badge/redirect/{embedId}', [BadgeController::class, 'redirect'])->name('badge.redirect');

public function redirect($embedId)
{
    $embed = BadgeEmbed::findOrFail($embedId);
    // 记录点击次数(可以加个click_count字段自增)
    $embed->increment('click_count');
    // 跳转到你的推广目标页面
    return redirect()->to(config('app.promotion_target_url'));
}

3. 辅助脚本路由

脚本可以用来实现额外功能,比如统计展示次数、动态调整徽章样式:

Route::get('/badge/script/{embedId}', [BadgeController::class, 'serveScript'])->name('badge.script');

public function serveScript($embedId)
{
    $script = <<<JS
document.addEventListener('DOMContentLoaded', function() {
    // 统计徽章展示次数(发送请求到后端)
    fetch('/badge/track-impression/$embedId', { method: 'POST', mode: 'no-cors' });
    
    // 给徽章添加hover效果
    const badge = document.querySelector('.your-custom-badge');
    if (badge) {
        badge.style.cursor = 'pointer';
        badge.addEventListener('mouseover', () => badge.style.opacity = '0.9');
        badge.addEventListener('mouseout', () => badge.style.opacity = '1');
    }
});
JS;
    return response($script)->header('Content-Type', 'application/javascript');
}
三、关键:网站验证机制

必须确保用户拥有该网站的控制权,否则徽章会被滥用,两种常用验证方式:

1. Meta标签验证

  • 给用户生成唯一验证码,让用户添加到网站的<head>中:<meta name="your-app-verification" content="{$embed->verification_code}">
  • 后端验证逻辑:
public function verifyWebsite(Request $request)
{
    $embed = $request->user()->badgeEmbeds()->where('website_url', $request->website_url)->first();
    $client = new \GuzzleHttp\Client();
    try {
        $response = $client->get($embed->website_url);
        $html = (string)$response->getBody();
        // 检查meta标签是否存在且匹配
        if (str_contains($html, $embed->verification_code)) {
            $embed->update(['is_verified' => true]);
            return redirect()->back()->with('success', '网站验证成功!');
        }
    } catch (\Exception $e) {
        return redirect()->back()->with('error', '验证失败,请检查网站是否可访问');
    }
    return redirect()->back()->with('error', '未找到验证标签');
}

2. 文件验证

让用户下载一个包含唯一验证码的HTML文件,上传到网站根目录,后端访问该文件检查内容是否匹配,逻辑和Meta标签类似,只是检查的是文件内容。

四、用户后台界面

在用户后台添加一个“获取推广徽章”的模块,展示嵌入代码并提供复制功能:

<div class="card">
    <div class="card-header">推广徽章嵌入代码</div>
    <div class="card-body">
        <textarea class="form-control" rows="5" readonly>{{ $embedCode }}</textarea>
        <button class="btn btn-primary mt-2" onclick="copyCode()">复制代码</button>
    </div>
</div>

<script>
function copyCode() {
    const textarea = document.querySelector('textarea');
    textarea.select();
    document.execCommand('copy');
    alert('代码已复制,可直接粘贴到你的网站中!');
}
</script>
五、优化建议
  • 缓存设置:给徽章图片和脚本添加缓存头,减少服务器压力,比如在返回响应时添加->header('Cache-Control', 'public, max-age=86400')
  • HTTPS支持:确保所有资源链接都是HTTPS,避免用户网站出现混合内容警告
  • 多样式选择:提供多种徽章样式,让用户选择,生成对应样式的嵌入代码
  • 数据统计:在后台给用户展示徽章的展示次数、点击次数,提升用户体验

内容的提问来源于stack exchange,提问作者Amin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:28:12