简体   繁体   English

如何在 Swift 中集成 Paytm 支付网关

[英]How to integrate Paytm payment gateway in Swift

I have checked all the tutorial and also did a lot of R & D on gateway integration.我已经检查了所有的教程,并且在网关集成方面也做了大量的研发。 But didn't find a way to integrate paytm payment gateway.但是没有找到集成paytm支付网关的方法。

func paymentConfiguration()
{
    var orderDict = [AnyHashable: Any]()
    orderDict["MID"] = "WorldP64425807474247"
    orderDict["CHANNEL_ID"] = "WAP"
    orderDict["INDUSTRY_TYPE_ID"] = "Retail"
    orderDict["WEBSITE"] = "worldpressplg"
    orderDict["TXN_AMOUNT"] = "1"
    orderDict["ORDER_ID"] = ViewController.generateOrderID(withPrefix: "")
    orderDict["CALLBACK_URL"] = "https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=<ORDER_ID>"
    orderDict["CHECKSUMHASH"] = "w2QDRMgp1/BNdEnJEAPCIOmNgQvsi+BhpqijfM9KvFfRiPmGSt3Ddzw+oTaGCLneJwxFFq5mqTMwJXdQE2EzK4px2xruDqKZjHupz9yXev4="
    orderDict["REQUEST_TYPE"] = "DEFAULT"
    orderDict["CUST_ID"] = "1234567890"
    var order = PGOrder(params: orderDict)
}



func openPaytmController()
{
    PGServerEnvironment.selectServerDialog(view, completionHandler: {(_ type: ServerType) -> Void in
        var txnController = PGTransactionViewController.initTransaction(forOrder: order)
        if type != eServerTypeNone {
            txnController.serverType = type
            txnController.merchant = mc
            txnController.delegate = self
            self.show(txnController)
        }
    })
}

Any help would be greatly appreciated.任何帮助将不胜感激。 Thanks in advance提前致谢

** **

PayTM Integaration with swift with detail PayTM 与 swift 与细节的集成

** **

##Download paytm sdk## https://github.com/Paytm-Payments/Paytm_iOS_App_Kit Make sure the dynamic lib and systemConfiguration.framwork is added in “Linked binaries and frameworks” ##下载paytm sdk## https://github.com/Paytm-Payments/Paytm_iOS_App_Kit确保动态库和systemConfiguration.framwork 被添加到“链接的二进制文件和框架”中

Add bridging header file into the project将桥接头文件添加到项目中

        #import "PaymentsSDK.h"

You have to generate CheckSumHash key - PayTm unique key for transaction purpose您必须为交易目的生成 CheckSumHash 密钥 - PayTm 唯一密钥

Pass the below parameters to generate checkSumHash传递以下参数以生成 checkSumHash

 let params:[String: Any] = [
            "CUST_ID”:<Your Customer ID>,  // you have to generate unique customer ID (Generate random string - less than 50 length count )
            "TXN_AMOUNT":"10.00", // sample amount
              “MID": <Your merchant ID>, 
             "ORDER_ID”:<Your Order ID>, // you have to generate unique order ID  (Generate random string - less than 50 length count )
             "INDUSTRY_TYPE_ID":"Retail",   //Staging Environment  
              "CHANNEL_ID":"WAP", //Staging Environment  
              "WEBSITE":"APPSTAGING",  //Staging Environment  - Mobile
             "CALLBACK_URL":"https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=\(<Your Order ID>)” // This should be important one and make sure the correct order ID. 
  ]

