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

如何在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体验:

  1. 使用webview_flutter或flutter_inappwebview插件加载自定义HTML页面
  2. 嵌入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:13:19