用于payumoney集成的angular / node.js POST

时间:2016-05-09 19:11:00

标签: angularjs node.js payumoney

我使用angular / node.js堆栈进行payumoney集成。

在角度方面,使用$ http.post将订单放置到服务器端的路由端点(node.js),如下所示:

$http.post('/placeOrder',order).success(function(data, status, headers, config){
      //handle responses on client side
      console.log("Successfully POSTED to payment gateway");
      window.location = "https://test.payu.in/_payment";
    }).error(function(data, status, headers, config) {
      console.log("Error in posting");
   });

实际的繁重工作是在node.js(服务器端)上完成的:

router.post('/placeOrder', function(req, res, next){

hash_data = MERCHANT_KEY+'|'+txnid+'|'+amount+'|'+productinfo+'|'+firstname+'|'+email+'|'+udf1+'|'+udf2+'|'+udf3+'|'+udf4+'|'+udf5+'||||||'+SALT;

var data = querystring.stringify({

      'key': MERCHANT_KEY,
      'txnid': txnid,
      'amount': amount,
      'productinfo': productinfo,
      'firstname': firstname,
      'email': email,
      'phone': phone,
      'surl': SUCCESS_URL,  
      'furl': FAILURE_URL,
      'curl': FAILURE_URL,
      'hash': hash,
      'service_provider': SERVICE_PROVIDER
      //'salt': SALT
    });

    //POST options
    var POST_OPTIONS = {
        hostname: PAYU_BASE_URL,
        port: 443,
        path: '/_payment',
        method: 'POST',
        //json: true,
        agent: false,
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            //'Content-Length': Buffer.byteLength(data)
            'Content-Length': data.length
        }
    };

    var resp_status = "";

    var req = https.request(POST_OPTIONS, function(response) {
        console.log('STATUS: ' + response.statusCode);
        console.log('HEADERS: ' + JSON.stringify(response.headers));
        response.setEncoding('utf8');
        response.on('data', function (chunk) {
            console.log("body: " + chunk);
            resp_status = 200;
            res.json(chunk);
        });
        response.on('error', function (err) {
            console.log("Got error: " + err.message);
            resp_status = 500;
            return res.send(err);
        });
    });
    req.end(data);

但是,这似乎不起作用,因为POST似乎无法使用此方法。通过网络选项卡在浏览器上进行调试时,我总是看到:

请求网址:https://test.payu.in/_payment 请求方法:GET 状态代码:200 OK

此外,测试付款页面(https://test.payu.in/_payment)显示: "错误原因 交易请求中缺少一个或多个强制参数。"

任何帮助都将不胜感激!!

3 个答案:

答案 0 :(得分:0)

按照您提到的“浏览器网络”标签

Request URL:https://test.payu.in/_payment Request Method:GET Status Code:200 OK

这意味着PayU正在通过GET请求而不是POST请求被调用。 PayU仅接受数据作为POST请求。

Also, the test payment page (https://test.payu.in/_payment) shows: "Error Reason One or more mandatory parameters are missing in the transaction request."

这是由于GET请求。我在基于JSF的应用程序中遇到了类似的情况,其中我正确地发送了所有参数,但作为GET请求。稍后,当我切换到POST时,错误会自动得到解决。

有关从angular发送POST请求的信息,请查看下面的链接。

https://www.devglan.com/angular/payumoney-integration-angular

答案 1 :(得分:-1)

我是如何实现这个......

  1. 使用Jquery并创建表单
  2. 使用sha512创建哈希码。 (凉亭安装js-sha512)
  3.  var hashString = this.merchantKey+'|'+ options.uid +'|'+ options.totalPrice + '|'+'options.uid + '|' +
            options.recipient_name + '|'+ options.email +'|||||||||||'+ this.merchantSalt ;
    
        var hash = sha512(hashString);
    
    
    
    
    
        var key1 = $('<input></input>').attr('type', 'hidden').attr('name', "key").val("merchantKey");
    
        var key2 = $('<input></input>').attr('type', 'hidden').attr('name', "txnid").val(options.uid);
    
        var key3 = $('<input></input>').attr('type', 'hidden').attr('name', "amount").val(options.totalPrice);
    
        var key4 = $('<input></input>').attr('type', 'hidden').attr('name', "productinfo").val(options.uid);
    
        var key5 = $('<input></input>').attr('type', 'hidden').attr('name', "firstname").val(options.recipient_name);
    
        var key6 = $('<input></input>').attr('type', 'hidden').attr('name', "email").val(options.email);
    
        var key7 = $('<input></input>').attr('type', 'hidden').attr('name', "phone").val(options.phone);
    
        var key8 = $('<input></input>').attr('type', 'hidden').attr('name', "surl").val("http://192.168.43.121/payment/success");
    
        var key9 = $('<input></input>').attr('type', 'hidden').attr('name', "furl").val("http://192.168.43.121/payment/error");
    
        var key10 = $('<input></input>').attr('type', 'hidden').attr('name', "hash").val(hash);
    
        var key11 = $('<input></input>').attr('type', 'hidden').attr('name', "service_provider").val("payu_paisa");
    
    
        var form = $('<form/></form>');
    
        form.attr("id", "payuform");
    
        form.attr("action", this.payumoneyLink );
    
        form.attr("method", "POST");
    
        form.attr("style", "display:none;");
    
        form.append(key1, key2, key3, key4, key5, key6, key7, key8, key9,key10, key11);
    
    
        $("body").append(form);
    
        // submit form
    
        form.submit();
    

    这是我在StacksOverflow上的第一个答案。希望能帮助到你!

答案 2 :(得分:-1)

注意:如果输入类型被隐藏,则angularjs在连接模型和视图时会遇到一些问题。所以请注意这一点。 txnid和hash我从AJAX获取调用,所以我不得不将它绑定在范围内的单独变量中。

角度代码是明星向前,只是填充变量。 还有一件事需要记住,如果您的帐户不活跃,那么您需要使用客户支持提供的测试盐/密钥:

MID : 4934580
Key : rjQUPktU
Salt : e5iIg1jwi8
Authorization : y8tNAC1Ar0Sd8xAHGjZ817UGto5jt37zLJSX/NHK3ok=
Test Card : 5123456789012346
Expiry : 05/20                                                                     
CVV : 123