In your server , You have to setUp the the file that should generate CheckSumHash key based on the given parameters and merchant key (Which is stored in the file; Don't use inside your app ).在您的服务器中,您必须根据给定的参数和商家密钥设置应生成 CheckSumHash 密钥的文件(存储在文件中;不要在您的应用程序中使用)。 That should be your CHECKSUM URL along with the above mentioned parameter.那应该是您的 CHECKSUM URL 以及上述参数。 And finally, we get the CheckSumHash in the response最后,我们在响应中得到 CheckSumHash

You have to given the above mentioned parameters along with checkSumHash (which you got the response - refer :step 3) to imitate PGTransactionViewCOntroller您必须提供上述参数以及 checkSumHash(您得到响应 - 请参阅:步骤 3)以模仿 PGTransactionViewCONtroller

       let params:[String: Any] = [
            "CUST_ID”:<Your Customer ID>,  // you have to generate unique customer ID (Generate random string - less than 50 length count )
            "TXN_AMOUNT":"10.00", // sample amount
              “MID": <Your merchant ID>, 
             "ORDER_ID”:<Your Order ID>, // you have to generate unique order ID  (Generate random string - less than 50 length count )
             "INDUSTRY_TYPE_ID":"Retail",   //Staging Environment  
              "CHANNEL_ID":"WAP", //Staging Environment  
              "WEBSITE":"APPSTAGING",  //Staging Environment  - Mobile
             "CALLBACK_URL":"https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=\(<Your Order ID>)”  // This should be important one and make sure the correct order ID. ,“CHECKSUMHASH”:<your geenrated CheckSumHash key> // which you got the response of generate CheckSumHash
]

  let order = PGOrder(params: params)

    let txnController = PGTransactionViewController(transactionFor: order)
    txnController?.serverType = eServerTypeStaging
    txnController?.merchant = PGMerchantConfiguration.default()
    txnController?.merchant.checksumGenerationURL = CheckSumGenerationURL
    txnController?.merchant.merchantID = "FlotaS90100524961231"
    txnController?.merchant.checksumValidationURL = CheckSumVerifyURL + orderID
    txnController?.loggingEnabled = true
    txnController?.merchant.website = "APPSTAGING"
    txnController?.merchant.industryID = "Retail"
    txnController?.serverType = eServerTypeStaging
    txnController?.delegate = self

    self.navigationController?.pushViewController(txnController!, animated: true)

PayTM delegates to handle response PayTM 委托处理响应

func didSucceedTransaction(controller: PGTransactionViewController, response: [NSObject : AnyObject]) {
        print(response)
    }

    func didFinishedResponse(_ controller: PGTransactionViewController!, response responseString: String!) {
        print(responseString) // Response will be in string 
         let data = responseString.data(using: .utf8)!
    let obj = JSON(data: data)
    if obj["STATUS"].stringValue != "TXN_SUCCESS" {
       //handle what you want             
    }
     }
    }
    func didFailTransaction(_ controller: PGTransactionViewController!, error: Error!, response: [AnyHashable : Any]!) {
        print(error)

    }

    func didCancelTrasaction(_ controller: PGTransactionViewController!) {
        print("User camcelled the trasaction")
        controller.navigationController?.popViewController(animated: true)
    }

    func errorMisssingParameter(_ controller: PGTransactionViewController!, error: Error!) {
        print(error.localizedDescription)
        controller.navigationController?.popViewController(animated: true)
    }

Try this code:试试这个代码:

func showController(controller: PGTransactionViewController) {

    if self.navigationController != nil {
        self.navigationController?.pushViewController(controller, animated: true)
    } else {
        self.present(controller, animated: true, completion: nil)
    }
}

func removeController(controller: PGTransactionViewController) {

    if self.navigationController != nil {
        self.navigationController?.popViewController(animated: true)
    } else {
        controller.dismiss(animated: true, completion: nil)
    }
}

