签名

使用node.js自带的加密模块crypto和字符编码模块iconv-lite

根据支付宝接口文档参数格式得到签名之前的字符串beforeSignStr,然后一定要编码为gbk格式再进行签名。

let crypto = require('crypto');
const iconv = require('iconv-lite'); // RSA2签名
function getSign( beforeSignStr ) {
let sign = crypto.createSign('RSA-SHA256');
return sign.update( iconv.encode( beforeSignStr, "gbk" ) ).sign( 私钥字符串, "base64" );
}

发送请求表单

我这里是直接参考支付宝PHP接口SDK写的,注意:表单字符串编码也要设置为gbk

//请求表单
function getRequestForm( requestBody ) {
let form = "<form id='alipaysubmit' name='alipaysubmit' action='" + 请求支付宝url + "' accept-charset='gbk' method='POST'>";
for( let key in requestBody ) {
form += "<input type='hidden' name='" + key + "' value='" + requestBody[key] + "'/>";
}
form += "<input type='submit' value='ok' style='display:none;'></form><script>document.forms['alipaysubmit'].submit();</script>";
return form;
}

验签

验签需要用到加密模块crypto、字符串编码模块iconv-lite、url编码模块urlencode

根据支付宝接口文档参数格式得到验签之前的字符串beforeVerifyStr,然后一定要编码为gbk格式再进行签名。

let crypto = require('crypto');
const urlencode = require('urlencode');
const iconv = require('iconv-lite'); // 得到验签结果
function getVerifySign( beforeVerifyStr ) {
let verify = crypto.createVerify('RSA-SHA256');
return verify.update( iconv.encode( urlencode.decode( beforeVerifyStr, "gbk" ), "gbk" ) ).verify( 公钥字符串, 支付宝响应签名, "base64" );
}

总结

  1. 在node中请求参数和响应参数都要转换为gbk才能正常签名和验签。
  2. 如果你使用的是沙箱模式,请注意请求参数time_express订单超时时间不能设置超过15h(尽管文档说明最大可以设置15d),否则支付宝无法响应订单。
  3. noical_url不响应,可能是响应头:'content-type' : 'application/x-www-form-urlencoded; text/html..的问题,导致bodyparse解析不出来,可以在bodyparse之前增加一个中间件,判断响应头是否从支付宝过来的,然后修改为正常的'content-type' : 'application/x-www-form-urlencoded'
  4. 如果验签不通过,最好用支付宝自带的验签工具测试下,如果依然不行那可能是你用的公钥不对,不能使用应用公钥,应该使用支付宝公钥。

Node.js集成支付宝接口注意事项的更多相关文章

  1. React-Native 获取node.js提供的接口

    一个简单的React-Native 获取node.js提供的接口的实现 一.node.js var http = require("http"); var url = requir ...

  2. PhantomJS笔记,Node.js集成PhantomJS

    PhantomJS笔记,Node.js集成PhantomJS 转 https://www.linchaoqun.com/html/cms/content.jsp?menu=index&id=1 ...

  3. Android应用集成支付宝接口的简化

    拿到支付宝接口的andriod demo后有点无语,集成一个支付服务而已,要在十几个java类之间引用来引用去,这样不仅容易导致应用本身代码结构的复杂化,调试起来也很累,于是操刀改造之: 该删的删,该 ...

  4. node.js:《接口实现文件的上传和下载》

    使用node.js写上传文件和下载文件的接口 上传接口: 开始写接口前,我们先安装一个上传文件的插件:npm install multer 安装成功在package.json或package-lock ...

  5. Android集成支付宝接口 实现在线支付

    手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...

  6. node.js简单数据接口开发

    随着网络时代的快速发展,前端开发不仅仅是做出漂亮的页面就可以了,还要会一点后端语言,那么后端语言有Java,php,node.js最常见,那我们应该学哪一种呢,为了让我们自己更好的学习,我推荐选择no ...

  7. 【Node.js】二、基于Express框架 + 连接MongoDB + 写后端接口

    在上节,我们讲了如何搭建express环境,现在我们说说如何通过node.js写服务接口给前端调用 1. 首先通过MongoDB建好数据库与表格 例如,我的数据库名字为db_demo,数据库表格为go ...

  8. Node.js中的模块接口module.exports浅析

    在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.这里作者对此做了个简单 ...

  9. Node.js中的模块接口module.exports

    在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.在此做了个简单的总结. ...

随机推荐

  1. 调试Scrapy过程中的心得体会

    1.大量抓取网页时出现“Memory Error”解决办法:设置一个队列,每当爬虫空闲时才向队列中放入请求,例如: from scrapy import signals, Spider from sc ...

  2. 解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded

    Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\wwwroot\ry.php on line 11 意 ...

  3. Xcode iphone模拟器运行不流畅

    xcode该需要多高的配置......把这个取消就好了

  4. 1355: [Baltic2009]Radio Transmission[循环节]

    1355: [Baltic2009]Radio Transmission Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 796  Solved: 538 ...

  5. Runnable 和 Callable的区别

    Runnable 与 Callable的区别: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable ...

  6. 使用OpenSessionInViewFilter的注意事项

    假设在你的应用中Hibernate是通过spring 来管理它的session.如果在你的应用中没有使用OpenSessionInViewFilter或者OpenSessionInViewInterc ...

  7. 九度OJ 1033:继续xxx定律 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4987 解决:1201 题目描述:     当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数, ...

  8. 九度OJ 1014:排名 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8267 解决:2469 题目描述:     今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分 ...

  9. JavaScript 四种显示数据方式

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 认识影片版本(CAM、TS、TC、DVD、HD、BD、TVRIP等)

    许多朋友在下载电影的时候, 往往会被各种各样的版本标识弄糊涂,今天把各种版本的缩写收集在一起,希望对大家有所帮助 . 引用: 1.CAM(枪版)    CAM 通常是用数码摄像机从电影院盗录.有时会使 ...