GateOpenPaySDK 是一个为 iOS 应用提供加密货币支付功能的 SDK。它支持多种支付方式,包括Gate支付、钱包连接、扫码支付,并提供了完整的支付流程管理。
需要到Gate开发者中心申请对应的ClientId、Scheme等 官方开发者中心
💡 Demo 参考:完整接入示例请参考 GitHub Demo 工程
- iOS 13.0 或更高版本
- Swift 5.9 或更高版本
- Xcode 12.0 或更高版本
- 在项目的
Podfile中添加:
platform :ios, '13.0'
use_frameworks!
target 'YourApp' do
pod 'GateOpenPaySDK', :git => 'https://github.com/gate/gatepay-sdk-ios', :tag => '2.0.0'
endps: 最好指定版本
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
end
end
end- 执行安装命令:
pod install- 在 Xcode 中,选择
File>Add Packages... - 输入仓库地址:
https://github.com/gate/gatepay-sdk-ios - 选择版本或分支
- 点击
Add Package
或者在 Package.swift 中添加依赖:
dependencies: [
.package(url: "https://github.com/gate/gatepay-sdk-ios", from: "2.0.0")
]- 解压之后将
GateOpenPaySDK.xcframework直接拖到项目之中
在项目的 Info.plist 文件中添加以下配置:
添加自定义 URL Scheme 用于支付回调,示例:gatepay73967e614a9fd5e3
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>gatepay[您的ClientID转义]</string>
</array>
<key>CFBundleTypeRole</key>
<string>Editor</string>
</dict>
</array>添加需要查询的第三方应用(如下示例,添加你希望用来支付的钱包) URL Schemes: "gatePay"是打开Gate App支付的必要设置
<key>LSApplicationQueriesSchemes</key>
<array>
<string>metamask</string>
<string>trust</string>
<string>uniswap</string>
<string>gatepay</string>
<string>okxwallet</string>
</array>在Info.plist文件添加必要的网络许可
- 在 Build Settings 中添加 OTHER_LDFLAGS = "-ObjC"
- 在 General中标记包为
Embed & Sign
在需要使用 SDK 的文件中导入:
import GateOpenPaySDK在应用启动时(通常在 AppDelegate 或首次使用前)注册 SDK:
import GateOpenPaySDK
// 在 AppDelegate 的 didFinishLaunchingWithOptions 中
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 注册 SDK
GatePaySDK.shared.regist(isDebug: true, clientId: "您的ClientID")
// 设置主题和语言
GatePaySDK.shared.setCurrentMode(isDarkMode: false, language: "zh-Hans")
return true
}参数说明:
isDebug: 是否为调试模式,生产环境请设置为falseclientId: Gate.io 提供的商户 ID
在发起支付前,需要先通过您的后端服务创建支付订单:
// 订单参数
let amount = "9.9" // 支付金额
let currency = "USDT" // 币种
let chain = "ETH" // 支付链
let payCurrency = "USDT" // 支付币种
// 调用您的后端接口创建订单
// 这里需要您自己实现与后端的通信
createOrder(amount: amount, currency: currency, chain: chain, payCurrency: payCurrency) { prepayId in
// 获取到 prepayId 后进行下一步
self.generateSignature(prepayId: prepayId)
}📖 服务端对接:服务端如何生成签名及对接 API,请参考 GatePay 服务端文档
获取订单 ID 后,需要通过您的后端服务生成支付签名:
func generateSignature(prepayId: String) {
// 调用您的后端接口生成签名
// 后端需要返回以下参数:
// - timestamp: 时间戳
// - nonce: 随机字符串
// - signature: 签名
requestSignature(prepayId: prepayId) { timestamp, nonce, signature in
self.startPayment(
prepayId: prepayId,
timestamp: timestamp,
nonce: nonce,
signature: signature
)
}
}获取签名后,调用 SDK 发起支付:
func startPayment(prepayId: String, timestamp: String, nonce: String, signature: String) {
// 构建支付参数
let payParams = GatePaySDKParams(
apiKey: "您的ClientID",
prepayId: prepayId,
timestamp: timestamp,
nonce: nonce,
signature: signature,
returnUri: "gatepay[您的ClientID转义]"
)
// 发起支付
guard let navigationController = self.navigationController else { return }
GatePaySDK.shared.pushGateOpenPay(navigationController, payModel: payParams) { result in
// 支付结果回调
if result.isSuccess {
print("支付成功: \(result.message)")
// 处理支付成功逻辑
} else {
print("支付失败: \(result.message)")
// 处理支付失败逻辑
}
}
}SDK 支持明亮模式和暗黑模式:
// 设置为暗黑模式
GatePaySDK.shared.setCurrentMode(isDarkMode: true, language: .en)
// 设置为明亮模式
GatePaySDK.shared.setCurrentMode(isDarkMode: false, language: .en)SDK 支持中文/英文/其他小语种:
// 设置为中文
GatePaySDK.shared.setCurrentMode(isDarkMode: false, language: .cn)
// 设置为英文
GatePaySDK.shared.setCurrentMode(isDarkMode: false, language: .en)| 代码 | 语言 | 代码 | 语言 |
|---|---|---|---|
zh-Hans |
简体中文 | ja |
日语 |
tw |
繁体中文 | ko |
韩语 |
en |
英语 | vi |
越南语 |
in |
印尼语 | th |
泰语 |
es |
西班牙语 | fr |
法语 |
de |
德语 | it |
意大利语 |
pt |
葡萄牙语 | br |
巴西葡萄牙语 |
ru |
俄语 | ar |
阿拉伯语 |
tr |
土耳其语 | uk |
乌克兰语 |
SDK 支持自定义界面颜色,包括文字颜色、按钮颜色等:
// 定义明亮和暗黑模式下的颜色(特定的一些文案颜色如“Gate”、“Gate APP”)
let textColor: GatePayColorTuple = (
lightColor: .black,
darkColor: .white
)
let button1Color: [GatePayColorTuple] = [
(lightColor: .white, darkColor: .black), // 文字颜色
(lightColor: .blue, darkColor: .darkGray) // 背景颜色
]
let button2Color: [GatePayColorTuple] = [
(lightColor: .blue, darkColor: .white), // 文字颜色
(lightColor: .white, darkColor: .gray) // 背景颜色
]
// 应用自定义颜色
GatePaySDK.shared.setCurrentMode(
isDarkMode: false,
language: "zh-Hans",
textColor: textColor,
topButtonColor: button1Color,
botButtonColor: button2Color
)
GatePaySDK.shared.topButtonColor = button1Color
GatePaySDK.shared.botButtonColor = button2Color也可以单独设置某个颜色:
// 设置推荐标识颜色
GatePaySDK.shared.recommondColor = (
lightColor: .systemBlue,
darkColor: .systemIndigo
)
// 设置特定文案颜色
GatePaySDK.shared.textColor = (
lightColor: .black,
darkColor: .white
)
// 设置进度图标颜色
GatePaySDK.shared.iconColor = (
lightColor: .gray,
darkColor: .lightGray
)SDK 提供了钱包连接功能,支持通过 WalletConnect 协议连接第三方钱包。
在使用钱包连接功能前,需要先配置 WalletConnect 参数:
GatePaySDK.shared.setWalletConnect(
groupId: "group.com.yourapp.shared",
projectName: "您的应用名称",
projectIcon: "https://gate.io/favicon.ico" #您的应用icon
)-
groupId (String, 必填)
- 说明:App Group 标识符
- 用途:用于在主应用和扩展之间共享数据
- 格式:
group.com.yourcompany.yourapp.shared - 示例:
"group.com.example.myapp.shared" - 注意:需要在 Xcode 的 Capabilities 中启用 App Groups 并配置相同的标识符
-
projectName (String, 必填)
- 说明:您的应用名称
- 用途:在钱包连接时显示给用户
- 示例:
"我的支付应用"
-
projectIcon (String, 可选)
- 说明:应用的Icon,如果不传展示默认图标
- 用途:用于钱包链接的显示
- 格式:url
- 示例:
"https://gate.io/favicon.ico"
import GateOpenPaySDK
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 1. 注册 SDK
GatePaySDK.shared.regist(isDebug: true, clientId: "您的ClientID")
// 2. 配置 WalletConnect
GatePaySDK.shared.setWalletConnect(
groupId: "group.com.example.myapp.shared", // 您的 App Group ID
projectName: "我的应用", // 您的应用名称
projectIcon: "" // 您的 URL Scheme
)
// 3. 设置主题和语言
GatePaySDK.shared.setCurrentMode(isDarkMode: false, language: "zh-Hans")
return true
}
}-
App Groups 配置:
- 在 Xcode 中,选择项目 Target
- 进入 Signing & Capabilities
- 添加 App Groups capability
- 配置与代码中相同的 Group ID
-
URL Scheme 配置:
- 确保
nativeUri参数与 Info.plist 中的 URL Scheme 配置一致 - 建议使用唯一的 URL Scheme,避免与其他应用冲突
- 确保
-
初始化时机:
- 建议在应用启动时(
didFinishLaunchingWithOptions)就配置 WalletConnect - 确保在使用钱包连接功能前完成配置
- 建议在应用启动时(
主要的 SDK 开放属性
shared: 单例实例isDarkMode: 当前是否为暗黑模式language: 当前语言设置textColor: 特定文字颜色recommondColor: 推荐标识颜色iconColor: 图标颜色topButtonColor: 顶部按钮颜色(文字和背景)botButtonColor: 底部按钮颜色(文字和背景)isWalletConnected: 钱包是否已连接currentWalletAccount: 当前连接的钱包账户orderEndAction: 订单完成按钮点击回调orderDetailAction: 订单详情按钮点击回调contactAction: 联系客服按钮点击回调
注册 SDK。
func regist(isDebug: Bool, clientId: String)参数:
isDebug: 是否为调试模式clientId: 商户 ID
打开支付收银台。
func pushGateOpenPay(
_ nav: UINavigationController,
payModel: GatePaySDKParams,
completion: @escaping GatePayResultBlock
)参数:
nav: 导航控制器payModel: 支付参数completion: 支付结果回调
支付参数模型。
public struct GatePaySDKParams {
let apiKey: String // 商户 API Key
let prepayId: String // 预订单 ID
let orderDetailUrl: String? // 订单详情 URL(可选)
let orderUrlEnd: String? // 订单完成 URL(可选)
let contactUrl: String? // 联系客服 URL(可选)
let returnUri: String? // 返回 App 的 URL Scheme(可选)
let timestamp: String // 时间戳
let nonce: String // 随机字符串
let signature: String // 签名
}-
apiKey (String)
- 说明:Gate.io 提供的商户 API Key / Client ID
- 用途:用于身份验证和订单关联
- 示例:
"mZ96D37oKk-xxxx"
-
prepayId (String)
- 说明:预订单 ID,由您的后端服务调用 Gate.io API 创建订单后返回
- 用途:唯一标识本次支付订单
- 示例:
"35519171252060239"
-
timestamp (String)
- 说明:签名时使用的时间戳(秒级)
- 用途:用于签名验证,防止重放攻击
- 示例:
"1704067200456" - 注意:必须与后端生成签名时使用的时间戳一致
-
nonce (String)
- 说明:随机字符串
- 用途:用于签名验证,增加签名的唯一性
- 示例:
"abc123def456" - 注意:必须与后端生成签名时使用的 nonce 一致
-
signature (String)
- 说明:后端生成的签名字符串
- 用途:验证请求的合法性和完整性
- 示例:
"a1b2c3d4e5f6..." - 注意:签名必须在服务端生成,不要在客户端生成
-
orderDetailUrl (String?, 可选)
- 说明:订单详情页的 Deep Link URL
- 用途:当用户在支付页面点击"查看订单详情"时,SDK 会尝试打开此 URL
- 示例:
"yourapp://order/detail?orderId=123456" - 默认行为:如果不设置此参数,且未设置
GateOpenPaySDK.shared.orderDetailAction,点击"查看订单详情"按钮将直接返回到入口页面
-
orderUrlEnd (String?, 可选)
- 说明:订单完成后的 Deep Link URL
- 用途:当支付完成后,用户点击"完成"按钮时,SDK 会尝试打开此 URL
- 示例:
"yourapp://order/complete?orderId=123456" - 默认行为:如果不设置此参数,且未设置
GateOpenPaySDK.shared.orderEndAction,点击"完成"按钮将直接返回到入口页面
-
contactUrl (String?, 可选)
- 说明:联系客服页面的 Deep Link URL
- 用途:当用户在支付页面点击"联系客服"时,SDK 会尝试打开此 URL
- 示例:
"yourapp://customer/service"或"yourapp://support?from=payment" - 默认行为:如果不设置此参数,且未设置
GateOpenPaySDK.shared.contactAction,点击"联系客服"按钮将直接返回到入口页面
-
returnUri (String?, 可选)
- 说明:支付完成后返回 App 的 URL Scheme
- 用途:用于从第三方钱包应用返回到您的 App
- 示例:
"gatepay73967e614a9fd5e3"或"yourapp://" - 格式:通常使用
gatepay[您的ClientID转义]格式 - 注意:必须与 Info.plist 中配置的 CFBundleURLSchemes 一致
SDK 提供了两种方式来处理用户在支付流程中的操作:
- 通过 URL 参数:在创建
GatePaySDKParams时传入 Deep Link URL - 通过 Action 回调:在
GateOpenPaySDK.shared中设置回调闭包
优先级:URL 参数 > Action 回调 > 默认行为(返回入口页)
// 方式一:使用 URL 参数
let params = GatePaySDKParams(
apiKey: "your_api_key",
prepayId: "order_123",
timestamp: "1704067200",
nonce: "abc123",
signature: "signature_string",
orderDetailUrl: "yourapp://order/detail?orderId=123" // 设置订单详情 URL
)
// 方式二:使用 Action 回调
GatePaySDK.shared.orderDetailAction = {
// 自定义处理逻辑
print("用户点击了查看订单详情")
// 跳转到订单详情页
// navigationController?.pushViewController(orderDetailVC, animated: true)
}
// 如果两者都不设置,点击"查看订单详情"将返回入口页// 方式一:使用 URL 参数
let params = GatePaySDKParams(
apiKey: "your_api_key",
prepayId: "order_123",
timestamp: "1704067200",
nonce: "abc123",
signature: "signature_string",
orderUrlEnd: "yourapp://order/complete?orderId=123" // 设置订单完成 URL
)
// 方式二:使用 Action 回调
GatePaySDK.shared.orderEndAction = {
// 自定义处理逻辑
print("用户点击了完成按钮")
// 跳转到订单完成页或首页
// navigationController?.popToRootViewController(animated: true)
}
// 如果两者都不设置,点击"完成"将返回入口页// 方式一:使用 URL 参数
let params = GatePaySDKParams(
apiKey: "your_api_key",
prepayId: "order_123",
timestamp: "1704067200",
nonce: "abc123",
signature: "signature_string",
contactUrl: "yourapp://customer/service" // 设置客服 URL
)
// 方式二:使用 Action 回调
GatePaySDK.shared.contactAction = {
// 自定义处理逻辑
print("用户点击了联系客服")
// 打开客服页面或拨打客服电话
// openCustomerService()
}
// 如果两者都不设置,点击"联系客服"将返回入口页- 推荐使用 Action 回调:更灵活,可以在运行时动态修改行为
- URL 参数适用于固定跳转:如果跳转目标是固定的页面,使用 URL 参数更简洁
- 混合使用:可以同时设置 URL 参数和 Action 回调,URL 参数会优先生效
- 清理 Action:在不需要时记得清空 Action 回调,避免内存泄漏
// 清理 Action 回调
GatePaySDK.shared.orderDetailAction = nil
GatePaySDK.shared.orderEndAction = nil
GatePaySDK.shared.contactAction = nil支付结果模型。
public struct GatePayResponseModel {
public let isSuccess: Bool // 是否支付成功
public let message: String // 结果消息
}颜色元组类型,用于定义明亮和暗黑模式下的颜色。
public typealias GatePayColorTuple = (lightColor: UIColor, darkColor: UIColor)-
URL Scheme:
- 确保
returnUri与 Info.plist 中配置的 URL Scheme 一致 - URL Scheme 格式:
gatepay[您的ClientID转义]
- 确保
-
错误处理:
- 始终处理支付回调中的错误情况
- 建议在支付前检查网络连接状态
A: 请到 Gate官网申请,或者请联系 Gate 商务团队申请商户账号,获取 clientId 和相关配置信息。
A: 检查以下几点:
- Info.plist 中的 URL Scheme 配置是否正确
returnUri参数是否与 URL Scheme 一致- 是否正确实现了 URL Scheme 的处理逻辑
A: SDK 支持钱包连接支付、扫码支付等多种方式,具体支持的支付方式取决于您的商户配置。
如有问题,请联系:
- 支持钱包连接
- 支持扫码转账
- 支持主题和语言切换
- 支持自定义颜色配置
- 初始版本发布
- 支持基础支付功能