asp.net(C#)网站实现在线支付功能?

Python012

asp.net(C#)网站实现在线支付功能?,第1张

1.支付只需要下载支付宝的ASP.NET语言的接口插件,用你的程序去调用即可(如果他提供了的话)

2.我简单说一下在线支付的原理:

假如您要使用支付宝的在线支付服务,您必须拥有一个支付宝的帐户,这是前提。

你的客户在线支付的时候,你的程序要把支付信息(如:要支付多少钱)、本次交易的编号(或者是密钥)、你的支付宝帐户、密码等信息(这些信息是支付宝接口规定的,按照他的说明去调用即可)通过支付宝插件接口提交给支付宝,这些信息对于用户来说都是不可见的,只是随后用户看见的就是支付宝网站的支付界面了,整个支付过程是在支付宝的网站上发生的。支付完成以后,支付宝会按照他的接口插件刚才使用的地址跳回你的网站,给用户显示支付成功。

所以用户是去支付宝的网站上支付的,你的网站只是通过官方的插件接口告诉支付宝,把钱支付到你的支付宝帐户而已,用户也没有什么不放心。

现在大多数支付都是这个原理,所以你也不必担忧,去找找支付宝的支付插件吧,不要下载第三方的,为了安全去支付宝网站上找,应该是个DLL文件,请参考一下这片文章:

http://www.book52.com/article/sort02/sort0161/info-21759.html

第一步:签订合约通过第三方拿到接口(可以邮件形式发送、也可以在第三方系统下载),拿到接口后,要确认下接口类型,是否是自己需要的接口,比如B2C接口、B2B接口等类型。

第二步:支付接口分很多语言版本,比如ASP、JSP、PHP、.NET语言版本,所以要选择与自己网站语言匹配的接口进行安装。商城网站的技术一般比较清楚商城的开发语言。

第三步:拿到的支付接口一般包括接口文档和接口代码示例,选择合适的接口代码示例,进行联调,比如自己网站是PHP开发的,就选择PHP代码示例联调。

第四步:接口联调的时候,需要第三方支付提供联调测试账号,方可以联调。联调除了需要联调账号除外,还需要该账号的支付密钥,联调过程中,有什么问题,可以直接找第三方支付技术支持给予协调处理。

第五步:接口联调通过后,可先换成生产环境账号,进行交易测试,测试没问题后,可以放到商城网站进行交易

AlipaySDKNet 是 .NET 平台下用于对接支付宝支付的官方 SDK。Alipay SDK for .NET 让您不用复杂编程即可访问支付宝开放平台开放的各项能力,SDK可以自动帮您满足能力调用过程中所需的证书校验、加签、验签、发送HTTP请求等非功能性要求。其 Nuget 链接如下:https://www.nuget.org/packages/AlipaySDKNet.Standard 。GitHub 开源地址为:https://github.com/alipay/alipay-sdk-net-all 。

要在程序中集成支付宝支付其实并不困难,只要谨记 .NET 程序要用的私钥格式是 PKCS1 且不把参数搞混问题应该都不大。

但是今天,却遇到一个大问题: 之前 正常工作的代码在更换了账户配置(APPID、私钥等)之后竟然报错了。

根据报错时的堆栈信息,该错误来自于方法:

本着先从自己找原因的原则冲头到尾检查了配置参数,PKCS1 格式是对的、私钥是对的、公钥是对的甚至点鼠标的手势也是对的。

尝试了 Java 语言的 DEMO (其采用的是 PKCS8 格式),这套参数也是可以正常工作的那就说明密钥本身是没问题的。

无奈之下只能通过 GitHub 将代码克隆到本地并引入项目开始调试。找到报错断点位于 RSAEncryptor 的 BuildRSAServiceProvider 方法:

https://github.com/alipay/alipay-sdk-net-all/blob/98fc187884d628d4268504bc0b93eb9a1aae417a/AlipaySDKNet.Standard/Util/Asymmetric/RSAEncryptor.cs#L234

这个方法的作用是读取 PKCS1 格式私钥并构建 RSACryptoServiceProvider ,但转换过程略显过时。其实,.NET 在 netstandard-2.1 时已经提供了名为 ImportRSAPrivateKey 的方法用于导入密钥,这段代码可以直接被替换掉。

首先需要将 AlipaySDKNet.Standard 的目标框架修改为 netstandard2.1 ,接着使用以下代码替换 BuildRSAServiceProvider 方法:

再次编译项目,已经可以正常下单使用了。

换一个密钥也许是最简单的方案。想要向阿里反馈这个问题,却发现该仓库并未开放 Issues 功能。我也想退而求其次,不要在项目中引入整个 SDK 的源代码(它太大了,有一万五千多个文件)只对 SDK 打补丁。但我发现这很难做到:DefaultAopClient 的实现看上去很复杂,而且 BuildRSAServiceProvider 被定义为了一个私有的静态方法。

我当然不能把我现在使用的私钥共享出来,但我做了一些工作又生成了一个会报错的私钥(PKCS1 格式):

你也可以使用以下代码尝试生成并测试,该代码循环100次,并尝试用阿里 SDK 提供的方法对密钥进行转换:

经测试,一百次生成中大概会有 2-4 次遇到异常密钥。

如果你遇到了和笔者一样的问题,并且通读本文解决了你的问题。那么恭喜你,你大概就是天选之子,下班后去买彩吧,说不定能中大奖。

受制于笔者的浅薄,本文并没有找到 BuildRSAServiceProvider 不能正确加载私钥的原因,但使用另一种方法规避了该问题。这让我更加坚信,即便是大厂的作品也不是完美无瑕。

简单总结一下:如果你遇到了本文所述的问题,那么就重置一下密钥吧。植发毕竟太贵了。

阅读原文:支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。-码农很忙