Пример #1
0
    def post(self, request):
        """
        处理支付宝notify_url异步通知
        :param request:
        :return:
        """
        processed_dict = {}
        for key, value in request.POST.items():
            processed_dict[key] = value

        print('request.POST的值:', processed_dict)
        sign = processed_dict.pop('sign', None)  # 直接就是字符串了

        server_ip = get_server_ip()
        alipay = AliPay(
            app_id=app_id,  # 自己支付宝沙箱 APP ID
            notify_url="http://{}:8000/alipay/return/".format(server_ip),
            app_private_key_path=app_private_key_path,  # 可以使用相对路径那个
            alipay_public_key_path=
            alipay_public_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=alipay_debug,  # 默认False,
            return_url="http://{}:8000/alipay/return/".format(server_ip))

        verify_result = alipay.verify(processed_dict, sign)  # 验证签名,如果成功返回True
        if verify_result:
            order_sn = processed_dict.get('out_trade_no')  # 原支付请求的商户订单号
            trade_no = processed_dict.get('trade_no')  # 支付宝交易凭证号
            trade_status = processed_dict.get('trade_status')  # 交易目前所处的状态

            # 更新数据库订单状态
            """
            OrderInfo.objects.filter(order_sn=order_sn).update(
                trade_no=trade_no,  # 更改交易号
                pay_status=trade_status,  # 更改支付状态
                pay_time=timezone.now()  # 更改支付时间
            )
            """
            orderinfos = OrderInfo.objects.filter(order_sn=order_sn)
            for orderinfo in orderinfos:
                orderinfo.trade_no = trade_no,  # 更改交易号
                orderinfo.pay_status = trade_status,  # 更改支付状态
                orderinfo.pay_time = timezone.now()  # 更改支付时间
                # 更改商品的销量
                order_goods = orderinfo.order_goods.all()
                for item in order_goods:
                    # 获取订单中商品和商品数量,然后将商品的销量进行增加
                    goods = item.goods
                    goods.sold_num += item.goods_nums
                    goods.save()

                orderinfo.save()

            # 给支付宝返回一个消息,证明已收到异步通知
            # 当商户收到服务器异步通知并打印出 success 时,服务器异步通知参数 notify_id 才会失效。
            # 也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出 success 导致支付宝重发数次通知),服务器异步通知参数 notify_id 是不变的。
            return Response('success')
Пример #2
0
    def get(self, request):
        """
        处理支付宝return_url返回
        :param request:
        :return:
        """


        processed_dict = {}
        for key, value in request.GET.items():  # GET逻辑 和 POST基本一样
            processed_dict[key] = value

        print('request.GET的值:', processed_dict)
        sign = processed_dict.pop('sign', None)  # 直接就是字符串了

        server_ip = get_server_ip()
        alipay = AliPay(
            app_id=app_id,  # 自己支付宝沙箱 APP ID
            notify_url="http://{}:8000/alipay/return/".format(server_ip),
            app_private_key_path=app_private_key_path,  # 可以使用相对路径那个
            alipay_public_key_path=alipay_public_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=alipay_debug,  # 默认False,
            return_url="http://{}:8000/alipay/return/".format(server_ip)
        )

        verify_result = alipay.verify(processed_dict, sign)  # 验证签名,如果成功返回True
        if verify_result:
            # POST中已经修改数据库订单状态,无需再GET中修改,且,GET中也得不到支付状态值

            # 给支付宝返回一个消息,证明已收到异步通知
            # return Response('success')
            # 修改为跳转到Vue页面
            response = redirect(reverse('index'))
            response.set_cookie('nextPath', 'pay', max_age=2)  # max_age设置为2s,让其快速过期,用一次就好了。
            # 跳转回Vue中时,直接跳转到Vue的pay的页面,后台无法配置,只能让Vue实现跳转。
            return response
        else:
            # 验证不通过直接跳转回首页就行,不设置cookie
            return redirect(reverse('index'))
Пример #3
0
 def get_alipay_url(self, obj):
     # 方法命名规则为:get_<field_name>
     server_ip = get_server_ip()
     alipay = AliPay(
         app_id=app_id,  # 自己支付宝沙箱 APP ID
         notify_url="http://{}:8000/alipay/return/".format(server_ip),
         app_private_key_path=app_private_key_path,  # 可以使用相对路径那个
         alipay_public_key_path=
         alipay_public_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
         debug=alipay_debug,  # 默认False,
         return_url="http://{}:8000/alipay/return/".format(server_ip))
     # 创建订单
     order_sn = obj.order_sn
     order_amount = obj.order_amount
     url = alipay.direct_pay(
         subject="生鲜超市-{}".format(order_sn),
         out_trade_no=order_sn,
         total_amount=order_amount,
         # return_url="http://{}:8000/alipay/return/".format(server_ip)  # 支付完成后自动跳回该url,可以不填了,因为初始化已经加上了
     )
     re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(
         data=url)
     return re_url