Пример #1
0
def save_order_payment_result():

    alipay_dict=request.form.to_dict()
    #对支付宝的数据进行分离,提取出支付宝的签名参数,sign和剩下的其他数据
    alipay_sign=alipay_dict.pop('sign')
    # 创建支付宝sdk的工具对象
    alipay = AliPay(
        appid="2016092800615894",
        app_notify_url=None,  # 默认回调url
        app_private_key_path=os.path.join(os.path.dirname(__file__), 'keys/app_private_key.pem'),  # 私钥
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_path=os.path.join(os.path.dirname(__file__), 'keys/alpay_public_key.pem'),
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True  # 默认False
    )
    #借助工具验证参数的合法性.update
    #验证是否是支付宝的参数
    result=alipay.verify(alipay_dict,alipay_sign)

    if result:
        #修改数据库的订单状态信息
        order_id = alipay_dict.get('out_trade_no')
        trade_no =alipay_dict.get('trade_no')  #支付宝的交易流水号
        try:
            Order.query.filter_by(id=order_id).update({'status':'WAIT_COMMENT','trade_no':trade_no})
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
    return jsonify(errno=RET.OK,errmsg='OK')
Пример #2
0
    def post(self, request):
        """处理支付宝异步通知结果"""
        # 初始化支付对象
        alipay = AliPay(
            appid=settings.ALIAPY_CONFIG["appid"],
            app_notify_url=settings.ALIAPY_CONFIG["app_notify_url"],  # 默认回调url
            app_private_key_path=settings.
            ALIAPY_CONFIG["app_private_key_path"],
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_path=settings.
            ALIAPY_CONFIG["alipay_public_key_path"],
            sign_type=settings.ALIAPY_CONFIG["sign_type"],
            debug=settings.ALIAPY_CONFIG["debug"]  # 默认False
        )

        data = request.data
        signature = data.pop("sign")
        success = alipay.verify(data, signature)
        if success and data["trade_status"] in ("TRADE_SUCCESS",
                                                "TRADE_FINISHED"):
            response = self.change_order_status(data)
            if "credit" in response.data:
                return HttpResponse("success")

        return Response({"message": "对不起,当前订单支付失败!"})
Пример #3
0
    def put(self, request):
        data = request.query_params.dict()
        signature = data.pop("sign")

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                "keys/alipay_public_key.pem"),  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )

        success = alipay.verify(data, signature)
        if success:
            # 订单编号
            order_id = data.get('out_trade_no')
            # 支付宝支付流水号
            trade_id = data.get('trade_no')
            Payment.objects.create(order_id=order_id, trade_id=trade_id)
            OrderInfo.objects.filter(order_id=order_id).update(
                status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"])
            return Response({'trade_id': trade_id})
        else:
            return Response({'message': '参数错误'},
                            status=status.HTTP_400_BAD_REQUEST)
Пример #4
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)
Пример #5
0
    def get(self, request):
        # 1.解析参数 --queydict---dict
        data = request.GET.dict()

        # 2.剔除 sign 签名
        signature = data.pop('sign')

        # 加自己的校验 ---订单是否存在--- 金额是否一致

        # 3.支付宝校验 参数的 真伪
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,

            # 美多的 私钥路径
            app_private_key_path=os.path.join(
                settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'),
            # alipay的 公钥路径
            alipay_public_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                'keys/alipay_public_key.pem'),
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG)
        sucess = alipay.verify(data, signature)

        if sucess:
            Payment.objects.create(order_id=data.get('out_trade_no'),
                                   trade_id=data.get('trade_no'))

        # 4.如果校验通过 --存储 trade_no

        # 5.返回前端的数据
        return render(request, 'pay_success.html',
                      {'trade_id': data.get('trade_no')})
