0

我正在使用 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)显示:“错误原因交易请求中缺少一个或多个强制参数。”

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

4

3 回答 3

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

于 2018-11-09T07:56:37.057 回答
0

我是如何实现这个的..

  1. 使用 Jquery 并创建一个表单
  2. 使用 sha512 创建哈希码。(凉亭安装 js-sha512)

 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 上的第一个答案。希望能帮助到你!

于 2017-07-04T17:45:04.993 回答
-1

注意:如果输入类型是隐藏的,angularjs 在连接模型和视图时会出现一些问题。所以请注意这一点。我从 AJAX 获取调用的 txnid 和哈希,所以我必须将它绑定在与作用域不同的变量中。

Angular 代码很简单,只需填充变量即可。今天还要记住一件事,如果您的帐户未激活,那么您需要使用他们的客户支持提供的测试盐/密钥:

MID : 4934580
Key : rjQUPktU
Salt : e5iIg1jwi8
Authorization : y8tNAC1Ar0Sd8xAHGjZ817UGto5jt37zLJSX/NHK3ok=
Test Card : 5123456789012346
Expiry : 05/20                                                                     
CVV : 123
于 2017-07-19T13:17:08.303 回答