nodejs支付宝支付过程加签验签

时间:2024-04-06 11:31:36

nodejs支付宝支付过程加签验签

1.首先如图如图先了解详细的基本流程。(https://docs.open.alipay.com/204/105297/)服务端:2,3,9,10步。

2.首先由客户端去支付宝申请沙箱,(开发者中心)(https://openhome.alipay.com/platform/appDaily.htm),申请完毕会看到如下:

 nodejs支付宝支付过程加签验签

之后会用到的数据有APPID,与支付宝公钥,以及支付宝网关

3. 下载RSA应用公钥与应用私钥生成软件https://docs.open.alipay.com/291/105971/

,然后生成公钥与私钥。将私钥按对应的生成方式RSA2或RSA,传入到沙箱环境。得到对应的支付宝公钥。

nodejs支付宝支付过程加签验签

4.开始进行加签,这里所必要的参数为:(https://docs.open.alipay.com/204/105465

nodejs支付宝支付过程加签验签

Biz_content必要参数:

nodejs支付宝支付过程加签验签

然后开始正式进行加签。

参数解析:app_id支付宝沙箱中的app_id

Method,format,Charset,sign_type,version:参考官方文档

Sign:

Timestamp:获得当前时间,转成官方文档的格式:YYYY-MM-DD HH:MM:ss

Notify_url:验签完,支付成功后支付宝调用的网址。(需要将这个网址配置到外网中,局域网不可以,并将这个具体网址的写入到加签时的那个请求参数中);

Biz_content:独立创建一个json对象,然后配置好之后再转换成json字符串格式。

      具体参数:

1.   subject:商品标题

2.   out_trade_no:商户网站的唯一订单号,可以4位随机数+当前时间毫秒数(这里一定要每次不一样,不然支付成功一次之后,再次支付客户端会提示系统繁忙)

3.   total_amont: 订单总金额

4.   product_code:官方文档固定值

组合过程:最后组合成如下实例格式的待签名字符串:(如下支付宝官方示例:)

app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=2016-08-2520:26:31&version=1.0

然后,先将其转换为数组,然后用sort(),方法进行自然排序,(貌似按字母开头排序a,b,c),

然后读取商户的应用私钥,(要转成pem文件,即将生成的txt文件的后戳名改为.pem,然后在private_key里的第一行加入 BEGIN PRIVATE KEY, 第二行为实际私钥,第三行ENDPRIVATE KEY ,【公钥的话将PRIVATE改为PUBLIC】)

Var sign =crypto.createSign("RSA-SHA256"); //创建一个编码方式

sign.update(content);//用这种编码方式修改排序后的待签名字符串(content)

sign.sign(privateKey, 'base64'); //用商户私钥进行加密,返回给我们真正的签名:sign

【这讲的模糊,反正就是这么整】

 

 

再将其与待签名字符串进行拼接,拼接格式依然为 aaa=111&bbb=222&ccc=333。

然后遍历新拼接好的数据,再将其先转为数组,然后用sort(),方法也进行自然排序,然后遍历所有的key-value值,将所有的value进行encodeURIComponent(value)编码一次【这是必须的】。再次拼接成(aaa=111&bbb=222&ccc=333)格式的字符串,然后将最终的字符串返回给前端。前端通过沙箱中的支付宝网关? + 最终字符串,得到支付宝返回的数据

 

5.验签

https://docs.open.alipay.com/200/106120

将前端返回的数据得到后:参数(param)实例格式如下

{"alipay_trade_precreate_response":{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"},"sign":"VrgnnGgRMNApB1QlNJimiOt5ocGn4a4pbXjdoqjHtnYMWPYGX9AS0ELt8YikVAl6LPfsD7hjSyGWGjwaAYJjzH1MH7B2/T3He0kLezuWHsikao2ktCjTrX0tmUfoMUBCxKGGuDHtmasQi4yAoDk+ux7og1J5tL49yWiiwgaJoBE="}

这里得到其,键: alipay_trade_precreate_response所对应的value。{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"}  , 即是我们所需要待验签字符串。(如果是JSON格式,用strinfiy()方法将其转换为json字符串格式)。

然后用param得到加密方法,与签名。即sign_type,sign

再读取沙箱给的支付宝公钥,public_key

然后用这四项,value,sign,sign_type,public_key。进行验证签名

代码如下

Var verify;

verify.update(content);//content为value(待验签的数据)

verify.verify(publicKey, sign, 'base64')//验证签名,然后返回false,或者true。将其返回给客户端

 

参考文献:https://blog.csdn.net/njweiyukun/article/details/79478455