手机版

NodeJs支付宝移动支付签名验证详解

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

非常感谢:http://www.jianshu.com/p/8513e995ff3a? UTM _竞选=雨果UTM _媒体=读者_分享UTM _内容=备注UTM _来源=微博。如果找不到这篇文章,我可能要继续挖几天,代码基本上是按照他的来移动的。但是支付宝的移动支付文档写的很烂,没有节点的SDK和演示。写作是极其痛苦的.幸运的是,我找到了这篇文章,扔了一下午。支付宝技术人员终于完成了移动支付的全过程,于是我记录了自己遇到的坑,顺便梳理了移动支付的全过程。

支付宝给出的流程图还是很清晰的。事实上,基本过程是

用户请求支付服务器生成签名订单并将其发送给客户端。客户通过此订单向app sdk请求付款。sdk将用户引入支付宝支付界面进行支付后,支付宝将支付成功结果返回前端,并向服务器发送支付通知。服务器收到通知,验证是否是支付宝发送的成功结果。应用客户端需要做的非常简单:

向自己的服务器申请订单,收到订单后,去支付宝sdk申请付款。事务结束后,服务器返回成功或失败。它做了更多的事情(注意:服务器需要存储应用的私钥进行签名,支付宝的公钥进行验证):

1.当收到客户端请求时,生成一个签名的订单并将其返回给客户端。中间步骤如下

1)从相应的配置数据生成数组,然后从数组的数据生成有序字符串

//将支付宝发送的数据生成有序序列函数getverify params(params){ var s para=[];if(!params)返回nullfor(参数中的var键){ if((!params[key])| key==' sign ' | | key==' sign _ type '){ continue;};sPara.push([key,params[key]]);} SPAra=SPAra . sort();var prestr=for(var I2=0;i2 sPara.lengthI2){ var obj=sPara[I2];if(I2==spara . length-1){ prestr=prestr obj[0]'=' obj[1]';} else { prestr=prestr obj[0]'=' obj[1]';} }返回prestr} 2)对这组支付字符串执行RSA-SHA1算法,然后使用存储在服务器中的私钥对结果进行签名

//验证函数veriy sign(params){ try { var public PEM=fs . readfilesync('。/RSA _ public _ key . PEM’);var public key=public PEM . ToString();var prestr=getVerifyParams(params);var sign=params['sign']?params[' sign ']:“”;var verify=crypto . create verify(' RSA-SHA1 ');verify . update(prestr);返回验证。verify(公钥,符号,' base64 ')} catch(err){ console . log(' verisign err ',err)}} 3)有序字符串的签名方法是生成的顺序,这组顺序返回给客户端

//发送订单号sendalipay:函数(req,RES){ var code=' ' for(var I=0;i4;I){ code=math . floor(math . random()* 10);}//订单号临时生成AlipayConfig。out _ trade _ no=日期。现在()。tostring()代码来自时间戳和四位随机代码;var myParam=getParams(AlipayConfig);var MySign=GetSign(Alipayconfig)var last=MyParam ' sign=' MySign ' ' sign _ type=' RSA ';Console.log(最后)返回res.send(最后)} 2。工作的前半部分完成了。接下来,如果前端支付成功,支付宝会向我们预留的回拨接口发送POST请求,让我们验证用户是否支付成功。

1)从支付宝发送的数据中生成有序字符串

//将支付宝发送的数据生成有序序列函数getverify params(params){ var s para=[];if(!params)返回nullfor(参数中的var键){ if((!params[key])| key==' sign ' | | key==' sign _ type '){ continue;};sPara.push([key,params[key]]);} SPAra=SPAra . sort();var prestr=for(var I2=0;i2 sPara.lengthI2){ var obj=sPara[I2];if(I2==spara . length-1){ prestr=prestr obj[0]'=' obj[1]';} else { prestr=prestr obj[0]'=' obj[1]';} }返回prestr} 2)对获取的数据进行哈希处理,然后根据公钥有效验证签名,并返回真、假

//验证函数veriy sign(params){ try { var public PEM=fs . readfilesync('。/RSA _ public _ key . PEM’);var public key=public PEM . ToString();var prestr=getVerifyParams(params);var sign=params['sign']?params[' sign ']:“”;var verify=crypto . create verify(' RSA-SHA1 ');verify . update(prestr);返回验证。验证(公钥,sign,' base64 ')} catch(err){ console . log(' verisign err ',err)}} 3)如果验证成功,那么生成支付宝通知url,验证是否是支付宝发送的通知(支付宝有很多验证,脑残)。如果有数据,说明确实是支付宝发的。

//回调验证getalipay:function (req,RES){ console . log(req . body)varparams=req . body varmysign=veriy sign(params);//验证支付宝签名:mysign为真,表示签名正确console.log(mysign) try {//成功if(my sign){ if(params[' notify _ id ']){ var partner=alipayconfig . partner;//生成支付宝验证通知的var URL=.支付宝.com/gateway.do?service=notify _ verify ' ' partner=' partner ' notify _ id=' params[' notify _ id '];Console.log('url:' url) //验证是否是支付宝发送的通知https.get(url,Function(text) {//数据显示是支付宝发送的通知if(text) {//交易成功console.log('success')} else {//交易失败console . log(' err ' } } } } } } catch(err){ console . log(err);}}这样,整个过程就完成了。代码的原始博客是可用的。最多有一部分改成了写帆。主要写这次遇到的几个坑和几个值得注意的地方

1.由于移动支付的文档描述不清晰,私钥实际上是上传到账户信息的mapi网管产品密钥:

而不是将其上传到应用程序的密钥

2.移动支付仅支持RSA(SHA1)

3./是在sails中获得的根目录的密钥(我不理解sails的这条路径)

4.生成订单时,有序字符串格式为body=' test ',带双引号,但验证生成的有序字符串不能带双引号

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

版权声明:NodeJs支付宝移动支付签名验证详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。