必备条件,公钥密钥
setting配置
# # 支付宝沙箱
# ALIPAY_APPID = "xxxxxxx"
# ALIPAY_URL = "https://openapi.alipaydev.com/gateway.do"
# 支付宝配置参数
ALIPAY_APPID = "xxxxx"
ALIPAY_URL = "https://openapi.alipay.com/gateway.do"
生成订单:
order.o_id = '%s%s' % (datetime.now().strftime('%Y%m%d%H%M%S'), order.user.id)
根据订单号
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url="http://xxx/vuser/check_pay/", # 默认回调url
app_private_key_path=os.path.join(settings.BASE_DIR, "apps/user_vip/app_private_key.pem"),
alipay_public_key_path=os.path.join(settings.BASE_DIR, "apps/user_vip/alipay_public_key.pem"),
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=False, # 默认False 配合沙箱模式使用
)
# 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id,
# total_amount=0.05,
total_amount=str(order.o_total_price), # 将Decimal类型转换为字符串交给支付宝
subject="优-%s"%tishi,
return_url="http://www.xxx.com/index?user=%s&token=%s&bind=1"%(username, token),
# return_url=None,
notify_url=None, # 可选, 不填则使用默认notify url
)
# 让用户进行支付的支付宝页面网址
url = settings.ALIPAY_URL + "?" + order_string
return HttpResponseRedirect(url)
支付完成,要确定是否成功支付呀
def check_pay(request):
# 创建用于进行支付宝支付的工具对象
out_trade_no = request.POST.get("out_trade_no")
order = OrderInfo.objects.filter(o_id=out_trade_no).first()
user = UserProfile.objects.filter(username=order.user).first()
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None, # 默认回调url
app_private_key_path=os.path.join(settings.BASE_DIR, "apps/user_vip/app_private_key.pem"),
alipay_public_key_path=os.path.join(settings.BASE_DIR, "apps/user_vip/alipay_public_key.pem"),
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA2,官方推荐,配置公钥的时候能看到
debug=False # 默认False 配合沙箱模式使用True
)
while True:
# 调用alipay工具查询支付结果
response = alipay.api_alipay_trade_query(out_trade_no) # response是一个字典
# 判断支付结果
code = response.get("code") # 支付宝接口调用成功或者错误的标志
trade_status = response.get("trade_status") # 用户支付的情况
if code == "10000" and trade_status == "TRADE_SUCCESS":
if order.o_pay == False:
# 表示用户支付成功
# 写入逻辑
else:
pass
# 返回前端json,通知支付成功
return JsonResponse({"code": 0, "message": "支付成功"})
elif code == "40004" or (code == "10000" and trade_status == "WAIT_BUYER_PAY"):
# 表示支付宝接口调用暂时失败,(支付宝的支付订单还未生成) 后者 等待用户支付
# 继续查询
print(code)
print(trade_status)
continue
# return JsonResponse({"code":code, "msg": trade_status })
else:
# 支付失败
# 返回支付失败的通知
return JsonResponse({"code": 1, "message": "支付失败"})
仅作记录