简体   繁体   English

如何在 iOS 应用中集成 Atom 支付网关?

[英]How to integrate Atom payment gateway in iOS app?

I am new to static library with extension.a, I am trying to impliment atom tech payment gateway to an iOS app.我是带有 extension.a 的静态库的新手,我正在尝试将原子技术支付网关植入 iOS 应用程序。 They provide 2 files 1.libAtomPayLib(Live).a 2.libAtomPayLib(UAT).a And a very brief documentation他们提供了 2 个文件 1.libAtomPayLib(Live).a 2.libAtomPayLib(UAT).a 和一个非常简短的文档

As per their documentation I have added.a files to project, "added other link flag" "$(OTHER_LDFLAGS) -ObjC".根据他们的文档,我添加了一个文件到项目中,“添加了其他链接标志”“$(OTHER_LDFLAGS) -ObjC”。

There is one point in the documentation which I didn't understand文档中有一点我不明白

Add Bundle ”resourcesLib” in Build Phases selecting your project target(Copy Bundle Resources).在构建阶段中添加 Bundle “resourcesLib” 选择您的项目目标(复制 Bundle Resources)。

The following code is from documentation以下代码来自文档

    #import <UIKit/UIKit.h>
#import "nb.h"
#import "card.h"
#import "NSString+DES.h"
#import "NSData+DES.h"

@interface ViewController : UIViewController <NSXMLParserDelegate,nbDelegate,cardDelegate>
{
NSXMLParser *parser;
}
@property (weak, nonatomic) IBOutlet UIButton *InitiateRequest;
@property (nonatomic,retain) NSXMLParser *parser;

-(IBAction)callVC:(id)sender;//Call for all transaction


@end

I tried to use this code in a viewcontroller.h file, but i am getting error "nb.h not found" I guess these headers are from the library, if it is linked with the project properly nb.h will available everywhere.我试图在 viewcontroller.h 文件中使用此代码,但出现错误“找不到 nb.h” 我猜这些标头来自库,如果它与项目正确链接 nb.h 将随处可用。 I am also adding the documentation details我还添加了文档详细信息

ATOM Mobile SDK Integration ATOM 移动 SDK 集成

The Atom mobile integration is designed to enable you to process payments through mobile applications. Atom 移动集成旨在使您能够通过移动应用程序处理付款。

Integration Type:- Non-Seamless:集成类型:- 非无缝:

Setup设置

•   Create new Group in your project hierarch & add all the files from “payAtom” in it.
•   Select your Project from Left Panel
•   Go to targets tab & select the application
•   Go to Build Setting & select Basic & Combined Tabs
•   Add the following property as shown below

If you cannot find “Other Linker Flags” then you can do these steps below如果找不到“Other Linker Flags”,则可以执行以下这些步骤

•   Select the project file from the project navigator on the far left side of the window.

•   Select the target for where you want to add the linker flag.

•   Select the "Build Settings" tab

•   Choose "All" to show all Build Settings.

•   Scroll down to the "Linking" section, and double-click to the right of where it says "Other Linking Flags".
•   A box will appear, Click on the "+" button to add a new linker flag.

•   Type "$(OTHER_LDFLAGS) -ObjC" (no quotes) and press enter.





•   Add Bundle ”resourcesLib” in Build Phases selecting your project target(Copy Bundle Resources).

Integration:一体化:

•   Merchant will design a screen wherein he will accept all the required fields including the bank detail, payment options and card details.
•   Pass the data to Library as follows in the same format:

ViewController.h File ViewController.h文件

#import <UIKit/UIKit.h>
#import "nb.h"
#import "card.h"
#import "NSString+DES.h"
#import "NSData+DES.h"

@interface ViewController : UIViewController <NSXMLParserDelegate,nbDelegate,cardDelegate>
{
NSXMLParser *parser;
}
@property (weak, nonatomic) IBOutlet UIButton *InitiateRequest;
@property (nonatomic,retain) NSXMLParser *parser;

-(IBAction)callVC:(id)sender;//Call for all transaction


@end

ViewController.m File ViewController.m 文件

