python调用支付宝SDK API

python调用支付宝SDK API

使用沙箱环境

https://openhome.alipay.com/platform/appDaily.htm?tab=info

生成密匙文件

  1. 使用OpenSSL
openssl
  1. 生成私钥
genrsa -out app_private_key.pem   2048 
  1. 生成公钥
rsa -in app_private_key.pem -pubout -out app_public_key.pem

进入沙箱环境加签RSA2

把刚刚生成的应用公匙app_public_key.pem粘贴到沙箱配置,拿到支付宝公匙

下载SDK库

推荐虚拟环境中下载

官方: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

使用SDK接口

官方API详解:https://opendocs.alipay.com/apis/api_1/alipay.trade.pay

下面是第三方接口:

主要的三个API:

  1. 初始化
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
        )
  1. api_alipay_trade_page_pay (收单交易支付接口)
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})
  1. .api_alipay_trade_query (收单线下交易查询)
# 参数就是上面第二步发给支付宝的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

你可能感兴趣的:(python,支付宝SDK,django)