Node.js集成支付宝接口注意事项
2024-08-27 21:34:30
签名
使用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" );
}
总结
- 在node中请求参数和响应参数都要转换为gbk才能正常签名和验签。
- 如果你使用的是沙箱模式,请注意请求参数
time_express
订单超时时间不能设置超过15h(尽管文档说明最大可以设置15d),否则支付宝无法响应订单。- noical_url不响应,可能是响应头:
'content-type' : 'application/x-www-form-urlencoded; text/html..
的问题,导致bodyparse解析不出来,可以在bodyparse之前增加一个中间件,判断响应头是否从支付宝过来的,然后修改为正常的'content-type' : 'application/x-www-form-urlencoded'
。- 如果验签不通过,最好用支付宝自带的验签工具测试下,如果依然不行那可能是你用的公钥不对,不能使用应用公钥,应该使用支付宝公钥。
最新文章
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
- Topology and Geometry in OpenCascade-Vertex
- NPN&;PNP
- HTML5 学习笔记--------》HTML5概要与新增标签!
- codeforces 681D Gifts by the List dfs+构造
- char 与 unsigned char的本质区别
- Oracle学习(十):视图,索引,序列号,同义词
- C# 如何获取当前应用程序的父目录
- Objective-c正确的写法单身
- 可用于Windows Server 2008 R2的Xbox One手柄、接收器驱动
- php开发微信APP支付接口
- 无法执行该VI,必须使用LabVIEW完整版开发系统才可以解决该错误
- C语言排序算法学习笔记——插入类排序
- 一套简单的git版本控制代码
- PHP到底有多牛?你所知道的网站都在用它
- zabbix链接规则
- 别人的Linux私房菜(12)正则表达式与文件格式化处理
- 【Python31--pickle函数】
- mac上为nodejs设置环境变量
- x window的奥秘
热门文章
- 【翻译自mos文章】执行utlpwdmg.sql之后报ORA-28003, ORA-20001, ORA-20002, ORA-20003, ORA-20004 错误
- linux查看磁盘挂载的三种方法
- 怎样实现动态加入布局文件(避免 The specified child already has a parent的问题)
- ASP.NET动态网站制作(12)-- JQ(4)
- EasyDSS流媒体视频实时回传与录像管理解决方案
- ddchuxing——php面试题及答案
- Wireshark学习笔记——怎样高速抓取HTTP数据包
- php分10个不同等级压缩优化图片(PNG)
- 常用BAPI list
- Java for LeetCode 124 Binary Tree Maximum Path Sum