Android Kotlin环境下Google Wallet/Pay功能异常排查求助
问题描述
- 设备已安装Google Pay,但应用内Google Pay按钮默认不显示,手动强制显示后点击触发错误:
An unexpected error has occurred. Please try again later. [OR_BIBED_07] - 手动启用Google Wallet按钮后,点击无响应,无法完成票据存入操作
相关代码片段
手动显示Google Pay按钮代码
private fun setGooglePayAvailable(available: Boolean) { if (available) { googlePayButton.visibility = View.VISIBLE } else { Toast.makeText( this, R.string.google_pay_status_unavailable, Toast.LENGTH_LONG).show() googlePayButton.visibility = View.VISIBLE } }
Google Pay按钮点击事件代码
private fun requestPayment() { // Disables the button to prevent multiple clicks. googlePayButton.isClickable = false // The price provided to the API should include taxes and shipping. // This price is not displayed to the user. val dummyPriceCents = 100L val shippingCostCents = 900L val task = model.getLoadPaymentDataTask(dummyPriceCents + shippingCostCents) task.addOnCompleteListener { completedTask -> if (completedTask.isSuccessful) { completedTask.result.let(::handlePaymentSuccess) } else { when (val exception = completedTask.exception) { is ResolvableApiException -> { resolvePaymentForResult.launch( IntentSenderRequest.Builder(exception.resolution).build() ) } is ApiException -> { handleError(exception.statusCode, exception.message) } else -> { handleError( CommonStatusCodes.INTERNAL_ERROR, "Unexpected non API" + " exception when trying to deliver the task result to an activity!" ) } } } // Re-enables the Google Pay payment button. googlePayButton.isClickable = true } }
Google Wallet按钮显示控制代码
private fun setAddToGoogleWalletAvailable(available: Boolean) { if (available) { layout.passContainer.visibility = View.VISIBLE } else { Toast.makeText( this, R.string.google_wallet_status_unavailable, Toast.LENGTH_LONG).show() } }
Google Wallet按钮点击事件代码
private fun requestSavePass() { // Disables the button to prevent multiple clicks. addToGoogleWalletButton.isClickable = false model.savePassesJwt(model.genericObjectJwt, this, addToGoogleWalletRequestCode) }
请求的JSON对象
private val issuerEmail = "irfan*********@gmail.com" private val issuerId = "338800000002212****" private val passClass = "338800000002212****.e7504e23-****-4852-b8e4-9345684a2e06" private val passId = UUID.randomUUID().toString() private val newObjectJson = """{ "iss": "$issuerEmail", "aud": "google", "typ": "savetowallet", "iat": ${Date().time / 1000L}, "origins": [], "payload": { "genericObjects": [ { "id": "$issuerId.$passId", "classId": "$passClass", "genericType": "GENERIC_TYPE_UNSPECIFIED", "hexBackgroundColor": "#4285f4", "logo": { "sourceUri": { "uri": "https://storage.googleapis.com/wallet-lab-tools-codelab-artifacts-public/pass_google_logo.jpg" } }, "cardTitle": { "defaultValue": { "language": "en", "value": "Google I/O '22 [DEMO ONLY]" } }, "subheader": { "defaultValue": { "language": "en", "value": "Attendee" } }, "header": { "defaultValue": { "language": "en", "value": "Alex McJacobs" } }, "barcode": { "type": "QR_CODE", "value": "$passId" }, "heroImage": { "sourceUri": { "uri": "https://storage.googleapis.com/wallet-lab-tools-codelab-artifacts-public/google-io-hero-demo-only.jpg" } }, "textModulesData": [ { "header": "POINTS", "body": "${Random.nextInt(0, 9999)}", "id": "points" }, { "header": "CONTACTS", "body": "${Random.nextInt(1, 99)}", "id": "contacts" } ] } ] } }"""
疑问
是否因为身处印度地区导致该问题?如何解决这些异常?
问题分析与解决方案
关于地区影响
印度地区确实会影响Google Pay和Wallet的部分功能:
- Google Pay在印度的服务侧重UPI支付,和全球版的支付API存在差异,部分非UPI相关的支付场景可能受限。
- Google Wallet在印度的支持范围有限,部分票据类型可能无法正常存入。
但你的问题更多是配置和代码逻辑问题,以下是针对性解决步骤:
一、解决Google Pay按钮不显示及OR_BIBED_07错误
修复按钮显示逻辑
你的setGooglePayAvailable函数无论available是否为true都强制显示按钮,这会跳过Google Pay的可用性检查。正确逻辑应该是仅当available为true时才显示:private fun setGooglePayAvailable(available: Boolean) { if (available) { googlePayButton.visibility = View.VISIBLE } else { Toast.makeText( this, R.string.google_pay_status_unavailable, Toast.LENGTH_LONG ).show() googlePayButton.visibility = View.GONE // 改为隐藏而非强制显示 } }强制显示未通过可用性检查的按钮,会直接触发服务端错误。
处理OR_BIBED_07错误
这个错误通常是以下原因导致:- 未正确配置Google Pay的支付环境(测试/生产):确保你使用的测试环境参数符合印度地区要求,比如支付网关、支持的卡组织。
- 价格格式问题:印度地区的货币代码应为
INR,检查你的model.getLoadPaymentDataTask方法中是否正确设置了货币为INR,且金额单位为派萨(1INR=100派萨)。 - 设备Google Pay账号问题:确认设备登录的Google账号在印度地区有可用的支付方式,且账号未受限。
二、解决Google Wallet按钮点击无响应问题
检查JWT签名有效性
你的newObjectJson生成的JWT必须用Google Cloud控制台中配置的服务账号私钥签名,确保:- 服务账号已被授予Google Wallet API的权限。
- 签名算法为RS256,且JWT未过期(
iat是当前时间,需确保服务器时间与标准时间同步)。 origins字段为空可能导致安全校验失败,添加你的应用包名对应的Android应用签名哈希值(格式为android:<package_name>:<signature_hash>)。
检查权限与Intent处理
- 确保应用已添加
com.google.android.gms.wallet.ACTION_SAVE_PASSES权限。 - 检查
model.savePassesJwt方法是否正确启动了Google Wallet的Intent,且你的Activity正确处理了返回结果(比如在onActivityResult或registerForActivityResult中接收回调)。 - 验证
passClass是否已在Google Wallet控制台中创建并发布,未发布的Class无法创建对应的票据对象。
- 确保应用已添加
印度地区适配
Google Wallet在印度支持的票据类型有限,避免使用GENERIC_TYPE_UNSPECIFIED,改为明确的类型(如EVENT_TICKET),并确保Class配置符合印度地区的规范。
三、通用排查步骤
- 查看Logcat中的详细错误日志,Google Pay和Wallet的API会输出具体的错误原因,比通用错误码更有用。
- 确认设备的Google Play Services是最新版本,旧版本可能存在兼容性问题。
- 使用Google Wallet API的测试工具验证JWT的有效性,确保签名和内容格式正确。
内容的提问来源于stack exchange,提问作者llllllllllllllllllllllllllllll
相关产品推荐
相关产品推荐

