use bkash_rs::models::common::{Currency, Money};
use bkash_rs::models::token::GrantTokenRequest;
use bkash_rs::models::tokenized::CreatePaymentRequest;
use bkash_rs::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
const APP_KEY: &str = "your_app_key_here";
const APP_SECRET: &str = "your_app_secret_here";
const USERNAME: &str = "your_username_here";
const PASSWORD: &str = "your_password_here";
const AGREEMENT_ID: &str = "your_agreement_id_here";
println!("Building bkash client...");
let bkash = Bkash::builder()
.environment(Environment::Sandbox)
.app_key(APP_KEY)
.app_secret(APP_SECRET)
.username(USERNAME)
.password(PASSWORD)
.build_and_connect()
.await?;
println!(
"Client ready: {}",
bkash.config().environment.base_url(Product::Tokenized)
);
println!("\n[1/4] Granting token...");
let token_req = GrantTokenRequest::new(APP_KEY, APP_SECRET);
let token = bkash.tokenized().grant_token(token_req).await?;
println!(" -> got token, expires in {}s", token.expires_in);
println!("\n[2/4] Creating payment...");
let amount = Money::bdt("100.00");
let create_req = CreatePaymentRequest::new(
AGREEMENT_ID,
"demo-payer-001",
"https://merchant.test/callback",
amount.clone(),
Currency::Bdt,
)
.with_merchant_invoice_number(format!("INV-{}", chrono_like_now()));
let created = bkash.tokenized().create_payment(create_req).await?;
println!(" -> paymentID = {}", created.payment_id);
println!(" -> bkashURL = {}", created.bkash_url);
println!("\n[3/4] Querying payment...");
let status = bkash.tokenized().query_payment(&created.payment_id).await?;
println!(" -> transactionStatus = {}", status.transaction_status);
println!(" -> trxID = {}", status.trx_id);
let _ = amount;
println!("\nDone.");
Ok(())
}
fn chrono_like_now() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_secs())
.unwrap_or(0)
}