Ejemplo n.º 1
0
class MyAliPay(View):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 初始化alipay
        self.alipay = AliPay(
            appid=settings.ALIPAY_APP_ID,
            app_notify_url=None,
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            sign_type='RSA2',
            debug=True  # 默认是False,True是请求转发到沙箱
        )

    def get_trade_url(self, order_id, price):
        # 生成支付宝支付连接  https://openapi.alipaydev.com/gateway.do? +查询字符串
        # 拼接查询字符串的函数
        query_str = self.alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=price,
            subject=f'达达商城:{order_id}',  # 对订单的描述
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url=settings.ALIPAY_NOTIFY_URL,
        )
        return f'https://openapi.alipaydev.com/gateway.do?{query_str}'

    def get_verify_result(self, data, sign):
        # 调用支付宝验签,返回 bool 值
        return self.alipay.verify(data, sign)

    def get_trade_result(self, order_id):
        # 查询支付结果
        reslut = self.alipay.api_alipay_trade_query(order_id)
        print('-----------:', reslut)
        return True if reslut.get('trade_status') == 'TRADE_SUCCESS' else False
Ejemplo n.º 2
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:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': '订单错误'})

        # 业务处理:使用python sdk调用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid="2016090800464054",  # 应用id
            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  # 默认False
        )

        # 调用支付宝的交易查询接口
        while True:
            # 调用alipay工具查询支付结果
            response = alipay.api_alipay_trade_query(order_id)  # response是一个字典
            # 判断支付结果
            code = response.get("code")  # 支付宝接口调用成功或者错误的标志
            trade_status = response.get("trade_status")  # 用户支付的情况

            if code == "10000" and trade_status == "TRADE_SUCCESS":
                # 表示用户支付成功
                # 返回前端json,通知支付成功
                return JsonResponse({"res": 3, "message": "支付成功"})

            elif code == "40004" or (code == "10000"
                                     and trade_status == "WAIT_BUYER_PAY"):
                # 表示支付宝接口调用暂时失败,(支付宝的支付订单还未生成) 后者 等待用户支付
                # 继续查询
                print(code)
                print(trade_status)
                continue
            else:
                # 支付失败
                # 返回支付失败的通知
                return JsonResponse({"code": 1, "message": "支付失败"})
Ejemplo n.º 3
0
def check_pay(request):
	"""获取用户支付的结果"""
	#用户登陆判断
	if not request.session.has_key('islogin'):
		return JsonResponse({'res':0,'errmsg':'用户未登录'})

	passport_id = request.session.get('passport_id')
	#接收订单id
	order_id = request.POST.get('order_id')

	#数据校验
	if not order_id:
		return JsonResponse({'res':1,'errmsg':'订单不存在'})

	try:
		order = OrderInfo.objects.get(order_id=order_id,
												passport_id=passport_id,
												pay_method=3
												)
	except OrderInfo.DoesNotExist:
		return JsonResponse({'res':2,'errmsg':'订单信息出错'})

	app_private_key_path = os.path.join(settings.BASE_DIR,'order/app_private_key.pem')
	alipay_public_key_path = os.path.join(settings.BASE_DIR,'order/app_public_key.pem')

	app_private_key_string = open(app_private_key_path).read()
	alipay_public_key_string = open(alipay_public_key_path).read()

	#和支付宝进行交互
	alipay = AliPay(
		appid="2016091500515408",  #应用id
		app_notify_url=None,  #默认回调url
		app_private_key_string=app_private_key_string,
		alipay_public_key_string=alipay_public_key_string,
		#支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
		sign_type="RSA2", #RSA 或者RSA2
		debug=True, #默认False
	)

	while True:
		#进行支付结果查询
		result = alipay.api_alipay_trade_query(order_id)
		code = result.get('code')
		if code == '10000' and result.get('trade_status') == 'TRADE_SUCCESS':
			#用户支付成功
			#改变订单支付状态
			order.status = 2 #待发货
			#填写支付宝交易号
			order.trade_id = result.get('trade_no')
			order.save()
			#返回数据
			return JsonResponse({'res':3,'message':'支付成功'})
		elif code == '40004' or (code == '10000' and result.get('trade_status') == 'WAIT_BUYER_PAY'):
			#支付订单还未生成,继续查询
			#用户还未完成支付,继续查询
			time.sleep(5)
			continue
		else:
			#支付出错
			return JsonResponse({'res':4,'errmsg':'支付出错'})
