CCAvenue网关集成套件适用于iOS应用程序

14

你好,
我开发了一个需要支付网关的应用程序。我已经使用了“Paypal”,并且取得了成功,现在我需要集成另一个支付网关,“ccavenue”。有人可以帮助我如何集成它吗?
谢谢。


你有 CCAvenue 的文档吗?你需要什么帮助? - nprd
我没有来自ccavenue的任何文件。如果有任何文件或ccavenue的示例,请与我分享。这是我的邮箱:kmadhu1423@gmail.com - Madhu
6个回答

16
我在搜索SDK时,他们已经在此处提到IOS/Android/Windows SDK可用,但我没有找到任何东西。最后我给CCAvenue技术支持团队写了一封电子邮件。
然后我与他们通话,这就是他们说的:
  • 我们需要实际的商户帐户才能获得登录凭据以下载SDK。
  • 他们不提供任何沙盒测试环境。
  • 该过程是,他们将通过商家网站和其他输入的详细信息验证商户帐户。
  • 完成验证后,他们会向商家注册的电子邮件地址发送激活电子邮件。
  • 一旦商家激活了他的帐户,他将获得登录凭据来下载SDK。
  • 有两种订阅类型:免费和特权。(请参阅他们的网站了解更多)
  • 使用SDK,如果商家拥有免费计划,则仅支持INR和USD货币。如果商家想要添加对任何其他货币的支持,则必须向CCAvenue请求相同。CCAvenue团队将与相关银行进行验证,如果银行允许交易,则可以通过支付每个5000卢比来激活新货币。
  • 如果商家有特权计划,则除了INR之外,商家还可以从支持的27种货币中选择任何4种货币。如果商家需要更多,那么他可以通过支付每个5000卢比来购买货币。

@hello BHumi,它是否完美运行?我需要在我的应用程序中实现,你能否提供这个支付网关的演示? - Mehul
5
你好,我从我的客户那里得到了注册账户的详细信息,他是 CCAvenue 的实际商家。我在登录 CCAvenue 仪表板后获得了 SDK 链接, 但我仍然需要集成 SDK 并深入学习。一旦我集成完成,我会尽快发布演示。 但是如果你有商家的登录详情,则可以在 M.A.R.S. 帐户下的“资源”>“网络集成工具包”部分中找到 SDK 链接。 - Bhumi Goklani
4
大家好,我正在准备一份文档,介绍整个CCAvenue集成过程中你需要在自己的服务器上做什么以及需要什么类型的服务器。我很快会分享一个演示项目。CCAvenue并没有提供任何易懂的文件,但我通过支持团队电话沟通收集了信息。 - Bhumi Goklani
2
大家好, 这是CCAvenue的非无缝SDK示例代码:https://www.dropbox.com/s/20x77jffyh6ydyo/Non-Seamless.zip?dl=0当您运行此代码时,您将看到一个表单。这些详细信息将是动态的,merchantID将从CCAvenue获取。 - Bhumi Goklani
2
新链接:https://www.dropbox.com/s/blxvvxvtkamgneq/Non-Seamless.zip?dl=0注意:在新的Xcode版本中运行时可能需要更新代码。 - Bhumi Goklani
显示剩余6条评论

8
自从CCAvenue显示了服务器端选项,我们需要连接到Web视图并加载与iPhone屏幕兼容的ccavenue网关。在我们的应用程序中,我们需要按照以下步骤进行操作:
首先创建HTML文件和相关的CCavenue网关参数。
<html>

<body>

    <form name='form2' method='post' action='UR URL HERE'>

        <input type="text" name='Merchant_Id'><br>
        <input type="text" name='Amount'><br>
        <input type="text" name='Order_Id'><br>
        <input type="text" name='Redirect_Url'><br>
        <input type="text" name='Checksum'><br>
        <input type="text" name='billing_cust_name'><br>
        <input type="text" name='billing_cust_address'><br>
        <input type="text" name='billing_cust_address'><br>
        <input type="text" name='billing_cust_tel'><br>
        <input type="text" name='billing_cust_email'><br>
        <input type="text" name='delivery_cust_name'><br>
        <input type="text" name='delivery_cust_address'><br>
        <input type="text" name='delivery_cust_tel'><br>
        <input type="text" name='delivery_cust_notes'><br>
        <input type="text" name='Merchant_Param'><br>

        </form>

</body>

在此之后,在您的屏幕上加载Web视图

  NSURL *url = [NSURL URLWithString: @"https://www.ccavenue.com/shopzone/cc_details.jsp"];

webView.delegate = self;
webView.scalesPageToFit = YES;

