Files
Pay2Gateway/app/merchant/[id]/(dashboard)/integration/page.tsx

189 lines
11 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React from 'react';
import { db } from '@/lib/db';
import {
Terminal,
Copy,
Globe,
Webhook,
Zap,
ShieldCheck,
Code2,
Server,
Link as LinkIcon
} from 'lucide-react';
import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';
async function getMerchant(identifier: string) {
const isUUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(identifier);
const queryText = isUUID
? 'SELECT * FROM merchants WHERE id = $1 LIMIT 1'
: 'SELECT * FROM merchants WHERE short_id = $1 LIMIT 1';
const result = await db.query(queryText, [identifier]);
return result.rows[0];
}
export default async function MerchantIntegrationPage(props: {
params: Promise<{ id: string }>;
}) {
const resolvedParams = await props.params;
const identifier = resolvedParams.id;
const merchant = await getMerchant(identifier);
const cookieStore = await cookies();
if (!merchant) return null;
if (!cookieStore.get(`merchant_auth_${merchant.id}`)) {
redirect(`/merchant/${identifier}/login`);
}
const host = process.env.NEXT_PUBLIC_BASE_URL || 'https://p2cgateway.com';
const checkoutUrl = `${host}/checkout?merchant_id=${merchant.short_id || merchant.id}&amount=100&currency=TRY&ref_id=SİPARİŞ_123`;
return (
<div className="max-w-6xl space-y-16 animate-in fade-in slide-in-from-bottom-4 duration-700 pb-32">
{/* Header */}
<div className="flex flex-col md:flex-row md:items-end justify-between gap-6">
<div>
<h1 className="text-4xl font-black text-gray-900 tracking-tight">Entegrasyon Rehberi</h1>
<p className="text-xs text-gray-400 font-black uppercase tracking-[0.3em] mt-3 px-1 border-l-4 border-blue-600 pl-4">Ödeme sistemini sisteminize dahil edin</p>
</div>
</div>
{/* Methods Selection */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-10">
{/* Option 1: Quick Link */}
<div className="bg-white p-12 rounded-[48px] border border-gray-100 shadow-xl shadow-gray-100/50 space-y-10 relative overflow-hidden group">
<div className="absolute top-0 right-0 w-32 h-32 bg-blue-50 rounded-full -mr-16 -mt-16 group-hover:scale-150 transition-transform duration-700"></div>
<div className="space-y-6 relative">
<div className="w-16 h-16 bg-blue-600 rounded-3xl flex items-center justify-center text-white shadow-lg shadow-blue-200">
<LinkIcon size={32} />
</div>
<h2 className="text-2xl font-black text-gray-900">1. Hızlı Ödeme Linki</h2>
<p className="text-gray-500 font-medium leading-relaxed">
Kod yazmanıza gerek kalmadan, müşterilerinizi doğrudan ödeme sayfamıza yönlendirebilirsiniz. Parametreleri URL üzerinden iletebilirsiniz.
</p>
</div>
<div className="space-y-4">
<p className="text-[10px] font-black text-gray-400 uppercase tracking-widest pl-1">Örnek Yapı</p>
<div className="bg-gray-50 p-6 rounded-3xl border border-gray-100 font-mono text-[11px] text-gray-600 break-all leading-relaxed relative group/code">
{checkoutUrl}
<button className="absolute top-4 right-4 p-2 bg-white rounded-lg shadow-sm opacity-0 group-hover/code:opacity-100 transition-opacity">
<Copy size={14} className="text-gray-400" />
</button>
</div>
</div>
</div>
{/* Option 2: Server-to-Server API */}
<div className="bg-gray-900 p-12 rounded-[48px] shadow-2xl space-y-10 relative overflow-hidden group">
<div className="absolute top-0 right-0 w-32 h-32 bg-white/5 rounded-full -mr-16 -mt-16"></div>
<div className="space-y-6 relative">
<div className="w-16 h-16 bg-emerald-500 rounded-3xl flex items-center justify-center text-white shadow-lg shadow-emerald-900/20">
<Server size={32} />
</div>
<h2 className="text-2xl font-black text-white">2. Profesyonel API (v1)</h2>
<p className="text-gray-400 font-medium leading-relaxed">
Sunucu taraflı entegrasyon ile daha güvenli işlemler başlatın. Fiyat manipülasyonunu engeller ve sessiz oturumlar oluşturur.
</p>
</div>
<div className="space-y-4">
<p className="text-[10px] font-black text-gray-500 uppercase tracking-widest pl-1">Endpoint</p>
<div className="bg-white/5 p-6 rounded-3xl border border-white/10 font-mono text-[11px] text-emerald-400">
POST {host}/api/v1/checkout
</div>
</div>
</div>
</div>
{/* API Details Section */}
<div className="bg-white p-12 rounded-[48px] border border-gray-100 shadow-sm space-y-12">
<div className="flex items-center gap-6">
<div className="w-14 h-14 bg-gray-50 rounded-2xl flex items-center justify-center text-gray-900">
<ShieldCheck size={28} />
</div>
<div>
<h3 className="text-2xl font-black text-gray-900">API Erişimi ve Güvenlik</h3>
<p className="text-xs text-gray-400 font-bold uppercase tracking-widest mt-1">İsteklerinizi doğrulamak için bu anahtarları kullanın</p>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-10">
<div className="space-y-4">
<label className="text-[10px] font-black text-gray-400 uppercase tracking-widest ml-2">Merchant ID</label>
<div className="bg-gray-50 p-5 rounded-2xl border border-gray-100 flex items-center justify-between">
<code className="text-xs font-mono font-bold text-gray-600">{merchant.id}</code>
<Copy size={16} className="text-gray-300 cursor-pointer hover:text-blue-600 transition" />
</div>
</div>
<div className="space-y-4">
<label className="text-[10px] font-black text-gray-400 uppercase tracking-widest ml-2">API Secret Key</label>
<div className="bg-gray-50 p-5 rounded-2xl border border-gray-100 flex items-center justify-between">
<code className="text-xs font-mono font-bold text-gray-600">
{merchant.api_key.substring(0, 8)}
</code>
<button className="text-[10px] font-black text-blue-600 uppercase tracking-widest hover:underline">Anahtarı Göster</button>
</div>
</div>
</div>
</div>
{/* Webhook Settings */}
<div className="bg-white p-12 rounded-[48px] border border-gray-100 shadow-sm space-y-12">
<div className="flex items-center gap-6">
<div className="w-14 h-14 bg-purple-50 rounded-2xl flex items-center justify-center text-purple-600">
<Webhook size={28} />
</div>
<div>
<h3 className="text-2xl font-black text-gray-900">Olay Bildirimleri (Webhooks)</h3>
<p className="text-xs text-gray-400 font-bold uppercase tracking-widest mt-1">Ödeme sonuçlarını anlık olarak sunucunuzda karşılayın</p>
</div>
</div>
<div className="space-y-8">
<p className="text-gray-500 font-medium leading-relaxed max-w-2xl">
İşlem tamamlandığında sistemimiz belirttiğiniz URL'ye <code className="bg-gray-100 px-2 py-1 rounded text-blue-600 font-bold">POST</code> isteği gönderir. Bu isteğin içerisinde işlemin tüm detayları yer alır.
</p>
<div className="p-8 bg-gray-50 rounded-[32px] border border-gray-100 space-y-6">
<div className="flex items-center justify-between">
<span className="text-[11px] font-black text-gray-400 uppercase tracking-widest ml-2">Webhook URL</span>
<span className={`text-[10px] font-black px-3 py-1 rounded-full ${merchant.webhook_url ? 'bg-emerald-100 text-emerald-700' : 'bg-red-100 text-red-700'}`}>
{merchant.webhook_url ? 'HİZMETE HAZIR' : 'HENÜZ TANIMLANMAMIŞ'}
</span>
</div>
<div className="bg-white p-6 rounded-2xl border border-gray-200">
<code className="text-sm font-bold text-gray-700 break-all">
{merchant.webhook_url || 'https://siteniz.com/api/payment-callback'}
</code>
</div>
</div>
</div>
</div>
{/* Footer Resources */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{[
{ title: 'Postman Koleksiyonu', icon: Terminal, color: 'blue' },
{ title: 'Geliştirici Dokümanları', icon: Code2, color: 'emerald' },
{ title: 'Teknik Yardım', icon: Globe, color: 'gray' },
].map((r) => (
<div key={r.title} className="bg-white p-8 rounded-[32px] border border-gray-100 shadow-sm flex items-center gap-6 hover:shadow-lg transition-all cursor-pointer group hover:-translate-y-1">
<div className={`w-14 h-14 bg-gray-50 rounded-2xl flex items-center justify-center text-gray-400 group-hover:bg-blue-600 group-hover:text-white transition-all`}>
<r.icon size={24} />
</div>
<span className="text-sm font-black text-gray-900 uppercase tracking-tight">{r.title}</span>
</div>
))}
</div>
</div>
);
}