#import "ViewController.h"
#import "nb.h"
#import "card.h"


@interface ViewController ()

@end

@implementation ViewController
@synthesize parser;
    •   (void)viewDidLoad { [super viewDidLoad];
}

    •   (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}






-(IBAction)callVC:(id)sender
{

nb *netB = [[nb alloc] init]; netB.myDelegate = self; netB.loginid=@"459"; netB.txnscamt=@"0"; netB.loginid=@"459"; netB.password=@"Test@123"; netB.prodid=@"NSE"; netB.txncurr=@"INR"; netB.clientcode=@"001"; netB.custacc=@"100000036600"; netB.amt=@"100.000"; netB.txnid=@"9Q6";//unique each time
netB.date=@"23/08/2010%2011:57:00";//unique each time netB.bankid=@"2001"; netB.ru=@"https://paynetzuat.atomtech.in/paynetz/param"; [self presentViewController:netB animated:YES completion:nil];
}


-(void)secondviewcontrollerDissmissed:(NSString *)stringToFirst
{
NSString *getResult; getResult = stringToFirst;
NSLog(@"received---->%@",getResult); //This will return status success or Fail of Transaction
}

@end

This is an issue with atom payment gateway, they should provide ah file along with.a file, but it is not available in the downloaded files.这是atom支付网关的问题,他们应该提供ah文件和.a文件,但下载的文件中没有。 So I used an alternative solution using web view to integrate atom payment gateway.因此,我使用了另一种解决方案,即使用 Web 视图来集成 Atom 支付网关。 I have created a class for get payment url.我创建了一个用于获取付款网址的类。 This method uses the web payment gateway used in the web site for the same project.此方法使用同一项目网站中使用的网络支付网关。

import Foundation
import Alamofire
import SwiftyXMLParser

class PaymentData {

    var totalPrice:String
    var taxId:String
    var userName:String
    var email:String
    var mobile:String
    var userId:String
    var currentDateTimeString:String
    init(totalPrice:String) {

        let time = Date().timeIntervalSince1970
        let taxId = "WVC"+String(time)
        let userId = UserDefaults.standard.string(forKey: "UserId")
        let name = UserDefaults.standard.string(forKey: "full_name")
        let phone = UserDefaults.standard.string(forKey: "phone")
        let email = UserDefaults.standard.string(forKey: "email")

        self.totalPrice = totalPrice
        self.taxId = taxId
        self.userId = userId!
        self.email = email!
        self.mobile = phone!
        self.userName = name!
        self.currentDateTimeString = NSDate().getStringWith(format: "dd/MM/yyyy")!

    }

    func getVenderUrl()->String{
        // Create vender url using user details
        var vVenderURL:String = "https://payment.atomtech.in/paynetz/epi/fts?login=test&pass=test@123&ttype=NBFundTransfer&prodid=test&amt=" + "\(totalPrice)"+"&txncurr=INR&txnscamt=0&ru=https://www.test.in/payment-success&clientcode=lisas00940&txnid="+"\(taxId)"+"&date="+"\(currentDateTimeString)"+"&udf1="+"\(userName)"+"&udf2="+"\(email)"+"&udf3="+"\(mobile)"+"&udf4=Bangalore&custacc="+"\(userId)"+"";

        vVenderURL = vVenderURL.replacingOccurrences(of: " ", with: "%20")
        print(vVenderURL)
        return vVenderURL

    }

