node接入支付宝当面付报错

今天搞支付宝当面付功能,搞了一天,搞死个人,无数次想砸电脑,因为没钱都忍住了。

各种报错,搞的我都无数遍怀疑人生。终于解决了,记录下遇到的bug问题。

支付宝当面付,官网是没有node程序的demo的。只有java,.Net,PHP这就是node接入带来了巨大的困难。

连Node的SDK在那里,也是翻了好久才找到。我以为只有腾讯的文档写的烂的,阿里也是彼此彼此。另外,这SDK使用说明写的也是非常简略,然后看完不知所以。

吐槽完了,开始正文。

按照官方的文档,要想使用当面付,需要设置生成公钥和私钥。官网很“贴心”的为我们提供了生成密钥的工具。密钥工具下载 - 支付宝文档中心 (alipay.com)

但是最大的问题就是在这里,官网提供的工具不合适Node,这就是为啥我今天搞了一天了,老不对的原因。

1. Error: error:0909006C:PEM routines:get_name:no start line - node

出现这个错误的原因,是公钥和私钥的格式不对。使用支付宝“密钥工具”生成的密钥文件,直接存放的是密钥的值,却没有加格式。
如果你用fs读取文件来获取密钥的话,就会出现这个bug。

密钥文件格式为

1
2
3
4
5
-----Begin <Type>-----

Key Information

-----End <Type>-----

详情可以查看这个链接:docusignapi - Error: error:0909006C:PEM routines:get_name:no start line - node - Stack Overflow

同理如果你直接这样子使用密钥,也是不对的,也是缺少格式。

1
2
const privateKey = '密钥内容';
let xxx = crypto.createSign('RSA-SHA256').update(str, 'utf8').sign(privateKey, 'base64');

正确的格式应该是这样子

-----BEGIN ${type}-----\n${privateKey}\n-----END ${type}-----;

Type是你编码方式+文件名 比如’PRIVATE KEY’ 或者 ‘RSA PRIVATE KEY’

我之前自己写代码实现当面付功能,结果折腾了半晌以失败告终。

2.ERR_OSSL_DSO_COULD_NOT_LOAD_THE_SHARED_LIBRARYError: error:25078067:DSO support routines:win32_load:could not load the shared library

这个据说是OpenSSL版本不兼容引起的。删掉重新装1.1.1版本的就可以

(37条消息) windows10 17272:error:25078067:DSO support routines:win32_load:could not load the shared library_浅拷贝的博客-CSDN博客

3.error:0D06C03A:asn1 encoding routines:asn1_d2i_ex_primitive:nested asn1 error”]

这个错误,百度google的结果五花八门,我一直怀疑是window不兼容引起的,后来我放到linux上还是这样。翻来覆去,搞了好久好久,才知道是加密方式node不兼容。

这就是“密钥工具”最坑人的地方,生成的密钥不兼容node,也不说。

解决办法就是把私钥由PKCS8装成PKCS1就可以了。

可以看这个文档格式转换 - 支付宝文档中心 (alipay.com)

总结,暂时遇到问题就这么多,但是都够恶心的。