Ejemplo n.º 4
0
    def get(self, request):
        user = request.user
        order_id = request.GET.get('out_trade_no')
        if not all([order_id]):
            return JsonResponse({'res': 1, 'errmsg': '缺少参数'})
        try:
            order = OrderInfo.objects.get(
                order_id=order_id,
                user=user,
                order_status=1,
                pay_method=3,
            )
        except OrderInfo.DoesNotExist:
            return HttpResponse('订单信息错误')

        ali_pay = AliPay(
            appid=settings.ALIPAY_APP_ID,
            app_notify_url=settings.ALIPAY_APP_NOTIFY_URL,
            app_private_key_path=settings.APP_PRIVATE_KEY_PATH,
            alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH,
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG)

        response = ali_pay.api_alipay_trade_query(out_trade_no=order_id)
        res_code = response.get('code')
        if res_code == '10000' and response.get(
                'trade_status') == 'TRADE_SUCCESS':
            order.trade_no = response.get('trade_no')
            order.save()
            return render(request, 'pay_result.html', {'pay_result': '支付成功'})
        else:
            return render(request, 'pay_result.html', {'pay_result': '支付失败'})
Ejemplo n.º 5
0
    def post(self, requset):
        # 用户是否登录
        user = requset.user
        if not user.is_authenticated:
            return JsonResponse({'res': 0, 'errmsg': '用户未登录'})
        # 接收参数
        order_id = requset.POST.get('order_id')

        # 校验参数
        if not order_id:
            return JsonResponse({'res': 1, 'errmsg': '无效的订单ID'})

        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=1,
                                          order_status=1)
        except order.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': '订单错误'})

        # 业务逻辑:查询订单支付的结果
        app_private_key_string = open(
            os.path.join(BASE_DIR,
                         "apps/order/alipay/app_private_key.pem")).read()
        alipay_public_key_string = open(
            os.path.join(BASE_DIR,
                         'apps/order/alipay/alipay_public_key.pem')).read()
        # 初始化
        alipay = AliPay(
            appid="2016102300746102",  # 应用的ID
            app_notify_url=None,  # 默认回调的url
            app_private_key_string=app_private_key_string,  # 应用的公钥
            alipay_public_key_string=alipay_public_key_string,  # 支付宝的公钥
            sign_type="RSA2",
            debug=True)
        # 调用支付宝的查询接口
        while True:
            response = alipay.api_alipay_trade_query(out_trade_no=order_id)
            code = response.get('code')
            if code == '10000' and response.get(
                    'trade_status') == 'TRADE_SUCCESS':
                # 支付成功
                # 获取支付宝交易号
                # 更新订单状态
                order.trade_no = response.get("trade_no")
                order.order_status = 4
                order.save()
                # 返回结果
                return JsonResponse({'res': 3, 'message': '支付成功'})
            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.º 6
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:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)

        except OrderInfo.DoesNotExist:
            return JsonResponse({'res':2,'errmsg':'订单错误'})

        # 业务处理:使用python sdk调用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid="2016101100663392", # 应用id,模拟时用沙箱id
            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  # 默认False,沙箱用True
        )

        # 调用支付宝交易查询接口
        while True:
            response = alipay.api_alipay_trade_query(order_id)

            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, 'message': '支付成功'})
            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.º 7
0
class Pay:
    def __init__(self):
        if not settings.USE_ALIPAY:
            return
        # NOTE 暂时只支持支付宝
        self.alipay = AliPay(
            app_notify_url="",
            appid=settings.ALIPAY_APP_ID,
            app_private_key_string=settings.ALIPAY_APP_PRIVATE_KEY_STRING,
            alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_STRING,
        )

    def trade_precreate(self, out_trade_no, total_amount, subject,
                        timeout_express, notify_url):
        return self.alipay.api_alipay_trade_precreate(
            out_trade_no=out_trade_no,
            total_amount=total_amount,
            subject=subject,
            timeout_express=timeout_express,
            notify_url=notify_url,
        )

    def trade_query(self, out_trade_no):
        return self.alipay.api_alipay_trade_query(out_trade_no=out_trade_no)

    def verify(self, data, signature):
        return self.alipay.verify(data=data, signature=signature)
