如何在Flutter应用中集成PhonePe支付网关Android SDK?
Flutter集成PhonePe支付网关方案指南
一、原生Android SDK集成方案(需编写原生代码)
步骤1:配置Android项目依赖
在android/app/build.gradle的dependencies块中添加PhonePe SDK依赖(请替换为官方最新版本):
implementation 'com.phonepe:pg-sdk-android:2.0.0'
同时在android/build.gradle的allprojects/repositories中添加PhonePe的Maven仓库:
maven { url "https://maven.phonepe.com/" }
步骤2:搭建Flutter与原生通信通道
在Flutter端定义MethodChannel,用于触发支付和接收结果:
import 'package:flutter/services.dart'; const MethodChannel _phonePeChannel = MethodChannel('com.your_app/phonepe_payment'); Future<String?> startPhonePePayment(Map<String, dynamic> paymentData) async { try { final String? result = await _phonePeChannel.invokeMethod('initiatePayment', paymentData); return result; } on PlatformException catch (e) { // 处理调用失败的异常 return 'ERROR: ${e.message}'; } }
步骤3:Android原生端实现支付逻辑
在MainActivity中注册MethodChannel并处理支付请求:
import com.phonepe.intent.sdk.api.PhonePe import com.phonepe.intent.sdk.api.PhonePeInit import com.phonepe.intent.sdk.api.models.PaymentRequest import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private val CHANNEL = "com.your_app/phonepe_payment" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "initiatePayment") { val paymentParams = call.arguments as Map<String, Any> // 初始化SDK,沙箱环境用SANDBOX,正式环境切换为PRODUCTION PhonePe.init(this, PhonePeInit.SANDBOX) // 构建支付请求,注意金额要转成派萨(比如100元=10000派萨) val paymentRequest = PaymentRequest.Builder() .setMerchantId(paymentParams["merchantId"].toString()) .setMerchantTransactionId(paymentParams["transactionId"].toString()) .setMerchantUserId(paymentParams["userId"].toString()) .setAmount((paymentParams["amount"] as Int) * 100) .setCallbackUrl(paymentParams["callbackUrl"].toString()) .setChecksum(paymentParams["checksum"].toString()) .build() // 发起支付并监听结果 PhonePe.startPayment(this, paymentRequest, object : PhonePe.PaymentCallback { override fun onPaymentSuccess(p0: com.phonepe.intent.sdk.api.PaymentStatus?) { result.success("SUCCESS") } override fun onPaymentFailed(p0: com.phonepe.intent.sdk.api.PaymentStatus?) { result.success("FAILED") } override fun onPaymentError(p0: Exception?) { result.error("PAYMENT_ERROR", p0?.message, null) } }) } else { result.notImplemented() } } } }
步骤4:配置AndroidManifest
添加必要权限和回调Activity:
<!-- 网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- PhonePe回调Activity,替换为你的应用自定义Scheme --> <activity android:name="com.phonepe.intent.sdk.api.RedirectActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="your_app_unique_scheme" /> </intent-filter> </activity>
二、无原生代码的优化方案(基于Web SDK)
如果不想编写原生代码,可以优化你之前的WebView方案,使用PhonePe官方Web SDK获得更贴近原生的UI体验:
- 使用
webview_flutter或flutter_inappwebview插件加载自定义HTML页面 - 嵌入PhonePe Web SDK,通过JS通道与Flutter交互传递参数和结果
示例HTML片段:
<script src="https://static.phonepe.com/v1/phonepe.min.js"></script> <script> const phonepe = new PhonePe({ env: 'SANDBOX' }); window.initiatePayment = function(paymentData) { phonepe.checkout(paymentData, { onSuccess: (data) => window.flutter_inappwebview.callHandler('onPaymentSuccess', data), onFailure: (data) => window.flutter_inappwebview.callHandler('onPaymentFailure', data) }); } </script>
Flutter端调用JS并监听回调:
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; InAppWebViewController? webViewController; // 加载HTML后触发支付 void triggerPayment(Map<String, dynamic> paymentData) { final jsonStr = jsonEncode(paymentData); webViewController?.evaluateJavascript(source: "initiatePayment($jsonStr)"); } // 监听JS回调 webViewController?.addJavaScriptHandler( handlerName: 'onPaymentSuccess', callback: (args) { // 处理支付成功逻辑 }, ); webViewController?.addJavaScriptHandler( handlerName: 'onPaymentFailure', callback: (args) { // 处理支付失败逻辑 }, );
三、第三方Flutter插件推荐
社区有几个维护中的插件可以简化集成,无需手动编写大量原生代码:
phonepe_payment_sdk:封装了PhonePe Android和iOS SDK,需注意版本兼容性flutter_phonepe:提供基础支付流程API,集成门槛较低
使用前请仔细核对插件支持的PhonePe SDK版本和你的Flutter版本,避免兼容性问题。
关键注意事项
- 支付请求的校验和(Checksum)必须由后端生成,禁止在客户端处理敏感数据
- 测试阶段使用沙箱环境,上线前务必切换为生产环境
- 客户端收到支付结果后,必须通过后端回调接口再次验证状态,防止客户端篡改
内容的提问来源于stack exchange,提问作者Shofick Hossain
相关产品推荐
相关产品推荐