Пример #6
0
    def get(self, request):
        alipay = AliPay(
            appid=settings.ALIAPY_CONFIG['appid'],
            app_notify_url=settings.ALIAPY_CONFIG['app_notify_url'],  # 默认回调url
            app_private_key_string=settings.
            ALIAPY_CONFIG['app_private_key_path'],
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=settings.
            ALIAPY_CONFIG['alipay_public_key_path'],
            sign_type=settings.ALIAPY_CONFIG['sign_type'],  # RSA 或者 RSA2
            debug=settings.ALIAPY_CONFIG['debug'],  # 默认False
        )

        # 验证支付的异步通知
        data = request.query_params.dict()

        signature = data.pop("sign")

        verify = alipay.verify(data, signature)
        print(verify)

        if verify:
            # 处理订单状态,生成用户购买记录,返回支付成功的结果
            return self.order_result_pay(data)

        return Response({"message": "对不起,支付失败"})
Пример #7
0
    def get(self, request):
        alipay = AliPay(
            appid=settings.ALIAPY_CONFIG['appid'],
            app_notify_url=None,  # 默认回调url
            app_private_key_string=open(
                settings.ALIAPY_CONFIG['app_private_key_path']).read(),
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=open(
                settings.ALIAPY_CONFIG['alipay_public_key_path']).read(),
            sign_type=settings.ALIAPY_CONFIG['sign_type'],  # RSA 或者 RSA2
            debug=settings.ALIAPY_CONFIG['debug'],  # 默认False
        )
        # 校验支付宝响应数据
        data = request.query_params.dict()
        out_trade_no = data.get('out_trade_no')
        sign = data.pop('sign')
        success = alipay.verify(data, sign)
        print('status>>>', success)
        if not success:
            logger.error('%s,支付宝响应数据校验失败' % out_trade_no)
            return Response('支付宝响应数据校验失败', status=status.HTTP_400_BAD_REQUEST)

        res_data = self.change_order_status(data)

        #  响应结果
        return Response({'msg': '这一脚没毛病', 'data': res_data})
Пример #8
0
 def get(self, request):
     # 初始化支付参数
     app_private_key_string = open(
         os.path.join(BASE_DIR,
                      "apps/payments/keys/app_private_key.pem")).read()
     alipay_public_key_string = open(
         os.path.join(BASE_DIR,
                      "apps/payments/keys/app_private_key.pem")).read()
     alipay = AliPay(
         appid=settings.ALIAPY_CONFIG["appid"],  # 沙箱支付的id
         app_notify_url=settings.ALIAPY_CONFIG["app_notify_url"],  # 默认回调url
         app_private_key_string=app_private_key_string,
         # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
         alipay_public_key_string=alipay_public_key_string,
         sign_type=settings.ALIAPY_CONFIG["sign_type"],  # RSA 或者 RSA2
         debug=settings.ALIAPY_CONFIG["debug"],  # 默认False
     )
     # 验证支付结果
     data = request.query_params.dict()
     print('支付结果', data)
     signature = data.pop("sign")
     success = alipay.verify(data, signature)
     success = True
     if success:
         return self.payResult(data)
     return Response({'message': '验证支付结果失败'})
Пример #9
0
def alipayback(request):
    query_dict = request.GET
    data = query_dict.dict()

    print(data)
    # 获取并从请求参数中剔除signature
    signature = data.pop('sign')

    app_private_key_string = open(os.path.join(settings.BASE_DIR, "alipay/app_private_key.pem")).read()
    alipay_public_key_string = open(os.path.join(settings.BASE_DIR, "alipay/alipay_public_key.pem")).read()

    # 创建支付宝支付对象
    alipay = AliPay(
        appid='2016092700609211',
        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
    )
    # 校验这个重定向是否是alipay重定向过来的
    success = alipay.verify(data, signature)
    if success:
        #	验证成功
        # 生成支付记录,改变订单状态
        order_code = data.get('out_trade_no')
        Order.objects.filter(order_code=order_code).update(status=2)
        return redirect(reverse('user:info'))
    else:
        # 验证失败
        print('no')
        return HttpResponse('支付失败')