NSString *strUsername = [[NSUserDefaults standardUserDefaults] objectForKey:@"userName"];

   NSString *body = [NSString stringWithFormat: @"Merchant_Id=%@&Amount=%@&Order_Id=%@&Redirect_Url=%@&Checksum=%@&billing_cust_name=%@&billing_cust_address=%@&billing_cust_country=%@&billing_cust_tel=%@&billing_cust_email=%@&delivery_cust_name=%@&delivery_cust_address=%@&delivery_cust_tel=%@&delivery_cust_notes=%@&Merchant_Param=%@",@"XXXXX",@"10",@"123456",@"http://us2guntur.com/us2guntur/CCAvenueredirecturl.jsp",@"1234567890",@"Test",@"Hyderabad",@"India",@"1357896437",@"Test1000",@"Guntur",@"234567896",@"",@""];

NSLog(@"%@",body);

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];
[webView loadRequest: request];

你在安卓上做过同样的事情吗?如果是这样,我该如何在安卓上测试实现呢?我想在安卓上实现支付网关,为什么我们需要HTML文件?在这个动作中应该传递什么URL?<form name='form2' method='post' action='UR URL HERE'> - Sankar Ganesh PMP
@Madhu,HTML文件有什么用处?它是在设备上还是服务器上? - Bonnie
@Madhu 我们在 iOS 应用程序中如何计算校验和? - girish_vr

6

Swift 3中CCAvenue支付网关集成


首先请查看此链接 "https://www.ccavenue.com/inapp_payments.jsp",了解CCAvenue提供的集成方式。

请按照以下步骤实现非无缝方法在您的移动应用程序上实现支付网关:

1. 请确保您的公共/出站IP已被列入CCAvenue的白名单中。

2. 将GetRSA和ccavResponseHandler文件放置在您的服务器上。

3. 在您的应用程序中,提及存储在您的服务器上的GetRSA文件的路径。

4. 从您的应用程序调用存储在您的服务器上的GetRSA以获取RSA公钥。

5. 使用获取的公钥,商家将加密参数(金额、货币)。要加密RSA密钥,请执行以下步骤(从Step1到Step8)。

Step1: 您必须从CCAvenue网站下载CCAvenue SDK,并且必须使用商家帐户凭据登录才能下载。

Step2: 登录后,转到资源->移动集成工具即可下载SDK。请参见以下屏幕截图。

enter image description here

Step3: 要下载,请单击“下载集成工具”,如下所示。在下载之前,选择无缝或非无缝。(有关此信息的详细信息,请查看CCAvenue提供的文档)

无缝: 如果商家配置为无缝,则接受所有账单/送货详细信息,包括支付选项,都在商家页面上完成。

非无缝: 如果商家配置为非无缝,则账单/送货详细信息(包括支付选项)都在CCAvenue的移动页面上完成。

enter image description here

Step4: 下载SDK工具包后,您必须将“OpenSSL”文件夹复制到项目中,否则您也可以使用Pods安装“openssl”。

Step5: 在Openssl / openssl-1.0.1i-iOS文件夹下,您将找到2个文件夹include和lib。还要在项目的Build Settings中搜索路径->Library,搜索路径,删除提供的Users/test/desktop/...,并将include/和lib/这两个文件夹拖放到搜索路径中。同样,您还需要对Paths->User Header Search Paths执行相同的操作。

步骤6:将这两个文件(在您下载的SDK中可用)复制到您的项目“CCTOOL&BASE64”中。

步骤7:使用桥接头导入“CCTool.h”。

步骤8:最后,使用“CCTool”文件中存在的方法加密您的RSA密钥。

6. 在加密参数后,您将通过浏览器(嵌入式Web视图)发布加密值以及其他账单运输详细信息(如果有)。 (如果您无法将所有代码从Objective-C转换为Swift,请使用Objective-C文件CCWEBVIEWCONTROLER)

7. 用户将被重定向到CCAvenue的账单运输页面,在该页面上填写必要的详细信息,包括付款选项。

8. 填写所需的详细信息后,他将被重定向到银行页面,在该页面上他将授权自己。

9. 授权后,他将被重定向到CCAvenue,并且响应即成功或失败将发送到在注册期间配置为返回URL的商家页面。

10. 然后,您应解密响应,然后可以解析以获取交易状态。

注意:

  • 访问代码和订单ID应与RSA调用期间传递的相同。

  • 订单ID应始终是唯一的

  • 在接收到RSA密钥后的60秒内,交易应命中CCAvenue服务器。

  • 在ccavResponseHandler文件中发布的工作密钥应对应于发布到CCAvenue的Accesscode。


嗨,@Sagar Sukode,我在使用CCTool.h时遇到了问题,请问如何将其转换为Swift?请帮助我。 - Nandkishor mewara

5

CCAvenue的集成页面仅显示服务器端选项。