Ejemplo n.º 8
0
def checkpay(request):
    orderid = request.POST.get('orderid')
    if not orderid:
        return JsonResponse({'status':500,'msg':'必须传递订单号'})
    alipay_public_key_string = open(PUBLIC_KEY).read()
    app_private_key_string = open(PRIVATE_KEY).read()

    alipay = AliPay(
        appid="2021000116697358",
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_string=alipay_public_key_string,
        sign_type='RSA2',
        debug=False  # 默认False
    )
    while True:
        response = alipay.api_alipay_trade_query(orderid)
        #判断response的结果
        print(response)
        if response.get('code')=='10000' and response.get('trade_status'):
            money = math.floor(response.get('total_amount'))
            request.user.beans += (money*2)
            request.user.save()
            return JsonResponse({'status':200,'msg':'支付成功!'})

        elif response.get('code' == '40004') or (
            response.get('code') == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'):
            time.sleep(3)
            continue
        else:
            print(response.get('code') )
            print(response.get('trade_status'))
            return JsonResponse({'status':500,'msg':'支付失败!'})
Ejemplo n.º 9
0
    def check_pay(self, order_id):
        alipay_ = AliPay(appid=APPID,
                         app_notify_url=None,
                         app_private_key_path=app_private_key_path,
                         alipay_public_key_path=alipay_public_key_path,
                         sign_type='RSA2',
                         debug=True)
        _ = 0
        while True:
            _ += 1
            try:
                response = alipay_.api_alipay_trade_query(order_id)
                code = response.get('code')
                sub_msg = response.get('sub_msg')
                trade_status = response.get('trade_status')

                if code == "10000" and trade_status == 'TRADE_SUCCESS':
                    #付款成功,需要改变状态,,未做完
                    return {"code": 1, "message": "成功"}

                elif code == '40004' or (code == "10000"
                                         and trade_status == "WAIT_BUYER_PAY"):
                    if _ >= 60:
                        #需要在此标记订单状态###此处是BUG
                        break
                    time.sleep(2)
                    continue
                else:
                    return {"code": -1, "message": "失败"}

            except Exception as e:
                time.sleep(3)
        return {"code": -2, "message": "失败"}
Ejemplo n.º 10
0
class MyAliPay(View):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            app_notify_url=None,
            sign_type="RSA2",
            debug=True  #默认False  True则将请求转发沙箱环境
        )

    def get_trade_url(self, order_id, amount):

        order_string = self.alipay.api_alipay_trade_page_pay(
            subject=order_id,
            out_trade_no=order_id,
            total_amount=amount,
            #支付完毕后,将用户跳转至哪个页面
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url=settings.ALIPAY_NOTIFY_URL)
        return "https://openapi.alipaydev.com/gateway.do?" + order_string

    def get_verify_result(self, data, sign):
        #验证签名 True 成功  False 失败
        return self.alipay.verify(data, sign)

    def get_trade_result(self, order_id):
        #主动查询
        result = self.alipay.api_alipay_trade_query(order_id)
        if result.get('trade_status') == 'TRADE_SUCCESS':
            return True
        return False
Ejemplo n.º 11
0
def star(request):
    #     读取私钥
    app_private_key_string = open(os.path.join(settings.BASE_DIR, 'apps/order/private.txt')).read()
    # 读取公钥
    alipay_public_key_string = open(os.path.join(settings.BASE_DIR, 'apps/order/public.txt')).read()

    alipay = AliPay(
        appid="2016092300576093",
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_string=alipay_public_key_string,
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True  # 默认False
    )
    # 获取参数
    out_trade_no = request.GET.get('out_trade_no')
    paid = False
    for i in range(3):
        result = alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
        if result.get("trade_status", "") == "TRADE_SUCCESS":
            paid = True
            break
        else:
            time.sleep(10)
    #  判断是否支付成功
    if paid is False:
        context = {'star': '支付失败!'}
    else:
        context = {'star': '支付成功!'}
    #     修改订单状态
    trade_no = request.GET.get('trade_no')
    order = OrderStatus.objects.filter(order_number=trade_no, is_delete=False).update(order_state=5)
    # 渲染页面
    return render(request, 'pay_detail.html', context)
Ejemplo n.º 12
0
class MyAlipay(View):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.alipay = AliPay(appid=settings.ALIPAY_APP_ID,
                             app_notify_url=None,
                             app_private_key_string=app_private_key_string,
                             alipay_public_key_string=alipay_public_key_string,
                             sign_type='RSA2',
                             debug=True)
        print(settings.ALIPAY_APP_ID)

    def get_trade_url(self, order_id, amount):
        base_url = 'https://openapi.alipaydev.com/gateway.do'
        order_string = self.alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=amount,
            subject=order_id,
            return_url=settings.ALIPAY_RETURN_URL,
            notify_url=settings.ALIPAY_NOTIFY_URL)
        return base_url + '?' + order_string

    def get_trade_result(self, order_id):
        result = self.alipay.api_alipay_trade_query(out_trade_no=order_id)
        if result.get('trade_status') == 'TRADE_SUCCESS':
            return True
        return False

    def get_verify_result(self, data, sign):
        # 验证签名
        return self.alipay.verify(data, sign)
Ejemplo n.º 13
0
 def get(self, request):
     order_id = request.GET.get('order_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': '订单错误'}))
     check_client = AliPay(
         appid=settings.ALIPAY_APPID,
         app_notify_url=None,
         app_private_key_path=settings.APP_PRIVATE_KEY_PATH,
         alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH,
         sign_type="RSA2",
         debug=True)
     while True:
         response = check_client.api_alipay_trade_query(order_id)
         print(response)
         code = response.get('code')
         trade_status = response.get('trade_status')
         if code == '10000' and trade_status == 'TRADE_SUCCESS':
             order.status = OrderInfo.ORDER_STATUS_ENUM['UNCOMMENT']
             order.trade_id = response.get('trade_no')
             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': '支付失败'})