Пример #10
0
    def put(self,request):
        data = request.query_params.dict()
        signature = data.pop('sign')

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None, #默认回调地址
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),'keys/alipay_public_key.pem'), #支付宝的公钥
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG #默认是false
        )
        success = alipay.verify(data,signature)
        if success:
            #订单编号
            order_id = data.get('out_trade_no')
            #支付宝支付流水号
            trade_id = data.get('trade_no')
            Payment.objects.create(
                order_id=order_id,
                trade_id=trade_id
            )
            OrderInfo.objects.filter(order_id=order_id,status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update(status=OrderInfo.ORDER_STATUS_ENUM['UNCOMMENT'])
            return Response({'trade_id':trade_id})
        else:
            return Response({'message':'非法请求'},status=status.HTTP_403_FORBIDDEN)
Пример #11
0
def save_order_payment_result(request):
    """保存订单支付结果"""
    data = request.body.decode()
    post_data = parse_qs(data)
    post_dict = {}
    # 支付宝的数据进行分离,提取出支付宝的签名参数sign和剩下的其他数据
    for k, v in post_data.items():
        post_dict[k] = v[0]
    alipay_sign = post_dict.pop("sign")

    app_private_key_string = open(
        os.path.join(os.path.dirname(__file__),
                     "key\\app_private_key.pem")).read()
    alipay_public_key_string = open(
        os.path.join(os.path.dirname(__file__),
                     "key\\alipay_public_key.pem")).read()
    alipay_client = AliPay(
        appid="2016092500594174",
        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
    )
    result = alipay_client.verify(post_dict, alipay_sign)
    if result:
        # 修改数据库的订单状态信息
        order_id = post_dict.get("out_trade_no")
        order = Order.objects.filter(id=order_id).first()
        order.status = 4
        order.save()
        return JsonResponse({"msg": "ok"})
    else:
        return JsonResponse({'err': 'error'})
Пример #12
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
Пример #13
0
 def get_sdict_ali_verify(self, request, method):
     """
     :param request:
     :param method: 请求方式
     :return: success_dict,ali_verufy,alipay
     """
     success_dict = {}
     if method == 1:
         for key, val in request.GET.items():
             success_dict[key] = val
     if method == 2:
         for key, val in request.POST.items():
             success_dict[key] = val
     # 1.剔除掉sign做验签准备
     sign = success_dict.pop("sign", None)
     # 2.生成alipay对象
     alipay = AliPay(
         appid="2016101900725372",
         app_notify_url=None,  # 默认回调url- 阿里与商户后台交互
         # 使用的文件读取方式,载入支付秘钥
         app_private_key_string=private_key,
         # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
         # 使用文件读取的方式,载入支付报公钥
         alipay_public_key_string=ali_public_key,
         sign_type="RSA2",  # RSA 或者 RSA2
         debug=True)
     # 3.使用支付宝接口进行验签
     ali_verify = alipay.verify(success_dict, sign)
     return success_dict, ali_verify, alipay
Пример #14
0
    def put(self, request):
        data = request.query_params.dict()
        # sign 不能参与签名验证
        signature = data.pop("sign")

        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            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=settings.DEBUG  # 默认False
        )

        # verify
        success = alipay.verify(data, signature)
        if success:
            # 订单号
            order_id = data.get('out_trade_no')
            # 支付宝订单号
            trade_id = data.get('trade_no')
            Payment.objects.create(order_id=order_id, trade_id=trade_id)
            OrderInfo.objects.filter(order_id=order_id).update(
                status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"])
            return Response({'trade_id': trade_id})
        return Response({'message': '参数错误'},
                        status=status.HTTP_400_BAD_REQUEST)
Пример #15
0
	def put(self, request):
		# 将query_dict转换为python的字典
		data_dict = request.query_params.dict()
		signature = data_dict.pop('sign')

		app_private_key_string = open(
			os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem")).read()
		alipay_public_key_string = open(
			os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem")).read()

		# 调用python-alipay-sdk中的类创建alipay对象
		alipay = AliPay(
			appid="2016091700529506",  # 沙箱的appid
			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
		)
		success = alipay.verify(data_dict, signature)
		if success:
			# 订单编号
			order_id = data_dict.get('out_trade_no')
			# 支付宝支付流水号
			trade_id = data_dict.get('trade_no')
			Payment.objects.create(
				order_id=order_id,
				trade_id=trade_id
			)
			OrderInfo.objects.filter(order_id=order_id, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update(
				status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"])
			return Response({'trade_id': trade_id})
		else:
			return Response({'message': '非法请求'}, status=403)
Пример #16
0
    def get(self, request):
        #1,获取参数
        dict_data = request.GET.dict()
        sign = dict_data.pop("sign")

        #2,校验参数
        app_private_key_string = open(settings.APLIPAY_PRIVATE_KEY).read()
        alipay_public_key_string = open(settings.APLIPAY_PUBLIC_KEY).read()

        #2,创建alipay对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            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=False  # 默认False
        )
        success = alipay.verify(dict_data, sign)

        if not success:
            return http.HttpResponseForbidden("非法请求")

        #3,数据入库(payment, status)
        order_id = dict_data.get("out_trade_no")
        trade_id = dict_data.get("trade_no")
        Payment.objects.create(order_id=order_id, trade_id=trade_id)
        OrderInfo.objects.filter(order_id=order_id).update(
            status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"])

        #4,返回响应
        return render(request,
                      'pay_success.html',
                      context={"trade_id": trade_id})
Пример #17
0
 def get_sdict_ali_verify(self, request, method):
     """
     :param request:
     :param method: 请求方式
     :return: success_dict,ali_verufy,alipay
     """
     success_dict = {}
     if method == 1:
         for key, val in request.GET.items():
             success_dict[key] = val
     if method == 2:
         for key, val in request.POST.items():
             success_dict[key] = val
     # 1.剔除掉sign做验签准备
     sign = success_dict.pop("sign", None)
     # 2.生成alipay对象
     alipay = AliPay(appid="2016100200644279",
                     app_notify_url=None,
                     app_private_key_path=os.path.join(
                         os.getcwd(), "utils/key_file/s7_private_key.pem"),
                     alipay_public_key_path=os.path.join(
                         os.getcwd(),
                         "utils/key_file/alipay_public_key.pem"),
                     debug=True)
     # 3.使用支付宝接口进行验签
     ali_verify = alipay.verify(success_dict, sign)
     return success_dict, ali_verify, alipay
Пример #18
0
    def get(self, request):
        # 查询字符串数据

        data = request.GET.dict()
        signature = data.pop('sign')
        # 验证是否是从支付宝套转的请求
        aalipay = AliPay(
            appid=settings.ALIPAY_APPID,  # 支付宝应用中的appid
            app_notify_url=None,  # 默认回调url
            # 美多私钥
            app_private_key_path=os.path.join(
                settings.BASE_DIR, 'apps/payments/keys/app_private_key.pem'),
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_path=os.path.join(
                settings.BASE_DIR, 'apps/payments/keys/alipay_public_key.pem'),
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        success = aalipay.verify(data, signature)
        if success:
            # 保存支付结果
            order_id = data['out_trade_no']
            trade_id = data['trade_no']
            Payment.objects.create(order_id - order_id, trade_id=trade_id)
            # 当前订单状态的修改
            OrderInfo.objects.filter(order_id=order_id,
                                     pay_method=2).update(status=2)
            # 渲染支付成功页面
            return render(request, 'pay_success.html', {'trade_no': trade_id})
        else:
            return render(request, 'index.html')
Пример #19
0
 def post(self, request):
     data = request.data
     alipay_data = dict(list(data.items()))
     signature = alipay_data.pop('sign')
     alipay = AliPay(
         appid="2016102000727796",
         app_notify_url=None,  # 默认回调url
         app_private_key_string=open(
             os.path.join(settings.BASE_DIR, 'keys', 'app_private_key.txt'),
             'r').read(),
         # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
         alipay_public_key_string=open(
             os.path.join(settings.BASE_DIR, 'keys',
                          'alipay_public_key.txt'), 'r').read(),
         sign_type="RSA2",  # RSA 或者 RSA2
         debug=True  # 默认False
     )
     success = alipay.verify(alipay_data, signature)
     if success and alipay_data["trade_status"] in ("TRADE_SUCCESS",
                                                    "TRADE_FINISHED"):
         order_id = alipay_data.get('out_trade_no')
         order = models.Order.objects.get(pk=order_id)
         print('order_id: ' + order_id)
         order.pay_method = 2
         order.order_status = 2
         order.save()
         return Response()
     else:
         return Response({'message': '订单支付失败!'},
                         status=status.HTTP_400_BAD_REQUEST)
Пример #20
0
 def post(self, request):
     data = request.data
     # print(data)
     alipay_data = {}
     for key, value in data.items():
         alipay_data[key] = value
     sign = alipay_data.pop("sign")
     app_private_key_string = open(
         os.path.join(settings.BASE_DIR, 'keys', 'app_private_key.txt'),
         'r').read()
     alipay_public_key_string = open(
         os.path.join(settings.BASE_DIR, 'keys', 'alipay_public_key.txt'),
         'r').read()
     alipay = AliPay(
         appid="2016100100640619",
         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
     )
     success = alipay.verify(alipay_data, sign)
     if success and alipay_data["trade_status"] in ("TRADE_SUCCESS",
                                                    "TRADE_FINISHED"):
         order_id = alipay_data.get('out_trade_no')
         order = Order.objects.get(pk=order_id)
         order.order_status = 4
         order.pay_method = 2
         order.save()
         return Response()
     else:
         return Response({"message": "订单支付失败!"},
                         status=status.HTTP_400_BAD_REQUEST)
Пример #21
0
    def get(self, request):
        app_private_key_string = open(
            os.path.join(BASE_DIR,
                         "apps/payments/keys/app_private_key.pem")).read()
        alipay_public_key_string = open(
            os.path.join(BASE_DIR,
                         "apps/payments/keys/alipay_public_key.pem")).read()
        # 初始化支付参数
        alipay = AliPay(
            appid=settings.ALIAPY_CONFIG["appid"],  # 沙箱支付的id
            app_notify_url=settings.ALIAPY_CONFIG["app_notify_url"],  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type=settings.ALIAPY_CONFIG["sign_type"],  # RSA 或者 RSA2
            debug=settings.ALIAPY_CONFIG["debug"],  # 默认False
        )

        # 验证alipay的异步通知,data来自支付宝回调POST 给你的data,字典格式.
        data = request.query_params.dict()
        # 获取签名信息
        signature = data.pop("sign")

        # 比对签名是否合法
        success = alipay.verify(data, signature)
        success = True

        if success:
            # TODO  支付成功后的业务逻辑
            return self.order_result_pay(data)

        return Response({"message": "对不起,当前订单支付失败!"})
Пример #22
0
    def get(self, request):
        query_dict = request.GET
        data = query_dict.dict()
        signature = data.pop('sign')

        # 创建支付宝支付对象
        alipy = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                "keys/alipay_public_key.pem"),
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG)
        success = alipy.verify(data, signature)
        # 校验这个重定向是否是alipay重定向过来的
        if success:
            trade_id = data.get('trade_no')  # 支付宝交易号
            order_id = data.get('out_trade_no')  # 商户订单号
            Payment.objects.create(order_id=order_id, trade_id=trade_id)
            OrderInfo.objects.filter(
                order_id=order_id,
                status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update(
                    status=OrderInfo.ORDER_STATUS_ENUM['UNCOMMENT'])
            context = {'trade_id': trade_id}
            return render(request, 'pay_success.html', context)
        else:
            return http.HttpResponseForbidden('非法访问')
Пример #23
0
    def get(self, request):
        #获取请求参数,类型是query_dict类型
        query_dict = request.GET
        #将query_dict类型转成字典
        date = query_dict.dict()
        #传过来的字符串多了签名属性,将它剔除
        signature = date.pop('sign')

        #创建支付宝支付对象
        alipay = AliPay(
            #应用APPID
            appid=settings.ALIPAY_APPID,
            #回调URL,使用None
            app_notify_url=None,
            #私钥地址
            app_private_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                "keys/app_private_key.pem"),  #支付宝公钥,指定路径
            #支付宝公钥地址
            alipay_public_key_path=os.path.join(
                os.path.dirname(os.path.abspath(__file__)),
                "keys/alipay_public_key.pem"),
            #签名方式RSA/RSA2
            sign_type="RSA2",
            #是否为沙箱环境
            debug=settings.ALIPAY_DEBUG,
        )

        #判断重定向是否为alipay重定向过来的verify(剔除签名后的字符串参数,签名)
        succes = alipay.verify(date, signature)
        if succes:
            #获取支付成功的订单编号
            order_id = date.get('out_trade_no')
            #获取支付成功支付宝流水编号
            trade_id = date.get('trade_no')

            #先获取当前的交易数据,保证唯一
            try:
                Payment.objects.get(order_id=order_id, trade_id=trade_id)
            except Payment.DoesNotExist:
                #保存交易数据
                Payment.objects.create(
                    order_id=order_id,
                    trade_id=trade_id,
                )
                #修改订单状态
                OrderInfo.objects.filter(
                    order_id=order_id,
                    status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update(
                        order_id=order_id,
                        status=OrderInfo.ORDER_STATUS_ENUM['UNCOMMENT'],
                    )

            #渲染页面
            context = {
                'trade_id': trade_id,
            }
            return render(request, 'pay_success.html', context)
        else:
            return HttpResponseForbidden('请求出错')
Пример #24
0
    def put(self,request):
        # 1、获取数据

        data=request.query_params.dict()
        # sign 不能参与签名验证
        signature = data.pop("sign")
        # 2、验证数据
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'keys/app_private_key.pem'),
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                'keys/alipay_public_key.pem'),
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )
        success = alipay.verify(data, signature)

        if success:
            order_id=data['out_trade_no']
            trade_id=data['trade_no']
            # 3、保存数据
            Payment.objects.create(order_id=order_id,trade_id=trade_id)
            # 更新订单状态
            OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
            # 4、返回结果
            return Response({'trade_id': trade_id})
        else:
            return Response({'error':'验证失败'},status=400)
Пример #25
0
def order_check():
    """校验支付是否完成"""
    # 获取数据
    alipay_data = request.form.to_dict()
    signure = alipay_data.pop("sign")

    # 创建支付宝支付对象
    alipay = AliPay(
        appid="2016101300676658",
        app_notify_url=None,  # 默认回调url
        app_private_key_path=os.path.join(os.path.dirname(__file__),
                                          "keys/app_private_key.pem"),
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_path=os.path.join(os.path.dirname(__file__),
                                            "keys/alipay_public_key.pem"),
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True  # 默认False
    )

    result = alipay.verify(alipay_data, signure)
    if result:
        # 交易成功,更新数据库数据
        id = alipay_data.get("out_trad_on")
        alipay_on = alipay_data.get("trad_on")
        try:
            Order.query.filter_by(id=id).update({
                "status": "PAID",
                "alipay_on": alipay_data
            })
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()

    return jsonify(errno=RET.OK, errmsg="ok")
Пример #26
0
    def get(self, request):
        # 支付的初始化参数
        alipay = AliPay(
            appid=settings.ALIAPY_CONFIG['appid'],  # 沙箱支付的应用id
            app_notify_url=settings.ALIAPY_CONFIG['app_notify_url'],  # 默认回调url
            # app_private_key_string=app_private_key_string,  # 应用私钥
            # # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            # alipay_public_key_string=alipay_public_key_string,
            app_private_key_string=settings.
            ALIAPY_CONFIG['app_private_key_path'],  # 应用私钥
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=settings.
            ALIAPY_CONFIG['alipay_public_key_path'],
            sign_type=settings.ALIAPY_CONFIG['sign_type'],  # RSA 或者 RSA2
            debug=settings.ALIAPY_CONFIG['debug'],  # 默认False
        )

        # 验证alipay的异步通知,
        data = request.query_params.dict()
        signature = data.pop("sign")
        success = alipay.verify(data, signature)

        if success:
            # 验证支付结果成功后 开始处理订单相关的业务
            return self.order_result_pay(data)

        return Response({"message": "对不起,当前订单支付失败"})
Пример #27
0
def save_order_result():
    """保存支付结果"""
    alipay_dict = request.form.to_dict()
    signature = alipay_dict.pop("sign")

    alipay = AliPay(
        appid=settings.ALIPAY_APPID,
        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
    )

    result = alipay.verify(alipay_dict, signature)
    if result:
        order_id = alipay_dict.get("out_trade_no")
        trade_no = alipay_dict.get("trade_no")

        try:
            Order.query.filter_by(id=order_id).update({
                "status": "WAIT_COMMENT",
                "trade_no": trade_no
            })
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()
    return jsonify(errno=RET.OK, errmsg="OK")
Пример #28
0
def save_order_payment_result():
    """保存订单支付结果"""
    alipay_dict = request.form.to_dict()

    # 对支付宝的数据进行分离 提取出支付宝的签名参数sign 和 剩下的其他数据
    alipay_sign = alipay_dict.pop("sign")

    # 创建支付宝SDK的工具对象
    alipay_client = AliPay(
        appid="2016092400581852",
        app_notify_url=None,  # 默认回调url
        app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"),
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"),
        sign_type="RSA2",  # RSA 或者 RSA2
        debug=True  # 默认False
    )

    # 借助工具验证参数合法性
    # 如果确定参数是支付宝的,返回True , 否则返回false
    result = alipay_client.verify(alipay_dict, alipay_sign)

    if result:
        # 修改数据库的订单状态信息
        order_id = alipay_dict.get("out_trade_no")
        trade_no = alipay_dict.get("trade_no") # 支付宝的交易号
        try:
            Order.query.filter_by(id=order_id).update({"status": "WAIT_COMMENT", "trade_no": trade_no})
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            db.session.rollback()

    return jsonify(errno=RET.OK, errmsg="OK")
Пример #29
0
 def put(self, request):
     # 1.接收支付宝返回的数据
     aliay_dict = request.query_params.dict()
     # 2.验证是否支付成功
     signature = aliay_dict.pop('sign')
     alipay = AliPay(appid=settings.ALIPAY_APPID,
                     app_notify_url=None,
                     app_private_key_path=settings.ALIPAY_PRIVATE_KEY_PATH,
                     alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH,
                     sign_type=settings.ALIPAY_SIGN_TYPE,
                     debug=settings.ALIPAY_DEBUG)
     success = alipay.verify(aliay_dict, signature)
     # print(aliay_dict)
     if success:
         # 3.如果支付成功
         # 3.1修改订单状态
         order_id = aliay_dict.get('out_trade_no')
         try:
             order = OrderInfo.objects.get(pk=order_id)
         except:
             raise Exception('订单编号无效')
         else:
             order.status = 2
             order.save()
         # 3.2创建订单支付对象
         Payment.objects.create(order_id=order_id,
                                trade_id=aliay_dict.get('trade_no'))
         return Response({'trade_id': aliay_dict.get('trade_no')})
     else:
         return Response({'message': '支付失败'})
Пример #30
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)