.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 结果回调配置
- 在
Info.plist中添加自定义 URL Scheme(例如yourapp-pay) - 在
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
相关产品推荐
相关产品推荐

