package com.stylefeng.guns.modular.system.utils;
import com.intuit.ipp.core.Context;
import com.intuit.ipp.core.ServiceType;
import com.intuit.ipp.data.*;
import com.intuit.ipp.exception.FMSException;
import com.intuit.ipp.security.OAuth2Authorizer;
import com.intuit.ipp.services.DataService;
import com.intuit.ipp.util.Config;
import com.intuit.oauth2.client.OAuth2PlatformClient;
import com.intuit.oauth2.config.Environment;
import com.intuit.oauth2.config.OAuth2Config;
import com.intuit.oauth2.config.Scope;
import com.intuit.oauth2.data.BearerTokenResponse;
import com.intuit.oauth2.exception.InvalidRequestException;
import com.intuit.oauth2.exception.OAuthException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.RedirectView;
import java.util.ArrayList;
import java.util.List;
/**
*
*
*
*
* @Author: lisy
* @date: 2023-05-23 14:37
* @Description:
*/
@Slf4j
public class InvoicesDataUploadUtil {
// private static final String redirectUrl = "http://cca19.com:8010/gunsApi/oauth2redirect";
private static final String redirectUrl = "http://cca19.com:8010/gunsApi/oauth2redirect";
private static final String createInvoiceUrl = "https://sandbox-quickbooks.api.intuit.com";
private static final String clientId = "ABXjfdoTHLWaBrkWRkoe6C8sk9mixpQJ1OlrFVkZznsdUzLPIf";
private static final String clientSecret = "WJ01VwbagGa23FJZQVJW4LGKPG9vaJIBgzxEEfEA";
public static View connectToQuickBooks() throws InvalidRequestException {
OAuth2Config oauth2Config = new OAuth2Config.OAuth2ConfigBuilder(clientId,clientSecret)
.callDiscoveryAPI(Environment.SANDBOX)
.buildConfig();
String csrf = oauth2Config.generateCSRFToken();
List scopes = new ArrayList();
scopes.add(Scope.Accounting);
String prepareUrl = oauth2Config.prepareUrl(scopes, redirectUrl, csrf);
System.out.println(prepareUrl);
return new RedirectView(prepareUrl, true, true, false);
}
public static String refreshToken() throws OAuthException {
//Prepare the config
OAuth2Config oauth2Config = new OAuth2Config.OAuth2ConfigBuilder(clientId,clientSecret).callDiscoveryAPI(Environment.SANDBOX).buildConfig();
//Prepare OAuth2PlatformClient
OAuth2PlatformClient client = new OAuth2PlatformClient(oauth2Config);
//Call refresh endpoint
BearerTokenResponse bearerTokenResponse = client.refreshToken("refreshToken"); //set refresh token
return bearerTokenResponse.getAccessToken();
}
private static Context prepareContext(String realmId, String accessToken) throws FMSException {
String url = new OAuth2PlatformClientFactory().getHost() + "/v3/company";
Config.setProperty(Config.BASE_URL_QBO, url);
//create oauth object
OAuth2Authorizer oauth = new OAuth2Authorizer(accessToken);
//create context
Context context = new Context(oauth, ServiceType.QBO, realmId);
return context;
}
public static DataService getDataService(String realmId, String accessToken ) throws FMSException {
Context context = prepareContext(realmId, accessToken);
// create dataservice
return new DataService(context);
}
public static BearerTokenResponse callBackFromOAuth(String code) throws OAuthException {
OAuth2Config oauth2Config = new OAuth2Config.OAuth2ConfigBuilder(clientId,clientSecret)
.callDiscoveryAPI(Environment.SANDBOX)
.buildConfig();
//prepare OAuth2Platform client
OAuth2PlatformClient client = new OAuth2PlatformClient(oauth2Config);
//retrieve access token by calling the token endpoint
return client.retrieveBearerTokens(code, redirectUrl);
}
}