    func getRedirectUrl(callBack:@escaping (URL)->Void){
        // get url to load in webview
        var xmlURL:String = ""
        var xmlttype:String = ""
        var xmltoken:String = ""
        var xmltempTxnId:String = ""
        var xmltxnStage:String = ""


        let headers: HTTPHeaders = [
            "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",
            "Accept": "application/json"
        ]

        // Call api for get payment url to load in webview
        Alamofire.request(getVenderUrl(), method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers)
            .responseString { response in

                var statusCode = response.response?.statusCode

                switch response.result {
                case .success:
                   // parsing xml data recieved from response, and extracting element required for generating the payment url
                    if let string = response.result.value {
                        print("XML: \(string)")
                        let xml = try! XML.parse(string)
                       print(xml["MMP","MERCHANT","RESPONSE"])
                        xmlURL = xml["MMP","MERCHANT","RESPONSE","url"].text!
                        let params = xml["MMP","MERCHANT","RESPONSE","param"]


                        for param in params {

                            if (param[0].attributes["name"])  == "ttype" {
                                xmlttype = param.text!
                            }
                            if (param[0].attributes["name"])  == "tempTxnId" {
                                xmltempTxnId = param.text!
                            }
                            if (param[0].attributes["name"])  == "token" {
                                xmltoken = param.text!
                            }
                            if (param[0].attributes["name"])  == "txnStage" {
                                xmltxnStage = param.text!
                            }

                        }

                        // creating payment url from extracted data
                        var  Atom2Request:String = "\(xmlURL)" + "?ttype=" + "\(xmlttype)" + "&tempTxnId=" + "\(xmltempTxnId)" + "&token=" + "\(xmltoken)" + "&txnStage=" + "\(xmltxnStage)";
                        Atom2Request = Atom2Request.replacingOccurrences(of: " ", with: "%20") //(" ", "%20");
                        print("ATOM 2nd Request URl" + "\(Atom2Request)")
                        callBack(URL.init(string: Atom2Request)!)


                    }
                case .failure(let error):
                    statusCode = error._code // statusCode private
                    print("status code is: \(String(describing: statusCode))")
                    print(error)
                }
        }

    }
}

This class helps to create data for generating url for atom payment gateway, next step is to load this url to a web view此类有助于创建用于为原子支付网关生成 url 的数据,下一步是将此 url 加载到 web 视图

Create a view controller and add web view in it, and add the following code创建一个view controller并在其中添加web view,并添加如下代码

@IBOutlet weak var paymentWebView: UIWebView!
    var paymentAmount:String?
    override func viewDidLoad() {

        super.viewDidLoad()
        self.title = "Payment Gateway"
        if paymentAmount != nil {

            let paymentData = PaymentData.init(totalPrice: paymentAmount!)
            paymentData.getRedirectUrl(callBack:{ url in

                let request = URLRequest(url: url)
                self.paymentWebView.loadRequest(request)


            })

        }

    }

Implementing Atom Payment Gateway In Swift Is Just Easy..在 Swift 中实现 Atom 支付网关非常简单……

