支付宝是否提供可直接使用的 Unity 支付 package 包?
结论
支付宝通常不提供可直接导入 Unity 并完成支付接入的官方 .unitypackage。Unity 游戏需要分别集成支付宝 Android SDK 和 iOS SDK,再通过 Unity 原生插件调用。
第三方渠道提供的所谓“支付宝 Unity package”在技术上或许可以导入,但这类插件通常只是对原生 SDK 的二次封装,不能据此认定为支付宝官方组件。未经审核,不建议直接用于正式项目。
实际可用的支付能力取决于商户签约的支付宝产品、游戏发行渠道和目标平台,请以支付宝开放平台当前的产品文档及商户后台提供的下载内容为准。
推荐接入方式
客户端的调用链通常是:
Unity
→ C# 支付接口
→ Android/iOS 原生桥接层
→ 支付宝客户端 SDK
→ 支付宝 App
→ 返回同步结果
服务端则需要完成:
创建业务订单
→ 生成支付宝支付请求
→ 签名
→ 接收异步通知
→ 验签
→ 更新订单状态
可以按以下步骤接入:
- 在支付宝开放平台创建应用,并完成所需产品的签约。
- 在服务端保存应用私钥、支付宝公钥等敏感配置。
- 由服务端创建业务订单,生成已签名的
orderInfo。 - 在 Android 项目中集成支付宝 Android SDK。
- 在 iOS 项目中集成支付宝 iOS SDK,并配置 URL Scheme 等参数。
- 分别为两个平台编写 Unity 原生桥接代码。
- Unity 调用桥接接口,将同步结果用于界面提示。
- 服务端接收支付宝异步通知,验签后确认最终支付状态。
Android 调用示例
支付宝 Android SDK 通常通过 PayTask 发起支付。Unity 可以使用 AndroidJavaObject 调用 Java API:
using UnityEngine;
public static class AlipayAndroid
{
public static void Pay(string orderInfo)
{
#if UNITY_ANDROID && !UNITY_EDITOR
using (var unityPlayer =
new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using (var activity =
unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
using (var payTask =
new AndroidJavaObject("com.alipay.sdk.app.PayTask", activity))
{
payTask.Call<AndroidJavaObject>("pay", orderInfo, true);
}
#endif
}
}
实际项目中不应直接忽略 pay 的返回值。更稳妥的方式是在 Java 或 Kotlin 插件中调用 SDK 并解析结果,再通过 UnityPlayer.UnitySendMessage 或自定义回调通知 Unity。
例如:
import com.alipay.sdk.app.PayTask;
import com.unity3d.player.UnityPlayer;
import java.util.Map;
public final class AlipayBridge {
public static void pay(
final String orderInfo,
final String gameObjectName,
final String callbackMethod) {
new Thread(() -> {
PayTask payTask =
new PayTask(UnityPlayer.currentActivity);
Map<String, String> result =
payTask.payV2(orderInfo, true);
UnityPlayer.UnitySendMessage(
gameObjectName,
callbackMethod,
result.toString()
);
}).start();
}
}
这段代码只用于说明桥接方式。究竟调用 pay 还是 payV2,以及如何处理返回字段,应以项目实际使用的支付宝 SDK 文档为准。
iOS 调用示例
iOS 端通常使用 Objective-C 或 Objective-C++ 封装一个 C 接口:
#import <AlipaySDK/AlipaySDK.h>
extern "C" void AlipayPay(
const char *orderInfo,
const char *scheme)
{
NSString *order =
[NSString stringWithUTF8String:orderInfo];
NSString *appScheme =
[NSString stringWithUTF8String:scheme];
[[AlipaySDK defaultService]
payOrder:order
fromScheme:appScheme
callback:^(NSDictionary *resultDic) {
NSLog(@"Alipay result: %@", resultDic);
}];
}
Unity C# 端通过 DllImport 调用:
using System.Runtime.InteropServices;
public static class AlipayIOS
{
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern void AlipayPay(
string orderInfo,
string scheme);
#endif
public static void Pay(string orderInfo, string scheme)
{
#if UNITY_IOS && !UNITY_EDITOR
AlipayPay(orderInfo, scheme);
#endif
}
}
生产环境还要处理支付回跳、URL Scheme、回调数据传递和 Unity 生命周期等问题。AppDelegate 或 UnityAppController 的具体扩展方式,需要根据当前 Unity 导出的 Xcode 工程结构及支付宝 iOS SDK 接入文档确定。
为什么不能只导入一个 package 就完成接入
支付接入并不只是从 Unity 客户端调用一个接口,还包括:
- 支付宝开放平台的应用配置
- Android 和 iOS 原生依赖
- 应用签名、包名或 Bundle Identifier
- iOS URL Scheme 和支付回跳
- 服务端创建订单及签名
- 支付宝异步通知验签
- 订单重复通知、超时和异常处理
- 不同 Unity、Gradle、CocoaPods 与原生 SDK 版本之间的兼容性
即使拿到 .unitypackage,它也只能省去部分桥接代码,无法替代平台配置和服务端接入。
注意事项
不要将支付宝应用私钥保存在 Unity 客户端,也不要由客户端生成正式支付签名。Unity 构建产物可以被反编译,私钥泄露后,攻击者可能伪造支付请求。
支付是否成功,应以服务端验签后的支付宝异步通知或服务端主动查询的结果为准。客户端返回结果只能用于更新界面状态,不能直接作为发放商品、增加余额或确认充值到账的依据。
使用第三方 Unity 插件前,需要重点检查:
- 是否明确标注 SDK 的来源和版本
- 是否会修改订单参数或上传支付数据
- 是否包含来源不明的网络请求
- Android Manifest 和 Gradle 配置是否合理
- iOS Framework、URL Scheme 和回调代码是否完整
- 能否随支付宝官方 SDK 一同升级
- 是否支持项目使用的 Unity、Android 和 iOS 版本
如果商户后台或特定行业解决方案确实提供 Unity 插件,应优先从对应的官方渠道下载,并严格按照配套文档接入。仅凭文件名或下载页面中的“支付宝 Unity package”字样,无法判断它是否属于官方 SDK。
备注:内容仅供参考。