//Creat Payment----------------
func creatPayment(CheckSum: String) {

    let mc = PGMerchantConfiguration.default()!
    var orderDict = [String : Any]()
    orderDict["MID"] = "WorldP64425807474247";
    orderDict["ORDER_ID"] = ViewController.generateOrderID(withPrefix: "");
    orderDict["CUST_ID"] = "1234567890";
    orderDict["INDUSTRY_TYPE_ID"] = "Retail";
    orderDict["CHANNEL_ID"] = "WAP";
    orderDict["TXN_AMOUNT"] = self.FINAL_AMOUNT;
    orderDict["WEBSITE"] = "APP_STAGING";
    orderDict["CALLBACK_URL"] = "https://pguat.paytm.com/paytmchecksum/paytmCallback.jsp";
    orderDict["CHECKSUMHASH"] = CheckSum;

    let pgOrder = PGOrder(params: orderDict )
    let transaction = PGTransactionViewController.init(transactionFor: pgOrder)
    transaction!.serverType = eServerTypeStaging
    transaction!.merchant = mc
    transaction!.loggingEnabled = true
    transaction!.delegate = self
    self.showController(controller: transaction!)
}

func didFinishedResponse(_ controller: PGTransactionViewController!, response responseString: String!) {
    print(responseString)
 }

func didCancelTrasaction(_ controller: PGTransactionViewController!) {
    print("CANCELLED")
}

func errorMisssingParameter(_ controller: PGTransactionViewController!, error: Error!) {
    self.removeController(controller: controller)
    print(error)
}

You have given the checksum as hardcore so, when the paytm decode your checksum and comapare with your parameters, the comparison will get fail.您已将校验和作为硬核提供,因此,当 paytm 解码您的校验和并与您的参数进行比较时,比较将失败。 so you need to provide a new checksum when ever you make a payment.因此,您每次付款时都需要提供新的校验和。

The main thing you need to be care is that, the given parameters for checksum generation and payment setup should be same.您需要注意的主要事情是,校验和生成和付款设置的给定参数应该相同。 Checksum can be generated in the backend with the help of checksum generation kit provided by paytm可以借助paytm提供的校验和生成工具在后端生成校验和

you should call the func creatPayment(CheckSum: String) in success of Generate checksumApi and give the checksum to the argument in the function您应该在 Generate checksumApi 成功调用func creatPayment(CheckSum: String)并将校验和提供给函数中的参数

In Swift 5.0 Follow the following steps:-在 Swift 5.0 中,请按照以下步骤操作:-

1:- Follow these steps to download and import the library in your project:- 1:- 按照以下步骤在您的项目中下载和导入库:-

  1. Download SDK from:- https://github.com/Paytm-Payments/Paytm_iOS_App_Kit从以下位置下载 SDK:- https://github.com/Paytm-Payments/Paytm_iOS_App_Kit

    Open your project in XCode and from the File menu, select Add files to "your project"在 XCode 中打开您的项目,然后从文件菜单中选择将文件添加到“您的项目”

    Select Paytm.framework in the directory you just unzipped在刚刚解压的目录中选择Paytm.framework

    Make sure 'Copy items if needed' is checked and click 'Add' Under "Link Binary With Libraries" in the "Build Phases" tab of your project settings, add SystemConfiguration.framework确保选中“需要时复制项目”,然后在项目设置的“构建阶段”选项卡中的“链接二进制与库”下单击“添加”,添加 SystemConfiguration.framework

    Check if PaytmSDK.framework is added in both “Link Binary With Libraries” and “Embedded Binaries”.检查 PaytmSDK.framework 是否添加到“Link Binary With Libraries”和“Embedded Binaries”中。 If not, add by clicking on the plus icon.如果没有,请单击加号图标添加。

Import PaytmSDK to ViewController将 PaytmSDK 导入 ViewController

 import PaymentSDK

Generate ChecksumHash生成校验和哈希

Security parameters to avoid tampering.防止篡改的安全参数。 Generated using server-side checksum utility provided by Paytm.使用 Paytm 提供的服务器端校验和实用程序生成。 Merchant has to ensure that this always gets generated on the server.商家必须确保这总是在服务器上生成。 Utilities to generate checksum hash is available生成校验和哈希的实用程序可用

