/// <summary> /// Exchange the authorization code for an access token /// </summary> /// <param name="accessTokenRequest">Request parameters to obtain access token</param> /// <returns>Access token</returns> public string ObtainAccessToken(ObtainAccessTokenRequest accessTokenRequest) { //create post data var postData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(accessTokenRequest)); //create web request var serviceUrl = $"{GetOAuthServiceUrl()}/token"; var request = (HttpWebRequest)WebRequest.Create(serviceUrl); request.Method = WebRequestMethods.Http.Post; request.Accept = "application/json"; request.ContentType = "application/json"; request.ContentLength = postData.Length; request.UserAgent = SquarePaymentDefaults.UserAgent; //post request using (var stream = request.GetRequestStream()) { stream.Write(postData, 0, postData.Length); } //get response var httpResponse = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { //return received access token var response = JsonConvert.DeserializeObject <ObtainAccessTokenResponse>(streamReader.ReadToEnd()); return(response?.AccessToken); } }
/// <summary> /// Exchange the authorization code for an access token /// </summary> /// <param name="authorizationCode">Authorization code</param> /// <returns>The asynchronous task whose result contains access and refresh tokens</returns> public async Task <(string AccessToken, string RefreshToken)> ObtainAccessTokenAsync(string authorizationCode) { try { //get response var request = new ObtainAccessTokenRequest { ApplicationId = _squarePaymentSettings.ApplicationId, ApplicationSecret = _squarePaymentSettings.ApplicationSecret, GrantType = GrantType.New, AuthorizationCode = authorizationCode }; var requestContent = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, MimeTypes.ApplicationJson); var response = await _httpClient.PostAsync("token", requestContent); //return received access token var responseContent = await response.Content.ReadAsStringAsync(); var accessTokenResponse = JsonConvert.DeserializeObject <ObtainAccessTokenResponse>(responseContent); return(accessTokenResponse?.AccessToken, accessTokenResponse?.RefreshToken); } catch (AggregateException exception) { //rethrow actual exception throw exception.InnerException; } }
/// <summary> /// Renew the expired access token /// </summary> /// <param name="storeId">Store identifier for which access token should be updated</param> /// <returns>The asynchronous task whose result contains access and refresh tokens</returns> public async Task <(string AccessToken, string RefreshToken)> RenewAccessTokenAsync(int storeId) { try { var settings = _settingService.LoadSetting <SquarePaymentSettings>(storeId); //get response var request = new ObtainAccessTokenRequest { ApplicationId = settings.ApplicationId, ApplicationSecret = settings.ApplicationSecret, GrantType = GrantType.Refresh, RefreshToken = settings.RefreshToken }; var httpRequest = new HttpRequestMessage(HttpMethod.Post, "token"); httpRequest.Headers.Add(HeaderNames.Authorization, $"Client {settings.ApplicationSecret}"); httpRequest.Content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, MimeTypes.ApplicationJson); var response = await _httpClient.SendAsync(httpRequest); //return received access token var responseContent = await response.Content.ReadAsStringAsync(); var accessTokenResponse = JsonConvert.DeserializeObject <ObtainAccessTokenResponse>(responseContent); return(accessTokenResponse?.AccessToken, accessTokenResponse?.RefreshToken); } catch (AggregateException exception) { //rethrow actual exception throw exception.InnerException; } }