Ejemplo n.º 14
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':'订单失效'})
        try:
            order = OrderInfo.objects.get(order_id=order_id)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res':2,'errmsg':'订单失效'})

        alipay = AliPay(
            appid="2016092200569759",
            app_notify_url=None,  # 默认回调url
            app_private_key_string=os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem'),
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem'),
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        while True:
            response = alipay.api_alipay_trade_query(order_id)

            # response = {
            #         "trade_no": "2017032121001004070200176844", # 支付宝交易号
            #         "code": "10000", # 接口调用是否成功
            #         "invoice_amount": "20.00",
            #         "open_id": "20880072506750308812798160715407",
            #         "fund_bill_list": [
            #             {
            #                 "amount": "20.00",
            #                 "fund_channel": "ALIPAYACCOUNT"
            #             }
            #         ],
            #         "buyer_logon_id": "csq***@sandbox.com",
            #         "send_pay_date": "2017-03-21 13:29:17",
            #         "receipt_amount": "20.00",
            #         "out_trade_no": "out_trade_no15",
            #         "buyer_pay_amount": "20.00",
            #         "buyer_user_id": "2088102169481075",
            #         "msg": "Success",
            #         "point_amount": "0.00",
            #         "trade_status": "TRADE_SUCCESS", # 支付结果
            #         "total_amount": "20.00"
            # }
            code = response['code']
            if code == '10000' and response['trade_status'] == 'TRADE_SUCCESS':
                order.order_status = 4
                order.trade_no =response['trade_no']
                order.save()
                return JsonResponse({'res':3,'message':'支付成功'})
            elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'):
               import time
               time.sleep(5)
               continue

            else:
                print(code)
                return JsonResponse({'res':4,'errmsg':'支付错误'})
Ejemplo n.º 15
0
def check_trade(out_trade_no=None):
    """
    check trade by the order number
    
    Keyword Arguments:
        out_trade_no {int} -- order number (default: {None})
    
    Returns:
        bool -- decided by trade success or failure
    """
    if not out_trade_no:
        return False
    else:
        app_private_key_string = open(
            f'{CUR_PATH}/rsa_alipay/app_private.txt').read()
        alipay_public_key_string = open(
            f'{CUR_PATH}/rsa_alipay/alipay_public.txt').read()
        alipay = AliPay(
            appid="2016102400752486",
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        try:
            result = alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
        except:
            pass
        else:
            if result.get("trade_status", "") == "TRADE_SUCCESS":
                return True
            else:
                return False
Ejemplo n.º 16
0
    def post(self, request):
        """查询支付结果"""

        if not request.user.is_authenticated():
            return JsonResponse({'code': 1, 'errmsg': '请先登录'})

        # 获取请求参数
        order_id = request.POST.get('order_id')

        if not order_id:
            return JsonResponse({'code': 2, 'errmsg': '参数不能为空'})

        # 查询订单对象
        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          status=1,
                                          user=request.user)
        except:
            return JsonResponse({'code': 3, 'errmsg': '无效订单'})

        # todo: 业务逻辑:调用第三方的SDK,实现支付功能
        from alipay import AliPay

        app_private_key_string = open("apps/orders/app_private_key.pem").read()
        alipay_public_key_string = open(
            "apps/orders/alipay_public_key.pem").read()

        # 创建AliPay对象
        alipay = AliPay(
            appid="2016091500513478",  # 沙箱应用id(后期需要换成用户创建的应用id)
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=
            alipay_public_key_string,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True,  # 默认False,True表示使用沙箱环境
        )

        # todo: 调用第三方的SDK,查询支付结果
        while True:
            dict_data = alipay.api_alipay_trade_query(out_trade_no=order_id)
            code = dict_data.get('code')
            trade_status = dict_data.get('trade_status')
            trade_no = dict_data.get('trade_no')

            if code == '10000' and trade_status == 'TRADE_SUCCESS':
                # 订单支付成功,修改订单状态
                order.status = 4
                order.trade_no = trade_no
                order.save()
                return JsonResponse({'code': 0, 'errmsg': '支付成功'})

            elif (code == '10000'
                  and trade_status == 'WAIT_BUYER_PAY') or code == '40004':
                sleep(2)
                continue

            else:
                # 支付失败
                return JsonResponse({'code': 4, 'errmsg': '支付失败'})
Ejemplo n.º 17
0
class MyAliPay(View):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.alipay = AliPay(
            appid=settings.ALIPAY_ID,
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,
            app_notify_url=None,
            sign_type='RSA2',
            debug=True,  # 默认是False True则是将请求转发沙箱环境
        )

    # 支付绑定地址 -- 订单id,订单价格
    def get_trade_url(self, order_id, amount):
        order_string = self.alipay.api_alipay_trade_page_pay(
            subject=order_id,
            out_trade_no=order_id,
            total_amount=amount,
            # 支付完毕,将用户跳转至哪个页面
            return_url='http://127.0.0.1:5000/',
            notify_url='http://127.0.0.1:5000/',
        )
        return 'https://openapi.alipaydev.com/gateway.do?' + order_string

    def get_verify_result(self, data, sign):
        # 验证签名 True 成功 False 失败
        return self.alipay.verify(data, sign)

    def get_trade_result(self, order_id):
        # 主动查询
        result = self.alipay.api_alipay_trade_query(order_id)
        if result.get('trade_status') == 'TRADE_SUCCESS':
            return True
        return False
Ejemplo n.º 18
0
    def post(self, request):
        user = request.user
        if not user.is_authenticated():
            return JsonResponse({'info': '未登陆'})
        order_id_2 = request.POST.get('order_id')
        if not order_id_2:
            return JsonResponse({'info': '没有订单号'})
        try:
            order = Order.objects.get(id=order_id_2, user=user)
        except Exception as e:
            return JsonResponse({'info': '没有订单'})

        alipay = AliPay(
            appid='2016091400508044',
            app_notify_url=None,
            app_private_key_path=os.path.join(
                settings.BASE_DIR, 'apps/orderform/app_private_key.pem'),
            alipay_public_key_path=os.path.join(
                settings.BASE_DIR, 'apps/orderform/app_public_key.pem'),
            sign_type="RSA2",
            debug=True,
        )
        while True:
            response = alipay.api_alipay_trade_query(order_id_2)
            code = response.get('code')
            status = response.get('trade_status')
            if code == '10000' and status == 'TRADE_SUCCESS':
                order.status = 1
                order.save()
                return JsonResponse({'info': 'succeed!'})
            elif code == '10000' and status == 'WAIT_BUYER_PAY':
                continue
            else:
                return JsonResponse({'info': 'mistake!'})
Ejemplo n.º 19
0
def check_pay(request):
    if request.method == 'GET':
        o_id = request.GET.get('o_id')
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,
            app_private_key_path=os.path.join(settings.BASE_DIR, 'keys/pri'),
            alipay_public_key_path=os.path.join(settings.BASE_DIR, 'keys/pub'),
            sign_type='RSA2',
            # 沙箱环境下没有查询订单服务的
            debug=True)

        while True:
            response = alipay.api_alipay_trade_query(o_id)
            # code 40004 支付订单未创建
            # code 10000 trade_status  WAIT_BUYER_PAY  等待支付
            # oode 10000 trade_status  TRADE_SUCCESS  支付成功

            # response 是字典
            code = response.get('code')
            trade_status = response.get('trade_status')

            if code == '10000' and trade_status == 'TRADE_SUCCESS':
                # 支付成功
                # 返回支付结果
                return JsonResponse({'status': 1, 'msg': '支付成功'})
            elif (code == '10000'
                  and trade_status == 'WAIT_BUYER_PAY') or code == '40004':
                # 表示支付暂时没有完成
                continue
            else:
                return JsonResponse({'status': 0, 'msg': '支付失败'})
