Ejemplo n.º 1
0
	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':'支付失败'})
Ejemplo n.º 2
0
    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':'支付失败'})