支付宝回调notify_url中没有trade_status?

来源:10-15 支付宝接口和vue联调-1

烈焰卡卡

2018-07-27

支付成功之后,支付宝回调notify_url时好像没有trade_status,因为写入数据库时会报一个warning是支付状态字段不能为空,只可能是从参数中取出时没有该参数所以默认为None,但之后4min后支付宝会重新发一个post请求,这时候就更新成功了。想问一下,这里和课程中好像有些出入,也和API文档中有出入,为什么支付成功之后出发的第一次请求没有trade_status?页面支付跳转到首页时,查看日志打印出来的url也是没有trade_status参数的

写回答

3回答

烈焰卡卡

提问者

2018-07-27

问题已解决:

网上查了一下,支付宝接口好像改版后,同步跳转的url中是不带有trade_status参数,只存在于异步回调url中,所以先异步回调更新了订单状态,然后同步跳转时只要去掉更新订单的逻辑即可,只进行页面重定向跳转

1
5
bobby
回复
烈焰卡卡
多谢。
2018-08-03
共5条回复

慕姐4046084

2020-06-01

现在这个支付成功跳转到首页之后,更改订单状态需要怎么去修改。目前报错一直是支付成功之后,没有更改订单状态

0
5
烈焰卡卡
回复
慕姐4046084
那你就POST请求你携带的参数都打印出来一个一个看,参数名变了就改一下
2020-06-01
共5条回复

烈焰卡卡

提问者

2018-08-01

def get(self, request):
    """
    处理支付宝的return_url返回
    :param request:
    :return:
    """
    processed_dict = {}
    for key, value in request.GET.items():
        processed_dict[key] = value
    sign = processed_dict.pop("sign", None)
    alipay = AliPay(
        appid=app_id,
        app_notify_url="http://123.206.30.254:8000/alipay/return/",
        app_private_key_path=private_key_path,
        alipay_public_key_path=ali_pub_key_path,
        debug=True,  # 默认False,
        return_url="http://123.206.30.254:8000/alipay/return/"
    )
    verify_re = alipay.verify(processed_dict, sign)
    if verify_re:
        # 支付宝接口改版,同步跳转url中不带有trade_status参数,不更新订单状态,只做跳转
        # order_sn = processed_dict.get('out_trade_no', None)  # 商家订单号
        # trade_no = processed_dict.get('trade_no', None)  # 支付宝交易号
        # trade_status = processed_dict.get('trade_status', None)  # 订单状态
        #
        # existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
        # for existed_order in existed_orders:
        #     existed_order.pay_status = trade_status
        #     existed_order.trade_no = trade_no
        #     existed_order.pay_time = datetime.now()
        #     existed_order.save()

        response = redirect('index')
        # 设置跳转到订单页面,3秒
        response.set_cookie('nextPath', 'pay', max_age=3)
        return response
    else:
        response = redirect("index")
        return response
def post(self, request):
    """
    处理支付宝的notify_url
    :param request:
    :return:
    """
    processed_dict = {}
    for key, value in request.POST.items():
        processed_dict[key] = value
    sign = processed_dict.pop("sign", None)
    alipay = AliPay(
        appid=app_id,
        app_notify_url="http://123.206.30.254:8000/alipay/return/",
        app_private_key_path=private_key_path,
        alipay_public_key_path=ali_pub_key_path,
        debug=True,  # 默认False,
        return_url="http://123.206.30.254:8000/alipay/return/"
    )
    verify_re = alipay.verify(processed_dict, sign)
    if verify_re:
        order_sn = processed_dict.get('out_trade_no', None)  # 商家订单号
        trade_no = processed_dict.get('trade_no', None)  # 支付宝交易号
        trade_status = processed_dict.get('trade_status', None) # 订单状态

        existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
        for existed_order in existed_orders:
            order_goods = existed_order.goods.all()
            for order_good in order_goods:
                goods = order_good.goods
                goods.sold_num += order_good.goods_num
                goods.save()

            existed_order.pay_status = trade_status
            existed_order.trade_no = trade_no
            existed_order.pay_time = datetime.now()
            existed_order.save()

        return HttpResponse('success')


0
0

Python前后端分离开发Vue+Django REST framework实战

Django REST framework课程视频,RESTFul API前后端分离开发

2873 学习 · 2457 问题

查看课程