https://openhome.alipay.com/platform/appDaily.htm?tab=info
openssl
genrsa -out app_private_key.pem 2048
rsa -in app_private_key.pem -pubout -out app_public_key.pem
把刚刚生成的应用公匙app_public_key.pem粘贴到沙箱配置,拿到支付宝公匙
推荐虚拟环境中下载
官方:pip install alipay-sdk-python
第三方:pip install python-alipay-sdk
提示:
两个库只能下载一个否则导入时报错:ImportError: cannot import name ‘AliPay’
解决:
pip uninstall alipay-sdk-python
pip uninstall python-alipay-sdk
pip install python-alipay-sdk
官方API详解:https://opendocs.alipay.com/apis/api_1/alipay.trade.pay
下面是第三方接口:
主要的三个API:
alipay = AliPay(
appid=settings.ALIPAY_APPID, # APPID
app_notify_url=None, # 默认回调url, 异步通知, 需要使用公网IP
app_private_key_string=settings.APP_PRIVATE_KEY,
alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
sign_type="RSA2", # RSA2
debug=True # 默认False
)
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id, # 订单id
total_amount=str(total_pay), # 支付总金额
subject='订单交易%s' % order_id,
return_url=None, # 可选, 同步通知订单状态
notify_url=None # 可选, 异步通知订单状态
)
# 真实环境:https://openapi.alipay.com/gateway.do?
# alipaydev是沙箱环境, 支付网址,让客户端访问下面这个网址进行支付
pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
return JsonResponse({'res': 3, 'pay_url': pay_url})
# 参数就是上面第二步发给支付宝的order_id
response = alipay.api_alipay_trade_query(order_id)
# 成功返回的dict:
# response = {
# 'buyer_user_type': 'PRIVATE',
# 'msg': 'Success',
# 'send_pay_date': '2020-04-14 17:54:34',
# 'total_amount': '23.50',
# 'invoice_amount': '0.00',
# 'buyer_pay_amount': '0.00',
# 'buyer_logon_id': 'ich***@sandbox.com',
# 'trade_status': 'TRADE_SUCCESS',
# 'buyer_user_id': '2088102180691897',
# 'point_amount': '0.00',
# 'trade_no': '2020041422001491890501153244',
# 'receipt_amount': '0.00',
# 'code': '10000',
# 'out_trade_no': '2020041415002443'
#}
# 未支付时返回的dict:
response ={
'receipt_amount': '0.00',
'buyer_user_type': 'PRIVATE',
'msg': 'Success',
'buyer_pay_amount': '0.00',
'invoice_amount': '0.00',
'total_amount': '23.50',
'trade_status': 'WAIT_BUYER_PAY',
'buyer_user_id': '2088102180691897',
'point_amount': '0.00',
'trade_no': '2020041422001491890501153244',
'buyer_logon_id': 'ich***@sandbox.com',
'code': '10000',
'out_trade_no': '2020041415002443'
}
由此我们可以判断交易结果
if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS':
'''支付成功'''
return JsonResponse({'res': 1, 'message': '支付成功'})
elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'):
'''等待买家付款'''
# 创建交易超时
if (expire_time > settings.ALIPAY_TIMEOUT_MINUTE * 60):
return JsonResponse({'res': 0, 'errmsg': '创建交易超时'})
time.sleep(settings.ALIPAY_TIMEOUT_SLEEP_SECS)
expire_time += settings.ALIPAY_TIMEOUT_SLEEP_SECS
continue
else:
'''支付出错'''
return JsonResponse({'res': 0, 'errmsg': '支付失败'})
买家账号[email protected]
登录密码111111
支付密码111111
还有一个问题就是在沙箱环境下,支付的时候没有弹出二维码,弹出了钓鱼网站的提示:
先把支付宝中的沙箱环境推出登录,或者直接关了那个页面,重新启动程序就行了。
目前沙箱钱包仅提供Android版本, 或者你下载安卓的·APP
https://github.com/fzlee/alipay/blob/master/README.zh-hans.md