alipay-node-sdk icon indicating copy to clipboard operation
alipay-node-sdk copied to clipboard

支付成功后,不知道怎么调用验签来返回商户界面 希望得到答案

Open xwh7351 opened this issue 7 years ago • 37 comments

router.get('/return', function (req, res) { var lalala = ali.signVerify(req.query); if (lalala === false) { return res.error("回调签名验证未通过"); } //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)// var trade_no = req.query["trade_no"]; //支付宝交易号 var order_no = req.query["out_trade_no"]; //获取订单号 var total_amount = req.query["total_amount"]; //获取总金额

//var buyer_email = req.query.buyer_email;		//买家支付宝账号
var trade_status = req.query["trade_status"];		//交易状态


if ( trade_status == "TRADE_SUCCESS") {
        //判断该笔订单是否在商户网站中已经做过处理
        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
        //如果有做过处理,不执行商户的业务程序

        handleRecharge(order_no, res);
}
res.end("success");

});

router.post('/notify', function (req, res) { var lalala = ali.signVerify(req.body); if (lalala === false) { return res.error("回调签名验证未通过"); } //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)// var trade_no = req.body["trade_no"]; //支付宝交易号 var order_no = req.body["out_trade_no"]; //获取订单号 var total_amount = req.body["total_amount"]; //获取总金额

//var buyer_email = req.query.buyer_email;		//买家支付宝账号
var trade_status = req.body["trade_status"];		//交易状态

if (trade_status == "TRADE_SUCCESS") {
        //判断该笔订单是否在商户网站中已经做过处理
        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
        //如果有做过处理,不执行商户的业务程序

     handleRecharge(order_no, res);
}
res.end("success");

});

xwh7351 avatar Oct 31 '17 07:10 xwh7351

不是太明白你的意思,一般来说在客户端进行支付操作后应该进行一个支付结果验证过程,根据验证结果进行页面跳转就可以了。 验证过程包括:支付宝的签名验证、根据自身业务进行订单合法性验证(订单是否处理过、支付金额是否正确等等)

fym201 avatar Oct 31 '17 08:10 fym201

怎么调用sdk中的支付宝签名验证呢

xwh7351 avatar Oct 31 '17 09:10 xwh7351

支付成功后没有返回页面上 支付宝云排查显示http://www.gy4k.com/alipay/notify 接收参数的处理逻辑错误 我是新手 不知道要怎样去弄

xwh7351 avatar Oct 31 '17 09:10 xwh7351

ali.signVerify(req.body); 这个是对的,其中req.body是支付宝返回的支付结果报文解析后的对象

fym201 avatar Oct 31 '17 09:10 fym201

