Add donation functionality to encourage community support, including a footer card on the home page, a highlighted "Apoiar" link in the header, and comprehensive English messages for the donation section to promote transparency and user engagement.
101 lines
2.6 KiB
TypeScript
101 lines
2.6 KiB
TypeScript
interface AbacatePayConfig {
|
|
apiKey: string;
|
|
accountId: string;
|
|
baseUrl?: string;
|
|
}
|
|
|
|
interface CreateBillingParams {
|
|
amount: number;
|
|
metadata?: {
|
|
donorName?: string;
|
|
donorEmail?: string;
|
|
message?: string;
|
|
};
|
|
returnUrl?: string;
|
|
completionUrl?: string;
|
|
}
|
|
|
|
interface BillingResponse {
|
|
id: string;
|
|
amount: number;
|
|
status: "PENDING" | "PAID" | "EXPIRED" | "CANCELLED";
|
|
pixCode: string;
|
|
pixQrCode: string;
|
|
expiresAt: string;
|
|
createdAt: string;
|
|
}
|
|
|
|
class AbacatePayClient {
|
|
private config: AbacatePayConfig;
|
|
|
|
constructor(config: AbacatePayConfig) {
|
|
this.config = {
|
|
...config,
|
|
baseUrl: config.baseUrl || "https://api.abacatepay.com/v1",
|
|
};
|
|
}
|
|
|
|
async createBilling(params: CreateBillingParams): Promise<BillingResponse> {
|
|
const response = await fetch(`${this.config.baseUrl}/billing`, {
|
|
method: "POST",
|
|
headers: {
|
|
Authorization: `Bearer ${this.config.apiKey}`,
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
account_id: this.config.accountId,
|
|
amount: params.amount * 100, // centavos
|
|
metadata: params.metadata,
|
|
return_url: params.returnUrl,
|
|
completion_url: params.completionUrl,
|
|
}),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const errorData = await response.json().catch(() => ({}));
|
|
throw new Error(
|
|
`Failed to create billing: ${errorData.message || response.statusText}`
|
|
);
|
|
}
|
|
|
|
return response.json();
|
|
}
|
|
|
|
async getBillingStatus(billingId: string): Promise<BillingResponse> {
|
|
const response = await fetch(
|
|
`${this.config.baseUrl}/billing/${billingId}`,
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${this.config.apiKey}`,
|
|
},
|
|
}
|
|
);
|
|
|
|
if (!response.ok) {
|
|
const errorData = await response.json().catch(() => ({}));
|
|
throw new Error(
|
|
`Failed to get billing status: ${
|
|
errorData.message || response.statusText
|
|
}`
|
|
);
|
|
}
|
|
|
|
return response.json();
|
|
}
|
|
|
|
verifyWebhookSignature(payload: string, signature: string): boolean {
|
|
// Implementar verificação de assinatura conforme documentação do AbacatePay
|
|
// Por enquanto, retorna true para desenvolvimento
|
|
// Em produção, implementar a verificação real
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// Instância do cliente (será configurada com variáveis de ambiente)
|
|
export const abacatePay = new AbacatePayClient({
|
|
apiKey: process.env.ABACATEPAY_API_KEY || "demo_key",
|
|
accountId: process.env.ABACATEPAY_ACCOUNT_ID || "demo_account",
|
|
});
|
|
|
|
export type { CreateBillingParams, BillingResponse };
|