Skip to main content

验签成功更改订单状态

本节将介绍如何在支付成功后,更改订单表和会员表中的相关数据。

例如,支付成功支付宝返回的trade_no这个订单号需要写入到order表中的trade_no字段。如下图所示。

图76-支付宝v返回参数

图76-支付宝返回的订单号

此外,还需要支付时间、过期时间等写入到profile表,如下图所示。

图76-profile表字段

更改order表和profile表信息

AlipayCallbackAPIView视图中,我们继续完成支付成功后的业务逻辑。代码如下:

dx_movie/trade/views.py
from datetime import datetime, timedelta

class AlipayCallbackAPIView(APIView):
def post(self, request):
params = request.POST.dict()
print(params)
# 去除sign 和 sign_type
sign = params.pop('sign')
del params['sign_type']
# 对字典进行排序
sorted_list = sorted([(k, v) for k,v in params.items() ])
unsigned_string = '&'.join(f"{k}={v}" for k,v in sorted_list) # buyer_pay_amount=0.02&app_id=9021000126620710
alipay = Alipay()
if not alipay.verify_sign(unsigned_string, sign):
print('vefify sign error')
return Response('error')
# 验证out_trade_no
try:
order = Order.objects.get(order_sn=params.get('out_trade_no'))
except:
return Response('error')
if params.get('total_amount') != str(order.order_mount):
return Response('error')
if params.get('seller_id') != settings.ALIPAY_SELLER_ID:
return Response('error')
if params.get('app_id') != settings.ALIPAY_APP_ID:
return Response('error')
if params.get('trade_status') not in ['TRADE_SUCCESS', 'TRADE_FINISHED']:
return Response('error')
# 业务逻辑
print('全部验证通过')
# 更改order表
order.trade_no = params.get('trade_no')
order.pay_status = params.get('trade_status')
order.pay_time = timezone.now()
order.save()

# 更改profile表
profile = Profile.objects.get(uid=order.profile.uid)
profile.is_upgrade = 1
profile.upgrade_time = timezone.now()
profile.upgrade_count += 1
# 如果用户首次充值,或者会员已经过期,那么设置过期时长为当前时间+会员卡时长
# 如果会员未过期,则在原来过期时间基础上,再次加上会员卡时长
if not profile.expire_time or profile.expire_time < timezone.now():
profile.expire_time = timezone.now() + timedelta(days=order.card.duration)
else:
profile.expire_time = profile.expire_time + timedelta(days=order.card.duration)
profile.save()

return Response('success')

上面代码中,我们根据对order表trade_no、pay_status和pay_time三个字段赋值,然后使用save()保存更改。

接下来,根据uid获取profile信息,然后更改profile表中相关字段。其中,特别注意判断是否是首次充值,以及设置过期时间。

注意事项

  • 在购买会员成功后,若需要再次购买会员,需要根据用户已有会员的剩余时间来计算新的过期时间,不是简单地加上会员卡时长。
  • 时间处理时,建议使用 Django 的 timezone.now() 方法来获取当前时间,以兼容时区。
  • 需要按需导入相关模块和函数。

以上是实现业务逻辑的示例代码,请根据实际情况进行适当修改和调试。