/// <summary> /// Makes HttpRequest to mpesa api server /// </summary> /// <param name="mpesaDto">Data transfer object</param> /// <param name="accessToken">Mpesa Accesstoken</param> /// <param name="mpesaEndpoint">Request endpoint</param> /// <param name="cancellationToken">Cancellation Token</param> /// <returns>Mpesa API response based on the API requests made.</returns> private async Task <T> MpesaPostRequestAsync <T>(object mpesaDto, string accessToken, string mpesaEndpoint, CancellationToken cancellationToken = default) where T : new() { _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); T result = new(); string json = JsonConvert.SerializeObject(mpesaDto); var content = new StringContent(json, Encoding.UTF8, "application/json"); cancellationToken.ThrowIfCancellationRequested(); var response = await _client.PostAsync(mpesaEndpoint, content, cancellationToken).ConfigureAwait(false); if (response.IsSuccessStatusCode) { await response.Content.ReadAsStreamAsync().ContinueWith((Task <Stream> stream) => { using var reader = new StreamReader(stream.Result); using var json = new JsonTextReader(reader); result = _serializer.Deserialize <T>(json); }, cancellationToken); } else { MpesaErrorResponse mpesaErrorResponse = new MpesaErrorResponse(); await response.Content.ReadAsStreamAsync().ContinueWith((Task <Stream> stream) => { using var reader = new StreamReader(stream.Result); using var json = new JsonTextReader(reader); mpesaErrorResponse = _serializer.Deserialize <MpesaErrorResponse>(json); }, cancellationToken); throw new MpesaAPIException(new HttpRequestException(mpesaErrorResponse.ErrorMessage), response.StatusCode, mpesaErrorResponse); } return(result); }
/// <summary> /// Method makes the accesstoken request to mpesa api /// </summary> /// <param name="consumerKey"></param> /// <param name="consumerSecret"></param> /// <param name="mpesaRequestEndpoint"></param> /// <param name="cancellationToken">Cancellation Token</param> /// <returns>string representing accesstoken for the mpesa api calls</returns> private async Task <string> RequestAccessTokenAsync(string consumerKey, string consumerSecret, string mpesaRequestEndpoint, CancellationToken cancellationToken = default) { var keyBytes = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{consumerKey}:{consumerSecret}")); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", keyBytes); MpesaAccessTokenResponse result = new MpesaAccessTokenResponse(); cancellationToken.ThrowIfCancellationRequested(); var response = await _client.GetAsync(mpesaRequestEndpoint, cancellationToken).ConfigureAwait(false); if (response.IsSuccessStatusCode) { await response.Content.ReadAsStreamAsync().ContinueWith((Task <Stream> stream) => { using var reader = new StreamReader(stream.Result); using var json = new JsonTextReader(reader); result = _serializer.Deserialize <MpesaAccessTokenResponse>(json); }, cancellationToken); } else { MpesaErrorResponse mpesaErrorResponse = new MpesaErrorResponse(); await response.Content.ReadAsStreamAsync().ContinueWith((Task <Stream> stream) => { using var reader = new StreamReader(stream.Result); using var json = new JsonTextReader(reader); mpesaErrorResponse = _serializer.Deserialize <MpesaErrorResponse>(json); }, cancellationToken); throw new MpesaAPIException(new HttpRequestException(mpesaErrorResponse.ErrorMessage), response.StatusCode, mpesaErrorResponse); } return(result.AccessToken); }
public MpesaAPIException(Exception ex, HttpStatusCode statusCode, MpesaErrorResponse mpesaErrorResponse) : base(ex.Message) { StatusCode = statusCode; _mpesaErrorResponse = mpesaErrorResponse; }