def post(self,request): # 用户是否登录 user = request.user if not user.is_authenticated(): return JsonResponse({'res':0,'errmsg':'用户未登陆'}) # 接收参数 order_id = request.POST.get('order_id') # 校验参数 if not order_id: return JsonResponse({'res':1,'errmsg':'无效的订单id'}) try: #查出的订单必须要符合id相同,用户相同,支付方式为3,订单状态为:未支付 order = OrderInfo.objects.get(order_id = order_id, user = user, pay_method = 3, order_status = 1) except OrderInfo.DoesNotExist: return JsonResponse({'res':1,'errmsg':订单错误}) # 业务处理:使用python sdk调用支付宝的支付接口 # 初始化 alipay = Alipay( appid = "2016093000628658", #自己沙箱中的APPID app_notify_url = None, #默认的回调url app_private_key_path = os.path.join(settings.BASE_DIR,'apps/order/app_private_key.pem'), alipay_public_key_path = os.path.join(settings.BASE_DIR,'apps/order/alipay_public_key.pem'), sign_type = "RSA2", #RSA或者RSA2 debug = "True" #沙箱模式就是调试模式 ) # 调用支付宝的交易查询接口(可传两个参数,out_trade_no订单号;trade_no,支付宝交易号,二者只需一个即可) while True: response = alipay.api_alipay_trade_query(order_id) # response是一个字典 code = response.get('code') #查看借口是否调用成功 if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS': # 支付成功 # 获取支付宝交易号 trade_no = response.get('trade_no') # 更新订单状态 order.trade_no = trade_no order.order_status = 4 #处于待评价状态 order.save() # 返回结果 return JsonResponse({'res':3,'errmsg':'支付成功'}) elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'): # 等待买家付款 # 业务处理失败,一会就会处理成功 import time time.sleep(5) continue else: # 支付出错 return JsonResponse({'res':4,'errmsg':'支付失败'})
def get(self, request): """查询订单信息:如果支付成功,需要修改订单状态和记录支付宝维护的订单id,如果失败,返回失败信息""" # 获取订单id order_id = request.GET.get('order_id') # 校验订单id if not order_id: return JsonResponse({'code': 2, 'message': '没有订单id'}) # 获取订单信息:状态是待支付,支付方式是支付宝 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=settings.APP_PRIVATE_KEY_PATH, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH, sign_type="RSA2", # RSA 或者 RSA2 debug=True # 默认False 配合沙箱模式使用 ) # 一直查询知道错误或者成功为止 while True: # 调用查询接口 : response 封装了查询之后的结果,是个字典. code trade_status trade_no response = alipay.api_alipay_trade_query(order_id) # 读取判断是否失败的数据 code = response.get('code') trade_status = response.get('trade_status') # 判断查询之后的结果 if code == '10000' and trade_status == 'TRADE_SUCCESS': # 支付成功:需要获取支付宝维护的订单id,存储到OrderInfo.改变订单的支付状态为待评价 order.trade_id = response.get('trade_no') order.status = OrderInfo.ORDER_STATUS_ENUM['UNCOMMENT'] order.save() return JsonResponse({'code': 0, 'message': '支付成功'}) elif code == '40004' or (code == '10000' and trade_status == 'WAIT_BUYER_PAY'): # 业务处理失败,但是不能宣告错误,比如系统繁忙 continue else: # 支付失败 return JsonResponse({'code':4, 'message':'支付失败'})