请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

支付宝回调notify_url中没有trade_status?

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

正在回答 回答被采纳积分+3

插入代码

3回答

提问者 烈焰卡卡 2018-07-27 11:09:46

问题已解决:

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

1 回复 有任何疑惑可以回复我~
  • bobby #1
    谢谢提醒
    回复 有任何疑惑可以回复我~ 2018-07-30 09:47:24
  • 提问者 烈焰卡卡 回复 bobby #2
    而且异步回调中返回好像用framework的Response是不行的,这样返回的字符串是带有""的success,支付宝不认,改成HttpResponse才可以
    回复 有任何疑惑可以回复我~ 2018-07-30 09:52:12
  • bobby 回复 提问者 烈焰卡卡 #3
    你能贴一下你的代码吗?我看看你的代码是如何修改的
    回复 有任何疑惑可以回复我~ 2018-08-01 09:38:34
慕姐4046084 2020-06-01 09:41:49

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

0 回复 有任何疑惑可以回复我~
  • 提问者 烈焰卡卡 #1
    不知道现在文档修改了没有,同步跳转回页面的,就按照下面代码,相当于只是跳转页面,不携带任何状态信息。而支付宝POST请求你服务端接口的里面,才携带真正支付成功失败的信息,在POST接口里去修改订单状态。
    回复 有任何疑惑可以回复我~ 2020-06-01 09:43:34
  • 慕姐4046084 回复 提问者 烈焰卡卡 #2
    需要怎么写代码
    回复 有任何疑惑可以回复我~ 2020-06-01 11:21:56
  • 提问者 烈焰卡卡 回复 慕姐4046084 #3
    下面有啊,如果文档没变,我贴的那样就能用
    回复 有任何疑惑可以回复我~ 2020-06-01 11:29:56
提问者 烈焰卡卡 2018-08-01 16:37:17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号