Just follow the simple steps.只需按照简单的步骤操作。

  1. Download the SDK from the below link.从以下链接下载 SDK。 https://www.atomtech.in/help-resource/payment-gateway-integration-kits https://www.atomtech.in/help-resource/payment-gateway-integration-kits

  2. Unzip the file.解压缩文件。

  3. Run the 'testSample.xcodeproj' in Xcode in iOS device.在 iOS 设备的 Xcode 中运行“testSample.xcodeproj”。 Don't worry the code is in Objective C.不用担心代码在 Objective C 中。

  4. Create your own Swift project.创建您自己的 Swift 项目。

  5. Inside your project create a folder 'include'.在您的项目中创建一个文件夹“include”。 Create another nested folder 'AtomPayLib' under 'include' folder.在“include”文件夹下创建另一个嵌套文件夹“AtomPayLib”。

  6. Drag all the header files (.h) including 'resourceLib.bundle' from the testSample project to your project folder 'AtomPayLib'.将所有头文件 (.h) 包括“resourceLib.bundle”从 testSample 项目拖到您的项目文件夹“AtomPayLib”。 Don't forget to check the tick box for your Target.不要忘记选中目标的复选框。

  7. Just create any Objective C ViewController class to you project.只需为您的项目创建任何 Objective C ViewController 类。 Xcode will ask you to add Bridging Header to your project. Xcode 会要求您将 Bridging Header 添加到您的项目中。 Choose Yes.选择是。 After the Bridging header added delete the newly created Objective class.添加 Bridging 标头后,删除新创建的 Objective 类。

  8. Add the below two lines inside your Bridging Header.在桥接标头中添加以下两行。 #import "nb.h" #import "card.h" #import "nb.h" #import "card.h"

  9. Inside your 'AtomPay' button which you can take wherever you like in your project write the below code.在您的“AtomPay”按钮内,您可以在项目中的任何地方编写以下代码。 The delegate method is also written just below it.委托方法也写在它的正下方。 Don't forget to add the method.不要忘记添加方法。 Also add the conformance 'nbDelegate' to your ViewController class.还将一致性“nbDelegate”添加到您的 ViewController 类。

     //MARK: Atom Payment @IBAction func atomPay(_ sender: Any) { var netB = nb() netB.discriminator = "All" netB.myDelegate = self netB.merchantId = "197" netB.txnscamt = "0" netB.loginid = "197" netB.password = "Test@123" netB.txncurr = "INR" netB.clientcode="007" netB.custacc="100000036600" netB.amt = "100.00" netB.txnid = "013"; netB.date = "23/08/2019 11:57:00" netB.bankid = "2001" netB.signatureRequest = "KEY123657234" netB.signatureResponse = "KEYRESP123657234" netB.prodid = "NSE" netB.isLive = false netB.ru = "https://paynetzuat.atomtech.in/mobilesdk/param" // netB.customerName = "ABC"; // netB.customerEmailID = "abc@gmail.com"; // netB.customerMobileNo = "5555555555"; // netB.billingAddress = "Kolkata"; // netB.optionalUdf9 = "Peter"; self.present(netB, animated: true) { print("Completed...") }

    } }

     func secondviewcontrollerDissmissed(_ stringForFirst: String,: withResponseKeys ResponseKeyArray, NSMutableArray:, andResponseValues ResponseValueArray. NSMutableArray.) { print("received---->%@".stringForFirst.) let deadlineTime = DispatchTime:now() + .seconds(5) DispatchQueue.main.asyncAfter(deadline: deadlineTime) { print("test") //code to be executed on the main queue after delay }

    } }

  10. Run your app in your iOS device.在您的 iOS 设备上运行您的应用程序。

Cheers!干杯!

Usually a static library (like libAtomPayLib.a) contains just code, but not UI resources (like images, sounds, fonts, config files etc.).通常静态库(如 libAtomPayLib.a)只包含代码,而不包含 UI 资源(如图像、声音、字体、配置文件等)。 One way to solve it is to provide a resource bundle.解决它的一种方法是提供资源包。 A bundle is actually a directory containing various file inside, but on macOS (with programs like Finder) it looks like a single file (for example resourcesLib.bundle ). bundle 实际上是一个包含各种文件的目录,但在 macOS 上(使用 Finder 等程序)它看起来像一个文件(例如resourcesLib.bundle )。 If you just add such file to your project Xcode (by default) will actually add it to your "copy bundle resources" phase.如果您只是将此类文件添加到您的项目中,Xcode(默认情况下)实际上会将其添加到您的“复制捆绑资源”阶段。 You can check that by going to TARGETS, select your target, open "Build Phases", and expanding "Copy Bundle Resources".您可以通过转到 TARGETS、选择您的目标、打开“Build Phases”并展开“Copy Bundle Resources”来检查这一点。

代码截图

After you have built your app you can actually make sure that the bundle was copied by expanding "Products" group, right-click your Example.app "Show in Finder", then right click that file and "Show Package Contents".构建应用程序后,您实际上可以通过展开“产品”组来确保捆绑包已被复制,右键单击您的 Example.app“在 Finder 中显示”,然后右键单击该文件并“显示包内容”。 You should see what files are copied inside your app, including the resources bundle.您应该看到在您的应用程序中复制了哪些文件,包括资源包。

If you add some "test.a" static library file to your project the default Xcode behaviour is to add it to "Linked Frameworks and Libraries" list.如果您将一些“test.a”静态库文件添加到您的项目中,默认的 Xcode 行为是将其添加到“链接的框架和库”列表中。 You can verify it by going to TARGETS, select your target, open "General" and scroll down to "Linked Frameworks and Libraries".您可以通过转到目标来验证它,选择您的目标,打开“常规”并向下滚动到“链接的框架和库”。

代码截图 2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM