Skip to content

支付宝沙箱环境

开通沙箱(从头开始)

1. 访问支付宝开放平台

https://open.alipay.com/

1832669489406148608.png

2. 用自己的真实的支付宝账号登录后,访问控制台

扫码登录,完事之后,点击控制台,并进入控制台。

1832669491352305664.png

1832669493034221568.png

3. 按照提示录入信息

1832669494934241280.png

然后弹出框这里直接叉掉即可。

1832669496138006528.png

4. 在控制台中,下拉选择"沙箱"

如果你从未开通过"沙箱"环境,那么你进入的应该是下面的图片所示的页面,反正找到"沙箱"即可。

1832669496687460352.png

5. 进入到沙箱应用界面

1832669497324994560.png

开通沙箱(一步到位)

1. 直接访问下面的连接进入到沙箱应用

如果提示扫码登录,就用支付宝扫码登录即可。

https://open.alipay.com/develop/sandbox/app

登录成功,就能进入到支付宝沙箱应用后台。

1832669498105135104.png

说明

当你登录到沙箱后台之后,后台页面中你应该留意这些信息。

沙箱应用菜单

1832669498826555392.png

这个菜单中,对我们有用的信息有。

  • 网页/移动应用:就是咱们在浏览器打开的网页和手机APP中进行支付宝支付的选项。
  • 小程序:这个小程序不是微信小程序,而是支付宝APP中的小程序。
  • 应用信息:这个选项中我们在沙箱环境中用到的参数有:
    • APPID,这个是必须的。
    • 接口加签方式:在沙箱环境中,我们选择系统默认秘钥:
      • 公钥模式,沙箱环境中,我们采用的模式。
        • 当你点击启用之后,点击查看,弹出框,会有三个秘钥,而我们用到的是下面这两个:
        • 应用私钥,根据你的编程语音,决定是Java语言还是非Java语言。
        • 支付宝公钥。
      • 证书模式,在沙箱环境中,我们通常不采用这个模式,但当脱离沙箱环境,项目上线之后,有些接口,需要用到这个证书模式,比如涉及到资金支出类的接口,必须用证书模式进行加签。
    • 支付宝网关地址,无论是否是沙箱环境,都需要有支付宝网关地址(只不过地址不一样而已),这个接口负责处理我们的业务。
      • 而且沙箱环境的支付宝网关地址,由于沙箱环境经历过升级之后,这个地址也变了,你需要注意的,你用的是新版的沙箱还是旧版的沙箱,不要搞错了。
  • 产品列表:
    • 已支持的产品中,就是我们可以在沙箱中实现的功能列表,比如支付、转账等,都有对应的文档。

沙箱账号

这个菜单,有用的就是下图中我标记的,不用一一解释了,支付宝沙箱给我们提供了两个账号,分饰两个角色。

这两个账号,可以用来在不能APP扫码支付时,采用的账号密码支付。

1832669499539587072.png

沙箱工具

这个菜单,就是我们在学习支付宝沙箱支付时,可以手机下载这个沙箱客户端,让你体验下沙箱版的支付宝扫码支付,很遗憾只有Android版本,没有ios版本,那如果你的手机是iPhone怎么办?莫慌,直接在支付时,采用沙箱账号中,人家给咱们提供的账号和密码进行手动输入进行支付。

1832669500084846592.png

1832669500420390912.png

关于SDK

想要在代码中使用支付宝沙箱环境,我们可以选择:

  • API,我们自己用代码向支付宝提供接口发送请求,并携带参数,完成相应的支付功能。
    • 这种比较麻烦,因为携带的参数比较多,而且参数中还需要进行签名校验处理,这些都是需要我们自己来完成的。
    • 当然了,我们能写出来这些支付相关的api,肯定是用类来实现,这也变相的等于我们自己封装了一个SDK了。
  • SDK,支付宝也知道我们自己通过api的方式比较麻烦,所以将这些复杂的配置进行封装成SDK,我们直接调用相应的方法就行了,大大降低了开发难度。

这里说明一下,你用api还是SDK,用支付宝的SDK还是三方的SDK,都可以的, 当然,你要是怕不保险,你就自己全程自己搞api支付或者采用支付宝的SDK。

相关链接快速获取

支付(支付宝用户给商家付款)

notify_url:当用户进行支付之后,支付宝服务器会给我们预留的一个接口发送请求,告诉我们支付成功了。这个我们自己的项目的接口就是通过notify_url参数指定。当我们就能确定整个支付过程真正成功了。注意,这个notify_url必须是具有公网IP的

提现

支付宝的提现流程就是:

  1. 客户端获取提现金额和提现的账户,发送到后端。
  2. 后端从

而支付宝对于提现,只需要发送一次请求,就会直接返回提现成功/提现失败。没有更多的回调之类的操作。

常见报错

TypeError: This is not a private key

这应该是你的公钥和私钥配置的有问题。

1832669500781101056.png

公钥和私钥在支付宝官档的控制台中的沙箱应用页面:https://open.alipay.com/develop/sandbox/app,如下图:

1832669501766762496.png

而查看秘钥栏,一共有三种秘钥,应用公钥、应用私钥、支付宝公钥,而我们需要的是:应用私钥(我们Python应该选择非Java语言)支付宝公钥这俩。而应用公钥是支付宝平台内部使用的。

1832669502249107456.png

收款账号不存在或姓名有误,建议核实账号和姓名是否准确

我在给指定支付宝账号转账时遇到的。

这个问题我这边的原因是这样的,支付宝沙箱老版本的一切正常,但自从沙箱环境升级到了新版之后,再使用就有问题了。

bash
{'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=='}

其原因我通过排查发现是构造参数时的问题,老版的沙箱给我们的沙箱账号是这样的:

1832669503171854336.png

注意观察用户名称是固定的沙箱环境,所以,我之前构造参数时,也是写死的。

1832669503398346752.png

但自从沙箱升级到新版之后,沙箱账号那里的用户名称不是原来的了,而是如下图。

1832669504061046784.png

而我的代码中没有同步更改,所以报错了,那解决办法也就有了,就是改成跟沙箱账号中一样就行了。

1832669504467894272.png

然后就不报错了。

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
bash
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

在支付成功之后,验签也没问题,到了同步查询支付结果的时候,也就是下面这段代码报错了:

python
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的版本错误。

bash
# 原来用的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版本的错误。