Ejemplo n.º 20
0
    def post(self, request):
        user = request.user
        if not user.is_authenticated:
            # 用户未登陆
            return JsonResponse({'res': 0, 'errmsg': '用户未登录'})
        # 获取数据
        # 订单id
        order_id = request.POST.get('order_id')

        # 数据校验
        if not order_id:
            return JsonResponse({'res': 1, 'errmsg': '订单id为空'})

        try:
            order = OrderInfo.objects.get(
                order_id=order_id,
                user=user,
                pay_method=3,
                order_status=1,
            )
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': '订单不存在'})

        # 业务处理:使用python sdk调用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid="2016101800714203",  # 应用id
            app_notify_url=None,  # 默认回调Url
            app_private_key_string=os.path.join(
                settings.BASE_DIR, 'apps/order/app_private_key.pem'),
            alipay_public_key_string=os.path.join(
                settings.BASE_DIR, 'apps/order/alipay_public_key.pem'),
            sign_type="RSA2",  # RSA 或者RSA2
            debug=True,  # 默认False是正式环境
        )
        while True:
            #调用支付宝的交易查询接口
            response = alipay.api_alipay_trade_query(trade_no=order_id)
            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, 'message': '支付成功'})
            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.º 21
0
class My_Alipay(object):
    """阿里云支付的类"""

    # 初始化            应用id   私钥文件的二进制数据     公钥文件的二进制数据
    def __init__(self,
                 appid,
                 private_key_data=None,
                 public_key_data=None,
                 app_notify_url=None,
                 sign_type="RSA2",
                 debug=False):
        if not private_key_data:
            private_key_data = open(constants.APP_PRIVATE_KEY_FILE).read()
        if not public_key_data:
            public_key_data = open(constants.ALIPAY_PUBLIC_KEY_FILE).read()
        self.alipay = AliPay(
            appid=appid,  # 应用id
            app_notify_url=app_notify_url,  # 默认回调url
            # 绑定应用公钥对应的私钥信息
            app_private_key_string=private_key_data,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=public_key_data,
            sign_type=sign_type,  # RSA 或者 RSA2
            debug=debug,  # 默认False是访问真实的地址。True就是访问沙箱的地址
        )
        self.api_alipay_trade_page_pay_url = "https://openapi.alipay.com/gateway.do?"
        self.api_alipaydev_trade_page_pay_url = "https://openapi.alipaydev.com/gateway.do?"

    # 拉去支付宝的交易界面                  交易订单流水号   交易金额(必须是字符串)        主体   是否获取沙箱的支付地址
    def api_alipay_trade_page_pay(self,
                                  out_trade_no,
                                  total_amount,
                                  subject,
                                  dev=False,
                                  return_url=None,
                                  notify_url=None):
        order_string = self.alipay.api_alipay_trade_page_pay(
            out_trade_no=out_trade_no,  # 订单id
            total_amount=total_amount,  # 支付总金额,因为我们的是Decimal类型无法被json序列化,所以变成字符串
            subject=subject,
            return_url=return_url,
            notify_url=notify_url  # 可选, 不填则使用默认notify url,支付宝服务器主动通知商户服务器里指定的页面
        )
        # 返回支付宝交易的url地址
        if dev:
            return self.api_alipaydev_trade_page_pay_url + order_string

        return self.api_alipay_trade_page_pay_url + order_string

    # 根据流水号,查询用户是否支付成功
    def api_alipay_trade_query(self, out_trade_no):

        response = self.alipay.api_alipay_trade_query(out_trade_no)
        code = response.get('code')
        if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS':
            return True
        else:
            # 支付出错
            return False
