Documentation
#[cfg(test)]
mod tests {
    use std::collections::HashMap;

    use dotenvy::dotenv;
    use rpay::{model::{AmountBuilder, PayType, PayerBuilder}, pay::{
            app::AppPayBuilder, config::{WechatV3PayConfig, WechatV3PayConfigBuilder}, h5::H5PayBuilder, jsapi::JsApiPayBuilder, native::NativePayBuilder, parse_encrypt::ParseEncryptBuilder, pay_info::PayInfoBuilder
        }, RPayResult
    };

    fn get_oepn_id() -> String {
        let openid = std::env::var("WECHAT_OPEN_ID").expect("WECHAT_OPEN_ID not found");
        return openid;
    }
    
    // sdk公共参数
    fn get_sdk() -> RPayResult<WechatV3PayConfig> {
        dotenv().ok();
        let app_id = std::env::var("WECHAT_APP_ID").expect("WECHAT_APP_ID not found");
        let mch_id = std::env::var("WECHAT_MCH_ID").expect("WECHAT_MCH_ID not found");
        let secret = std::env::var("WECHAT_SECRET").expect("WECHAT_SECRET not found");
        let private_key =
            std::env::var("WECHAT_PRIVATE_KEY").expect("WECHAT_PRIVATE_KEY not found");
        let serial_no = std::env::var("WECHAT_SERIAL_NO").expect("WECHAT_SERIAL_NO not found");
        let v3_key = std::env::var("WECHAT_KEY_V3").expect("WECHAT_KEY_V3 not found");
        let notify_url = std::env::var("WECHAT_NOTIFY_URL").expect("WECHAT_NOTIFY_URL not found");
        let sdk = WechatV3PayConfigBuilder::default()
        .app_id(app_id)
        .secret(secret)
        .api_key_v3(v3_key)
        .serial_no(serial_no.to_string())
        .mch_id(mch_id)
        .private_key(private_key)
        .notify_url(notify_url)
        .build()?;
        Ok(sdk)
    }
   
    /// 测试解密
    #[tokio::test]
    async fn test_pay_info() -> RPayResult<()> {
        let sdk = get_sdk()?;
        let resp = PayInfoBuilder::default()
            .prepay_id("wx14154500982430c7bee6ccd124b7400000") // 这里注意动态获取的参数
            .pay_type(PayType::Jsapi)
            .build()?.signature(sdk).await?;
        println!("resp => {:?}", resp);
        Ok(())
    }

    /// 测试获取支付信息用于支付
    #[tokio::test]
    async fn decrypt_pay_data() -> RPayResult<()> {
        let sdk = get_sdk()?;
        let resp = ParseEncryptBuilder::default()
            .algorithm("AEAD_AES_256_GCM")
            .associated_data("transaction")
            .original_type("transaction")
            .ciphertext("+iVAZMU1iCmdiYuJbQmAxBy1QU4D+EO2kqPiYx3UvHwGWUbucacP4eKxuI3+WBjOP59QU1IW+hRwMiU+9GSR6DFp5deB2aCvIWuj1EjL1uVWg4UvUqMm1YmO0ROE5vhSK4wWe+tqiB+j+EMho5Xm2M03nQYt5wdQiXLUHDkzC9b8iM9Cjy6sQYyejc4zCZN7TEbIt3BDqBgHKyUzLzA01CQ2f2BR5NqJbXhl/0OSNz2LMlmOKOsGnuD86Pb/w0g2Zz6UzkduMqnJQUFaa3QhOD+dKJI00KF8gqzNU7eCTHqbF7qaoxaWJ80B4q3BGodqS6xH0GkT++SjpGDd/gHd+T/l/7Mw/aPnt3KmrRCbZJ6k/aBHAbZkvfr+5h0ij/MkF97yDBIcWbMbJB0buL6QXtwII/pXuXzLTIlctdg1jDQUAsK0xHm5FVLbKDQq8Kbb+70WeZeb+C5iYfGBxEfiBo0s71IRyhZx6Jfyg5yNUd/hP9kwnpDZI/uu/xyi7GmNGCVXMg7E9eSNukRmjQl87+Svg3Q7tWVJEmECwt6T7ks0jTkcqihy8EptJhBtomETbJu9Ia/HsY4Iw0jDqBG9")
            .nonce("Sum4M3feZ35C")
            .build()?.parse(sdk).await?;
        println!("{:?}", resp);
        Ok(())
    }

    #[tokio::test]
    async fn test_build_jsapi_pay() -> RPayResult<()> {
        // sdk
        let sdk = get_sdk()?;
        // 创建支付请求参数
        let resp = JsApiPayBuilder::default()
            .description("测试支付")
            .payer(
                PayerBuilder::default()
                    .openid(get_oepn_id())
                    .build()?,
            )
            .out_trade_no("wx1123123232432341223")
            // .notify_url(sdk.notify_url)
            .amount(
                AmountBuilder::default()
                    .total(100)
                    .build()?,
            )
            .build()?.pay(sdk).await?;
        // 返回结果
        println!("test_build_jsapi_pay resp => {:?}", resp);
        Ok(())
    }

    #[tokio::test]
    async fn test_h5() -> RPayResult<()> {
        // sdk
        let sdk = get_sdk()?;
        // 创建支付请求参数
        let resp = H5PayBuilder::default()
            .description("测试H5支付")
            .out_trade_no("wx1123123232432341223")
            // .notify_url(sdk.notify_url)
            .amount(
                AmountBuilder::default()
                    .total(100)
                    .build()?,
            )
            .build()?.pay(sdk).await?;
        // 返回结果
        println!("test_build_jsapi_pay resp => {:?}", resp);
        Ok(())
    }

    #[tokio::test]
    async fn test_app() -> RPayResult<()> {
        // sdk
        let sdk = get_sdk()?;
        // 创建支付请求参数
        let resp = AppPayBuilder::default()
            .description("测试App支付")
            .out_trade_no("wx1123123232432341223")
            // .notify_url(sdk.notify_url)
            .amount(
                AmountBuilder::default()
                    .total(100)
                    .build()?,
            )
            .build()?.pay(sdk).await?;
        // 返回结果
        println!("test_build_jsapi_pay resp => {:?}", resp);
        Ok(())
    }

    #[tokio::test]
    async fn test_native() -> RPayResult<()> {
        // sdk
        let sdk = get_sdk()?;
        // 创建支付请求参数
        let resp = NativePayBuilder::default()
            .description("测试原生支付")
            .out_trade_no("wx1123123232432341223")
            // .notify_url(sdk.notify_url)
            .amount(
                AmountBuilder::default()
                    .total(100)
                    .build()?,
            )
            .build()?.pay(sdk).await?;
        // 返回结果
        println!("test_build_jsapi_pay resp => {:?}", resp);
        Ok(())
    }
}