alipay_payment

Flutter 支付宝支付插件,支持 iOS、Android 平台。

功能

  • 设置支付环境:切换正式/测试环境
  • 支付:发起支付宝支付
  • 授权:支付宝账号授权
  • 检测安装:检查是否已安装支付宝客户端
  • 支付/授权结果:统一的结果封装,含容错处理
  • 平台支持:iOS、Android

安装

dependencies:
  alipay_payment: ^0.0.1

# 配置(可选)
alipay_payment:
  scheme: alipay${yourAppId}  # iOS 必填,支付完成后跳回 App
  ios: noutdid  # 可选,默认 utdid;noutdid 可避免与阿里系其他 SDK 的 UTDID 冲突

iOS utdid/noutdid:在 ios/Podfile 顶部添加(供 podspec 读取 pubspec 配置):

ENV['ALIPAY_PAYMENT_APP_ROOT'] ||= File.dirname(File.dirname(File.expand_path(__FILE__)))

使用

import 'package:alipay_payment/alipay_payment.dart';

// 设置环境(测试/正式)
await AlipayPaymentPlatform.instance.setEnvironment(AlipayEnvironment.sandbox);

// 检查是否安装支付宝
final installed = await AlipayPaymentPlatform.instance.isAlipayInstalled();

// 先监听结果流,再发起支付/授权
AlipayPaymentPlatform.instance.payResp().listen((result) {
  if (result.isSuccess) {
    // 支付成功
  } else if (result.isCancel) {
    // 用户取消
  } else if (result.isFailure) {
    // 失败
  }
});
AlipayPaymentPlatform.instance.authResp().listen((result) { /* 同上 */ });

// 发起支付(会跳转支付宝 App,结果通过 payResp 返回)
await AlipayPaymentPlatform.instance.pay(
  orderInfo: orderInfoFromServer,
  urlScheme: 'alipay${yourAppId}',  // iOS URL Scheme
  universalLink: 'https://yourdomain.com/alipay',  // iOS Universal Links(可选)
  showPayLoading: true,  // 是否显示支付中 loading
  payEnv: AlipayEnvironment.sandbox,  // 本次支付环境(可选,不传则用 setEnvironment)
);

// 发起授权
await AlipayPaymentPlatform.instance.auth(
  authInfo: authInfoFromServer,
  urlScheme: 'alipay${yourAppId}',
  universalLink: 'https://yourdomain.com/alipay',
  showPayLoading: true,
);

// 客户端签名支付(与 alipay_kit unsafePay 一致,私钥仅用于开发测试)
await AlipayPaymentPlatform.instance.unsafePay(
  orderInfo: {
    'app_id': yourAppId,
    'biz_content': json.encode(bizContent),
    'charset': 'utf-8',
    'method': 'alipay.trade.app.pay',
    'timestamp': 'yyyy-MM-dd HH:mm:ss',
    'version': '1.0',
  },
  signType: AlipaySign.signTypeRsa2,
  privateKey: yourRsaPrivateKey,
  urlScheme: 'alipay${yourAppId}',
);

// 客户端签名授权(与 alipay_kit unsafeAuth 一致)
await AlipayPaymentPlatform.instance.unsafeAuth(
  appId: yourAppId,
  pid: yourPid,
  targetId: targetId,
  signType: AlipaySign.signTypeRsa2,
  privateKey: yourRsaPrivateKey,
  urlScheme: 'alipay${yourAppId}',
);

平台配置

iOS

  1. pubspec 配置(推荐):在项目根目录 pubspec.yaml 添加:
alipay_payment:
  scheme: alipay${yourAppId}
  ios: noutdid  # 可选

ios/Podfilepost_install 中调用 alipay_setup.rb 可自动写入 scheme(见 example)。

  1. 或手动Info.plist 中添加 URL Scheme:
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>alipay你的AppID</string>
    </array>
    <key>CFBundleURLName</key>
    <string>alipay</string>
  </dict>
</array>
  1. 添加 LSApplicationQueriesSchemes(检测支付宝是否安装):
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>alipay</string>
  <string>alipays</string>
</array>
  1. AlipaySDK:将 AlipaySDK.frameworkAlipaySDK.bundle 放入插件目录 ios/Libraries/noutdid/utdid/(与 pubspec 的 ios: noutdid 对应)。详见 AlipaySDK-iOS

Android

  1. AndroidManifest.xml 中已配置 queries 用于检测支付宝安装
  2. Android SDK:二选一
    • Maven(默认):无需配置,自动拉取 com.alipay.sdk:alipaysdk-android:15.8.35
    • 本地 AAR:将 alipaySdk-xxx.aar 放入 android/libs/ 后优先使用,详见 支付宝 Android SDK

结果状态码

状态码 含义
9000 成功
8000 处理中
6001 用户取消
6002 网络错误
4000 支付失败

测试与 Mock

业务代码只需导入 package:alipay_payment/alipay_payment.dart 使用 AlipayPaymentPlatform.instance
单元测试如需 mock 平台实现,实现 AlipayPaymentPlatform 并替换实例:

import 'package:alipay_payment/alipay_payment.dart';

// 实现 MockAlipayPaymentPlatform 继承 AlipayPaymentPlatform
// 测试前:AlipayPaymentPlatform.instance = mockPlatform;
// 测试后:AlipayPaymentPlatform.instance = 原实例;

注意事项

  1. 安全性:生产环境强烈建议由服务端生成并签名订单,使用 pay/auth 传入已签名字符串。unsafePay/unsafeAuth 仅在客户端签名,私钥存在泄露风险,仅适合开发测试或与 alipay_kit 平替迁移
  2. iOS URL Scheme:格式通常为 alipay${AppID},不能为纯数字
  3. 测试:开发阶段使用 AlipayEnvironment.sandbox 沙箱环境

Libraries

alipay_payment
支付宝支付插件