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

.NET Maui实现带参数启动Google Pay并获取响应(Android/iOS)

.NET Maui 实现启动 Google Pay 功能

Android 平台实现

核心步骤

  • 构建 UPI 支付 URI
  • 创建并配置 Intent
  • 启动 Google Pay 并处理返回结果

代码实现

首先在共享项目定义统一调用接口:

public interface IGooglePayService
{
    Task<string> LaunchGooglePayAsync(string merchantVpa, string merchantName, string merchantCode, string transactionRefId, string transactionNote, string amount, string currency = "INR", string transactionUrl = "");
}

然后在 Android 项目中实现该接口:

[assembly: Dependency(typeof(GooglePayService))]
namespace YourApp.Platforms.Android
{
    public class GooglePayService : IGooglePayService, IActivityResultCallback
    {
        private const string GOOGLE_PAY_PACKAGE = "com.google.android.apps.nbu.paisa.user";
        private const int PAY_REQUEST_CODE = 1001;
        private TaskCompletionSource<string> _resultSource;

        public async Task<string> LaunchGooglePayAsync(string merchantVpa, string merchantName, string merchantCode, string transactionRefId, string transactionNote, string amount, string currency = "INR", string transactionUrl = "")
        {
            _resultSource = new TaskCompletionSource<string>();

            // 构建支付URI
            var uriBuilder = new Android.Net.Uri.Builder()
                .Scheme("upi")
                .Authority("pay")
                .AppendQueryParameter("pa", merchantVpa)
                .AppendQueryParameter("pn", merchantName)
                .AppendQueryParameter("mc", merchantCode)
                .AppendQueryParameter("tr", transactionRefId)
                .AppendQueryParameter("tn", transactionNote)
                .AppendQueryParameter("am", amount)
                .AppendQueryParameter("cu", currency);

            if (!string.IsNullOrEmpty(transactionUrl))
            {
                uriBuilder.AppendQueryParameter("url", transactionUrl);
            }

            var payUri = uriBuilder.Build();

            // 创建并配置Intent
            var payIntent = new Intent(Intent.ActionView);
            payIntent.SetData(payUri);
            payIntent.SetPackage(GOOGLE_PAY_PACKAGE);

            // 检查Google Pay是否安装
            var packageManager = Platform.CurrentActivity.PackageManager;
            var resolveInfo = packageManager.ResolveActivity(payIntent, PackageInfoFlags.MatchDefaultOnly);
            if (resolveInfo == null)
            {
                _resultSource.SetResult("Google Pay未安装");
                return await _resultSource.Task;
            }

            // 启动支付并等待结果
            Platform.CurrentActivity.RegisterForActivityResult(new ActivityResultContracts.StartActivityForResult(), this).Launch(payIntent);

            return await _resultSource.Task;
        }

        public void OnActivityResult(ActivityResult result)
        {
            if (result.ResultCode == Result.Ok)
            {
                var response = result.Data.GetStringExtra("response");
                _resultSource.SetResult(response);
            }
            else
            {
                _resultSource.SetResult("支付取消或失败");
            }
        }
    }
}

iOS 平台实现

核心步骤

  • 构建 UPI 支付 URL
  • 唤起 Google Pay 应用
  • 通过自定义 URL Scheme 接收支付结果

代码实现

在 iOS 项目中实现接口:

[assembly: Dependency(typeof(GooglePayService))]
namespace YourApp.Platforms.iOS
{
    public class GooglePayService : IGooglePayService
    {
        public async Task<string> LaunchGooglePayAsync(string merchantVpa, string merchantName, string merchantCode, string transactionRefId, string transactionNote, string amount, string currency = "INR", string transactionUrl = "")
        {
            // 构建支付参数
            var queryParams = new Dictionary<string, string>
            {
                {"pa", merchantVpa},
                {"pn", merchantName},
                {"mc", merchantCode},
                {"tr", transactionRefId},
                {"tn", transactionNote},
                {"am", amount},
                {"cu", currency}
            };

            if (!string.IsNullOrEmpty(transactionUrl))
            {
                queryParams.Add("url", transactionUrl);
            }

            // 拼接成UPI支付URL
            var queryString = string.Join("&", queryParams.Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
            var upiPayUrl = new Uri($"upi://pay?{queryString}");

            // 检查Google Pay是否安装
            var googlePayScheme = new Uri("com.google.apps.nbu.paisa.user://");
            if (!UIApplication.SharedApplication.CanOpenUrl(googlePayScheme))
            {
                return "Google Pay未安装";
            }

            // 唤起支付
            if (UIApplication.SharedApplication.CanOpenUrl(upiPayUrl))
            {
                await UIApplication.SharedApplication.OpenUrlAsync(upiPayUrl);
                return "支付已发起,请等待结果";
            }
            else
            {
                return "设备不支持UPI支付";
            }
        }
    }
}

iOS 结果回调配置

  1. 在 Info.plist 中添加自定义 URL Scheme(例如 yourapp-pay)
  2. 在 SceneDelegate 中处理回调:
public override void OpenUrlContexts(UIScene scene, NSSet<UIOpenUrlContext> urlContexts)
{
    base.OpenUrlContexts(scene, urlContexts);
    var callbackUrl = urlContexts.AnyObject.Url;
    if (callbackUrl.Scheme == "yourapp-pay")
    {
        // 解析支付结果参数
        var resultParams = callbackUrl.Query;
        // 通过消息中心通知共享项目处理结果
        MessagingCenter.Send<object, string>(this, "GooglePayResult", resultParams);
    }
}

共享项目调用示例

var payService = DependencyService.Get<IGooglePayService>();
var payResult = await payService.LaunchGooglePayAsync(
    "merchant-test@upi",
    "测试商户",
    "12345",
    "TXN000123",
    "商品购买",
    "29.99"
);
// 处理支付结果
Console.WriteLine(payResult);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:12:08