【问题标题】:How to integrate Atom payment gateway in iOS app?如何在 iOS 应用中集成 Atom 支付网关?
【发布时间】:2018-03-23 13:14:53
【问题描述】:

我是扩展名为 .a 的静态库的新手,我正在尝试将 atom 技术支付网关引入 iOS 应用程序。他们提供 2 个文件 1.libAtomPayLib(Live).a 2.libAtomPayLib(UAT).a 还有一个非常简短的文档

根据他们的文档,我已将 .a 文件添加到项目中,“添加了其他链接标志”“$(OTHER_LDFLAGS) -ObjC”。

文档中有一点我不明白

在构建阶段添加捆绑“resourcesLib”,选择您的项目目标(复制捆绑资源)。

以下代码来自文档

    #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.h 文件中使用此代码,但出现错误“nb.h not found” 我猜这些头文件来自库,如果它与项目正确链接,nb.h 将随处可用。我还在添加文档详细信息

ATOM 移动 SDK 集成

Atom 移动集成旨在使您能够通过移动应用程序处理付款。

集成类型:- 非无缝:

设置

•   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

如果您找不到“其他链接器标志”,那么您可以执行以下步骤

•   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).

整合:

•   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 文件

#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 文件

#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

【问题讨论】:

  • 你集成ATOM成功了吗?
  • 你能解释一下这行吗?在你的项目层次结构中创建新组并将“payAtom”中的所有文件添加到其中。我有来自 ATOM 的包文件夹,在这个包里面有多个名为“payAtom”的文件夹,我真的很困惑:(
  • @KhushbuDesai 通过使用网页视图我已经成功集成了 ATOM ,简单地重用了我们网站的支付网关。我必须使用一套程序,我已将其添加到答案部分
  • @KhushbuDesai 我也是这样做的 :-) 没有其他办法,当我正式联系 atom tech 时,他们说他们没有 iOS 开发人员来解决这个问题 :-D跨度>
  • 我得到了同样的回复;)

标签: ios swift static-libraries xcode9


【解决方案1】:

这是 atom 支付网关的问题,他们应该提供 .h 文件和 .a 文件,但在下载的文件中不可用。所以我使用了另一种解决方案,使用 web view 来集成 atom 支付网关。我创建了一个获取付款网址的类。此方法使用网站中用于同一项目的 Web 支付网关。

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)
                }
        }

    }
}

该类帮助创建用于生成 atom 支付网关 url 的数据,下一步是将此 url 加载到 web 视图中

创建一个视图控制器并在其中添加web视图,并添加以下代码

@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)


            })

        }

    }

【讨论】:

    【解决方案2】:

    在 Swift 中实现 Atom 支付网关非常简单..

    只需按照简单的步骤。

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

    2. 解压缩文件。

    3. 在 iOS 设备的 Xcode 中运行“testSample.xcodeproj”。不用担心代码在 Objective C 中。

    4. 创建您自己的 Swift 项目。

    5. 在您的项目中创建一个文件夹“include”。在“include”文件夹下创建另一个嵌套文件夹“AtomPayLib”。

    6. 将包括“resourceLib.bundle”在内的所有头文件 (.h) 从 testSample 项目拖到项目文件夹“AtomPayLib”中。不要忘记选中您的目标的复选框。

    7. 只需为您的项目创建任何Objective C ViewController 类。 Xcode 会要求您将 Bridging Header 添加到您的项目中。选择是。添加 Bridging 标头后删除新创建的 Objective 类。

    8. 在您的桥接头中添加以下两行。 #import "nb.h" #import "card.h"

    9. 在您的“AtomPay”按钮中,您可以在项目中随意使用该按钮,编写以下代码。 委托方法也写在它的下面。不要忘记添加方法。还将一致性“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. 在您的 iOS 设备上运行您的应用。

    干杯!

    【讨论】:

      【解决方案3】:

      通常静态库(如 libAtomPayLib.a)只包含代码,但不包含 UI 资源(如图像、声音、字体、配置文件等)。解决它的一种方法是提供资源包。包实际上是一个目录,其中包含各种文件,但在 macOS(使用 Finder 等程序)上,它看起来像单个文件(例如 resourcesLib.bundle)。如果您只是将此类文件添加到您的项目中,Xcode(默认情况下)实际上会将其添加到您的“复制捆绑资源”阶段。您可以通过转到 TARGETS,选择您的目标,打开“Build Phases”并展开“Copy Bundle Resources”来检查。

      构建应用后,您实际上可以通过展开“产品”组来确保已复制捆绑包,右键单击您的 Example.app“在 Finder 中显示”,然后右键单击该文件并“显示包内容” .您应该会看到在您的应用中复制了哪些文件,包括资源包。

      如果您将一些“test.a”静态库文件添加到您的项目中,默认的 Xcode 行为是将其添加到“链接框架和库”列表中。您可以通过转到 TARGETS 来验证它,选择您的目标,打开“General”并向下滚动到“Linked Frameworks and Libraries”。

      【讨论】:

      • 我仍然很困惑,需要更多关于使用 .a 文件中的“资源包”的说明。我只有一种文件,即:libAtomPayLib.a。如第二部分所述,我可以在“链接的框架和库”中看到该文件,但仍然无法使用该库。
      • ".a" 和 ".bundle" 是两个不同的东西。一个转到“链接的框架和库”,另一个转到“复制捆绑资源”。似乎您找到了您的“.a”,但找不到您的“.bundle”。通常它们来自库作者的同一个包(如 zip 文件)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2012-08-31
      • 2017-01-01
      • 2016-04-09
      相关资源
      最近更新 更多