Add code on your payment ViewController to execute the payment process在您的支付视图控制器上添加代码以执行支付流程

     var txnController = PGTransactionViewController()
     var serv = PGServerEnvironment()
     var params = [String:String]()
     var order_ID:String?
     var cust_ID:String?


   func beginPayment() {
    serv = serv.createStagingEnvironment()
    let type :ServerType = .eServerTypeStaging
    let order = PGOrder(orderID: "", customerID: "", amount: "", eMail: "", mobile: "")
    order.params = ["MID": "rxazcv89315285244163",
        "ORDER_ID": "order1",
        "CUST_ID": "cust123",
        "MOBILE_NO": "7777777777",
        "EMAIL": "username@emailprovider.com",
        "CHANNEL_ID": "WAP",
        "WEBSITE": "WEBSTAGING",
        "TXN_AMOUNT": "100.12",
        "INDUSTRY_TYPE_ID": "Retail",
        "CHECKSUMHASH": "oCDBVF+hvVb68JvzbKI40TOtcxlNjMdixi9FnRSh80Ub7XfjvgNr9NrfrOCPLmt65UhStCkrDnlYkclz1qE0uBMOrmuKLGlybuErulbLYSQ=",
        "CALLBACK_URL": "https://securegw-stage.paytm.in/theia/paytmCallback?ORDER_ID=order1"]
    self.txnController =  self.txnController.initTransaction(for: order) as! PGTransactionViewController
    self.txnController.title = "Paytm Payments"
    self.txnController.setLoggingEnabled(true)
    if(type != ServerType.eServerTypeNone) {
        self.txnController.serverType = type;
    } else {
        return
    }
    self.txnController.merchant = PGMerchantConfiguration.defaultConfiguration()
    self.txnController.delegate = self
    self.navigationController?.pushViewController(self.txnController, animated: true)
 }

Change "CHECKSUMHASH": value in params that comes from API更改“CHECKSUMHASH”:来自 API 的参数中的值

    order.params["CHECKSUMHASH"] = checkSum // API checkSum value

confirm the protocol-delegate of 'PGTransactionDelegate' to Handle error and success responses确认“PGTransactionDelegate”的协议委托以处理错误和成功响应

To handle success/errors on completion of payment, implement "didFinishedResponse", "didCancelTrasaction", "errorMisssingParameter" methods of the "PGTransactionDelegate".要处理支付完成时的成功/错误,请实现“PGTransactionDelegate”的“didFinishedResponse”、“didCancelTrasaction”、“errorMisssingParameter”方法。 Code snippet provided below:-下面提供的代码片段:-

extension PaymentViewController : PGTransactionDelegate {
//this function triggers when transaction gets finished
func didFinishedResponse(_ controller: PGTransactionViewController, response responseString: String) {
    let msg : String = responseString
    var titlemsg : String = ""
    if let data = responseString.data(using: String.Encoding.utf8) {
        do {
            if let jsonresponse = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any] , jsonresponse.count > 0{
                titlemsg = jsonresponse["STATUS"] as? String ?? ""
            }
        } catch {
            debugLog("Something went wrong")
        }
    }
    let actionSheetController: UIAlertController = UIAlertController(title: titlemsg , message: msg, preferredStyle: .alert)
    let cancelAction : UIAlertAction = UIAlertAction(title: "OK", style: .cancel) {
        action -> Void in
        controller.navigationController?.popViewController(animated: true)
    }
    actionSheetController.addAction(cancelAction)
    self.present(actionSheetController, animated: true, completion: nil)
}
//this function triggers when transaction gets cancelled
func didCancelTrasaction(_ controller : PGTransactionViewController) {
    controller.navigationController?.popViewController(animated: true)
}
//Called when a required parameter is missing.
func errorMisssingParameter(_ controller : PGTransactionViewController, error : NSError?) {
    controller.navigationController?.popViewController(animated: true)
  }
}

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

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