Google Pay银行卡识别库生产环境崩溃问题求助
Google Pay生产环境信用卡扫描功能崩溃问题
我集成了Google Pay库实现借记卡/信用卡(卡号、有效期、CVV)信息扫描功能,QA环境运行正常,但切换到WalletConstants.ENVIRONMENT_PRODUCTION生产环境后出现崩溃。
相关代码
private fun createPaymentsClient(activity: Activity): PaymentsClient { val walletOptions = Wallet.WalletOptions.Builder() .setEnvironment(WalletConstants.ENVIRONMENT_PRODUCTION) .build() return Wallet.getPaymentsClient(activity, walletOptions) }
崩溃日志
FATAL EXCEPTION: main Process: com.dhl.pay.google, PID: 5219 kotlin.UninitializedPropertyAccessException: lateinit property cardRecognitionPendingIntent has not been initialized at com.dhl.pay.google.MainActivity.startPaymentCardOcr(MainActivity.kt:80) at com.dhl.pay.google.MainActivity.onCreate$lambda$0(MainActivity.kt:38) at com.dhl.pay.google.MainActivity.$r8$lambda$9ZIx61lkQCSM4mTsrQGymHGsZ_g(Unknown Source:0) at com.dhl.pay.google.MainActivity$$ExternalSyntheticLambda0.onClick(Unknown Source:2) at android.view.View.performClick(View.java:7488) at android.view.View.performClickInternal(View.java:7464) at android.view.View.access$3700(View.java:841) at android.view.View$PerformClick.run(View.java:28911) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:344) at android.app.ActivityThread.main(ActivityThread.java:8212) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
解决方案
核心原因
生产环境下Google Pay对配置校验远严格于QA环境,卡片识别所需的PendingIntent初始化失败,导致lateinit变量未赋值就被调用,触发UninitializedPropertyAccessException。
修复步骤
验证生产环境配置合法性
- 确认应用已在Google Pay Console完成生产环境注册,绑定的包名、签名证书指纹与当前构建完全一致。
- 检查
AndroidManifest.xml中是否正确声明Google Pay相关配置:<meta-data android:name="com.google.android.gms.wallet.api.enabled" android:value="true" /> <!-- 确保已添加正确的生产环境API密钥 --> <meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_PRODUCTION_API_KEY" />
完善PendingIntent初始化与调用逻辑
- 替换
lateinit变量为可空类型,避免未初始化访问:private var cardRecognitionPendingIntent: PendingIntent? = null private fun initCardRecognitionIntent() { val request = CardRecognitionRequest.newBuilder().build() paymentsClient.createCardRecognitionPendingIntent(request) .addOnSuccessListener { intent -> cardRecognitionPendingIntent = intent } .addOnFailureListener { e -> Log.e("GooglePay", "PendingIntent初始化失败", e) // 添加失败提示或降级到手动输入的逻辑 } } - 在触发扫描前增加非空校验:
// 扫描按钮点击事件 scanButton.setOnClickListener { cardRecognitionPendingIntent?.let { intent -> startIntentSenderForResult(intent.intentSender, REQUEST_CARD_OCR, null, 0, 0, 0) } ?: run { Toast.makeText(this, "卡片扫描功能暂不可用,请手动输入", Toast.LENGTH_SHORT).show() } }
- 替换
生产环境调试建议
- 使用Google Pay官方提供的生产环境测试卡片进行验证,避免无效卡片导致初始化失败。
- 查看Logcat中Google Pay相关的错误日志,通常会给出初始化失败的具体原因(如签名不匹配、权限缺失等)。
内容的提问来源于stack exchange,提问作者Hitesh Dhamshaniya
相关产品推荐
相关产品推荐

