package
com.example.upipaymentgateway
import
android.app.Activity
import
android.content.Context
import
android.os.Bundle
import
android.util.Log
import
android.widget.Toast
import
androidx.activity.ComponentActivity
import
androidx.activity.compose.setContent
import
androidx.compose.foundation.layout.*
import
androidx.compose.material.*
import
androidx.compose.runtime.*
import
androidx.compose.ui.Alignment
import
androidx.compose.ui.Modifier
import
androidx.compose.ui.graphics.*
import
androidx.compose.ui.platform.LocalContext
import
androidx.compose.ui.text.font.FontFamily
import
androidx.compose.ui.text.font.FontWeight
import
androidx.compose.ui.text.style.TextAlign
import
androidx.compose.ui.unit.*
import
com.android.volley.DefaultRetryPolicy
import
com.android.volley.Request
import
com.android.volley.Response
import
com.android.volley.VolleyError
import
com.android.volley.toolbox.StringRequest
import
com.android.volley.toolbox.Volley
import
com.example.upipaymentgateway.ui.theme.*
import
com.google.android.gms.common.api.ApiException
import
com.google.android.gms.common.api.CommonStatusCodes
import
com.google.android.gms.safetynet.SafetyNet
import
org.json.JSONObject
import
java.util.*
class
MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContent {
UPIPaymentGatewayTheme {
Surface(
modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background
) {
Scaffold(
topBar = {
TopAppBar(backgroundColor = greenColor,
title = {
Text(
text =
"reCAPTCHA in Android"
,
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
color = Color.White
)
})
}) {
recaptcha(
this
)
}
}
}
}
}
}
@Composable
fun recaptcha(mainActivity: MainActivity) {
val ctx = LocalContext.current
var SITE_KEY =
"Enter your site key"
Column(
modifier = Modifier
.fillMaxSize()
.fillMaxHeight()
.fillMaxWidth(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text =
"reCAPTCHA in Android"
,
color = greenColor,
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Bold, textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(
5
.dp))
Button(
onClick = {
SafetyNet.getClient(ctx).verifyWithRecaptcha(SITE_KEY).addOnSuccessListener {
if
(it.tokenResult!!.isNotEmpty()) {
handleVerification(it.tokenResult.toString(), ctx)
}
}.addOnFailureListener {
if
(it is ApiException) {
val apiException = it as ApiException
Log.d(
"TAG"
,
"Error message: "
+
CommonStatusCodes.getStatusCodeString(apiException.statusCode)
)
}
else
{
Toast.makeText(ctx,
"Error found is : $it"
, Toast.LENGTH_SHORT)
.show()
}
}
},
modifier = Modifier
.fillMaxWidth()
.padding(
16
.dp)
) {
Text(text =
"Verify Captcha"
, modifier = Modifier.padding(
8
.dp))
}
}
}
fun handleVerification(responseToken: String, ctx: Context) {
val queue = Volley.newRequestQueue(ctx)
val SECRET_KEY =
"Enter your secret key"
val request: StringRequest =
object : StringRequest(Request.Method.POST, url, object : Response.Listener<String?> {
override fun onResponse(response: String?) {
try
{
val jsonObject = JSONObject(response)
if
(jsonObject.getBoolean(
"success"
)) {
Toast.makeText(
ctx,
"User verified with reCAPTCHA"
,
Toast.LENGTH_SHORT
).show()
}
else
{
Toast.makeText(
ctx,
jsonObject.getString(
"error-codes"
).toString(),
Toast.LENGTH_LONG
).show()
}
}
catch
(ex: Exception) {
Log.d(
"TAG"
,
"JSON exception: "
+ ex.message)
}
}
}, object : Response.ErrorListener {
override fun onErrorResponse(error: VolleyError?) {
Toast.makeText(ctx,
"Fail to post data.."
, Toast.LENGTH_SHORT)
.show()
}
}) {
override fun getParams(): Map<String, String>? {
val params: MutableMap<String, String> = HashMap()
params[
"secret"
] = SECRET_KEY
params[
"response"
] = responseToken
return
params
}
}
request.setRetryPolicy(
DefaultRetryPolicy(
50000
,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
)
)
queue.add(request)
}