签名

使用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. MySQL联表更新插入数据

    Error: DELETE FROM t_23andme_addref WHERE id IN (  SELECT min(id)  FROM t_23andme_addref   GROUP BY ...

  2. java线程用法

    package com; public class Demo { public static void main(String[] args) { // TODO Auto-generated met ...

  3. Android 进阶自定义 ViewGroup 自定义布局

    前言 在我们的实际应用中, 经常需要用到自定义控件,比如自定义圆形头像,自定义计步器等等.但有时我们不仅需要自定义控件,举个例子,FloatingActionButton 大家都很常用,所以大家也很经 ...

  4. [转]XMPP基本概念--节(stanza)

    本文介绍在XMPP通信中最核心的三个XML节(stanza).这些节(stanza)有自己的作用和目标,通过组织不同的节(stanza),就能达到我们各种各样的通信目的. 首先我们来看一段XMPP流. ...

  5. java List复制:浅拷贝与深拷贝

    Java的拷贝可以分为三种:浅拷贝(Shallow Copy).深拷贝(Deep Copy).延迟拷贝(Lazy Copy). 在java中除了基本数据类型之外(int,long,short等),还存 ...

  6. 图像处理之基础---卷积及其快速算法的C++实现

    头文件: /* * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com * * This program is free so ...

  7. 时间写入文件名 nohup 原理 Command In Background your shell may have its own version of nohup

    echo 123 > `date +%Y-%m-%d-%H.tmp` echo 123 > /home/`date +%Y-%m-%d-%H.tmp` nohup --help [root ...

  8. 【题解】 CF734F 【Anton and School】

    题解 CF734F [Anton and School] 传送门 这种将位运算和普通运算结合起来的题目要拆位来考虑,可以得到\(log_{2}(\)值域\()\)的算法,甚至将值域看成常数. 根据 \ ...

  9. 我的Android进阶之旅------>直接拿来用!最火的Android开源项目

    转载于CSDN,相关链接如下: http://www.csdn.net/article/2013-05-03/2815127-Android-open-source-projects http://w ...

  10. JavaScript toFixed() 方法注意点

    定义和用法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法 NumberObject.toFixed(num) 参数 描述 num 必需.规定小数的位数,是 0 ~ ...