因此,您需要自己实现。您可以在服务器上集成CCAvenue的支付网关,并在设备上的Web视图中打开支付页面。由于服务器端实现在您的控制下,您可以通过cookie发送付款确认详细信息,就像OAuth中所做的那样。


4
我按照Sagar Sukode的所有步骤成功地集成了CCAvenue。
如果有人需要Swift 2.3中的CCWEBVIEWCONTROLER:
在ViewDidLoad中:
    let rsaKey = getRsaKeyForCCAvenue()

    //Encrypting Card Details
    let myRequestString = "amount=\(AMOUNT)&currency=\(CURRENCY)"

    let ccTool = CCTool()

    var encVal = ccTool .encryptRSA(myRequestString, key: rsaKey)

    let charset = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]").invertedSet
    encVal = encVal.stringByAddingPercentEncodingWithAllowedCharacters(charset)

    //Preparing for a webview call
    let urlAsString = TRANS_URL

    let encryptedStr = "\(KEY_MERCHANT_ID)=\(MERCHANT_ID)&\(KEY_ORDER_ID)=\(ORDER_ID)&\(KEY_REDIRECT_URL)=\(REDIRECT_URL)&\(KEY_CANCEL_URL)=\(CANCEL_URL)&\(KEY_ENC_VAL)=\(encVal)&\(KEY_CC_ACCESS_CODE)=\(CC_ACCESS_CODE)&\(KEY_BILLING_NAME)=""&\(KEY_BILLING_ADDRESS)=""&\(KEY_BILLING_ZIP)=""&\(KEY_BILLING_CITY)=""&\(KEY_BILLING_STATE)=""&\(KEY_BILLING_COUNTRY)=""&\(KEY_BILLING_TEL)=""&\(KEY_BILLING_EMAIL)="""

    let myRequestData = encryptedStr.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

    let request = NSMutableURLRequest(URL: NSURL(string: urlAsString)!)

    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type")

    request.setValue("https://secure.ccavenue.com/", forHTTPHeaderField: "Referer")

    request.HTTPMethod = "POST"

    request.HTTPBody = myRequestData

    ccWebView .loadRequest(request)

获取RSA密钥的方法:
    func getRsaKeyForCCAvenue() -> String {

    //Getting RSA Key
    let rsaKeyDataStr = "\(KEY_CC_ACCESS_CODE)=\(CC_ACCESS_CODE)&\(KEY_ORDER_ID)=\(ORDER_ID)"

    let requestData = rsaKeyDataStr.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

    let rsaRequest = NSMutableURLRequest(URL: NSURL(string: RSA_KEY_URL)!)

    rsaRequest .setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type")

    rsaRequest.HTTPMethod = "POST"

    rsaRequest.HTTPBody = requestData

    let rsaKeyData: NSData? = try? NSURLConnection.sendSynchronousRequest(rsaRequest, returningResponse: nil)

    var rsaKey =  NSString(data: rsaKeyData!, encoding: NSASCIIStringEncoding)

    let strNewRSA = rsaKey as! String

    let range: Range<String.Index> = strNewRSA.rangeOfString("<")!
    let index: Int = strNewRSA.startIndex.distanceTo(range.startIndex)

    rsaKey = strNewRSA.substringToIndex(range.startIndex)

    rsaKey = rsaKey?.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())

    rsaKey = "-----BEGIN PUBLIC KEY-----\n\(rsaKey!)\n-----END PUBLIC KEY-----\n"

    return rsaKey as! String
}

Web视图委托方法以读取响应:
    func webViewDidFinishLoad(webView: UIWebView) {

    let webString = webView.request?.URL?.absoluteString
    if (webString! as NSString).containsString("PaymentCCAvenue/ReturnAPI") {

        let html = webView .stringByEvaluatingJavaScriptFromString("document.documentElement.outerHTML")          
        if (html! as NSString).containsString("Success") {
        }
        else if (html! as NSString).containsString("Failure") {  
        }
        else {
        }
    }

}

只需检查后端开发人员的响应字符串,然后在webViewDidFinishLoad中添加条件。

什么是TRANS_URL?我需要放哪个URL? - amisha.beladiya
@ABJ:这是由CCAvenue提供的安全交易URL。 - Amit
我的循环没有进入这个检查,如果(webString! as NSString).containsString("PaymentCCAvenue/ReturnAPI")。你能帮我吗?可能会有什么错误? - Hakikat Singh

2

对于需要Swift 3.2答案的任何人,以下是代码。我花了一段时间来将其转换为Swift 3.2版本。但是现在给你。

(1) 您需要将GetRSA文件放在服务器上,然后将该链接复制并粘贴到您的应用程序中作为“rsaKeyUrl”。

(2) “getRsaKeyForCCAvenue()”函数调用位于服务器上的文件,并且其IP地址必须事先加入白名单。

