You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误

  1. 修复按钮显示逻辑
    你的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 // 改为隐藏而非强制显示
        }
    }
    

    强制显示未通过可用性检查的按钮,会直接触发服务端错误。

  2. 处理OR_BIBED_07错误
    这个错误通常是以下原因导致:

    • 未正确配置Google Pay的支付环境(测试/生产):确保你使用的测试环境参数符合印度地区要求,比如支付网关、支持的卡组织。
    • 价格格式问题:印度地区的货币代码应为INR,检查你的model.getLoadPaymentDataTask方法中是否正确设置了货币为INR,且金额单位为派萨(1INR=100派萨)。
    • 设备Google Pay账号问题:确认设备登录的Google账号在印度地区有可用的支付方式,且账号未受限。

二、解决Google Wallet按钮点击无响应问题

  1. 检查JWT签名有效性
    你的newObjectJson生成的JWT必须用Google Cloud控制台中配置的服务账号私钥签名,确保:

    • 服务账号已被授予Google Wallet API的权限。
    • 签名算法为RS256,且JWT未过期(iat是当前时间,需确保服务器时间与标准时间同步)。
    • origins字段为空可能导致安全校验失败,添加你的应用包名对应的Android应用签名哈希值(格式为android:<package_name>:<signature_hash>)。
  2. 检查权限与Intent处理

    • 确保应用已添加com.google.android.gms.wallet.ACTION_SAVE_PASSES权限。
    • 检查model.savePassesJwt方法是否正确启动了Google Wallet的Intent,且你的Activity正确处理了返回结果(比如在onActivityResult或registerForActivityResult中接收回调)。
    • 验证passClass是否已在Google Wallet控制台中创建并发布,未发布的Class无法创建对应的票据对象。
  3. 印度地区适配
    Google Wallet在印度支持的票据类型有限,避免使用GENERIC_TYPE_UNSPECIFIED,改为明确的类型(如EVENT_TICKET),并确保Class配置符合印度地区的规范。

三、通用排查步骤

  • 查看Logcat中的详细错误日志,Google Pay和Wallet的API会输出具体的错误原因,比通用错误码更有用。
  • 确认设备的Google Play Services是最新版本,旧版本可能存在兼容性问题。
  • 使用Google Wallet API的测试工具验证JWT的有效性,确保签名和内容格式正确。

内容的提问来源于stack exchange,提问作者llllllllllllllllllllllllllllll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:57:35