1

教程都查了,网关集成方面也做了很多研发。但是没有找到整合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)
        }
    })
}

任何帮助将不胜感激。提前致谢

4

3 回答 3

2

**

PayTM 与 swift 与细节的集成

**

##Download paytm sdk## https://github.com/Paytm-Payments/Paytm_iOS_App_Kit 确保在“Linked binaries and frameworks”中添加动态库和systemConfiguration.framwork</p>

将桥接头文件添加到项目中

        #import "PaymentsSDK.h"

您必须为交易目的生成 CheckSumHash 密钥 - PayTm 唯一密钥

传递以下参数生成 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. 
  ]

在您的服务器中,您必须根据给定的参数和商家密钥设置应该生成 CheckSumHash 密钥的文件(存储在文件中;不要在您的应用程序中使用)。那应该是您的 CHECKSUM URL 以及上述参数。最后,我们在响应中得到 CheckSumHash

您必须提供上述参数以及 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 代表处理响应

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)
    }
于 2018-11-27T06:50:52.783 回答
1

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

you should call the func creatPayment(CheckSum: String) in success of Generate checksumApi and give the checksum to the argument in the function

于 2018-03-21T08:03:08.017 回答
0

在 Swift 5.0 中,请执行以下步骤:-

1:- 按照以下步骤下载并导入项目中的库:-

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

    在 XCode 中打开您的项目,然后从 File 菜单中选择 Add files to "your project"

    在刚刚解压的目录中选择Paytm.framework

    确保选中“如果需要则复制项目”,然后在项目设置的“构建阶段”选项卡中的“将二进制文件与库链接”下单击“添加”,添加 SystemConfiguration.framework

    检查是否在“Link Binary With Libraries”和“Embedded Binaries”中都添加了 PaytmSDK.framework。如果没有,请单击加号图标添加。

将 PaytmSDK 导入 ViewController

 import PaymentSDK

生成校验和哈希

避免篡改的安全参数。使用 Paytm 提供的服务器端校验和实用程序生成。商家必须确保这始终在服务器上生成。生成校验和哈希的实用程序可用

在您的支付 ViewController 上添加代码以执行支付流程

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

更改“CHECKSUMHASH”:来自 API 的参数中的值

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

确认“PGTransactionDelegate”的协议委托以处理错误和成功响应

要处理付款完成时的成功/错误,请实现“PGTransactionDelegate”的“didFinishedResponse”、“didCancelTrasaction”、“errorMisssingParameter”方法。下面提供的代码片段:-

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)
  }
}
于 2020-06-16T14:13:32.510 回答