class InstanceHolder {
        private static final WechatApi20 INSTANCE = new WechatApi20();
    }

    /**
     * <p>instance.</p>
     *
     * @return a {@link WechatApi20} object
     */
    public static WechatApi20 instance() {
        return WechatApi20.InstanceHolder.INSTANCE;
    }

    /** {@inheritDoc} */
    @Override
    public String getAccessTokenEndpoint() {
        return TOKEN_ENDPOINT_URL + "?grant_type=authorization_code";
    }

    /** {@inheritDoc} */
    @Override
    public String getAuthorizationUrl(String responseType, String apiKey, String callback, String scope, String state,
            Map<String, String> additionalParams) {
        var authorizationUrl = super.getAuthorizationUrl(responseType, apiKey, callback, scope, state, additionalParams);
        authorizationUrl = authorizationUrl.replace(OAuthConstants.CLIENT_ID, APPID);
        if (scope != null && scope.contains(
            WechatClient.WechatScope.SNSAPI_LOGIN.toString().toLowerCase())) {
            authorizationUrl = AUTHORIZE_ENDPOINT_URL_1 + authorizationUrl;
        } else {
            authorizationUrl = AUTHORIZE_ENDPOINT_URL_2 + authorizationUrl;
        }
        return authorizationUrl;
    }

    /** {@inheritDoc} */
    @Override
    protected String getAuthorizationBaseUrl() {
        return Pac4jConstants.EMPTY_STRING;
    }

    /** {@inheritDoc} */
    @Override
    public Verb getAccessTokenVerb() {
        return Verb.GET;
    }

    /** {@inheritDoc} */
    @Override
    public TokenExtractor<OAuth2AccessToken> getAccessTokenExtractor() {
        return WechatJsonExtractor.instance();
    }

    /** {@inheritDoc} */
    @Override
    public OAuth20Service createService(String apiKey, String apiSecret, String callback, String defaultScope,
                                                     String responseType, OutputStream debugStream, String userAgent,
                                                     HttpClientConfig httpClientConfig, HttpClient httpClient) {<FILL_FUNCTION_BODY>

        return new WechatService(this, apiKey, apiSecret, callback, defaultScope, responseType, userAgent, httpClientConfig, httpClient);
    
<methods>public void <init>() ,public com.github.scribejava.core.oauth.OAuth20Service createService(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.io.OutputStream, java.lang.String, com.github.scribejava.core.httpclient.HttpClientConfig, com.github.scribejava.core.httpclient.HttpClient) ,public abstract java.lang.String getAccessTokenEndpoint() ,public TokenExtractor<com.github.scribejava.core.model.OAuth2AccessToken> getAccessTokenExtractor() ,public com.github.scribejava.core.model.Verb getAccessTokenVerb() ,public java.lang.String getAuthorizationUrl(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, Map<java.lang.String,java.lang.String>) ,public com.github.scribejava.core.oauth2.bearersignature.BearerSignature getBearerSignature() ,public com.github.scribejava.core.oauth2.clientauthentication.ClientAuthentication getClientAuthentication() ,public java.lang.String getDeviceAuthorizationEndpoint() ,public com.github.scribejava.core.extractors.DeviceAuthorizationJsonExtractor getDeviceAuthorizationExtractor() ,public java.lang.String getRefreshTokenEndpoint() ,public java.lang.String getRevokeTokenEndpoint() <variables>