完成了订单支付,用户需要在个人中心看到商品的支付结果,需要从数据库查询用户成功支付的订单,通过订单编号可以获取到每份订单的信息。
① 获取订单信息
try:
order = OrderInfo.objects.get(order_id=order_id, user=request.user,
status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"],
pay_method=OrderInfo.PAY_METHODS_ENUM["ALIPAY"])
except OrderInfo.DoesNotExist:
return JsonResponse({"code": 3, "message": "订单信息有误"})
② 创建用于进行支付宝支付的工具对象
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None, # 默认回调url
app_private_key_path=os.path.join(settings.BASE_DIR, "apps/orders/app_private_key.pem"),
alipay_public_key_path=os.path.join(settings.BASE_DIR, "apps/orders/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=True # 默认False 配合沙箱模式使用
)
③ 查询支付结果
class CheckPayStatusView(LoginRequiredJsonMixin, View):
# 查询支付结果
def get(self, request):
# 订单编号
order_id = request.GET.get("order_id")
if not order_id:
return JsonResponse({"code": 2, "message": "缺失订单号"})
# 获取订单的信息
try:
order = OrderInfo.objects.get(order_id=order_id, user=request.user,
status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"],
pay_method=OrderInfo.PAY_METHODS_ENUM["ALIPAY"])
except OrderInfo.DoesNotExist:
return JsonResponse({"code": 3, "message": "订单信息有误"})
while True:
# 调用alipay工具查询支付结果
response = alipay.api_alipay_trade_query(order_id) # response是一个字典
# 判断支付结果
code = response.get("code") # 支付宝接口调用成功或者错误的标志
trade_status = response.get("trade_status") # 用户支付的情况
if code == "10000" and trade_status == "TRADE_SUCCESS":
# 表示用户支付成功
# 修改订单的状态,变为待评论状态
order.status = OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"]
# 更新订单的支付宝交易编号
order.trade_id = response.get("trade_no")
order.save()
# 返回前端json,通知支付成功
return JsonResponse({"code": 0, "message": "支付成功"})
elif code == "40004" or (code == "10000" and trade_status == "WAIT_BUYER_PAY"):
# 表示支付宝接口调用暂时失败,(支付宝的支付订单还未生成) 后者 等待用户支付
# 继续查询
continue
else:
# 支付失败
# 返回支付失败的通知
return JsonResponse({"code": 4, "message": "支付失败"})