支付宝没有提供Python SDK。但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个,我们就调用支付宝接口就比较简单了,下面就说说如何在Django项目中调用支付宝接口:
github网站:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
pip uninstall pycrypto
pip install python-alipay-sdk --upgrade
在linux环境中,我们可以使用linux自带的openssl软件来进行私钥和密钥的生成
在终端输入openssl开启软件:
openssl
先生成私钥,再由私钥生成公钥:
genrsa -out app_private_key.pem 2048 # 私钥
# 2048是密钥长度,建议使用2048位
# app_private_key.pem是生成私钥的文件名称,在当前终端目录下生成
cat app_publict_key.pem
网址:https://openhome.alipay.com/platform/appDaily.htm?tab=account
(需要自己注册并注册里面的服务商功能)
点击进入我的开发平台,在开放中心, 点击研发服务
在沙箱应用中,刚刚开始会有显示上传公钥,把刚刚用opessl生成的公钥复制进去点击确认就行,然后在点击“查看支付宝公钥”复制里面的内容,等等项目的代码里一定要用这里的公钥,不能用opessl生成的公钥
特别是alipay_public_key.pem的内容需要添加-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----
# 业务处理: 使用python sdk调用支付宝的支付接口
# 初始化
alipay = AliPay(
appid="2016092600603434",
app_notify_url=None,
app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'),
alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'),
sign_type="RSA2",
debug=True
)
# 调用接口
total_pay = order.total_price + order.transit_price
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id,
total_amount=str(total_pay),
subject='天天生鲜%s' % order_id,
return_url=None,
notify_url=None,
)
# 返回应答
pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string
# 初始化t
alipay = AliPay(
appid="2016092600603434",
app_notify_url=None,
app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'),
alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'),
sign_type="RSA2",
debug=True
)
# 调用支付宝的交易查询接口
"""
response = {
"trade_no": # 支付宝交易号
"code": "10000" # 接口调用是否成功
"trade_status": "TRADE_SUCCESS" # 支付成功
}
"""
while True:
response = alipay.api_alipay_trade_query(out_trade_no=order_id)
print("response:ok")
code = response.get('code')
if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS':
# 支付成功
# 获取支付宝交易号
trade_no = response.get("trade_no")
# 更新订单状态
order.trade_no = trade_no
order.order_status = 4 # 待评价
order.save()
# 返回结果
return JsonResponse({'res':3, 'message': '支付成功'})
elif code == '40004' or (code == '10000' and response.get("trade_status") == 'WAIT_BUYER_PAY'):
# 等待买家付款
# 业务处理失败, 可能一会就会成功
import time
time.sleep(5)
continue
else:
# 支付出错
return JsonResponse({'res': 4, 'message': '支付失败'})
如果还有不懂的,可以看github的文档,或者留言给我哈