我正在try 执行PayUCheckoutPro android SDK 在Android中成功完成实现部分后,当我try 默认启动支付时,onError()函数调用时出现错误消息

5014类型为java.lang.String的值<!DOCTYPE不能转换为 JSONObject

Points I've checked before asking this question are

  1. 已判断官方文档,生成哈希以正确使用bar'|'

  2. 已判断此问题的凭据问题url

添加了我的文件以进行更多说明

public class MainActivity extends AppCompatActivity {
String strKey = "gtKFFx";
String strSalt = "4R38IvwiV57FwVpsgOvTXBdLE4tHUXFW";

String TAG = "TAG123";
String txnid = "001", amount = "1.0", productinfo = "test", firstname = "shyam", email = "shyam@entitcs.com",
        user_credentials = "", udf1 = "1", udf2 = "1", udf3 = "1", udf4 = "1", udf5 = "1", offerKey = "0", cardBin = "0",
        phone = "7224857968";
String hashString = "";

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    generateHash();
}

public void startPayment(View v) {
    HashMap<String, Object> additionalParams = new HashMap<>();
    additionalParams.put(PayUCheckoutProConstants.CP_UDF1, udf1);
    additionalParams.put(PayUCheckoutProConstants.CP_UDF2, udf2);
    additionalParams.put(PayUCheckoutProConstants.CP_UDF3, udf3);
    additionalParams.put(PayUCheckoutProConstants.CP_UDF4, udf4);
    additionalParams.put(PayUCheckoutProConstants.CP_UDF5, udf5);

    PayUPaymentParams.Builder builder = new PayUPaymentParams.Builder();
    builder .setKey(strKey1)
            .setIsProduction(true)
            .setTransactionId(txnid)
            .setAmount(amount)
            .setProductInfo(productinfo)
            .setFirstName(firstname)
            .setEmail(email)
            //.setPhone(phone)
            .setSurl("https://payuresponse.firebaseapp.com/success")
            .setFurl("https://payuresponse.firebaseapp.com/failure");

    PayUPaymentParams payUPaymentParams = builder.build();

    PayUCheckoutPro.open(this, payUPaymentParams, new PayUCheckoutProListener() {

        @Override
        public void onPaymentSuccess(Object response) {
            //Cast response object to HashMap
            HashMap<String, Object> result = (HashMap<String, Object>) response;
            String payuResponse = (String) result.get(PayUCheckoutProConstants.CP_PAYU_RESPONSE);
            String merchantResponse = (String) result.get(PayUCheckoutProConstants.CP_MERCHANT_RESPONSE);
            Log.e(TAG, "onPaymentSuccess: "+payuResponse );
        }

        @Override
        public void onPaymentFailure(Object response) {
            //Cast response object to HashMap
            HashMap<String, Object> result = (HashMap<String, Object>) response;
            String payuResponse = (String) result.get(PayUCheckoutProConstants.CP_PAYU_RESPONSE);
            String merchantResponse = (String) result.get(PayUCheckoutProConstants.CP_MERCHANT_RESPONSE);
            Log.e(TAG, "onPaymentFailure: "+payuResponse );
        }

        @Override
        public void onPaymentCancel(boolean isTxnInitiated) {
            Log.e(TAG, "onPaymentCancel: "+isTxnInitiated );
        }

        @Override
        public void onError(@NonNull ErrorResponse errorResponse) {
            Log.e(TAG, "onError: "+errorResponse.getErrorCode() );
            Log.e(TAG, "onError: "+errorResponse.getErrorMessage() );
            Toast.makeText(MainActivity.this, String.valueOf(errorResponse.getErrorMessage()), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void setWebViewProperties(@Nullable WebView webView, @Nullable Object o) {
            Log.e(TAG, "setWebViewProperties: " );
            //For setting webview properties, if any. Check Customized Integration section for more details on this
        }

        @Override
        public void generateHash(HashMap<String, String> valueMap, PayUHashGenerationListener hashGenerationListener) {
            String hashName = valueMap.get(PayUCheckoutProConstants.CP_HASH_NAME);
            String hashData = valueMap.get(PayUCheckoutProConstants.CP_HASH_STRING);
            if (!TextUtils.isEmpty(hashName) && !TextUtils.isEmpty(hashData)) {
                //Do not generate hash from local, it needs to be calculated from server side only. Here, hashString contains hash created from your server side.
                String hash = hashString;
                Log.e(TAG, "----: "+hash );
                HashMap<String, String> dataMap = new HashMap<>();
                dataMap.put(hashName, hash);
                hashGenerationListener.onHashGenerated(dataMap);
            }
        }
    });
}

void generateHash() {
    StringRequest stringRequest = new StringRequest(Request.Method.POST, "url", response -> {
        Log.e(TAG, "generateHash: " + response);
        try {
            JSONObject jsonObject = new JSONObject(response);
            hashString = jsonObject.getString("payment_hash");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }, error -> {
        Log.e(TAG, "generateHash: " + error.toString());
    }) {
        @Nullable
        @Override
        protected Map<String, String> getParams() {
            HashMap<String, String> param = new HashMap<>();
            param.put("txnid", txnid);
            param.put("amount", amount);
            param.put("productinfo", productinfo);
            param.put("firstname", firstname);
            param.put("email", email);
            //param.put("phone", phone);
            //param.put("user_credentials", user_credentials);
            //param.put("udf1", udf1);
            //param.put("udf2", udf2);
            //param.put("udf3", udf3);
            //param.put("udf4", udf4);
            //param.put("udf5", udf5);
            //param.put("offerKey", offerKey);
            //param.put("cardBin", cardBin);
            Log.e(TAG, "getParams: "+param );
            return param;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}


plugins {
id 'com.android.application'
}

android {
    namespace 'com.shyam.payudemo'
    compileSdk 32

    defaultConfig {
        applicationId "com.shyam.payudemo"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}

dependencies {
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'

implementation 'in.payu:payu-checkout-pro:2.0.2'//Pay-U-Money
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'com.android.volley:volley:1.2.1'//Volley

推荐答案

This is how you implement PayUCheckoutPro-SDK

Payu-Money支付网关是目前最安全、最安全的支付网关之一,与其他支付网关相比,其实现部分也比较困难

  • 要求解类型为java.lang.String的5014值<;!DOCTYPE,无法将其转换为JSONObject .setIsProduction(false)

  • 详细代码可在我的git-repository上查看

Android相关问答推荐

如何使用视图模型触发可变状态?

懒惰列的滚动到项目不按预期工作'

Android可组合继承?

list 合并失败,AGP 8.3.0

fillMaxHeight中的分数在列内不起作用(android jetpack compose)

如何在Android Studio中将我的Java-库&库设置为Kotlin库

strings.xml中字符串数组中的占位符

将DiffUtils用于Android上的Recrecerview适配器

为什么可以';我不能直接在RecyclerView.ViewHolder中访问视图ID吗?

FFmpeg Android 错误

Android 应用程序从 Android Studio 安装,但不是作为 .apk 在外部安装.抛出java.lang.UnsatisfiedLinkError

我怎样才能在多行 TextView 旁边有一个 ImageView 并且不超过父级的限制?

在 compose android 中创建一个圆形按钮和居中文本

Kotlin Multiplatform Mobile targetSdk 已弃用

来自位图的 WearOS 图标不显示 colored颜色

从活动共享视图模型以使用 hilt 组合函数

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

如何在jetpack compose中通过lamda返回columnScope/RowScope

如何在android studio 2021.1中使用谷歌库以外的库

如何在 Jetpack Compose 中将 NavigationRail 的内容居中