Ejemplo n.º 22
0
    def post(self,request):
        # 判断用户是否登录
        if 'user' not in request.session:
            return JsonResponse({'res': 0, 'errmsg': '请先登录'})
        user = jsonpickle.loads(request.session.get('user'))

        # 获取参数
        order_id = request.POST.get('order_id')
        # 校验数据
        if not order_id:
            return JsonResponse({'res': 1, 'errmsg': '无效的订单ID'})
        # 查看订单是否存在
        try:
            order = OrderInfo.objects.get(user=user, pay_method=3, order_status=1, order_id=order_id)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': '订单无效'})

        # 使用python.SDK 连接支付宝接口
        # 初始化
        # 业务处理:条用python.sdk条用支付宝的支付接口
        # 初始化
        alipay = AliPay(
            appid="2016093000634740",  # APPID 支付宝沙箱
            app_notify_url=None,  # 默认回调url
            # 应用私钥
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'app_private_key.pem'),
            # 支付宝公钥
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                'alipay_public_key.pem'),
            sign_type='RSA2',  # RSA 或者 RSA2
            debug=True  # 默认False
        )

        # 调用支付宝订单查询接口
        while True:
            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':
                # 支付成功
                # 获取支付宝交易号
                trade_on = response.get('trade_no')
                # 更新订单状态
                order.trade_on = trade_on
                order.order_status = 4  # 待评价
                order.save()
                # 返回结果
                return JsonResponse({'res': 3, 'message': '支付成功'})

            elif code == '40004' or code == '10000' and trade_status == 'WAIT_BUYER_PAY':
                # 业务处理失败,可能一会就能成功
                # 等待买家付款
                import time
                time.sleep(3)
                continue
            else:
                # 支付出错
                return JsonResponse({'res': 4, 'errmsg': '支付失败'})
Ejemplo n.º 23
0
    def get(self, request):
        """查询订单状态:保存支付宝返回的支付宝维护的订单id,修改订单的状态为待评价"""

        # 接受订单id
        order_id = request.GET.get('order_id')

        # 校验order_id
        if not order_id:
            return JsonResponse({'code': 2, 'message': '缺少订单id'})

        # 查询订单信息:订单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:

            # 调用查询接口
            # 参数:可以接受商家维护的订单id.可以接受支付宝维护的订单id
            # 返回值:是个字典,内部包含了支付宝响应给调用者的参数信息,包括code,trade_status,trade_no
            response = alipay.api_alipay_trade_query(order_id)

            # 读取code,trade_status
            code = response.get('code')
            trade_status = response.get('trade_status')

            # 判断订单状态
            if code == '10000' and trade_status == 'TRADE_SUCCESS':
                # 支付成功:保存trade_no,修改订单状态
                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': '支付失败'})
