This guide explains how to integrate the Google Pay Merchant SDK (or Google Pay SDK) with your app.
Step 1: Create PaymentsClient
instance
Create an instance of PaymentsClient
in the onCreate
method of your
Activity
class. This allows interaction with the APIs in the Google Pay SDK
test kit.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
paymentsClient = Wallet.getPaymentsClient();
}
Step 2: Call IsReadyToPay
API
Implement the IsReadyToPay
method, as shown in the following example:
private void isReadyToPay() {
Task<Boolean> task = paymentsClient.isReadyToPay(request);
task.addOnCompleteListener(
new OnCompleteListener<Boolean>() {
public void onComplete(Task<Boolean> task) {
try {
boolean result = task.getResult(RuntimeException.class);
if (result == true) {
// Show Google as payment option.
} else {
// Hide Google as payment option.
}
} catch (RuntimeException exception) {
// Handle exception.
}
}
});
}
Step 3: Call loadPaymentData
Calling loadPaymentData
starts a Google Pay Activity to facilitate the payment via intent. Once the user
has completed requesting payment, a PaymentData
response is returned from the
Activity via onActivityResult
. The caller must implement onActivityResult
to
handle the PaymentDataResponse
. To construct the paymentDataRequest
JSON,
refer to the loadPaymentData
section.
Step 4: Create an onClickListener
object
The paymentDataRequest
object is a Parcelable representing a payment data
request, which provides the necessary information to support a payment. Use the
autoResolveHelper
class to auto resolve the Task, and then handle the result
in the onActivityResult
method of your Activity
class.
payWithGPay.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View view) {
payWithGPay.setEnabled(false);
// This transfers the control to the Google Pay app and the result of the transaction
// will be returned in onActivityResult with the given request code.
paymentsClient
.loadPaymentData(
this, paymentDataRequestJson, LOAD_PAYMENT_DATA_REQUEST_CODE);
}
});
Step 5: Handle the paymentDataResponse
object
When you call loadPaymentData
, a PaymentData
object is returned to
onActivityResult
. Parse the paymentDataobject
to obtain payment credentials
that can be charged with your payment provider. The format of the JSON is
defined in the
loadPaymentData section.
To ensure forward compatibility and robustness, parse only the specific fields your application requires from the JSON response. Avoid validating the exact field count, as our API may evolve to include additional data over time without constituting a breaking change.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == LOAD_PAYMENT_DATA_REQUEST_CODE) {
// Handle the transaction result here.
switch (resultCode) {
case Activity.RESULT_OK:
String paymentData = WalletUtils.getPaymentDataFromIntent(data);
// Handle the payment data response in order to complete the transaction.
break;
case Activity.RESULT_FIRST_USER:
int statusCode = data.getIntExtra(WalletConstants.EXTRA_ERROR_CODE,
WalletConstants.INTERNAL_ERROR);
handleResultStatusCode(statusCode);
break;
case Activity.RESULT_CANCELED:
// Nothing to here normally - the user simply cancelled without selecting a
// payment method.
break;
}
}
}
private void handleResultStatusCode(int statusCode) {
switch (statusCode) {
case WalletConstants.ERROR_CODE_BUYER_ACCOUNT_ERROR:
// Prompt the user that there is a problem with their account.
break;
case WalletConstants.ERROR_CODE_MERCHANT_ACCOUNT_ERROR:
// Merchant account error - handle as necessary.
break;
case WalletConstants.ERROR_CODE_UNSUPPORTED_API_VERSION:
case WalletConstants.INTERNAL_ERROR:
case WalletConstants.DEVELOPER_ERROR:
default:
throw new IllegalStateException("Internal error.");
}
}