Gopay Checkout iOS SDK
iOS库,通过Midtrans API启用GoPay结算流程。
SDK安装
手动安装
- 下载此存储库
- 将
GopayCheckoutKit.xcframework
拖到您的Xcode项目中 - 在弹出的菜单中,选择
如有需要则复制项
和创建组
,然后点击完成
- 构建并运行
cocoapods安装
如果您使用cocoapods,请将以下内容添加到您的.podfile
target 'MyApp' do
pod 'GopayCheckoutKit'
end
然后运行pod install
SDK集成
对于Swift,您需要在您的AppDelegate.Swift文件以及您计划使用sdk方法的每个类中导入import GopayCheckoutKit
对于Objective-C,您需要在您的AppDelegate.h文件以及您计划使用sdk方法的每个类中导入import GopayCheckoutKit.h
您还需要设置您的应用程序URL方案,该方案用于让SDK自动返回关闭webview并导航到上一屏幕。例如,您的应用程序URL方案应该是类似于myapp://
的模式,全部小写。要设置应用程序URL方案,有两种方法可供选择:
-
转到
项目设置
>信息
,然后在URL类型
部分添加一个新的URL方案。添加类似于myapp
或您喜欢的任何名称,全部小写。 -
或者,您也可以进入您的
info.plist
文件并粘贴以下代码,您可以用您喜欢的名称重命名myapp
。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
SDK 初始化
SDK初始化可以在您想开始使用SDK方法时进行。在这个例子中,我们将使用AppDelegate在application:didfinishlaunchingwithoptions:
中设置SDK。
从iOS 13开始,Apple引入了SceneDelegate
,因此如果您的应用程序目标包含iOS 13及以上版本,您还需要在SceneDelegate
文件中的openURLContexts:
方法添加handleCallbackUrl
。
重要提示
对于callbackUrl
参数,请使用以下格式的应用程序URL方案myapp://home
,通过在应用程序URL方案中添加home
,如下面的代码所示:
Obj-C
AppDelegate文件
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[GPYClient initWithMerchantServerURL:MERCHANT_SERVER_URL merchantId:MERCHANT_ID callbackUrl:@"myapp://home" isLoggingEnabled:NO];
...
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
[GPYClient handleCallbackUrl:url];
return YES;
}
SceneDelegate文件
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts{
NSURL *url = URLContexts.allObjects.firstObject.URL;
[GPYClient handleCallbackUrl:url];
}
Swift
AppDelegate 文件
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
GPYClient.initWithMerchantServerURL(MERCHANT_SERVER_URL, merchantId: MERCHANT_ID, callbackUrl: "myapp://home", isLoggingEnabled: false)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
GPYClient.handleCallbackUrl(url)
return true
}
SceneDelegate 文件
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
GPYClient.handleCallbackUrl(url)
}
}
链接账户
Objective-C
GPYPartnerDetails *details = [[GPYPartnerDetails alloc]initWithPhoneNumber:@"8212345678" countryCode:@"62"];
[GPYClient linkAccountWithPaymentType:@"gopay" gopayPartnerDetails:details viewController:self completion:^(GPYLinkAccountResult * _Nullable result, NSError * _Nullable error) {
if (result) {
// do something
} else{
NSLog(@"error %@", error);
}
}];
Swift
let partnerDetails = GPYPartnerDetails(phoneNumber: "812345678", countryCode: "62")
GPYClient.linkAccount(withPaymentType: "gopay", gopayPartnerDetails: partnerDetails, viewController: self) { (result, error) in
if (result != nil){
// do something
} else {
// error
}
}
查询账户和支付信息
Objective-C
[GPYClient enquireAccountWithAccountID:ACCOUNT_ID completion:^(GPYAccountInfo * _Nullable result, NSError * _Nullable error) {
if (result) {
// do something
} else{
NSLog(@"error %@", error);
}
}];
Swift
GPYClient.enquireAccount(ACCOUNT_ID) { (result, error) in
if (result != nil) {
//do something
} else {
// error
}
}
禁用/解除账户关联
Objective-C
[GPYClient disableAccountWithAccountID:ACCOUNT_ID completion:^(GPYDisableAccountResult * _Nullable result, NSError * _Nullable error) {
if (result) {
// do something
} else {
NSLog(@"error %@", error);
}
}];
Swift
GPYClient.disableAccount(withAccountID: ACCOUNT_ID) { (result, error) in
if (result != nil){
// do something
} else {
// error
}
}
创建交易
Obj-C
GPYGopayDetails *gopayDetails = [[GPYGopayDetails alloc]initWithAccountID:ACCOUNT_ID paymentOptionToken:PAYMENT_OPTION_TOKEN];
GPYTransactionDetails *transDetails = [[GPYTransactionDetails alloc]initWithGrossAmount:@100 orderID:ORDER_ID currency:@"IDR"];
GPYCustomerDetails *customerDetails = [[GPYCustomerDetails alloc]initWithPhoneNumber:@"08123456789" firstName:@"fauzi" lastName:nil email:nil];
GPYItemDetails *itemDetails = [[GPYItemDetails alloc]initWithIthItemID:@"itemId1" name:@"one piece t-shirt" price:@100 quantity:@1 category:@"clothing"];
[GPYClient createTransactionWithPaymentType:@"gopay" viewController:self gopayDetails:gopayDetails transactionDetails:transDetails customerDetails:customerDetails itemDetails:@[itemDetails] completion:^(GPYTransactionResult * _Nullable result, NSError * _Nullable error) {
if (result) {
// do something
// Transaction status will be set to "Pending", To actually know the latest transaction status, you should hit get transaction API
} else {
NSLog(@"error transaksi %@", error);
}
}];
Swift
let gopayDetais = GPYGopayDetails(accountID: ACCOUNT_ID ?? "", paymentOptionToken: PAYMENT_OPTIONS_TOKEN ?? "")
let transDetails = GPYTransactionDetails(grossAmount: 200, orderID: "abc111", currency: "IDR")
let cusDetails = GPYCustomerDetails(phoneNumber: "088888888", firstName: "fauzi", lastName: "cihuy", email: "[email protected]")
let itemDetails1 = GPYItemDetails(ithItemID: "aabb1", name: "one piece t-shirt", price: 100, quantity: 1, category: "shirts")
let itemDetails2 = GPYItemDetails(ithItemID: "aabb2", name: "one piece pants", price: 100, quantity: 1, category: "pants")
GPYClient.createTransaction(withPaymentType: "gopay", viewController: self, gopayDetails: gopayDetais, transactionDetails: transDetails, customerDetails: cusDetails, itemDetails: [itemDetails1, itemDetails2]) { (result, error) in
if (result != nil) {
// do something
} else {
// error
}
}
Gopay 结账响应处理器
此响应处理器用于帮助处理和应对直接调用伙伴API时遇到的webview。
链接账户
Obj-C
[GPYCheckoutProcessor processAccountLinkingWithResponse:linkingResponse viewController:viewController completion:^(GPYLinkAccountResult * _Nullable result, NSError * _Nullable error) {
if (result) {
//do something
} else{
// error
}
}];
Swift
GPYCheckoutProcessor.processAccountLinking(with: RESPONSE, viewController: self) { (result, error) in
if (result != nil){
// do something
} else {
// error
}
}
创建交易
Obj-C
[GPYCheckoutProcessor processCreateTransactionWithResponse:transactionResponse viewController:viewController completion:^(GPYTransactionResult * _Nullable result, NSError * _Nullable error) {
if (result) {
// do something
} else {
// error
}
}];
Swift
GPYCheckoutProcessor.processCreateTransaction(with: TRANSACTION_RESPONSE, viewController: self) { (result, error) in
if (result != nil){
// do something
} else {
// error
}
}