(3) “getRSA”文件向CCavenue发送请求,链接已经在其中。(这很重要,因为CCavenue只接受来自白名单IP的请求,这使得所有请求都可以从一个IP路由。)

(4) CCAvenue检查细节并处理请求,如果一切正常,则发送响应并重定向到付款页面。

(5) 重定向URL应为“ccavResponseHandler”文件的链接,其中包含您的访问代码并翻译响应。

SWIFT 3.2中的代码

1)获取RSA密钥

func getRsaKeyForCCAvenue() -> String {

    //Getting RSA Key
    let rsaKeyDataStr = "access_code=\(accessCode)&order_id=\(orderId)"

    let requestData = rsaKeyDataStr.data(using: String.Encoding.utf8, allowLossyConversion: false)

    var request = URLRequest(url: URL(string: rsaKeyUrl)!)


    let rsaRequest =  NSMutableURLRequest(url: URL(string: rsaKeyUrl)!)

    rsaRequest .setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type")

    rsaRequest.httpMethod = "POST"

    rsaRequest.httpBody = requestData

    let rsaKeyData: NSData? = try? NSURLConnection.sendSynchronousRequest(rsaRequest as URLRequest, returning: nil) as NSData

    var rsaKey =  NSString(data: rsaKeyData! as Data, encoding: String.Encoding.ascii.rawValue)
    rsaKey = rsaKey?.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) as NSString?


    //   rsaKey = rsaKey?.trimmingCharacters(in: NSCharacterSet.newlines) as? NSString

    rsaKey = "-----BEGIN PUBLIC KEY-----\n\(rsaKey!)\n-----END PUBLIC KEY-----\n" as NSString
    print(rsaKey)
    return rsaKey! as String
}

2) 在super.viewDidLoad()之后的代码

    let rsaKey = getRsaKeyForCCAvenue()

    //Encrypting Card Details
    let myRequestString = "amount=\(VQ_MOUNT)&currency=\(currency)"

    let ccTool = CCTool()

    var encVal :NSString = ccTool.encryptRSA(myRequestString, key: (rsaKey as NSString) as String!) as NSString

    let charset : String = "!*'();:@&=+$,/?%#[]"

    encVal = CFURLCreateStringByAddingPercentEscapes(nil, encVal as CFString, nil, (charset as CFString), CFStringBuiltInEncodings.UTF8.rawValue) as String as NSString


    //Preparing for a webview call
    let urlAsString = TRANS_URL

    var encryptedStr = "merchant_id=\(merchantId)&order_id=\(orderId)&redirect_url=\(redirectUrl)&cancel_url=\(cancelUrl)&enc_val=\(encVal)&access_code=\(accessCode)"

    let myRequestData = NSData.init(bytes: encryptedStr.cString(using: .utf8), length: encryptedStr.characters.count) as Data

    let request = NSMutableURLRequest(url: URL(string: urlAsString)!)


    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "content-type")

    request.setValue(TRANS_URL, forHTTPHeaderField: "Referer")

    request.httpMethod = "POST"

    request.httpBody = myRequestData

    viewWeb.loadRequest(request as URLRequest)

3) 最后是webViewDidFinishLoad()的实现

    func webViewDidFinishLoad(_ webView: UIWebView) {
    let webString = webView.request?.url?.absoluteString
    if ((webString as NSString?)?.range(of: "/ccavResponseHandler.jsp"))?.location != NSNotFound {
        let html: String? = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
        var transStatus = "Not Known"
        if (((html as NSString?)?.range(of: "Aborted"))?.location != NSNotFound) || (((html as NSString?)?.range(of: "Cancel"))?.location != NSNotFound) {
            transStatus = "Transaction Cancelled"
        }
        else if (((html as NSString?)?.range(of: "Success"))?.location != NSNotFound) {
            transStatus = "Transaction Successful"
        }
        else if (((html as NSString?)?.range(of: "Fail"))?.location != NSNotFound) {
            transStatus = "Transaction Failed"
        }
        var controller = storyboard?.instantiateViewController(withIdentifier: "CCResultViewController") as? CCResultViewController
        controller?.transStatus = transStatus
        controller?.modalTransitionStyle = .crossDissolve
        present(controller ?? UIViewController(), animated: true)
    }else {
        print("Something went wrong...")
    }
}

我正在尝试这段代码,一切都正常工作,所有的交易都发生了,但在func webViewDidFinishLoad(_ webView: UIWebView)循环中总是进入else并打印“出了些问题...”。你有什么想法吗? - Hakikat Singh
@HakikatSingh 让我检查一下,我会在一两天内回复你。 - The Doctor
如何在Swift中转换“CCTool()”这个类。 - Nandkishor mewara
@kishumewara,抱歉我不明白。我已经转换了这个。 - The Doctor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接