今天搞支付宝当面付功能,搞了一天,搞死个人,无数次想砸电脑,因为没钱都忍住了。
各种报错,搞的我都无数遍怀疑人生。终于解决了,记录下遇到的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 | -----Begin <Type>----- |
详情可以查看这个链接:docusignapi - Error: error:0909006C:PEM routines:get_name:no start line - node - Stack Overflow
同理如果你直接这样子使用密钥,也是不对的,也是缺少格式。
1 | const privateKey = '密钥内容'; |
正确的格式应该是这样子
-----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版本的就可以
3.error:0D06C03A:asn1 encoding routines:asn1_d2i_ex_primitive:nested asn1 error”]
这个错误,百度google的结果五花八门,我一直怀疑是window不兼容引起的,后来我放到linux上还是这样。翻来覆去,搞了好久好久,才知道是加密方式node不兼容。
这就是“密钥工具”最坑人的地方,生成的密钥不兼容node,也不说。
解决办法就是把私钥由PKCS8装成PKCS1就可以了。
可以看这个文档格式转换 - 支付宝文档中心 (alipay.com)
总结,暂时遇到问题就这么多,但是都够恶心的。