Ejemplo n.º 24
0
    def post(self, request):
        user = request.user
        if not user.is_authenticated():
            return JsonResponse({'res': -1, 'error': '用户未登录'})

        order_id = request.POST.get('order_id')

        if not order_id:
            return JsonResponse({'res': -2, 'error': '无效的订单id'})

        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': -3, 'error': '订单错误'})

        app_private_key_string = open(
            os.path.join(settings.BASE_DIR,
                         'apps/order/app_private_key.pem')).read()
        alipay_public_key_string = open(
            os.path.join(settings.BASE_DIR,
                         'apps/order/alipay_public_key.pem')).read()

        alipay = AliPay(
            appid="2016100100636673",
            # 默认回调url
            app_notify_url=None,
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            # RSA 或者 RSA2
            sign_type="RSA2",
            # 正式环境使用False,沙箱环境使用True
            debug=True,
        )

        while True:
            # 调用支付宝的交易查询接口
            response = alipay.api_alipay_trade_query(order_id)
            code = response.get('code')
            if code == '10000':
                # 支付成功
                if 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': 1, 'message': '支付成功'})
                # 等待支付
                elif response.get('trade_status') == 'WAIT_BUYER_PAY':
                    time.sleep(5)
                # 支付失败
                else:
                    return JsonResponse({'res': -1, 'error': '支付失败'})
            # 业务处理失败,可能一会后就会成功
            elif code == '40004':
                time.sleep(5)
Ejemplo n.º 25
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 all([order_id]):
            return JsonResponse({'res': 1, 'errmsg': '订单id为空'})

        # 校验订单信息
        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          order_status=1,
                                          pay_method=3)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': '无效订单id'})

        # 业务处理: 使用python SDK调用支付宝的下单支付接口
        # 初始化

        alipay = AliPay(
            appid="2016091900545245",  # 应用id
            app_notify_url=None,  # 默认回调url
            app_private_key_path=APP_PRIVATE_KEY_PATH,  # 网站私钥文件路径
            alipay_public_key_path=ALIPAY_PUBLIC_KEY_PATH,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False, True代表沙箱环境
        )

        while True:
            response = alipay.api_alipay_trade_query(order_id)
            code = response.get('code')

            if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS':
                # 支付成功
                # 获取支付宝交易号
                trade_no = response.get('trade_no')
                # 更新订单状态,设置支付宝交易号
                order.order_status = 2  # 待发货
                order.trade_no = trade_no
                order.save()

                # 返回应答
                return JsonResponse({'res': 3, 'message': '支付成功'})
            elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'):
                # code == '40004': 支付交易订单还未创建,用户登录支付宝后就会创建
                # 等待买家付款
                import time
                time.sleep(5)
                continue
            else:
                # 支付失败
                return JsonResponse({'res': 4, 'errmsg': '支付失败'})
