To implement the payment functionality in the Open Event Android App using credit cards we are using Stripe. Let’s see how this is being done.
We are taking the sensitive information about the user like the card details and sending it to Stripe’s servers which will return a token encrypting users information which we will use to send it to the Open Event Server to complete the payment.
We need to add the library in the build.gradle file in the dependency block.
//Stripe implementation 'com.stripe:stripe-android:6.1.2'
Next we add Stripe’s Card Input Widget in our layout file. This widget is used to input card details like the card number, expiry date and CVC. It automatically validates the card details. It has a minimum width of 320 px. By default we are setting it’s visibility to gone that is it won’t be visible unless the user selects the payment option.
<com.stripe.android.view.CardInputWidget android:id="@+id/cardInputWidget" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" />
The visibility of the input field for card details is determined here. We want to show the Input widget only when the user selects Stripe as the mode of payment.
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) { selectedPaymentOption = paymentOptions[p2] if (selectedPaymentOption == "Stripe") rootView.cardInputWidget.visibility = View.VISIBLE else rootView.cardInputWidget.visibility = View.GONE }
Next we store the user’s card details in a variable. If any of the details be it card number, expiry date or CVC isn’t correct, the value of the variable becomes null and then we show a message to the user.
val cardDetails: Card? = cardInputWidget.card if (cardDetails == null) Toast.makeText(context, "Invalid card data", Toast.LENGTH_LONG).show()
This is the most important part where we receive the Stripe token. We are sending a request in a background thread to the Stripe servers using the Stripe API_KEY. In the onSuccess method we receive the token if everything went successfully while in the onError method we display the errors to the user.
cardDetails?.let { context?.let { contextIt -> Stripe(contextIt).createToken( it, API_KEY, object : TokenCallback { override fun onSuccess(token: Token) { //Send this token to server Toast.makeText(context, "Token received from Stripe", Toast.LENGTH_LONG).show() } override fun onError(error: Exception) { Toast.makeText(context, error.localizedMessage.toString(), Toast.LENGTH_LONG).show() } }) } }
Resources
- Stripe Android documentation: https://stripe.com/docs/mobile/android
- Stripe Documentation: https://stripe.com/docs/quickstart
- Stripe Android Github: https://github.com/stripe/stripe-android