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

如何在Python Kivy应用中集成Braintree Drop-in UI并处理Activity Context?

集成Braintree Drop-in UI到Kivy Python应用(Pyjnius实现)

咱们来一步步解决你在Kivy应用中集成Braintree支付的问题,包括获取Android Activity Context、完善支付流程和处理回调:

获取Android Activity Context

在Kivy的Android环境中,应用运行在PythonActivity实例里,你可以直接通过PythonActivity.mActivity获取当前的Activity对象——这就是我们需要的Context,所有Android组件(比如Braintree的DropInRequest)都依赖它来运行。

完整集成代码(含回调处理)

我帮你补全并优化了代码,修正了RESULT_OK的错误值(Android原生的RESULT_OK是-1,不是1),同时完善了回调逻辑:

from jnius import autoclass, cast
from android import activity

# 导入核心类
Intent = autoclass('android.content.Intent')
PythonActivity = autoclass('org.renpy.android.PythonActivity')
DropInRequest = autoclass('com.braintreepayments.api.dropin.DropInRequest')
DropInResult = autoclass('com.braintreepayments.api.dropin.DropInResult')
Activity = autoclass('android.app.Activity')

# 全局常量与实例
REQUEST_CODE_BRAINTREE = 1
braintree_request = None
RESULT_OK = Activity.RESULT_OK

def init_braintree_payment(client_token):
    """初始化并启动Braintree Drop-in支付界面"""
    global braintree_request
    # 获取当前Activity Context(关键步骤)
    current_activity = PythonActivity.mActivity
    
    # 创建DropInRequest并配置客户端令牌
    braintree_request = DropInRequest()
    braintree_request.clientToken = client_token  # 替换为你的服务器生成的客户端令牌
    
    # 生成启动DropInActivity的Intent
    payment_intent = braintree_request.getIntent(current_activity)
    # 启动Activity并等待结果
    current_activity.startActivityForResult(payment_intent, REQUEST_CODE_BRAINTREE)
    
    # 注册Activity结果回调
    activity.bind(on_activity_result=handle_braintree_result)

def handle_braintree_result(request_code, result_code, data):
    """处理Braintree支付返回的结果"""
    if request_code != REQUEST_CODE_BRAINTREE:
        return
    
    if result_code == RESULT_OK:
        # 支付成功,获取支付方法Nonce(用于服务器端完成交易)
        drop_in_result = DropInResult.fromIntent(data)
        payment_nonce = drop_in_result.getPaymentMethodNonce().getNonce()
        print(f"支付成功!Nonce: {payment_nonce}")
        # 这里调用你的API,把nonce发送到服务器完成扣款
        
    elif result_code == Activity.RESULT_CANCELED:
        # 用户主动取消支付
        print("用户取消了支付流程")
        
    else:
        # 支付出错,获取错误信息
        error = data.getSerializableExtra(DropInResult.EXTRA_ERROR)
        print(f"支付失败:{error.getMessage()}")

关键配置与注意事项

  • 依赖配置(buildozer.spec):
    必须在buildozer.spec中添加Braintree的Maven依赖,否则Pyjnius找不到相关类:
    android.maven_dependencies = com.braintreepayments.api:drop-in:6.11.0, com.braintreepayments.api:core:4.27.0
    android.permissions = INTERNET
    
  • 客户端令牌获取:
    客户端令牌不能硬编码,必须从你的Braintree服务器端通过API请求动态获取,确保令牌的安全性和有效性。
  • 回调绑定时机:
    要确保activity.bind(on_activity_result=...)在启动支付前完成注册,否则无法接收返回结果。
  • 测试环境:
    先使用Braintree的沙箱环境测试,确认支付流程正常后再切换到生产环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:28:58