import express from "express";
import { config } from "dotenv";
import { X402Server } from "x402x-server";
import { Facilitator } from "x402x-facilitator";
import { createPublicClient, http } from "viem";
import { parseEther } from "viem";
import { bsc } from "viem/chains";
config();
const app = express();
app.use(express.json());
const PORT = 3939;
const RECIPIENT_ADDRESS=0xSellerRecipientAddress;
async function main() {
// 创建 viem client
const client = createPublicClient({
chain: bsc,
transport: http(),
});
// 创建 facilitator
const facilitator = new Facilitator({
recipientAddress: RECIPIENT_ADDRESS,
waitUntil: "confirmed",
});
// 创建 server
const server = new X402Server({ client, facilitator });
// 预检测当前 token 所支持的支付方案
await server.initialize(["0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d"]);
// 付费 API
app.post("/api/data", async (req, res) => {
try {
// 创建支付要求(可根据业务动态调整金额/描述/资源等)
const requirements = await server.createRequirements({
asset: "0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d", // USD1
maxAmountRequired: parseEther("0.01").toString(), // 0.01 USD1
description: "API access",
resource: `http://localhost:${PORT}/api/data`,
});
// 处理支付
const result = await server.process(
req.headers["x-payment"] as string,
requirements
);
if (!result.success) {
return res.status(result.status).json(result.response);
}
// 支付成功,返回数据并可记录对账信息
res.json({
message: "Success!",
data: "This is premium content",
payer: result.data.payer,
txHash: result.data.txHash,
});
} catch (error) {
console.error("Error:", error);
res.status(500).json({
error: "Internal server error",
message: error instanceof Error ? error.message : "Unknown error",
});
}
});
app.listen(PORT, () => {
console.log(`✅ Server running on http://localhost:${PORT}`);
});
}
main();