Skip to content

Credit Card Two Clicks

Raka Westu Mogandhi edited this page Oct 27, 2016 · 3 revisions

Credit Card Two Clicks

Merchant Server Implementation Required. Please follow the implementation of merchant server here.

To implement two clicks please follow steps below.

First Transaction

For the first transaction, after the payment users need to save the card to merchant server.

Creating TransactionRequest

TransactionRequest request = new TransactionRequest(ORDER_ID, GROSS_AMOUNT);
... // Set another parameters like item details or customer details for transaction request here

// Set credit card option parameters
CreditCard creditCard = new CreditCard();
creditCard.setSaveCard(true); // True if save card is enabled (to get the savedTokenId)
creditCard.setSecure(true); // True if 3D Secure was enabled

request.setCreditCard(creditCard);

MidtransSDK.getInstance().setTransactionRequest(request);

MidtransSDK.getInstance().checkout(new CheckoutCallback() {
    @Override
    public void onSuccess(Token token) {
         // Handle success checkout
         // Checkout token
         String token = token.getTokenId();
    }

    @Override
    public void onFailure(Token token, String reason) {
         // Handle failure when checkout            
    }

    @Override
    public void onError(Throwable error) {
         // Handle error when checkout
    }
});

Get Card Token

// Create CardTokenRequest 
CardTokenRequest cardTokenRequest = new CardTokenRequest(CARD_NUMBER, CARD_CVV_NUMBER, EXPIRY_MONTH, EXPIRY_YEAR, CLIENT_KEY);
// This is if you're using 3D secure
cardTokenRequest.setSecure(true);
cardTokenRequest.setGrossAmount(GROSS_AMOUNT);

// Start getting token
MidtransSDK.getInstance().getCardToken(cardTokenRequest, new CardTokenCallback() {
    @Override
    public void onSuccess(TokenDetailsResponse response) {
        // Card token will be used to charge the payment
        String cardToken = response.getTokenId();
        // Success action here
        // If using 3DS then show the authorization page using WebView. When authorization completed then start the payment
        // Else start to charge the transaction
    }

    @Override
    public void onFailure(TokenDetailsResponse response, String reason) {
        // Failure action here
    }

    @Override
    public void onError(Throwable error) {
        // Error action here
    }
});

Charge Transaction

At the charge transaction, when charging you must set IS_SAVE_CARD parameter to true.

MidtransSDK.getInstance().paymentUsingCard(CHECKOUT_TOKEN, CARD_TOKEN, IS_SAVE_CARD, new TransactionCallback() {
    @Override
    public void onSuccess(TransactionResponse response) {
        // Success Action here
    }

    @Override
    public void onFailure(TransactionResponse response, String reason) {
        // Failure Action here
    }

    @Override
    public void onError(Throwable error) {
        // Error Action here
    }
});

Save savedTokenId to Merchant Server

If you have implemented the merchant server you can save savedTokenId to your merchant server by passing string of UserId. It can be anything as long as it differentiate the user.

Create SaveCardRequest

First, create object of SaveCardRequest using TransactionResponse from previous step.

SaveCardRequest saveCardRequest = new SaveCardRequest();
saveCardRequest.setCode(transactionResponse.getStatusCode());
saveCardRequest.setMaskedCard(transactionResponse.getMaskedCard());
saveCardRequest.setSavedTokenId(transactionResponse.getSavedTokenId());

Add into ArrayList

Add it into an array if there's no saved card yet.

// This is example if you're using it for first time.
ArrayList<SaveCardRequest> saveCardRequestList = new ArrayList<>();
saveCardRequestList.add(saveCardRequest);
// Then proceed to save updated array list
saveCards(saveCardRequest);

Or add into array from GetSavedToken if there alre

    MidtransSDK.getInstance().getCards(USER_ID, new GetCardCallback() {
            @Override
            public void onSuccess(ArrayList<SaveCardRequest> response) {
                response.add(saveCardRequest);
                // Then proceed to save updated array list
                saveCards(saveCardRequest);
            }

            @Override
            public void onFailure(String reason) {
                
            }

            @Override
            public void onError(Throwable error) {
                
            }
        });

Save it to merchant server using code below.

public void saveCards(ArrayList<SaveCardRequest> saveCardRequestList) {
     MidtransSDK.getInstance().saveCards(USER_ID, saveCardRequestList, new SaveCardCallback() {
            @Override
            public void onSuccess(SaveCardResponse response) {
                // Handle card registration success
            }

            @Override
            public void onFailure(String reason) {
                // Handle card registration failed
            }

            @Override
            public void onError(Throwable error) {
                // Handle card registration error
            }
        });
}

Sequential Transaction

You can use the savedTokenId obtained in first transaction to proceed the payment without require your customers to input their credit card details again. They just need to input the CVV.

Get Saved Tokens

    MidtransSDK.getInstance().getCards(USER_ID, new GetCardCallback() {
            @Override
            public void onSuccess(ArrayList<SaveCardRequest> response) {
                // Handle success getting saved token list
            }

            @Override
            public void onFailure(String reason) {
                
            }

            @Override
            public void onError(Throwable error) {
                
            }
        });

This array list of saved cards can be used to show card list in your UI.

Get Card Token

After user select which card want to be used on next payment, they have need to input CVV again then proceed into get card token using this parameters.

CardTokenRequest cardTokenRequest = new CardTokenRequest();
cardTokenRequest.setCardCVV(CVV);
cardTokenRequest.setSavedTokenId(SAVED_TOKEN_ID);
cardTokenRequest.setTwoClick(true);
cardTokenRequest.setSecure(true);
cardTokenRequest.setGrossAmount(GROSS_AMOUNT);

midtransSDK.getCardToken(cardTokenRequest, new CardTokenCallback() {
            @Override
            public void onSuccess(TokenDetailsResponse response) {
                actionGetCardTokenSuccess(response);
            }

            @Override
            public void onFailure(TokenDetailsResponse response, String reason) {
                actionGetCardTokenFailure(response, reason);
            }

            @Override
            public void onError(Throwable error) {
                actionGetCardTokenError(error);
            }
        });

Then you can proceed charge the transaction just like first transaction. Read again here.

Clone this wiki locally