支付宝是我们支付的重头戏,为了搞定支付宝支付我们花费了大量的时间和精力,也趟过了无数的坑。而今天在生成支付宝小程序二维码的一个小接口上,我们又被坑了~~~
事故第一现场
下午忽然收到同事的呼救,说给的支付宝私钥有问题,一番校验,发现没有问题啊。看了下同事的问题,如下:
- 场景1,开发环境(windows)调试,发送接口请求,返回正常
- 场景2,发布到服务器(docker)环境,发送接口请求,返回失败。
错误异常如下:
rid:3cbfe2ae41f44b64b01f31b26a2197de , url:/xxx/xxxAppQrCode
Execute Time:54 ms
code:500,msg:ServerError: [Exception]:[serviceName]: [computerName]:c7bb3eb3867a [workPath]:/publish/ [processInfo]:13-dotnet [computerAddress]:172.17.0.7
[ExceptionMessage]:您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8
[ExceptionStackTrace]: at Aop.Api.Util.AlipaySignature.RSASignCharSet(String data, String privateKeyPem, String charset, Boolean keyFromFile, String signType)
at Aop.Api.Util.AlipaySignature.RSASign(IDictionary`2 parameters, String privateKeyPem, String charset, Boolean keyFromFile, String signType)
at Aop.Api.Util.AopUtils.SignAopRequest(IDictionary`2 parameters, String privateKeyPem, String charset, Boolean keyFromFile, String signType)
at Aop.Api.DefaultAopClient.Execute[T](IAopRequest`1 request, String accessToken, String appAuthToken)
at Aop.Api.DefaultAopClient.Execute[T](IAopRequest`1 request, String accessToken)
at Aop.Api.DefaultAopClient.Execute[T](IAopRequest`1 request)
呵呵,竟然遇到如此神奇的错误。
排查一:配置错误
检查开发环境的配置,对比服务器环境配置,一番拷贝、复制下来,发现配置完全一样。
此路不通啊!
排查2:度娘
为了帮助同事解决该问题,我开展了一下救援工作。搜索度娘,几下找到了博客园的解决办法。
调试支付宝条码支付的时候碰到个错误:您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8,
原因是我代码里的那私钥是直接复制pem文件里的代码的,可支付宝底层的sdk中默认是以文件的方式来进行,
方法引用
查看一下DefaultAopClient.cs,里面有一个自定义属性keyFromFile改成=false,则是用代码的方式进行,true的话则必须得传入pem的物理路径,如:HttpRuntime.AppDomainAppPath.ToString() + “App_Data\ant\rsa_private_key.pem”
这是一个点,回去问了下同事,说已经设定过了,开来这个坑比较深啊!
排查3:问经验丰富的支付宝开发专家
号称有3年的支付经验开发,继承了各大支付平台,是我司的栋梁之材!关键的时候,需要老将出马了!
一通电话下来,他说帮我试下:
- 支付宝私钥校验,通过
- 支付宝公钥校验,通过
- 本地调试,通过
- 看日志:卡在您使用的私钥格式错误,请检查RSA私钥配置。
55555,谁也帮不了我亲爱的同事了!看来是时候祭出我的神器了
搬出神奇的梯子,翻阅外文资料,一通翻,没啥帮助啊!看来捷径没有了,还得老老实实的看源码了~~~
排查4: github源码
源码地址:https://github.com/alipay/alipay-sdk-net-all
翻看了下源码,编码采用utf-8,没有问题,那就把源码拉下来吧,毕竟在docker容器内没法直接跟踪,不如把源码加载上,打印出来请求参数,看看到底啥情况。
说干就干,拉下来源码,换库。
咦,咦,这是什么啊?
我们亲爱的同事,引入了
<PackageReference Include="Alipay" Version="2.0.0" />
此库不支持.net core !
oh,my god!
我明白了,就是此库的问题,一定是。
看看官方的说明!!
我想死的心已经有了!
更换正确的包
还有什么说的,linux下需要特别的库,因此针对.net core的库才是首先。至于这个神奇的问题,也只能说.net framework 下的库在windows上也能运行在.net core ,是真的神奇!
好了,我大支付宝,不背你的烂锅!
愿天下没有神奇的手,则天下就没有神奇的坑!