支付宝沙箱环境
开通沙箱(从头开始)
1. 访问支付宝开放平台
2. 用自己的真实的支付宝账号登录后,访问控制台
扫码登录,完事之后,点击控制台,并进入控制台。
3. 按照提示录入信息
然后弹出框这里直接叉掉即可。
4. 在控制台中,下拉选择"沙箱"
如果你从未开通过"沙箱"环境,那么你进入的应该是下面的图片所示的页面,反正找到"沙箱"即可。
5. 进入到沙箱应用界面
开通沙箱(一步到位)
1. 直接访问下面的连接进入到沙箱应用
如果提示扫码登录,就用支付宝扫码登录即可。
登录成功,就能进入到支付宝沙箱应用后台。
说明
当你登录到沙箱后台之后,后台页面中你应该留意这些信息。
沙箱应用菜单
这个菜单中,对我们有用的信息有。
- 网页/移动应用:就是咱们在浏览器打开的网页和手机APP中进行支付宝支付的选项。
- 小程序:这个小程序不是微信小程序,而是支付宝APP中的小程序。
- 应用信息:这个选项中我们在沙箱环境中用到的参数有:
- APPID,这个是必须的。
- 接口加签方式:在沙箱环境中,我们选择系统默认秘钥:
- 公钥模式,沙箱环境中,我们采用的模式。
- 当你点击启用之后,点击查看,弹出框,会有三个秘钥,而我们用到的是下面这两个:
- 应用私钥,根据你的编程语音,决定是Java语言还是非Java语言。
- 支付宝公钥。
- 证书模式,在沙箱环境中,我们通常不采用这个模式,但当脱离沙箱环境,项目上线之后,有些接口,需要用到这个证书模式,比如涉及到资金支出类的接口,必须用证书模式进行加签。
- 公钥模式,沙箱环境中,我们采用的模式。
- 支付宝网关地址,无论是否是沙箱环境,都需要有支付宝网关地址(只不过地址不一样而已),这个接口负责处理我们的业务。
- 而且沙箱环境的支付宝网关地址,由于沙箱环境经历过升级之后,这个地址也变了,你需要注意的,你用的是新版的沙箱还是旧版的沙箱,不要搞错了。
- 新版沙箱的网关地址:https://openapi-sandbox.dl.alipaydev.com/gateway.do
- 旧版沙箱的网关地址:https://openapi.alipaydev.com/gateway.do
- 注意新版沙箱和旧版沙箱,它的应用/网关/沙箱账号信息都不一样,这点也是要注意的。
- 而我接下来的示例中,都采用的是新版的网关地址。
- 而且沙箱环境的支付宝网关地址,由于沙箱环境经历过升级之后,这个地址也变了,你需要注意的,你用的是新版的沙箱还是旧版的沙箱,不要搞错了。
- 产品列表:
- 已支持的产品中,就是我们可以在沙箱中实现的功能列表,比如支付、转账等,都有对应的文档。
沙箱账号
这个菜单,有用的就是下图中我标记的,不用一一解释了,支付宝沙箱给我们提供了两个账号,分饰两个角色。
这两个账号,可以用来在不能APP扫码支付时,采用的账号密码支付。
沙箱工具
这个菜单,就是我们在学习支付宝沙箱支付时,可以手机下载这个沙箱客户端,让你体验下沙箱版的支付宝扫码支付,很遗憾只有Android版本,没有ios版本,那如果你的手机是iPhone怎么办?莫慌,直接在支付时,采用沙箱账号中,人家给咱们提供的账号和密码进行手动输入进行支付。
关于SDK
想要在代码中使用支付宝沙箱环境,我们可以选择:
- API,我们自己用代码向支付宝提供接口发送请求,并携带参数,完成相应的支付功能。
- 这种比较麻烦,因为携带的参数比较多,而且参数中还需要进行签名校验处理,这些都是需要我们自己来完成的。
- 当然了,我们能写出来这些支付相关的api,肯定是用类来实现,这也变相的等于我们自己封装了一个SDK了。
- SDK,支付宝也知道我们自己通过api的方式比较麻烦,所以将这些复杂的配置进行封装成SDK,我们直接调用相应的方法就行了,大大降低了开发难度。
- 支付宝的SDK:https://opendocs.alipay.com/open/02no41?pathHash=2faf7eac,但支付宝官方提供的SDK封装的一言难尽.......
- 所以,有个大佬封装了一个相对好用的SDK,我们本篇也是采用的是这个,我会有相应的使用示例,官档连接:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md,如果你要是担心不安全,请忽略这个SDK。
这里说明一下,你用api还是SDK,用支付宝的SDK还是三方的SDK,都可以的, 当然,你要是怕不保险,你就自己全程自己搞api支付或者采用支付宝的SDK。
相关链接快速获取
- 三方SDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
- 支付宝沙箱控制台:https://open.alipay.com/develop/sandbox/app
支付(支付宝用户给商家付款)
notify_url:当用户进行支付之后,支付宝服务器会给我们预留的一个接口发送请求,告诉我们支付成功了。这个我们自己的项目的接口就是通过notify_url参数指定。当我们就能确定整个支付过程真正成功了。注意,这个notify_url必须是具有公网IP的
提现
支付宝的提现流程就是:
- 客户端获取提现金额和提现的账户,发送到后端。
- 后端从
而支付宝对于提现,只需要发送一次请求,就会直接返回提现成功/提现失败。没有更多的回调之类的操作。
常见报错
TypeError: This is not a private key
这应该是你的公钥和私钥配置的有问题。
公钥和私钥在支付宝官档的控制台中的沙箱应用页面:https://open.alipay.com/develop/sandbox/app,如下图:
而查看秘钥栏,一共有三种秘钥,应用公钥、应用私钥、支付宝公钥,而我们需要的是:应用私钥(我们Python应该选择非Java语言)和支付宝公钥这俩。而应用公钥是支付宝平台内部使用的。
收款账号不存在或姓名有误,建议核实账号和姓名是否准确
我在给指定支付宝账号转账时遇到的。
这个问题我这边的原因是这样的,支付宝沙箱老版本的一切正常,但自从沙箱环境升级到了新版之后,再使用就有问题了。
{'alipay_fund_trans_uni_transfer_response': {'msg': 'Business Failed', 'code': '40004', 'sub_msg': '收款账号不存在或姓名有误,建议核实账号和姓名是否准确', 'sub_code': 'PAYEE_NOT_EXIST'}, 'sign': 'NrbLj9xDSPROlOy1be/FtPdd88dVgrmq3fNgnjCMD9PrZokx9X8xBhCKrCh0nIaYhRhu/ZX5mtp+ddKHWowYMawonEJMFWLcgR71ZHBzgG0+M6QxPG3EIaoQlfja0iFfzSIxn2I6utEu6yVjvvDEDjXjo2OdozAsscwbRnxyedRgx9SHqm9UClXiQzKD8OnspQmORWWJ+DF+RioXp7ZTLnDoExFNiyOvsJRlVnmbfyte7ussO8J0yj73O3qS+1tT+7Lpm95452sxWrQBU7YuQ1wCELceCns1gEzTWDAo0xDyJQ3a03DfUio40FeWlA25PxxfG8chHVuwpRt3J4KyGZW9y47L98TQ=='}
其原因我通过排查发现是构造参数时的问题,老版的沙箱给我们的沙箱账号是这样的:
注意观察用户名称是固定的沙箱环境,所以,我之前构造参数时,也是写死的。
但自从沙箱升级到新版之后,沙箱账号那里的用户名称不是原来的了,而是如下图。
而我的代码中没有同步更改,所以报错了,那解决办法也就有了,就是改成跟沙箱账号中一样就行了。
然后就不报错了。
alipay.exceptions.AliPayException: AliPayException: code:40002, message:{"alipay_trade_query_response":{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.invalid-app-id","sub_msg":"无效的AppID参数"}}
我的报错环境是这样的:
python3.10 + 支付宝沙箱环境
哦,还有就是沙箱网管接口升级为新的之后:
# 原来的老网关地址
https://openapi.alipaydev.com/gateway.do
# 新的网关地址
https://openapi-sandbox.dl.alipaydev.com/gateway.do
asgiref==3.7.2
cffi==1.15.1
cryptography==41.0.1
Django==3.2
djangorestframework==3.14.0
pycparser==2.21
pycryptodomex==3.18.0
pyOpenSSL==23.2.0
python-alipay-sdk==3.2.0
pytz==2023.3
sqlparse==0.4.4
typing_extensions==4.6.3
在支付成功之后,验签也没问题,到了同步查询支付结果的时候,也就是下面这段代码报错了:
class MyAliPaySdk(AliPay):
def query(self, order_number):
"""
根据订单号,主动查询支付结果
"""
return self.server_api( # 这行代码引起的内部源码错误
api_name="alipay.trade.query",
biz_content={
"out_trade_no": order_number
}
)
首先排查了代码和支付宝相关的配置,都正确无误,最终发现是支付宝的sdk的版本错误。
# 原来用的3.2.0的版本,一直报错
python-alipay-sdk==3.2.0
pip uninstall python-alipay-sdk -y
# 后来卸载重装了3.3.0之后,一行代码没改,就行了.......
python-alipay-sdk==3.3.0
pip install python-alipay-sdk==3.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 注意,我处理在这个bug的时候,我原来安装用的是豆瓣源,单安装的sdk版本是默认是3.2.0,可见豆瓣源的sdk默认最高版本就是3.2.0,所以,这里重新安装的时候,就不要指定豆瓣源了,换个清华源
所以,最终排出来的是sdk版本的错误。