Rehberler

Kod örnekleri

Aynı iki işin üç dilde çalışan hali: ödeme oturumu açıp alıcıyı yönlendirmek ve webhook'u doğrulamak.

import express from "express";
import crypto from "node:crypto";

const app = express();
const API = "https://odecik.com/api/v1";
const KEY = process.env.ODECIK_API_KEY;
const WEBHOOK_SECRET = process.env.ODECIK_WEBHOOK_SECRET;

// 1) Satın al butonu → ödeme oturumu aç → alıcıyı yönlendir
app.post("/satin-al", express.urlencoded({ extended: false }), async (req, res) => {
  const r = await fetch(`${API}/checkout/sessions`, {
    method: "POST",
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
    body: JSON.stringify({
      product: req.body.product,
      successUrl: "https://siteadresin.com/tesekkurler",
      buyer: { name: req.body.name, email: req.body.email, ip: req.ip },
    }),
  });
  const session = await r.json();
  if (!r.ok) return res.status(400).send(session.error.message);
  res.redirect(303, session.paymentUrl);
});

// 2) Webhook — ham gövde gerekli, express.json() KULLANMA
app.post("/odecik-webhook", express.raw({ type: "application/json" }), (req, res) => {
  const header = req.get("x-odecik-signature") ?? "";
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const expected = crypto
    .createHmac("sha256", WEBHOOK_SECRET)
    .update(`${parts.t}.${req.body}`)
    .digest("hex");

  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  const valid =
    fresh && parts.v1 && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
  if (!valid) return res.sendStatus(400);

  const evt = JSON.parse(req.body.toString("utf8"));
  if (evt.event === "order.paid") {
    // evt.id ile tekrarları ele, siparişi teslim et
    console.log("Ödendi:", evt.data.orderNo, evt.data.totalKurus);
  }
  res.sendStatus(200);
});

app.listen(3000);