如何在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
相关产品推荐
相关产品推荐