Ejemplo n.º 26
0
    def post(self, request):
        '''处理浏览器支付结果查询请求'''
        # 用户是否登录
        user = request.user
        if not user.is_authenticated:
            return JsonResponse({'res': -1, 'errmsg': '用户未登录'})

        # 接收参数
        order_id = request.POST.get('order_id')
        # 校验参数
        if not order_id:
            return JsonResponse({'res': -2, 'errmsg': '无效的订单ID'})
        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': -3, 'errmsg': '订单错误'})
        # total_pay = order.total_price + order.transit_price  # 计算得到订单应付总金额

        # 业务处理:使用Python SDK调用支付宝的交易查询接口
        # 初始化
        app_private_key_string = open(os.path.join(settings.BASE_DIR, 'apps/order/app_private_key.pem')).read()
        alipay_public_key_string = open(os.path.join(settings.BASE_DIR, 'apps/order/alipay_public_key.pem')).read()
        alipay = AliPay(
            appid="2016102100732704",  # 应用ID
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        while True:
            # 调用支付宝交易查询接口, https://openapi.alipaydev.com/gateway.do? + order_string
            response = alipay.api_alipay_trade_query(order_id)
            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 = 3
                order.save()
                # 返回结果
                return JsonResponse({'res': 1, 'message': '支付成功'})
            elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'):
                # 等待买家付款
                import time
                time.sleep(5)
                continue
            else:
                # 支付出错
                print(code)
                print(response.get('trade_status'))
                return JsonResponse({'res': -4, 'errmsg': '支付错误'})
Ejemplo n.º 27
0
    def post(self, request):
        """查询支付结果"""
        user = request.user

        if not user.is_authenticated():
            return redirect(reverse('user:login'))

        order_id = request.POST.get('order_id')

        if not order_id:
            return JsonResponse({'res': 1, 'errmsg': '未传入订单ID!'})

        try:
            order = OrderInfo.objects.get(
                order_id=order_id,
                user=user,
                pay_method=3,
                order_status=1
            )
        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': "订单不存在!"})

        app_private_key = open('./apps/order/app_private_key.pem').read()
        alipay_public_key = open('./apps/order/alipay_public_key.pem').read()

        alipay = AliPay(
            appid='2016092900627469',
            app_notify_url=None,
            app_private_key_string=app_private_key,
            alipay_public_key_string=alipay_public_key,
            sign_type="RSA2",
            debug=True
        )

        # 返回的是一个字典
        while True:
            query_response = alipay.api_alipay_trade_query(out_trade_no=order_id)

            code = query_response.get('code')
            if code == '10000' and query_response.get('trade_status') == 'TRADE_SUCCESS':
                # 支付成功
                # 获取支付宝交易号
                # 更新订单的支付状态
                trade_no = query_response.get('trade_no')
                order.trade_no = trade_no
                order.order_status = 4      # 待评价
                order.save()

                return JsonResponse({'res': 4, 'message': '支付成功!'})
            elif code == '40004' or code == '10000' and query_response.get('trade_status') == "WAIT_BUYER_PAY":
                # 等待买家付款
                # 业务处理失败,可能一会就可以成功
                import time
                time.sleep(5)
                continue
            else:
                # 支付出错
                return JsonResponse({'res': 3, 'errmsg': '支付出错!'})
Ejemplo n.º 28
0
    def post(self):
        user = request.user
        if not user.is_authenticated:
            return jsonify({'res': 0, 'errmsg': '请先登录!'})

        order_id = request.form.get('order_id')

        if not order_id:
            return jsonify({'res': 1, 'errmsg': '无效的订单id'})

        # try:
        #     order = OrderInfo.objects.get(
        #         order_id=order_id, user=user, pay_method=3, order_status=1)
        # except OrderInfo.DoesNotExist:
        #     return JsonResponse({'res': 2, 'errmsg': '订单错误!'})
        order = OrderInfo.query.filter(
            OrderInfo.id == order_id,
            OrderInfo._user == user,
            OrderInfo.pay_method == 3,
            OrderInfo.order_status == 1,
        )
        if not order:
            return jsonify({'res': 2, 'errmsg': '订单错误!'})

        alipay = AliPay(
            appid=config.ALIPAY_APP_ID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=config.APP_PRIVATE_KEY_PATH,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_path=config.ALIPAY_PUBLIC_KEY_PATH,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )

        # 调用支付宝的交易查询接口
        while True:
            response = alipay.api_alipay_trade_query(order_id)

            code = response.get('code')
            if code == '10000' and response.get(
                    'trade_status') == 'TRADE_SUCCESS':
                # 支付成功
                # 更新订单的状态
                train_no = response.get('trade_no')
                order.trade_no = train_no
                # 将支付状态改为待评价
                order.order_status = 4
                db.session.add(order)
                db.session.commit()
                # order.save()
                return jsonify({'res': 3, 'message': '支付成功!'})
            elif (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY') or code == '40004':
                # 等待支付
                sleep(5)
                continue
            else:
                # 支付失败
                return jsonify({'res': 4, 'errmsg': '支付失败!'})
Ejemplo n.º 29
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': '参数不完整'})

        try:
            # 校验该订单是不是当前用户的
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)

        except OrderInfo.DoesNotExist:
            return JsonResponse({'res': 2, 'errmsg': '无效订单号'})

        while True:
            # 业务处理 使用python sdk调用支付宝接口
            alipay = AliPay(
                appid="2016092500595178",  # 应用id
                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  # 默认False True访问沙箱
            )

            # 调用查询接口
            response = alipay.api_alipay_trade_query(order_id)
            code = response.code
            print(code)
            if code == '1000' and response.get(
                    'trade_stutas') == 'TRADE_SUCCESS':
                # 修改订单信息
                trade_no = response.get('trade_no')
                order.trade_no = trade_no
                order.trade_status = 4
                order.save()
                return JsonResponse({'res': 3, 'msg': '支付成功'})
            elif code == '1000' and response.get(
                    'trade_stutas') == 'WAIT_BUYER_PAY':
                time.sleep(5)
                continue
            else:
                return JsonResponse({'res': 4, 'errmsg': '支付失败'})
Ejemplo n.º 30
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': '无效的订单'})

        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          pay_method=3,
                                          order_status=1)
        except OrderInfo.DoesNotExist:

            return JsonResponse({'res': 2, 'errmsg': '订单错误'})

        # 业务处理:使用python sdk调用支付宝的支付接口
        # alipay初始化
        app_private_key_string = open("apps/order/app_private_key.pem").read()
        alipay_public_key_string = open("apps/order/alipay_public_key.pem").read()
        alipay = AliPay(
            appid="2016102200738204",  # 应用id
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False, 此处沙箱模拟True
        )
        # 调用支付宝的交易查询接口
        while True:
            response = alipay.api_alipay_trade_query(order_id)
            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, "messsage":'成功'})
            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':"支付失败"})