python+alipay支付宝支付接入(沙箱测试)
本文依据自己的理解和开发编写的流程中间可能有些逻辑问题欢迎大佬指出。
本文主要说的是沙箱接入,正式应用需要注册应用的步骤。如果你想接入正式应用建议先把沙箱搞通。原因其一正式应用就是换appid的事,其二正式应用搞坏了折的是真钱!!
调试支付宝支付需要先 在 支付宝开放平台 进行注册,入驻为 “自助研发者”;链接为
第一次进入需要填写详细信息 - 注意:切换为 自研开发者
完善个人信息后,在个人管理后台可看到 “沙箱” 服务
注:沙箱为支付宝提供的调试支付的测试环境,在该环境下,可模拟和调试支付流程
具体位置如下: 开发者中心 - 首页
点击 研发服务 - 进入沙箱后, 在沙箱应用选项中可以看到支付宝提供的测试应用
注:当您的网站上线运营时,需要在开放平台申请一个应用;并填写相关信息审核后,方可使用支付功能;沙箱应用为支付宝提供开发者测试用的应用
支付过程中涉及到请求和响应的签名校验;
在linux终端中 输入openssl 进入 交互环境
RSA 钥匙用途
公钥加密/私钥解密
私钥签名/公钥验签
点击 沙箱应用展示信息页中的 RSA2密钥 的 设置/查看
提交我方公钥后,弹框会显示 支付宝公钥;该公钥需要复制保存下来;
保存流程如下:
支付时序图
如何配置收费公司的支付宝信息
1.1、首先,登录支付宝开放平台,登录后,如果您是首次登陆,会让您选择入驻账号类型,选择“自研开发者”即可。
随后进入到开发平台的首页,依次点击“网页移动应用列表-支付接入”创建新应用。
1.3、设置应用公钥
1.2、进入创建应用的页面后,填写应用名称,设置应用图标,选择应用类型为“网页应用”。
应用名称可考虑填写公司名称或品牌名称,不能带有“测试”、“Test”等文字;
网址url可填可不填,不填也可以正常创建应用;
如果想要填写,可输入已备案的一级域名,域名开头需带上http或https,否则无法创建应用,如下图示例。
创建应用后会直接生成APPID,在页面左上方。
APPID需要填写在建站支付设置中的如下位置:
1.3.1、在“应用信息-开发设置-接口加签方式”处点击“设置”
1.3.2、弹出窗口中,选择加签模式为“公钥”。若已有公钥,可直接填写在下方输入框内。若无,则点击“支付宝密钥生成器”。
1.3.3、然后根据电脑系统,选择下载密钥生成工具。
1.3.4、下载该工具后,解压并打开文件夹,运行“RSA签名验签工具.bat”(WINDOWS)或“RSA签名验签工具.command”(MAC_OSX)
1.3.5、运行后,弹出如下窗口,根据开发语言选择密钥格式(一般是默认Java),选择密钥长度(2048位),点击“生成密钥”,会自动生成商户应用公钥和商户应用私钥,可直接“复制公钥”到步骤1.3.2的窗口填写。
(注意:如果运行后,弹窗的窗口不是如下样式,您有可能下载的是旧版工具,麻烦返回步骤1.3.3中点击蓝色文字下载新版工具生成密钥)
也可打开“密钥文件路径”,可以看到本地文件夹已有应用公钥和私钥的文件,打开对应文件进行复制到步骤1.3.2的窗口也是可以的。
填写应用公钥后,会生成相应的支付宝公钥,而建站支付设置里要的是支付宝公钥,支付宝公钥,支付宝公钥!重要的事情说三遍!)
设置完应用名称,应用图标,应用公钥后,即可提交审核,审核通过,应用上线。
四、公钥和私钥,加密和数字签名
本文涉及到支付宝SDK的内容,均摘自支付宝开放平台。
因为支付宝SDK使用RSA来加密和生成数字签名,所以本文中涉及到的概念也都是针对于RSA的。
一对儿密钥生成后,会有公钥和私钥之分,我们需要把私钥保存下来,而把公钥发布出去。一对儿公钥和私钥,不能由其中一个导出另一个。
比如使用支付宝SDK的时候,我们商户端会生成一对儿密钥A和B,A是私钥,B是公钥,支付宝也会生成一对儿密钥C和D,C是私钥,D是公钥。我们商户端需要把商户端私钥A保存下来,而把商户端公钥B发布出去给支付宝,支付宝需要把支付宝私钥C保存下来,而把支付宝公钥D发布出去给我们商户端。
加密是指我们使用一对儿密钥中的一个来对数据加密,而使用另一个来对数据解密的技术,需要注意的是公钥和私钥都可以用来加密,也都可以用来解密 ,并不是规定死了只能用公钥加密私钥解密,但是加解密必须是一对儿密钥之间的互相加解密,否则不能成功。
加密的目的是为了保证数据的不可读性,防止数据在传输过程中被截获。
知道了加密这个概念,我们先看一下支付宝的加密过程,再引出数字签名这个概念。接着第1小节的例子,当我们商户端和支付宝互相发布了公钥之后,我们商户端手里就有 商户端私钥 和 支付宝公钥 两个密钥,支付宝手里也有 商户端公钥 和 支付宝私钥 两个密钥。现在假设我们商户端要给支付宝传输订单信息,那么为了保证传输订单信息时数据的安全性,结合我们商户端手里所拥有的密钥,可以有两套加密方案
貌似这两套加密方案都能达到对订单信息加密的效果,而且如果采用方案二,我们商户端甚至只需要存储支付宝公钥这一个密钥,都不用去申请一对儿商户端的公私钥来维护,支付宝也不用保存我们一堆商户那么多的商户端公钥了,这不是更简单吗,那为什么支付宝开放平台让我们采用的是方案一而不是方案二呢?下面来回答一下。
支付宝开放平台说明:当我们采用RSA(1024位密钥)来加密的时候,支付宝分配给所有商户的支付宝公钥都是一样的,即支付宝针对那么多的商户只负责维护一对儿支付宝公私钥,这就意味着支付宝公钥随便什么人拿到后都是一样的;而当我们采用RSA2(2048位密钥)来加密的时候,支付宝会分配给每个商户单独的一个支付宝公钥,即支付宝为每一个的商户单独的维护一对独立的支付宝公私钥,当然一个商户下的多个App的支付宝公钥是一样的。RSA是早就支持的,RSA2是最近才支持的。
知道了上面这段话,现在假设我们采用的是方案二,并且采用RSA加密(很多老业务并没有使用RSA2加密),业务逻辑将会是下面这样。
这就出问题了, RSA加密下,支付宝公钥是公开发布的,而且所有的商户用的都是同一个支付宝公钥(上面声明了RSA2加密下,支付宝才针对每个商户维护了一对儿公私钥),攻击者很容易就能获取到,而 notify_url 也很容易被截获,那攻击者拿到这两个东西就可以做和商户一样的操作来发起支付请求,这样就会一直给小明充钱了。
所以 支付宝就需要确认支付请求确实是商户发给他们的,而不是攻击者发给他们的。 这就用到了 数字签名 ,我们会通过方案一的实现流程来引出数字签名的具体概念。如果我们采用的是方案一,我们商户端保存的就是商户端私钥和支付宝公钥,而支付宝保存的就是需要存着商户端公钥和支付宝私钥的,业务逻辑将会是下面这样。
这样就可以保证交易的安全性了,我们也可以看出使用支付宝SDK保证交易的安全性注重的其实不是订单信息是否加密,而是如何确保商户端和支付宝能够互相确认身份,订单信息是明文的,但是后面拼接了数字签名。
数字签名其实就是明文数据加密之后得到的一个密文,只不过它是用私钥加密生成的而已,我们一般会把数字签名拼接在明文数据后面一起传递给接收方,接收方收到后用公钥解密数字签名,从而验证发送方的身份、以及明文数据是否被篡改。数字签名的生成过程其实就是一个加密过程,数字签名的验签过程就是一个解密过程。
数字签名的目的有两个:一、发送方和接收方互相验证身份;二、验证数据是否被篡改。
从上面第一部分我们知道为了确保商户和支付宝交易的安全性,约定采用的是给订单信息加数字签名传输的方式。支付宝也为我们提供了 一键生成RSA密钥的工具 ,可以帮助我们很快的生成一对商户端公私钥。以下会对支付宝SDK的支付流程做个大概的解释,并点出实际开发中我们使用支付宝SDK时应该注意的地方。
由我们商户端自己生成的RSA私钥(必须与商户端公钥是一对),生成后要保存在服务端,绝对不能保存在客户端,也绝对不能从服务端传输给客户端。
用来对订单信息加签,加签过程一定要在服务端完成,绝对不能在客户端做加,客户端只负责用加签后的订单信息调起支付宝来支付。
由我们商户端自己生成的RSA公钥(必须与商户端私钥是一对),生成后需要填写在支付宝开放平台。
用来给支付宝服务端验签经过我们加签后的订单信息,以确保订单信息确实是我们商户端发给支付宝的,并且确保订单信息在传输过程中未被篡改。
这个和我们就没关系了,支付宝私钥是他们自己生成的,也是他们自己保存的。
用来对支付结果进行加签。
支付宝公钥和支付宝私钥是一对,也是支付宝生成的,当我们把商户端公钥填写在支付宝开放平台后,平台就会给我们生成一个支付宝公钥,我们可以复制下来保存在服务端,同样不要保存在客户端,并且不要传输给客户端。
用来让服务端对支付宝服务端返给我们的同步或异步支付结果进行验签,以确保支付结果确实是由支付宝服务端返给我们服务端的,而且没有被篡改,对支付结果的验签工作也一定要在服务端完成。
上面已经说过了: 订单信息的加签和支付结果的验签是一定要在服务端做的,绝对不能在客户端做。
下面是在客户端对订单信息加签的过程,仅仅是为了模拟服务端来表明订单信息是如何通过加签最终转变为orderString的, 千万不要觉得订单信息的加签过程也可以放在客户端完成 。
假设我们服务端收到了来自支付宝服务端的支付结果,即: 支付结果+数字签名 。
那么我们服务端就会对支付结果进行验签,怎么个验法呢?
支付宝、微信支付(国内、国际版)走过的坑
目前为止,已经完成了支付宝(国内国际版)、微信(国内国际版)的开发,包括h5、微信公众号、app的支付开发。其中走过了很多的坑,记录下来,以后做这方面的朋友可以少走一些坑。接下来我也将从国内国际两个方向记录一下。
1、在生成公钥私钥以后,要上传公钥到支付宝开放平台获取支付宝公钥,以及公钥私钥在接口如何使用的就不具体讲了,遇到签名问题的时候请使用支付宝验签工具验证。另外需要注意一点,坑了我将近两小时的问题,我在收到支付宝异步回调的时候,是可以延签通过的,然后我进入到支付宝联调工具中把刚才回调的地址重新访问一遍,这个时候是需要注意的,因为这个时候已经将回调的参数拼接在了url后面,RSA加签出来的签名是有特殊字符的,然后就一直延签不通过。
2、微信方面由于没有sdk,所以需要自己写的部分相对多一些,其中在与ios对接的时候,发现死活调不起来微信,但是安卓却可以,浪费了将近半天的时候,最后修改了一个参数的长度,发现ios可以了。其中在调起支付接口中有一个参数timestamp,注意这个参数长度是10位的,但是java的时间戳长度默认是13位的,后来改成了10位就可以了。另外国内版微信有公众号支付、h5支付、app支付,分别是三种不同的接口。h5支付和app支付都可以在微信开放平台中申请的,但是公众号却需要在商户平台去绑定公众号的appid,这点需要注意一下,是需要不同的appid的,但是商户号可以使用同一个。
国际版的一个最大的特点就是效率慢,太慢了。相比国内多的接口就是报关接口。
国际版支付宝和国内的完全不同,使用的网关是mapi开头的地址,另外如果使用rsa的话,公钥是需要发送邮箱到支付宝海外团队的(需要他们返回支付宝公钥),在做国际版支付宝的时候遇到的一个最大的问题就是签名问题,支付宝延签工具也可以,客服也问了好久,可就是在唤醒的时候一直报签名错误,传递参数的值(包括sign)中如果存在特殊字符(如:、@、/、+、{}等),那么该值需要做URL Encoding,这一点一定要特别注意,一定要做url encoding操作,不然会坑死自己的。另外国际版支付宝是需要有资金单位的,还没有rmb结算的时候,所以在开发的时候统一使用了美元。
国际版微信在申请填写手机号的时候不要加+86,不然你会收到设置api密钥的时候收不到短信的魔咒。另外国际版微信是需要商户号和appid手动绑定的
支付宝公匙 是什么?
恰切地说是支付宝公钥、私钥。
公钥与私钥是用于信息加解密,用公钥加密的文件只能用私钥解密,而私钥加密的文件只能用公钥解密。为发送一份保密报文,发送者必须使用接收者的公共密钥对数据进行加密,一旦加密,只有接收方用其私人密钥才能加以解密。
公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。
对于支付宝公钥验签工具和支付宝公钥验签工具是什么的总结分享本篇到此就结束了,不知你从中学到你需要的知识点没 ?如果还想了解更多这方面的内容,记得收藏关注本站后续更新。
还没有评论,来说两句吧...