首页
学习
活动
专区
圈层
工具
发布

Django实战-生鲜电商-查询支付结果

完成了订单支付,用户需要在个人中心看到商品的支付结果,需要从数据库查询用户成功支付的订单,通过订单编号可以获取到每份订单的信息。

① 获取订单信息

代码语言:javascript
代码运行次数:0
复制
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": "订单信息有误"})

② 创建用于进行支付宝支付的工具对象

代码语言:javascript
代码运行次数:0
复制
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  配合沙箱模式使用
)

③ 查询支付结果

代码语言:javascript
代码运行次数:0
复制
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": "支付失败"})
下一篇
举报
领券