diff --git a/.env.example b/.env.example index 8091f941f..0c0f5fbb4 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,2 @@ -CLIENT_KEY="" -CLIENT_SECRET="" \ No newline at end of file +CONSUMER_KEY="" +CONSUMER_SECRET="" diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 500e1fdca..6a8a3843f 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -10,8 +10,8 @@ jobs: name: Test runs-on: ubuntu-latest env: - CLIENT_KEY: ${{ secrets.CLIENT_KEY }} - CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }} + CONSUMER_KEY: ${{ secrets.CLIENT_KEY }} + CONSUMER_SECRET: ${{ secrets.CLIENT_SECRET }} steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -58,8 +58,8 @@ jobs: name: Code coverage runs-on: ubuntu-latest env: - CLIENT_KEY: ${{ secrets.CLIENT_KEY }} - CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }} + CONSUMER_KEY: ${{ secrets.CLIENT_KEY }} + CONSUMER_SECRET: ${{ secrets.CLIENT_SECRET }} steps: - name: Checkout repository uses: actions/checkout@v2 diff --git a/README.md b/README.md index b75618f1a..5d079bdd4 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,8 @@ use mpesa::Mpesa; ### Creating a `Mpesa` client -You will first need to create an instance of the `Mpesa` instance (the client). You are required to provide a **CLIENT_KEY** and -**CLIENT_SECRET**. [Here](https://developer.safaricom.co.ke/test_credentials) is how you can get these credentials for the Safaricom sandbox +You will first need to create an instance of the `Mpesa` instance (the client). You are required to provide a **CONSUMER_KEY** and +**CONSUMER_SECRET**. [Here](https://developer.safaricom.co.ke/test_credentials) is how you can get these credentials for the Safaricom sandbox environment. It's worth noting that these credentials are only valid in the sandbox environment. To go live and get production keys read the docs [here](https://developer.safaricom.co.ke/docs?javascript#going-live). @@ -53,8 +53,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); @@ -76,8 +76,8 @@ async fn main() -> Result<(), Box> { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::from_str("sandbox")?, // or // Environment::try_from("sandbox")?, ); @@ -124,8 +124,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), CustomEnvironment, ); } @@ -142,8 +142,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/account_balance.md b/docs/client/account_balance.md index f0844cc5b..69a3507e9 100644 --- a/docs/client/account_balance.md +++ b/docs/client/account_balance.md @@ -17,8 +17,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/b2b.md b/docs/client/b2b.md index bcdfc20ab..a24d35a25 100644 --- a/docs/client/b2b.md +++ b/docs/client/b2b.md @@ -19,8 +19,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/b2c.md b/docs/client/b2c.md index 6e674d10e..dac5d545f 100644 --- a/docs/client/b2c.md +++ b/docs/client/b2c.md @@ -15,8 +15,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/bill_manager/bulk_invoice.md b/docs/client/bill_manager/bulk_invoice.md index ad7a919e9..6b24f3832 100644 --- a/docs/client/bill_manager/bulk_invoice.md +++ b/docs/client/bill_manager/bulk_invoice.md @@ -15,8 +15,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/bill_manager/cancel_invoice.md b/docs/client/bill_manager/cancel_invoice.md index 07dc152a2..11a4bd5bf 100644 --- a/docs/client/bill_manager/cancel_invoice.md +++ b/docs/client/bill_manager/cancel_invoice.md @@ -15,8 +15,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/bill_manager/onboard.md b/docs/client/bill_manager/onboard.md index e797cc509..e77515145 100644 --- a/docs/client/bill_manager/onboard.md +++ b/docs/client/bill_manager/onboard.md @@ -14,8 +14,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/bill_manager/onboard_modify.md b/docs/client/bill_manager/onboard_modify.md index a27501b0c..981fec8b6 100644 --- a/docs/client/bill_manager/onboard_modify.md +++ b/docs/client/bill_manager/onboard_modify.md @@ -14,8 +14,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/bill_manager/reconciliation.md b/docs/client/bill_manager/reconciliation.md index 0bf99dde7..d14c4dd66 100644 --- a/docs/client/bill_manager/reconciliation.md +++ b/docs/client/bill_manager/reconciliation.md @@ -15,8 +15,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/bill_manager/single_invoice.md b/docs/client/bill_manager/single_invoice.md index 5dcd28b5e..eb19530c2 100644 --- a/docs/client/bill_manager/single_invoice.md +++ b/docs/client/bill_manager/single_invoice.md @@ -15,8 +15,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/c2b_register.md b/docs/client/c2b_register.md index a9d5e921d..7b1c861f9 100644 --- a/docs/client/c2b_register.md +++ b/docs/client/c2b_register.md @@ -18,8 +18,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/c2b_simulate.md b/docs/client/c2b_simulate.md index bd07f87b0..c52a41720 100644 --- a/docs/client/c2b_simulate.md +++ b/docs/client/c2b_simulate.md @@ -14,8 +14,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/dynamic_qr.md b/docs/client/dynamic_qr.md index 9cef08a3e..6209cd317 100644 --- a/docs/client/dynamic_qr.md +++ b/docs/client/dynamic_qr.md @@ -17,8 +17,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/express_request.md b/docs/client/express_request.md index a58a95dcb..df6b515cc 100644 --- a/docs/client/express_request.md +++ b/docs/client/express_request.md @@ -21,8 +21,8 @@ async fn main() -> Result<(), Box>{ dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/transaction_reversal.md b/docs/client/transaction_reversal.md index 08543ddbd..3d18fe231 100644 --- a/docs/client/transaction_reversal.md +++ b/docs/client/transaction_reversal.md @@ -17,8 +17,8 @@ async fn main() -> Result<(), Box> { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/docs/client/transaction_status.md b/docs/client/transaction_status.md index 03bdcac7d..d6eb5b7c6 100644 --- a/docs/client/transaction_status.md +++ b/docs/client/transaction_status.md @@ -17,8 +17,8 @@ async fn main() { dotenvy::dotenv().ok(); let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), Environment::Sandbox, ); diff --git a/src/auth.rs b/src/auth.rs index aaed769bc..d725a3827 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -11,7 +11,7 @@ const AUTHENTICATION_URL: &str = "/oauth/v1/generate?grant_type=client_credentia time = 3600, key = "String", result = true, - convert = r#"{ format!("{}", client.client_key()) }"# + convert = r#"{ format!("{}", client.consumer_key()) }"# )] pub(crate) async fn auth(client: &Mpesa) -> MpesaResult { let url = format!("{}{}", client.base_url, AUTHENTICATION_URL); @@ -19,7 +19,7 @@ pub(crate) async fn auth(client: &Mpesa) -> MpesaResult { let response = client .http_client .get(&url) - .basic_auth(client.client_key(), Some(&client.client_secret())) + .basic_auth(client.consumer_key(), Some(&client.consumer_secret())) .send() .await?; @@ -111,7 +111,9 @@ mod tests { let mut cache = AUTH.lock().await; - assert!(cache.cache_get(&client.client_key().to_string()).is_some()); + assert!(cache + .cache_get(&client.consumer_key().to_string()) + .is_some()); assert_eq!(cache.cache_hits().unwrap(), 1); assert_eq!(cache.cache_capacity().unwrap(), 1); } diff --git a/src/client.rs b/src/client.rs index df08e43d5..5721f5e11 100644 --- a/src/client.rs +++ b/src/client.rs @@ -29,8 +29,8 @@ const CARGO_PACKAGE_VERSION: &str = env!("CARGO_PKG_VERSION"); /// Mpesa client that will facilitate communication with the Safaricom API #[derive(Clone, Debug)] pub struct Mpesa { - client_key: String, - client_secret: Secret, + consumer_key: String, + consumer_secret: Secret, initiator_password: RefCell>>, pub(crate) base_url: String, certificate: String, @@ -50,8 +50,8 @@ impl Mpesa { /// dotenvy::dotenv().ok(); /// /// let client = Mpesa::new( - /// dotenvy::var("CLIENT_KEY").unwrap(), - /// dotenvy::var("CLIENT_SECRET").unwrap(), + /// dotenvy::var("CONSUMER_KEY").unwrap(), + /// dotenvy::var("CONSUMER_SECRET").unwrap(), /// Environment::Sandbox, /// ); /// @@ -61,8 +61,8 @@ impl Mpesa { /// # Panics /// This method can panic if a TLS backend cannot be initialized for the internal http_client pub fn new>( - client_key: S, - client_secret: S, + consumer_key: S, + consumer_secret: S, environment: impl ApiEnvironment, ) -> Self { let http_client = HttpClient::builder() @@ -75,8 +75,8 @@ impl Mpesa { let certificate = environment.get_certificate().to_owned(); Self { - client_key: client_key.into(), - client_secret: Secret::new(client_secret.into()), + consumer_key: consumer_key.into(), + consumer_secret: Secret::new(consumer_secret.into()), initiator_password: RefCell::new(None), base_url, certificate, @@ -94,14 +94,14 @@ impl Mpesa { .unwrap_or(DEFAULT_INITIATOR_PASSWORD.to_owned()) } - /// Get the client key - pub(crate) fn client_key(&self) -> &str { - &self.client_key + /// Get the consumer key + pub(crate) fn consumer_key(&self) -> &str { + &self.consumer_key } - /// Get the client secret - pub(crate) fn client_secret(&self) -> &str { - self.client_secret.expose_secret() + /// Get the consumer secret + pub(crate) fn consumer_secret(&self) -> &str { + self.consumer_secret.expose_secret() } /// Optional in development but required for production for the following apis: @@ -124,8 +124,8 @@ impl Mpesa { /// dotenvy::dotenv().ok(); /// /// let client = Mpesa::new( - /// dotenvy::var("CLIENT_KEY").unwrap(), - /// dotenvy::var("CLIENT_SECRET").unwrap(), + /// dotenvy::var("CONSUMER_KEY").unwrap(), + /// dotenvy::var("CONSUMER_SECRET").unwrap(), /// Environment::Sandbox, /// ); /// client.set_initiator_password("your_initiator_password"); @@ -150,7 +150,7 @@ impl Mpesa { /// # Errors /// Returns a `MpesaError` on failure pub(crate) async fn auth(&self) -> MpesaResult { - if let Some(token) = AUTH.lock().await.cache_get(&self.client_key) { + if let Some(token) = AUTH.lock().await.cache_get(&self.consumer_key) { return Ok(token.to_owned()); } @@ -158,14 +158,14 @@ impl Mpesa { let new_token = auth::auth(self).await?; // Double-check if the access token is cached by another thread - if let Some(token) = AUTH.lock().await.cache_get(&self.client_key) { + if let Some(token) = AUTH.lock().await.cache_get(&self.consumer_key) { return Ok(token.to_owned()); } // Cache the new token AUTH.lock() .await - .cache_set(self.client_key.clone(), new_token.to_owned()); + .cache_set(self.consumer_key.clone(), new_token.to_owned()); Ok(new_token) } @@ -326,7 +326,7 @@ mod tests { #[test] fn test_setting_initator_password() { - let client = Mpesa::new("client_key", "client_secret", Sandbox); + let client = Mpesa::new("consumer_key", "consumer_secret", Sandbox); assert_eq!(client.initiator_password(), DEFAULT_INITIATOR_PASSWORD); client.set_initiator_password("foo_bar"); assert_eq!(client.initiator_password(), "foo_bar".to_string()); @@ -348,7 +348,7 @@ mod tests { #[test] fn test_custom_environment() { - let client = Mpesa::new("client_key", "client_secret", TestEnvironment); + let client = Mpesa::new("consumer_key", "consumer_secret", TestEnvironment); assert_eq!(&client.base_url, "https://example.com"); assert_eq!(&client.certificate, "certificate"); } @@ -356,7 +356,7 @@ mod tests { #[test] #[should_panic] fn test_gen_security_credentials_fails_with_invalid_pem() { - let client = Mpesa::new("client_key", "client_secret", TestEnvironment); + let client = Mpesa::new("consumer_key", "consumer_secret", TestEnvironment); let _ = client.gen_security_credentials().unwrap(); } } diff --git a/src/environment.rs b/src/environment.rs index 17233c808..b96577ac3 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -2,7 +2,7 @@ //! //! Code related to setting up the desired Safaricom API environment. Environment can be either //! sandbox or production. -//! you will need environment specific credentials (`CLIENT_KEY` AND `CLIENT_SECRET`) when creating +//! you will need environment specific credentials (`CONSUMER_KEY` AND `CONSUMER_SECRET`) when creating //! an instance of the `Mpesa` client struct. Note that you cannot use sandbox credentials in //! production and vice versa. //! diff --git a/tests/mpesa-rust/helpers.rs b/tests/mpesa-rust/helpers.rs index afecc8ec2..ceeb56b5a 100644 --- a/tests/mpesa-rust/helpers.rs +++ b/tests/mpesa-rust/helpers.rs @@ -37,8 +37,8 @@ macro_rules! get_mpesa_client { let server = MockServer::start().await; let test_environment = TestEnvironment::new(&server).await; let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), test_environment, ); Mock::given(method("GET")) @@ -64,8 +64,8 @@ macro_rules! get_mpesa_client { let server = MockServer::start().await; let test_environment = TestEnvironment::new(&server).await; let client = Mpesa::new( - dotenvy::var("CLIENT_KEY").unwrap(), - dotenvy::var("CLIENT_SECRET").unwrap(), + dotenvy::var("CONSUMER_KEY").unwrap(), + dotenvy::var("CONSUMER_SECRET").unwrap(), test_environment, ); Mock::given(method("GET")) @@ -80,23 +80,23 @@ macro_rules! get_mpesa_client { (client, server) }}; - ($client_key:expr, $client_secret:expr) => {{ + ($consumer_key:expr, $consumer_secret:expr) => {{ use mpesa::{Environment, Mpesa}; use std::str::FromStr; dotenvy::dotenv().ok(); let client = Mpesa::new( - $client_key, - $client_secret, + $consumer_key, + $consumer_secret, Environment::from_str("sandbox").unwrap(), ); client }}; - ($client_key:expr, $client_secret:expr, $environment:expr) => {{ + ($consumer_key:expr, $consumer_secret:expr, $environment:expr) => {{ use mpesa::{Environment, Mpesa}; use std::str::FromStr; dotenvy::dotenv().ok(); - let client = Mpesa::new($client_key, $client_secret, $environment); + let client = Mpesa::new($consumer_key, $consumer_secret, $environment); client }}; }