如何在 Swift 中集成 Paytm 支付网关
Posted
技术标签:
【中文标题】如何在 Swift 中集成 Paytm 支付网关【英文标题】:How to integrate Paytm payment gateway in Swift 【发布时间】:2018-08-15 07:32:57 【问题描述】:看了所有教程,也做了很多关于网关集成的研发。 但是没有找到集成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)
)
任何帮助将不胜感激。 提前致谢
【问题讨论】:
您需要包含代码 sn-p 以显示您所做的一些努力。 【参考方案1】:**
PayTM 与 swift 的详细集成
**
##下载paytm sdk## https://github.com/Paytm-Payments/Paytm_ios_App_Kit 确保将动态库和 systemConfiguration.framwork 添加到“链接的二进制文件和框架”中
在项目中添加桥接头文件
#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)
【讨论】:
非常感谢,有帮助 工作..正确【参考方案2】:试试这个代码:
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)
您已将校验和作为核心给出,因此,当 paytm 解码您的校验和并与您的参数进行比较时,比较将失败。所以每次付款时都需要提供新的校验和。
您需要注意的主要事项是,校验和生成和支付设置的给定参数应该相同。 可以借助paytm提供的校验和生成工具包在后端生成校验和
您应该调用func creatPayment(CheckSum: String)
成功生成校验和Api 并将校验和提供给函数中的参数
【讨论】:
“试试这个”并不是一个好的答案。你应该解释如何和为什么这可以解决他们的问题。我推荐阅读,“How do I write a good answer?"【参考方案3】:在 Swift 5.0 中执行以下步骤:-
1:- 按照以下步骤下载并导入项目中的库:-
从以下位置下载 SDK:- https://github.com/Paytm-Payments/Paytm_iOS_App_Kit
在 XCode 中打开您的项目,然后从 File 菜单中选择 Add files to “你的项目”
在刚刚解压的目录中选择Paytm.framework
确保选中“如果需要,复制项目”,然后单击“添加” 您的“构建阶段”选项卡中的“将二进制文件与库链接” 项目设置,添加SystemConfiguration.framework
检查 PaytmSDK.framework 是否添加在“Link Binary With 库”和“嵌入式二进制文件”。如果没有,请单击加号图标添加。
将 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”方法。下面提供的代码 sn-p:-
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)
【讨论】:
以上是关于如何在 Swift 中集成 Paytm 支付网关的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android studio 中集成 Paytm 订阅支付(定期支付)?