use reqwest::{Client, Error};
use uuid::Uuid;
pub mod models;
use models::{PaymentInitializeResponse, PaymentInitializePayload, PaymentVerifyResponse};
const PAYSTACK_BASE_URL: &str = "https://api.paystack.co";
pub struct PaystackClient{
client : Client,
secret_key : String
}
impl PaystackClient{
pub fn new<S : Into<String>> (secret_key : S) -> Self {
Self {
client : Client::new(),
secret_key : secret_key.into()
}
}
pub fn generate_refrence(&self) -> String {
Uuid::new_v4().to_string()
}
pub async fn initialize_payment(
&self,
email: &str,
amount: f64,
callback_url: &str) -> Result<(String, PaymentInitializeResponse), Error>{
let reference: String = self.generate_refrence();
let payload = PaymentInitializePayload {
email: email.to_string(),
amount: (amount * 100.0) as i64,
reference: reference.clone(),
callback_url: callback_url.to_string(),
};
let res = self
.client
.post(format!("{}/transaction/initialize", PAYSTACK_BASE_URL))
.bearer_auth(&self.secret_key)
.json(&payload)
.send()
.await?
.json::<PaymentInitializeResponse>()
.await?;
Ok((reference, res))
}
pub async fn verify_payment(&self, reference:&str) -> Result<PaymentVerifyResponse, Error> {
let res = self
.client
.get(format!("{}/transaction/verify/{}", PAYSTACK_BASE_URL, reference))
.bearer_auth(&self.secret_key)
.send()
.await?
.json::<PaymentVerifyResponse>()
.await?;
Ok(res)
}
}