Skip to content

Commit 191e36a

Browse files
[PIMOB-4287]: adding base url prefix to Frames SDK for multi-region (#302)
* PIMOB-4287: add subdomain prefix to base url for multi region support * PIMOB-4287: rename base url prefix var, include global subdomain in config, add updated public keys * PIMOB-4287: update kdoc * PIMOB-4287: add & fix unit tests, rename variable name for baseurl prefix, add validator extension function * PIMOB-4287: lint format check * PIMOB-4287: remove unused secret key * PIMOB-4287: add kdoc for cvv component, update test file to include annotation * PIMOB-4287 ktlint formating * PIMOB-4287: ktlint format * PIMOB-4287: hide secret keys * PIMOB-4287: fix ci/cd + build prefix url from constants * PIMOB-4287: fix local prop keys parsing for both app run configurations + ci * PIMOB-4287: edit kdocs and remove nullable extension type
1 parent 0b0a99f commit 191e36a

File tree

31 files changed

+243
-51
lines changed

31 files changed

+243
-51
lines changed

.github/workflows/gradle-task.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ jobs:
4343
~/.gradle/caches
4444
~/.gradle/wrapper
4545
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
46+
47+
- name: Create local.properties
48+
run: |
49+
touch local.properties
50+
echo "sandbox.components.public_key=${{ secrets.COMPONENTS_SANDBOX_PUBLIC_KEY }}" >> local.properties
51+
echo "sandbox.components.secret_key=${{ secrets.COMPONENTS_SANDBOX_SECRET_KEY }}" >> local.properties
52+
4653
- name: Run ${{ inputs.task }} with Gradle
4754
run: ./gradlew :${{ inputs.module }}:${{ inputs.task }}
4855

app/build.gradle

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,22 @@ android {
4545
lint {
4646
baseline = file('lint-baseline.xml')
4747
}
48+
49+
def localProps = new Properties()
50+
def localPropsFile = rootProject.file("local.properties")
51+
if (localPropsFile.exists()) {
52+
localProps.load(localPropsFile.newDataInputStream())
53+
}
54+
55+
defaultConfig {
56+
buildConfigField "String", "SANDBOX_PUBLIC_KEY", "\"${localProps.getProperty("sandbox.components.public_key") ?: ""}\""
57+
buildConfigField "String", "SANDBOX_SECRET_KEY", "\"${localProps.getProperty("sandbox.components.secret_key") ?: ""}\""
58+
buildConfigField "String", "SANDBOX_PROCESSING_CHANNEL_ID", "\"${localProps.getProperty("sandbox.components.processing_channel_id") ?: ""}\""
59+
60+
buildFeatures {
61+
buildConfig true
62+
}
63+
}
4864
}
4965

5066
dependencies {

app/src/main/java/checkout/checkout_android/CVVTokenizationActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package checkout.checkout_android;
22

3-
import static checkout.checkout_android.Constants.PUBLIC_KEY_CVV_TOKENIZATION;
3+
import static checkout.checkout_android.Constants.REGIONAL_SUBDOMAIN;
44

55
import android.app.AlertDialog;
66
import android.os.Bundle;
@@ -51,7 +51,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
5151
setupObservers();
5252

5353
// Create cvvComponentApi
54-
CVVComponentApi cvvComponentApi = CVVComponentApiFactory.create(PUBLIC_KEY_CVV_TOKENIZATION, Environment.SANDBOX, this);
54+
CVVComponentApi cvvComponentApi = CVVComponentApiFactory.create(BuildConfig.SANDBOX_PUBLIC_KEY, Environment.SANDBOX, this, REGIONAL_SUBDOMAIN);
5555

5656
// initialise CVVTokenizationResultHandler for tokenization
5757
resultHandler = result -> {

app/src/main/java/checkout/checkout_android/Constants.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,11 @@ public class Constants {
77
* Target platform environment
88
*/
99
public static final Environment ENVIRONMENT = Environment.SANDBOX;
10-
/**
11-
* Replace with public key from Hub in Sandbox Environment
12-
*/
13-
public static final String PUBLIC_KEY = "pk_test_b37b8b6b-fc9a-483f-a77e-3386b606f90e";
1410

15-
/**
16-
* Replace with public key from Hub in Sandbox Environment, testing key for CVV Tokenization
17-
*/
18-
public static final String PUBLIC_KEY_CVV_TOKENIZATION = "pk_6b30805a-1f3b-4c63-8b75-eb3030109173";
19-
/**
20-
* Replace with Secret key from Hub in Sandbox Environment
21-
*/
22-
public static final String SECRET_KEY = "sk_test_568e6077-a08f-4692-9237-cc6c48dcf6aa";
11+
/**
12+
* Replace with subdomain value, testing key for base url regional subdomain prefix
13+
*/
14+
public static final String REGIONAL_SUBDOMAIN = "global";
2315
/**
2416
* Replace with Success/Failure Urls from Hub in Sandbox Environment
2517
*/

app/src/main/java/checkout/checkout_android/DemoActivity.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package checkout.checkout_android;
22

3+
import static checkout.checkout_android.Constants.REGIONAL_SUBDOMAIN;
4+
35
import android.app.AlertDialog;
46
import android.app.ProgressDialog;
57
import android.os.Bundle;
@@ -18,6 +20,8 @@
1820
import com.checkout.threedsecure.model.ThreeDSResult;
1921
import com.checkout.tokenization.model.TokenDetails;
2022

23+
import java.util.Collections;
24+
2125
import checkout.checkout_android.utils.PaymentUtil;
2226
import kotlin.Unit;
2327
import kotlin.jvm.functions.Function1;
@@ -89,11 +93,15 @@ public void onBackPressed() {
8993

9094
private PaymentFormConfig providePaymentFormConfig() {
9195
return new PaymentFormConfig(
92-
Constants.PUBLIC_KEY,
96+
BuildConfig.SANDBOX_PUBLIC_KEY,
9397
this,
9498
Constants.ENVIRONMENT,
9599
new PaymentFormStyle(),
96-
mPaymentFlowHandler);
100+
mPaymentFlowHandler,
101+
Collections.emptyList(),
102+
null,
103+
REGIONAL_SUBDOMAIN
104+
);
97105
}
98106

99107
private void displayMessage(String title, String message, boolean exitScreen) {

app/src/main/java/checkout/checkout_android/utils/PaymentUtil.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.io.IOException;
1313

14+
import checkout.checkout_android.BuildConfig;
1415
import checkout.checkout_android.Constants;
1516
import okhttp3.Call;
1617
import okhttp3.MediaType;
@@ -47,7 +48,7 @@ public static void createPayment(String token, Callback callback) {
4748
RequestBody requestBody = buildPaymentRequestBody(token);
4849
Request paymentRequest = new Request.Builder()
4950
.url("https://api.sandbox.checkout.com/payments")
50-
.addHeader("Authorization", "Bearer "+Constants.SECRET_KEY)
51+
.addHeader("Authorization", "Bearer "+ BuildConfig.SANDBOX_SECRET_KEY)
5152
.post(requestBody)
5253
.build();
5354

checkout/src/main/java/com/checkout/CheckoutApiServiceFactory.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.checkout.base.model.Environment
77
import com.checkout.logging.EventLoggerProvider
88
import com.checkout.logging.Logger
99
import com.checkout.logging.model.LoggingEvent
10+
import com.checkout.logging.utils.toBaseUrl
1011
import com.checkout.network.OkHttpProvider
1112
import com.checkout.risk.FramesOptions
1213
import com.checkout.threedsecure.Executor
@@ -40,6 +41,7 @@ public object CheckoutApiServiceFactory {
4041
publicKey: String,
4142
environment: Environment,
4243
context: Context,
44+
baseUrlPrefix: String? = null,
4345
): CheckoutApiService {
4446
val logger = EventLoggerProvider.provide()
4547
logger.setup(context, environment)
@@ -51,7 +53,7 @@ public object CheckoutApiServiceFactory {
5153
)
5254

5355
return CheckoutApiClient(
54-
provideTokenRepository(context, publicKey, environment),
56+
provideTokenRepository(context, publicKey, environment, baseUrlPrefix),
5557
provideThreeDSExecutor(logger),
5658
)
5759
}
@@ -60,8 +62,9 @@ public object CheckoutApiServiceFactory {
6062
context: Context,
6163
publicKey: String,
6264
environment: Environment,
65+
baseUrlPrefix: String?,
6366
): TokenRepository = TokenRepositoryImpl(
64-
networkApiClient = provideNetworkApiClient(publicKey, environment.url),
67+
networkApiClient = provideNetworkApiClient(publicKey, environment.toBaseUrl(baseUrlPrefix)),
6568
cardToTokenRequestMapper = CardToTokenRequestMapper(),
6669
cvvToTokenNetworkRequestMapper = CVVToTokenNetworkRequestMapper(),
6770
cardTokenizationNetworkDataMapper = CardTokenizationNetworkDataMapper(),
@@ -77,7 +80,13 @@ public object CheckoutApiServiceFactory {
7780
logger = TokenizationEventLogger(EventLoggerProvider.provide()),
7881
publicKey = publicKey,
7982
cvvTokenizationNetworkDataMapper = CVVTokenizationNetworkDataMapper(),
80-
riskSdkUseCase = RiskSdkUseCase(environment, context, publicKey, riskSDKFramesOptions, RiskInstanceProvider),
83+
riskSdkUseCase = RiskSdkUseCase(
84+
environment,
85+
context,
86+
publicKey,
87+
riskSDKFramesOptions,
88+
RiskInstanceProvider,
89+
),
8190
)
8291

8392
private fun provideNetworkApiClient(
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.checkout.base.model
22

3-
import com.checkout.base.util.EnvironmentConstants
4-
5-
public enum class Environment(public val url: String) {
6-
PRODUCTION(EnvironmentConstants.PRODUCTION_SERVER_URL),
7-
SANDBOX(EnvironmentConstants.SANDBOX_SERVER_URL),
3+
public enum class Environment {
4+
PRODUCTION,
5+
SANDBOX,
86
}

checkout/src/main/java/com/checkout/base/util/CommonConstants.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,8 @@ internal const val ZIP_LENGTH = 50
1414
*/
1515
internal const val PHONE_MIN_LENGTH = 6
1616
internal const val PHONE_MAX_LENGTH = 25
17+
18+
/**
19+
* Constant for HTTPS protocol prefix, used when constructing environments' base URLs for network communication.
20+
*/
21+
internal const val HTTPS_PROTOCOL: String = "https://"

checkout/src/main/java/com/checkout/base/util/EnvironmentConstants.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ package com.checkout.base.util
33
internal object EnvironmentConstants {
44
internal const val SANDBOX_SERVER_URL = "https://api.sandbox.checkout.com/tokens"
55
internal const val PRODUCTION_SERVER_URL = "https://api.checkout.com/tokens"
6+
internal const val PRODUCTION_LOGGING = "production"
7+
internal const val SANDBOX_LOGGING = "sandbox"
68
}

0 commit comments

Comments
 (0)