0
I am integrating Android with Strepe and Google-pay. The problem is that there is a link failure with the xml layouts. The following figure shows the link failure. I’ve researched several similar problems, but they didn’t work out. Does anyone know what might be going on?
The error that appears is the sequinte:
Android resource linking failed
E:\Android-Studio_2\Stripe\ProjetoStripe5\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values-v28\values-v28.xml:7: error: resource android:attr/dialogCornerRadius not found.
E:\Android-Studio_2\Stripe\ProjetoStripe5\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values-v28\values-v28.xml:11: error: resource android:attr/dialogCornerRadius not found.
E:\Android-Studio_2\Stripe\ProjetoStripe5\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:3493: error: resource android:attr/fontVariationSettings not found.
E:\Android-Studio_2\Stripe\ProjetoStripe5\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:3493: error: resource android:attr/ttcIndex not found.
error: failed linking references.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="n.com.projetostripe5">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.wallet.api.enabled"
android:value="true" />
</application>
</manifest>
build.gradle - app
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "n.com.projetostripe5"
minSdkVersion 22
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//noinspection GradleCompatible
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.stripe:stripe-android:8.3.0'
implementation 'com.google.android.gms:play-services-wallet:16.0.1'
}
build.gradle - project
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
package n.com.projetostripe5;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.identity.intents.model.UserAddress;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.wallet.AutoResolveHelper;
import com.google.android.gms.wallet.CardInfo;
import com.google.android.gms.wallet.CardRequirements;
import com.google.android.gms.wallet.IsReadyToPayRequest;
import com.google.android.gms.wallet.PaymentData;
import com.google.android.gms.wallet.PaymentDataRequest;
import com.google.android.gms.wallet.PaymentMethodTokenizationParameters;
import com.google.android.gms.wallet.PaymentsClient;
import com.google.android.gms.wallet.TransactionInfo;
import com.google.android.gms.wallet.Wallet;
import com.google.android.gms.wallet.WalletConstants;
import com.stripe.android.PaymentConfiguration;
import com.stripe.android.model.Token;
import java.util.Arrays;
import n.com.projetostripe5.R;
public class MainActivity extends AppCompatActivity {
private static final int LOAD_PAYMENT_DATA_REQUEST_CODE = 53;
private View mPayWithGoogleButton;
private PaymentsClient mPaymentsClient;
private ProgressBar mProgressBar;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPaymentsClient =
Wallet.getPaymentsClient(this,
new Wallet.WalletOptions.Builder()
.setEnvironment(WalletConstants.ENVIRONMENT_TEST)
.build());
mProgressBar = findViewById(R.id.pwg_progress_bar);
mPayWithGoogleButton = findViewById(R.id.btn_buy_pwg);
mPayWithGoogleButton.setEnabled(false);
mPayWithGoogleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
payWithGoogle();
}
});
isReadyToPay();
}
private void payWithGoogle() {
PaymentDataRequest request = createPaymentDataRequest();
if (request != null) {
AutoResolveHelper.resolveTask(
mPaymentsClient.loadPaymentData(request),
MainActivity.this,
LOAD_PAYMENT_DATA_REQUEST_CODE);
}
}
private void isReadyToPay() {
mProgressBar.setVisibility(View.VISIBLE);
IsReadyToPayRequest request = IsReadyToPayRequest.newBuilder()
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD)
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD)
.build();
Task<Boolean> task = mPaymentsClient.isReadyToPay(request);
task.addOnCompleteListener(
new OnCompleteListener<Boolean>() {
public void onComplete(@NonNull Task<Boolean> task) {
try {
boolean result =
task.getResult(ApiException.class);
mProgressBar.setVisibility(View.INVISIBLE);
if(result) {
Toast.makeText(MainActivity.this, "Ready", Toast.LENGTH_SHORT).show();
mPayWithGoogleButton.setEnabled(true);
} else {
Toast.makeText(MainActivity.this, "No PWG", Toast.LENGTH_SHORT).show();
//hide Google as payment option
}
} catch (ApiException exception) {
Toast.makeText(MainActivity.this,
"Exception: " + exception.getLocalizedMessage(),
Toast.LENGTH_LONG).show();
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case LOAD_PAYMENT_DATA_REQUEST_CODE:
switch (resultCode) {
case Activity.RESULT_OK:
PaymentData paymentData = PaymentData.getFromIntent(data);
// You can get some data on the user's card, such as the brand and last 4 digits
CardInfo info = paymentData.getCardInfo();
// You can also pull the user address from the PaymentData object.
UserAddress address = paymentData.getShippingAddress();
// This is the raw string version of your Stripe token.
String rawToken = paymentData.getPaymentMethodToken().getToken();
// Now that you have a Stripe token object, charge that by using the id
Token stripeToken = Token.fromString(rawToken);
if (stripeToken != null) {
// This chargeToken function is a call to your own server, which should then connect
// to Stripe's API to finish the charge.
// chargeToken(stripeToken.getId());
Toast.makeText(MainActivity.this,
"Got token " + stripeToken.toString(), Toast.LENGTH_LONG).show();
}
break;
case Activity.RESULT_CANCELED:
Toast.makeText(MainActivity.this,
"Canceled", Toast.LENGTH_LONG).show();
break;
case AutoResolveHelper.RESULT_ERROR:
Status status = AutoResolveHelper.getStatusFromIntent(data);
Toast.makeText(MainActivity.this,
"Got error " + status.getStatusMessage(), Toast.LENGTH_SHORT).show();
// Log the status for debugging
// Generally there is no need to show an error to
// the user as the Google Payment API will do that
break;
default:
// Do nothing.
}
break; // Breaks the case LOAD_PAYMENT_DATA_REQUEST_CODE
default:
// Do nothing.
}
}
private PaymentMethodTokenizationParameters createTokenizationParameters() {
return PaymentMethodTokenizationParameters.newBuilder()
.setPaymentMethodTokenizationType(WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY)
.addParameter("gateway", "stripe")
.addParameter("stripe:publishableKey",
PaymentConfiguration.getInstance().getPublishableKey())
.addParameter("stripe:version", "2018-11-08")
.build();
}
private PaymentDataRequest createPaymentDataRequest() {
PaymentDataRequest.Builder request =
PaymentDataRequest.newBuilder()
.setTransactionInfo(
TransactionInfo.newBuilder()
.setTotalPriceStatus(WalletConstants.TOTAL_PRICE_STATUS_FINAL)
.setTotalPrice("10.00")
.setCurrencyCode("USD")
.build())
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD)
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD)
.setCardRequirements(
CardRequirements.newBuilder()
.addAllowedCardNetworks(Arrays.asList(
WalletConstants.CARD_NETWORK_AMEX,
WalletConstants.CARD_NETWORK_DISCOVER,
WalletConstants.CARD_NETWORK_VISA,
WalletConstants.CARD_NETWORK_MASTERCARD))
.build());
request.setPaymentMethodTokenizationParameters(createTokenizationParameters());
return request.build();
}
}