router.post('/notify', function (req, res) { var lalala = ali.signVerify(req.body); var order_no = req.body.out_trade_no; //获取订单号 var trade_status = req.body.trade_status; //交易状态 if (lalala) { if (trade_status == "TRADE_SUCCESS") { handleRecharge(order_no, res); } res.end("success"); } else { res.end("fail"); } }); 那这样代码有错吗 可以支付成功 就是页面没有返回

xwh7351 avatar Oct 31 '17 09:10 xwh7351

你这个应该是接收支付宝结果通过的地址,在这里面你要验签,并校验订单是否正确。如果说你这里逻辑错误的话,那你就要在这里排查一下,看是哪一步出的错

fym201 avatar Oct 31 '17 09:10 fym201

ali.signVerify(req.body);这个方法就是 签名校验么 返回true或者false的 是的话没有错呢 怎样可以查看到 req.body里的值 console.log(req.body());吗 可是显示在哪里

if(ali.signVerify(req.body)){ if(trade_status ==“TRADE_SUCCESS”){ handleRecharge(order_no,res); } res.end(“success”); } else { res.end(“fail”); }

xwh7351 avatar Oct 31 '17 10:10 xwh7351

你可以直接远程调试或者转成json字符串输出

fym201 avatar Oct 31 '17 10:10 fym201

为什么一直是 支付成功后 不return跳转呢

xwh7351 avatar Nov 01 '17 07:11 xwh7351

可以给个return的事例吗 代码感觉是没有问题的 支付宝成功后确不跳转

router.get('/return', function (req, res) { var lalala = ali.signVerify(req.params); if (lalala) { var trade_no = req.params.trade_no; //支付宝交易号 var order_no = req.params.out_trade_no; //获取订单号 var total_amount = req.params.total_amount; //获取总金额 //var buyer_email = req.query.buyer_email; //买家支付宝账号 var trade_status = req.params.trade_status; //交易状态 if (trade_status == "TRADE_SUCCESS") { handleRecharge(order_no, res); } res.end("success"); } else { res.end("fail"); }

});

xwh7351 avatar Nov 01 '17 07:11 xwh7351

这个页面是你给客户端使用的页面吧,如果是的话你要自己在这里控制是否跳转啊,你直接输出success自然是跳转不了的

fym201 avatar Nov 01 '17 08:11 fym201

这个原来是mapi的支付网关 现在改openapi 是不是着问题导致失败 需要注意什么吗

xwh7351 avatar Nov 01 '17 08:11 xwh7351

如果是网关的话这样是对的,那你就是跟踪一下看看返回的结果是不是对的,是不是返回了success给支付宝

fym201 avatar Nov 01 '17 08:11 fym201

商户响应时间: 2017-11-01 16:10:19 | 商户返回信息: 耗时耗时: 59ms, 地址: http://www.gy4k.com/alipay/notify, http状态码: 404, 返回: {"isSuccess":false,"msg":"Not Found"}. 支付宝的云排查 是这样提示的

xwh7351 avatar Nov 01 '17 08:11 xwh7351

这是 notify的代码 router.post('/notify', function (req, res) { var lalala = ali.signVerify(req.body); if (lalala) { var trade_no = req.body.trade_no; //支付宝交易号 var order_no = req.body.out_trade_no; //获取订单号 var total_amount = req.body.total_amount; //获取总金额

//var buyer_email = req.query.buyer_email;		//买家支付宝账号
    var trade_status = req.body.trade_status;		//交易状态
    if (trade_status == "TRADE_SUCCESS") {
         handleRecharge(order_no, res);
    }
    res.send("success");
} else {
    res.send("fail");
}

});

xwh7351 avatar Nov 01 '17 08:11 xwh7351

iisnode encountered an error when processing the request.

HRESULT: 0x6d HTTP status: 500 HTTP subStatus: 1013 HTTP reason: Internal Server Error

return 页面 在一分钟后会显示这个错误消息

xwh7351 avatar Nov 01 '17 08:11 xwh7351

测试的结果显示你只处理了get的路由,没有处理post

fym201 avatar Nov 01 '17 08:11 fym201

怎么没处理 post 呢

xwh7351 avatar Nov 01 '17 08:11 xwh7351

检测下你的路由处理逻辑是不是有问题,发的post请求返回的是 {"isSuccess":false,"msg":"Not Found"},而从你发的代码上来看你只会返回success或fail。只有两种情况,要么你的路由没有经过这里,要么你是handleRecharge(order_no, res);这一步里提前返回了结果给支付宝

fym201 avatar Nov 01 '17 08:11 fym201

如果是路由没有经过这里 需要怎么配置呢 恩人

xwh7351 avatar Nov 01 '17 08:11 xwh7351

你用的什么框架

fym201 avatar Nov 01 '17 08:11 fym201

express

xwh7351 avatar Nov 01 '17 08:11 xwh7351

我很少用express,已经记不清怎么设置了,如果你同时设置了get和post的路由,尝试把get的移除掉看看,支付宝不会用get给你通知

fym201 avatar Nov 01 '17 08:11 fym201

好的 谢谢你 谢谢你 我在看看

xwh7351 avatar Nov 01 '17 08:11 xwh7351

为什么 写的return_url地址 是直接redirect到那个地址上 没有执行return里的逻辑

xwh7351 avatar Nov 02 '17 09:11 xwh7351

return_url是给用户进行反馈的地址,你应该是支付宝通知中处理业务逻辑

fym201 avatar Nov 02 '17 11:11 fym201

支付宝异步通知 没有调用我的notify里的代码 怎么回事

xwh7351 avatar Nov 03 '17 06:11 xwh7351

你好 请问一下sdk 一切正常 为什么 发布Azure上时 会有 http 500的错误 我用的是express

xwh7351 avatar Nov 06 '17 09:11 xwh7351

错误堆栈发上来看看

fym201 avatar Nov 06 '17 09:11 fym201

不知道怎么看错误堆栈 哥 支付宝可以 又出现发布时 报错

xwh7351 avatar Nov 07 '17 06:11 xwh7351