支付宝AopSdk在dotnet core下的实现
随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移。之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framework,不过还好提供了源码的下载。
本着不重复造轮子的想法,先NuGet搜了下,已经有不少实现了,仔细比较了下,最终选择了AliPay.AopSdk.Core。主要原因是在git上开源,再有就是用的人也比较多。
AliPay.AopSdk.Core项目本身很优秀,与阿里官方的Sdk基本完全一致,主要是变更了一些命名不规范的方法。很快修改完成,简单的测试了下就上线了,却不想留了个坑。
上线不久,所有用户无法支付了。登陆服务器(CentOS 7)报的异常是Too many open files in system,额,查下看看先。
ps -ef | grep dotnet 找出服务的pid,这里是14689
cat /proc/14689/limits 看看系统的限制
Max open files 4096 话说已经不少了呀
lsof -p 14689 | wc -l 统计下一共打开了多少,一看,霍,真不少满了
lsof -p 14689 看下都是哪些,发现有大量的未销毁的TCP链接
看着IP比较眼熟,似乎是阿里的,ping 下支付的服务域名 openapi.alipay.com,嗯,就是它,至此定位到了问题。
先紧急处理下,重启支付的服务,然后做下配置,把Max open files放大些。因为我的服务是用systemctl管理的,所以只需要配置 xxx.service就好。
在[Service]下面增加一行配置
LimitNOFILE=10240
重启服务后,重新拿到pid,看下limits,嗯,生效了
先扛着用下,然后来分析问题。
庆幸自己选择了开源的项目,很容易看代码。
这两句,作者实现了池,导致的。然后才回头开始看项目的文档,使用说明中用DI注入了一个IAopClient的单例,额,我是每次new出来的,所以xxxxxxxx。
至此似乎解决了,但完全没有。这个项目单例注入,已经固定了支付宝的商户号等参数,但我实际的业务需要多个支付宝账户,每次根据取到商户号来赋值。
处理思路:
本来想做个工厂,自己实现个单例,根据不同的商户号返回不同IAopClient的实现实例。仔细一想以为商户比较多,仍然存在大量的不必要的链接。最后决定,自己拿阿里的源码,改个core的版本吧。还是重复造轮子了。说干就干,先下个最新的源码,我这里是alipay-sdk-net-core-3.2.0,新建个dotnet core的Library,把需要的文件copy进来(主要是去掉了Test目录),编译下,报错。源码中包含了Jayrock,用来处理JSON,git上看了下,好老的项目,已经停止更新了,不知道为什么阿里还在用。不过还好NuGet装下System.Configuration.ConfigurationManager就一切ok了。还有些warning暂时没有理会。本机测试下(windows 10),一切OK。放到测试服务器(CentOS 7)上测试下,额,报错“您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8“,这是什么鬼。看看源码,不知所踪。这下比较麻烦了,本机没问题,远程测试环境不行,目测肯定是系统的差异了。脑子里蹦出来的办法--远程调试。嗯,没错,就这么弄(具体远程调试另一篇文档)。最后发现,果然是操作系统的差异,RSACryptoServiceProvider这个类,只支持windows系统。找到问题就好办了,替换掉。具体实现嘛懒了懒,直接拿的Alipay.AopSdk.Core项目中的实现。publish一个版本,到测试服务器上,嗯,问题解决。
非常感谢Alipay.AopSdk.Core项目作者,源码提供了很大的帮助。
参考资料:
https://github.com/dotnetcore/Alipay.AopSdk.Core
可以使用的版本
https://github.com/draweye/AopSdkCore
支付宝AopSdk在dotnet core下的实现的更多相关文章
- Dotnet Core下的Channel, 你用了吗?
今天给大家分享一个微软官方的好东西:Channel. 前言 今天给大家分享一个微软官方的生产者/消费者方案的特性解决:Channel. Channel在System.Threading.Chann ...
- 【redis】在dotnet core下的redis的使用
1.Install-Package Microsoft.Extensions.Caching.Redis -Version 2.2.0 2.注入 services.AddDistributedRedi ...
- .net core下使用FastHttpApi构建web聊天室
一般在dotnet core下构建使用web服务应用都使用asp.net core,但通过FastHttpApi组建也可以方便地构建web服务应用,在FastHttpApi功能的支持下构建多人聊天室是 ...
- dotnet core高吞吐Http api服务组件FastHttpApi
简介 是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件,它并没有完全实现HTTP SERVER的所有功能,而是只实现了在APP和WEB中提供数据服 ...
- ubuntu15.10 或者 16.04 或者 ElementryOS 下使用 Dotnet Core
这里我们不讲安装,缺少libicu52自行安装. 安装完成后使用dotnet restore或者build都会失败,一是报编译的dll不适合当前系统,二是编译到ubuntu16.04文件夹下会产生一些 ...
- 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(下)
写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...
- 【Step By Step】将Dotnet Core部署到Docker下
一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...
- 解决 dotnet core 1.x 命令行(cli) 下运行路径错误
环境: Windows 10,Visual Studio 2017 centos 7,nginx,supervisor,dotnet core 1.1 问题: 在 Linux 配置 superviso ...
- dotnet core linux 接入支付宝H5支付,提示:System.PlatformNotSupportedException","Message":"'CspParameters' requires Windows Cryptographic API (CAPI), which is not available on this platform.
用的官方提供的demo,实际上部署后却出现了上图的错误.和技术支持沟通无效后,走上了不归路. 在微软的github dotnet/core开源库提交了issue后,终于获得了解决.附上链接:https ...
随机推荐
- 说说 Vue.js 中的 v-cloak 指令
可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除. 当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示 ...
- HTML5之图片转base64编码
之前在群里看到很多小哥哥小姐姐讨论关于图片base64互转的方法,刚好我之前用到的一个方法给大家分享一下. <!Doctype html><html> <head> ...
- #3145. 「APIO 2019」桥梁
#3145. 「APIO 2019」桥梁 题目描述 圣彼得堡市内所有水路长度总和约 282 千米,市内水域面积占城市面积的 7%.--来自维基百科 圣彼得堡位于由 \(m\) 座桥梁连接而成的 \(n ...
- 01-Git单人本地仓库操作
Git源代码管理 Git(多人协同开发同一个项目),作用就是源代码管理,为什么需要源代码管理呢,方便多人协同开发,并且方便版本控制. Git管理源代码特点: 1.Git是分布式管理.服务器和客户端都有 ...
- pytest框架之pytest-html报告生成
一.关于安装 pytest-html属于pytest的一个插件,使用它需要先安装 pip install pytest-html pytest可以生成多种样式的结果: 生成JunitXML格式的测试报 ...
- poj-3682 King Arthur's Birthday Celebration
C - King Arthur's Birthday Celebration POJ - 3682 King Arthur is an narcissist who intends to spare ...
- Javase之object类的概述
object类的概述 object类是类层次结构的根类,每个类都使用object作为超类. 即每个类都直接或间接的继承object类. object类中方法介绍 hashCode public int ...
- ble蓝牙扫描几种方式
有空再更新内容 方式一BluetoothAdapter层扫描回调 在高版本api已过时 方式二BluetoothLeScanner层扫描回调 android>= 5.0之后的版本推荐使用 方式三 ...
- JS中的NaN和isNaN,简直是双重人格?
number数字类型 包括数字和NaN,NaN:not a number 但是它是数字类型的 isNaN的用法:检测当前值是否不是有效数字,返回true代表不是有效数字,返回false是有效数字 ...
- 2019年上半年收集到的人工智能Python编程干货文章
2019年上半年收集到的人工智能Python编程干货文章 一文了解Python深拷贝与浅拷贝问题 Python广度优先查找和深度优先查找(内附python教程分享) Python基础之函数2 (参数的 ...