Ejemplo n.º 1
0
    def post(self, request):
        '''
        处理支付宝的notify_url
        通过POST进行判断,通知商家是否支付成功
        扩展:为什么不能用本地调试,因为notify_url时返回给服务器的,而不是返回给浏览器处理,而且放在浏览器会不安全。
        第三方登录可以本地调试,是因为服务器只执行重定向操作,其他都是服务器处理,而且返回只是基本信息,并不是敏感信息。
        '''

        processed_dict = {}
        for key, value in request.POST.items():
            # django的request默认把请求(返回url参数)列表转换为字符串
            # 循环出URL的参数
            processed_dict[key] = value
        # URL参数里的sign参数
        sign = processed_dict.pop('sign', None)

        # 生成一个Alipay对象
        alipay = AliPay(
            appid="2016092700609030",  # 沙箱的APPID
            # 异步url:支付宝获取商家传递的notify_url,通过POST进行判断,通知商家是否支付成功,
            # 另外的用途:用户扫码(没有进行支付),支付宝会生成订单url,用户可以通过此url进行支付或者修改订单
            app_notify_url=notify_url,
            app_private_key_path=private_key_path,  # 自己生成的私钥
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # debug为true时使用沙箱的url。如果不是用正式环境的url
            # 同步url:电脑支付页面成功,回跳的url;(支付宝获取商家的return_url,通过GET请求返回部分支付信息)
            return_url=return_url)

        # 验证URL参数
        verify_re = alipay.verify(processed_dict, sign)
        # 验证成功
        if verify_re is True:
            # get:获取字典的元素
            # 先提交订单再进行支付,所以支付完成后就拿到自己生成的out_trade_no
            out_trade_no = processed_dict.get('out_trade_no', None)
            # 支付宝系统交易流水号
            trade_no = processed_dict.get('trade_no', None)
            # 交易状态
            trade_status = processed_dict.get('trade_status', None)
            # 查询数据库有此订单
            existed_orders = OrderInfo.objects.filter(trade_no=out_trade_no)
            for existed_order in existed_orders:
                # 支付成功再增加商品销量
                # 卖出n商品,即销售量为n
                order_goods = existed_order.goods.all(
                )  # 所有订单商品对象(列表),OrderGoods外键是OrderInfo
                for order_good in order_goods:
                    goods = order_good.goods  # goods对象,OrderGoods外键是Goods
                    # 商品销售量 = 订单(卖出)所有商品数量
                    goods.sold_num += order_good.goods_num
                    goods.save()

                # 更新订单状态
                existed_order.pay_status = trade_status  # 订单状态(重点)
                existed_order.trade_no = trade_no  # 支付宝系统交易流水号
                existed_order.pay_time = datetime.now()  # 支付时间
                existed_order.save()
                # 需要返回一个'success'给支付宝,如果不返回,支付宝会一直发送订单支付成功的消息
            return Response("success")
Ejemplo n.º 2
0
    def get_alipay_url(self, obj):
        from MxShop.settings import private_key_path, ali_key_path
        alipay = AliPay(
            # 沙箱里面的appid值
            appid="2016092800616929",
            # notify_url是异步的url
            app_notify_url="http://113.16.255.12:11032/alipay/return/",
            # 我们自己商户的密钥
            app_private_key_path=private_key_path,
            # 支付宝的公钥
            alipay_public_key_path=ali_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            # debug为true时使用沙箱的url。如果不是用正式环境的url
            debug=True,  # 默认False,
            return_url="http://113.16.255.12:11032/alipay/return/")

        # 直接支付:生成请求的字符串。
        url = alipay.direct_pay(
            # 订单标题
            subject=obj.order_sn,
            # 我们商户自行生成的订单号
            out_trade_no=obj.order_sn,
            # 订单金额
            total_amount=obj.order_mount,
        )
        # 将生成的请求字符串拿到我们的url中进行拼接
        re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(
            data=url)

        return re_url
Ejemplo n.º 3
0
    def get_alipay_url(self, obj):
        '''
        :param obj: 为serializer.data
        :return:
        '''
        alipay = AliPay(
            # 沙箱的appid
            appid="2016101200669671",
            # 这里一定要改为线上服务器的地址
            app_notify_url="http://线上服务器地址:8000/alipay/return",
            # 使用静态文件路径
            app_private_key_path=private_key_path,
            # 使用静态文件路径
            alipay_public_key_path=
            ali_public_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
            # debug为True,适用沙箱接口
            debug=True,  # 默认False,
            # 这里一定要改为线上服务器的地址
            return_url="http://线上服务器地址:8000/alipay/return")

        url = alipay.direct_pay(subject=obj.order_sn,
                                out_trade_no=obj.order_sn,
                                total_amount=obj.order_mount)
        re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(
            data=url)
        return re_url
Ejemplo n.º 4
0
    def get(self, request):
        """
        支付宝同步调用返回
        :param request:
        :return:
        """
        # 将支付宝post的数据保存到字典中
        processed_dict = {}
        for key, value in request.GET.items():
            processed_dict[key] = value

        # 将sign从字典中移除
        sign = processed_dict.pop('sign')

        alipay = AliPay(
            appid="2016082100304253",
            app_notify_url="http://123.206.229.93:8000/alipay/return/",
            app_private_key_path=alipay_private_key,
            alipay_public_key_path=alipay_pub_key,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://123.206.229.93:8000/alipay/return/"  # 支付宝付款完成后返回的url
        )

        # 使用alipay_public_key为字典重新生成sign,与上面取出的的sign做比较,看数据是否有被修改
        verify_re = alipay.verify(processed_dict, sign)

        if verify_re is True:
            response = redirect('index')
            response.set_cookie('nextPath','pay',max_age=2)
            return response
        else:
            response = redirect('index')
            return response
Ejemplo n.º 5
0
    def post(self, request):
        processed_dict = {}
        for key, value in request.GET.items():
            processed_dict[key] = value
        sign = processed_dict.pop('sign', None)
        alipay = AliPay(appid=ALI_APP_ID,
                        app_notify_url=ALI_NOTIFY_URL,
                        app_private_key_path=PRIVATE_KEY_PATH,
                        alipay_public_key_path=ALI_PUB_KEY_PATH,
                        debug=ALI_Test_DEBUG,
                        return_url=ALI_RETURN_URL)
        # 校验返回的数据
        verify_re = alipay.verify(processed_dict, sign)
        if verify_re is True:
            order_sn = processed_dict.get('out_trade_no', None)
            trade_no = processed_dict.get('trade_no', None)
            trade_status = processed_dict.get('trade_status', None)

            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for existed_order in existed_orders:
                # 更新商品的卖出数量
                order_goods = existed_order.goods.all()
                for order_good in order_goods:
                    goods = order_good.goods
                    goods.sold_num += order_good.goods_num
                    goods.save()
                # 更新 order 状态
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()

            # 给支付宝返回成功,如果不返回支付宝会不停的给接口发送数据
            # 如果 校验返回的数据 和 sign 不匹配,则不处理。
            return Response('success')
Ejemplo n.º 6
0
    def post(self, request):
        """
        处理支付宝的notify_url
        :param request:
        :return:
        """
        processed_dict = {}
        for key, value in request.POST.items():
            processed_dict[key] = value
        sign = processed_dict.pop("sign", None)

        alipay = AliPay(
            appid="2016091700530193",
            app_notify_url="http://123.206.43.75:8080/alipay/return/",
            app_private_key_path=private_key_path,
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://123.206.43.75:8080/alipay/return/")
        verify_re = alipay.verify(processed_dict, sign)
        if verify_re is True:
            order_sn = processed_dict("out_trade_no", None)
            trade_no = processed_dict('trade_no', None)
            trade_status = processed_dict("trade_status", None)
            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for existed_order in existed_orders:
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()
            return Response("success")
Ejemplo n.º 7
0
 def get(self, request):
     """
         返回哪个页面 即redirect 到订单列表页
     :param request:
     :return:
     """
     data_dict = dict()
     for k, v in request.GET.items():  # 把类字典转换为字典,包括签名
         data_dict[k] = v
     sign = data_dict.pop('sign', None)  # 此时数据只有数据了
     alipay = AliPay(
         appid=app_id,
         app_notify_url="http://47.105.33.27:8000/alipay_return/",
         app_private_key_path=private_key,
         alipay_public_key_path=ali_key,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
         debug=True,  # 默认False,
         return_url="http://47.105.33.27:8000/alipay_return/"  # 这个最终需要配置成线上的
     )
     res = alipay.verify(data_dict, sign)
     if res:  # 比对成功即验签成功 返回 True
         # 此时我们可以更新订单流水号等信息
         order_sn = data_dict.get('out_trade_no', '')
         trade_no = data_dict.get('trade_no', '')
         pay_time = datetime.now()
         pay_status = data_dict.get('trade_status', 'TRADE_SUCCESS')
         order_list = OrderInfo.objects.filter(order_sn=order_sn)
         if order_list:
             order = order_list[0]
             order.pay_status = pay_status
             order.pay_time = pay_time
             order.trade_no = trade_no
             order.save()
             ret = redirect(reverse('index'))
             ret.set_cookie('nextPath', 'pay', 2)
             return ret
Ejemplo n.º 8
0
    def get(self,request):
        """
        处理支付宝的retrun_url返回
        :param request:
        :return:
        """
        # 1. 先将sign剔除掉
        processed_dict = {}
        for key,value in request.GET.items():
            processed_dict[key] = value

        sign = processed_dict.pop("sing",None)

        # 2. 生成一个Alipay对象

        alipay = AliPay(
            appid=alipay_appid,
            app_notify_url="http://127.0.0.1:8000/alipay/retrun",
            app_private_key_path=private_key_path,
            alipay_public_key_path=ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://127.0.0.1:8000/alipay/retrun"
        )

        # 3. 进行验签,确保这是支付宝给我们的
        verify_re = alipay.verify(processed_dict,sign)
        # 如果验签成功
        if verify_re is True:
            #商家订单号
            order_sn = processed_dict.get("out_trade_no",None)
            #支付宝支付订单号
            trade_no = processed_dict.get("trade_no",None)
            #支付状态
            trade_status = processed_dict.get('trade_status', None)

            # 查询数据库中存在的订单
            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)

            for existed_order in existed_orders:
                # 订单商品项
                order_goods =  existed_order.goods.all()

                for order_good in order_goods:
                    goods = order_good.goods
                    goods.sold_num += order_good.goods_num
                    goods.save()

                # 更新订单状态,填充支付宝给的交易凭证号。
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()

            response = redirect("index")
            # 希望跳转到vue项目的时候直接帮我们跳转到支付的页面
            response.set_cookie("nextPath","pay",max_age=2)
            return response
        else:
            response = redirect("index")
            return response
Ejemplo n.º 9
0
def pay(request):
    '''封装后'''
    # 拿出数据校验
    conn = get_redis_connection()
    key = 'payment_{}'.format(request.saas.user.phone)
    context_string = conn.get(key)
    if not context_string:
        return redirect('price')
    context = json.loads(context_string.decode('utf-8'))

    # 1.数据库生成交易记录(待支付),
    order_id = uid(request.saas.user.phone)  # 根据手机号生成随机字符串
    total_price = context['total_price']
    Transaction.objects.create(status=1,
                               order=order_id,
                               user=request.saas.user,
                               price_policy_id=context['policy_id'],
                               count=context['number'],
                               price=total_price)
    # 生成支付宝链接
    ali_pay = AliPay(appid=settings.ALI_APPID,
                     app_notify_url=settings.ALI_NOTIFY_URL,
                     return_url=settings.ALI_RETURN_URL,
                     app_private_key_path=settings.ALI_PRI_KEY_PATH,
                     alipay_public_key_path=settings.ALI_PUB_KEY_PATH)
    query_params = ali_pay.direct_pay(
        subject="Saas 系统会员",  # 商品简单描述
        out_trade_no=order_id,  # 商户订单号
        total_amount=total_price)
    pay_url = "{}?{}".format(settings.ALI_GATEWAY, query_params)
    return redirect(pay_url)
Ejemplo n.º 10
0
    def get(self, request):
        """
        处理支付宝的return_url返回
        """
        processed_dict = {}
        # 1. 获取GET中参数
        for key, value in request.GET.items():
            processed_dict[key] = value
        # 2. 取出sign
        sign = processed_dict.pop("sign", None)

        # 3. 生成ALipay对象
        alipay = AliPay(
            appid="2016090900469819",
            app_notify_url="http://47.95.8.70:8000/alipay/return/",
            app_private_key_path=private_key_path,
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://47.95.8.70:8000/alipay/return/")

        verify_re = alipay.verify(processed_dict, sign)

        # 这里可以不做操作。因为不管发不发return url。notify url都会修改订单状态。
        if verify_re is True:
            response = redirect("index")
            response.set_cookie("nextPath", "pay", max_age=3)
            return response
        else:
            response = redirect("index")
            return response
Ejemplo n.º 11
0
 def get_ailpay_url(self, obj):
     """
     系列化ailpay_url,返回ailpay_url(数据)给前端
     :param obj: 当前函数对象
     :return: 支付页面
     """
     # AliPay对象
     alipay = AliPay(
         appid="2016092700609030",  # 沙箱的APPID
         # 异步url:支付宝获取商家传递的notify_url,通过POST进行判断,通知商家是否支付成功,
         # 另外的用途:用户扫码(没有进行支付),支付宝会生成订单url,用户可以通过此url进行支付或者修改订单
         app_notify_url=notify_url,
         app_private_key_path=private_key_path,  # 自己生成的私钥
         alipay_public_key_path=ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
         debug=True,  # debug为true时使用沙箱的url。如果不是用正式环境的url
         # 同步url:电脑支付页面成功,回跳的url;(支付宝获取商家的return_url,通过GET请求返回部分支付信息)
         return_url=return_url
     )
     # 请求参数
     url = alipay.direct_pay(
         subject=obj.order_sn,  # 订单标题
         out_trade_no=obj.order_sn,  # 我们商户自行生成的订单号
         total_amount=obj.order_mount,  # 订单金额
         return_url=return_url
     )
     re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(data=url)
     return re_url
Ejemplo n.º 12
0
    def post(self, request):
        """
        处理notifyUrl
        """
        processed_dict = {}
        for key, value in request.POST.items():
            processed_dict[key] = value
        sign = processed_dict.pop("sign", None)
        alipay = AliPay(
            appid="id",
            app_notify_url="url",
            app_private_key_path=private_key,
            alipay_public_key_path=
            ali_public_key,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            return_url="url")
        verify_result = alipay.verify(processed_dict, sign)
        if verify_result is True:
            order_sn = processed_dict.get('out_trade_no', None)
            trade_no = processed_dict.get('trade_no', None)
            trade_status = processed_dict.get('trade_status', None)

            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for existed_order in existed_orders:
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()
            return Response("success")
Ejemplo n.º 13
0
    def get(self, request):
        processed_dict = {}
        for key, value in request.GET.items():
            processed_dict[key] = value
        sign = processed_dict.pop("sign", None)
        alipay = AliPay(
            appid="id",
            app_notify_url="url",
            app_private_key_path=private_key,
            alipay_public_key_path=
            ali_public_key,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            return_url="url")
        verify_result = alipay.verify(processed_dict, sign)
        if verify_result is True:
            order_sn = processed_dict.get('out_trade_no', None)
            trade_no = processed_dict.get('trade_no', None)
            trade_status = 'TRADE_SUCCESS'

            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for existed_order in existed_orders:
                order_goods = existed_order.goods.all()
                for order_good in order_goods:
                    goods = order_good.goods
                    goods.sold_num += order_good.goods_num
                    goods.save()
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()
            response = redirect("url")
            response.set_cookie("nextPath", "pay", max_age=3, domain='url')
            return response
        else:
            response = redirect("url")
            return response
Ejemplo n.º 14
0
    def post(self, request):
        process_query = {k: v for k, v in request.POST.items()}
        ali_sign = process_query.pop('sign')
        alipay = AliPay(
            appid=APPID,
            app_notify_url=RETURN_URL,
            app_private_key_path=APP_PRIVATE_KEY_PATH,
            alipay_public_key_path=
            ALIPAY_PUBLIC_KEY_PATH,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=ALIPAY_DEBUG,  # 默认False,
            return_url=RETURN_URL)
        check_result = alipay.verify(process_query, ali_sign)
        response = redirect('index')
        if check_result:
            order_sn = process_query.get('out_trade_no', None)
            trade_no = process_query.get('trade_no', None)
            order_infos = OrderInfo.objects.filter(order_sn=order_sn)

            # 交易信息保存
            for order_info in order_infos:
                order_goods = order_info.goods.all()
                for order_good in order_goods:
                    # 根据某个个订单得到对应的商品
                    goods = order_good.goods
                    # 商品的销量等于购物车的销量加上原来的
                    goods.sold_num += order_good.goods_num
                    goods.save()

                order_info.trade_no = trade_no
                order_info.pay_status = "TRADE_SUCCESS"
                order_info.pay_time = datetime.datetime.now()
                order_info.save()
            response.set_cookie('nextPath', 'pay', max_age=2)
        return response
Ejemplo n.º 15
0
 def retrieve(self, request, *args, **kwargs):
     """
         重写 获取某个订单的方法 因为 用户在支付的过程中 可能直接关闭支付 那这个时候这个订单即为未支付状态,也需要把支付链接返回
     :param request:
     :param args:
     :param kwargs:
     :return:
     """
     instance = self.get_object()  # 获取到某个订单实例
     alipay = AliPay(
         appid=app_id,
         app_notify_url="http://47.105.33.27:8000/alipay_return/",
         app_private_key_path=private_key,
         alipay_public_key_path=ali_key,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
         debug=True,  # 默认False,
         return_url="http://47.105.33.27:8000/alipay_return/")
     url = alipay.direct_pay(subject=instance.order_sn,
                             out_trade_no=instance.order_sn,
                             total_amount=instance.order_mount)
     # 沙箱环境
     re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(
         data=url)
     serializer = self.get_serializer(instance)
     ret = serializer.data
     ret['alipay_url'] = re_url
     return Response(ret)
Ejemplo n.º 16
0
    def post(self, request):
        """
        处理notify_url
        """
        process_dict = dict()
        for key, value in request.POST.items():
            process_dict[key] = value
        ali_sign = process_dict.pop('sign')

        alipay = AliPay(
            appid="2016091500518447",
            app_notify_url="http://47.106.173.70:8000/alipay/return/",
            app_private_key_path=PRIVATE_KEY_PATH,
            alipay_public_key_path=
            ALIPAY_KEY_PATH,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://47.106.173.70:8000/alipay/return/")

        res_verify = alipay.verify(process_dict, ali_sign)
        if res_verify:
            order_infos = OrderInfo.objects.filter(
                order_sn=process_dict['out_trade_no'])
            for order_info in order_infos:
                order_info.trade_no = process_dict.get('trade_no', None)
                order_info.pay_status = process_dict.get('trade_status', None)
                order_info.pay_time = datetime.now()
                order_info.save()

            return Response("success")
Ejemplo n.º 17
0
 def post(self, request):
     processed_dict = {}
     for key, value in request.POST.items():
         processed_dict[key] = value
     sign = processed_dict.pop('sign', None)
     # 将剩余的参数重新进行签名
     alipay = AliPay(
         appid="2016091100484002",
         app_notify_url="http://114.116.83.180:8000/trades/alipay/redirect/",
         app_private_key_path=settings.app_private_key_path,
         alipay_public_key_path=settings.alipay_public_key_path,
         debug=True,  # 默认False,
         return_url="http://114.116.83.180:8000/trades/alipay/redirect/")
     result = alipay.verify(processed_dict, sign)
     if result:
         # 是支付宝回调
         # 获取支付宝回传的订单号,利用这个订单号,修改数据库中订单的状态
         order_sn = processed_dict.get('out_trade_no', None)
         order = OrderInfo.objects.filter(order_sn=order_sn).first()
         order.pay_status = processed_dict.get('trade_status')
         order.trade_no = processed_dict.get('trade_no')
         order.pay_time = datetime.now()
         order.save()
         return Response('success')
     else:
         return Response('')
Ejemplo n.º 18
0
    def post(self, request):
        processed_dict = {}
        for key, value in request.POST.items():
            processed_dict[key] = value
        sign = processed_dict.pop('sign', None)

        alipay = AliPay(
            appid=alipay_id,
            app_notify_url="http://127.0.0.1:8000/alipay/return/",
            app_private_key_path=private_key_path,
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://127.0.0.1:8000/alipay/return/")
        verify_re = alipay.verify(processed_dict, sign)
        if verify_re is True:
            order_sn = processed_dict.get('out_trade_no', None)
            trade_no = processed_dict.get('trade_no', None)
            trade_status = processed_dict.get('trade_status', None)

            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for existed_order in existed_orders:
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()
            return Response("success")
Ejemplo n.º 19
0
    def get(self, request):
        processed_dict = {}
        for key, value in request.GET.item():
            processed_dict[key] = value

        sign = processed_dict.pop('sign', None)

        alipay = AliPay(
            appid="",
            app_notify_url="http://127.0.0.1:8000/alipay/return/",
            app_private_key_path=private_key_path,
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://127.0.0.1:8000/alipay/return/")
        verify_re = alipay.verify(processed_dict, sign)
        if verify_re is True:
            order_sn = processed_dict.get('out_trade_no', None)
            trade_no = processed_dict.get('trade_no', None)
            trade_status = processed_dict.get('trade_status', None)

            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for existed_order in existed_orders:
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()

            response = redirect("index")
            response.set_cookie("nextPath", "pay", max_age=3)
            return response
        else:
            response = redirect("index")
            return response
Ejemplo n.º 20
0
    def get(self, request):
        """
        处理支付宝的return_url返回
        :param request:
        :return:
        """
        processed_dict = {}
        for key, value in request.GET.items():
            processed_dict[key] = value

        sign = processed_dict.pop("sign", None)

        alipay = AliPay(
            appid="2016101000652414",
            app_notify_url="http://139.199.123.96:8000/alipay/return/",
            app_private_key_path=private_key,
            alipay_public_key_path=
            alipay_public_key,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://139.199.123.96:8000/alipay/return/")

        verify_re = alipay.verify(processed_dict, sign)

        if verify_re is True:
            return HttpResponse('支付成功')
            response = redirect("index")
            response.set_cookie("nextPath", "pay", max_age=3)
            return response
        else:
            response = redirect("index")
            return response
Ejemplo n.º 21
0
    def get(self, request):
        """
        处理支付宝的return_url返回
        """
        processed_dict = {}
        # 1. 获取GET中参数
        for key, value in request.GET.items():
            processed_dict[key] = value
        # 2. 取出sign
        sign = processed_dict.pop("sign", None)

        # 3. 生成ALipay对象
        alipay = AliPay(
            appid="2016101800715734",
            app_notify_url="http://101.200.163.151:7800/alipay/return/",
            app_private_key_path=private_key_path,
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://101.200.163.151:7800/alipay/return/")

        verify_re = alipay.verify(processed_dict, sign)

        # 这里可以不做操作。因为不管发不发return url。notify url都会修改订单状态。
        if verify_re is True:
            order_sn = processed_dict.get('out_trade_no', None)
            trade_no = processed_dict.get('trade_no', None)
            trade_status = processed_dict.get('trade_status', None)

            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for existed_order in existed_orders:
                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()
Ejemplo n.º 22
0
def pay(request):
    conn = get_redis_connection()
    key = 'payment_{}'.format(request.tracer.user.mobile_phone)
    context_string = conn.get(key)
    if not context_string:
        return redirect('price')
    context = json.loads(context_string.decode('utf-8'))

    # 1. 数据库中生成交易记录(待支付)
    #     等支付成功之后,我们需要把订单的状态更新为已支付、开始&结束时间
    order_id = uid(request.tracer.user.mobile_phone)
    total_price = context['total_price']
    models.Transaction.objects.create(status=1,
                                      order=order_id,
                                      user=request.tracer.user,
                                      price_policy_id=context['policy_id'],
                                      count=context['number'],
                                      price=total_price)
    # 生成支付链接

    ali_pay = AliPay(appid=settings.ALI_APPID,
                     app_notify_url=settings.ALI_NOTIFY_URL,
                     return_url=settings.ALI_RETURN_URL,
                     app_private_key_path=settings.ALI_PRI_KEY_PATH,
                     alipay_public_key_path=settings.ALI_PUB_KEY_PATH)
    query_params = ali_pay.direct_pay(
        subject="trace rpayment",  # 商品简单描述
        out_trade_no=order_id,  # 商户订单号
        total_amount=total_price)
    pay_url = "{}?{}".format(settings.ALI_GATEWAY, query_params)
    return redirect(pay_url)
Ejemplo n.º 23
0
    def get_alipay_url(self, obj):
        alipay = AliPay(
            # 自己沙箱应用的APPID
            appid="2016091100484002",
            # 如果用户没有再浏览器生成的支付订单中支付,而是通过支付宝app进行了订单支付,此时需要指定一个跳转地址。
            # app_notify_url:只要用户通过支付宝支付成功,支付宝就会回调这个notify_url
            app_notify_url="http://114.116.83.180:8000/trades/alipay/redirect/",
            app_private_key_path=settings.app_private_key_path,
            # 支付宝的公钥,验证支付宝回传消息使用,不是自己生成的应用公钥
            alipay_public_key_path=settings.alipay_public_key_path,
            debug=True,  # 默认False,
            # 如果用户是在浏览器上的支付宝订单页面进行的支付操作,支付完成之后会自动跳转到网站的指定页面return_url。如果用户没有在浏览器上支付,return_url就失效了。
            return_url="http://114.116.83.180:8000/trades/alipay/redirect/"
            # app_notify_url和return_url,只有在支付成功的前提下,支付宝才会回调。
            # app_notify_url: 相当于是支付宝给后台发送的一个通知,告诉后台用户已经支付完成了,当后台接收到这个通知之后,必须给支付宝返回一个success结果,告诉支付宝后台已经接收到这个支付结果通知了。
            # return_url:就是一个简单的支付宝回调,支付宝只负责回调这个url地址,至于这个url地址做了什么事情,与支付宝就无关了,支付宝也不会关心这个url的返回值。
        )

        url = alipay.direct_pay(subject=obj.order_sn,
                                out_trade_no=obj.order_sn,
                                total_amount=obj.order_mount)
        # 这个re_url就是支付宝提供的一个扫码支付页面的Url
        re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(
            data=url)
        return re_url
Ejemplo n.º 24
0
 def post(self, request):
     # 处理支付宝回调notify_url时,发送的POST请求
     # 只要用户支付成功,只要是通过支付宝完成的支付,支付宝服务器肯定会回调这个notify_url
     # 在接收到支付宝回调请求(GET/POST)的时候,后台需要对这个回调进行验证,如果判断出来不是支付宝回调,可以对这个请求不做任何处理。
     # 1. 将支付宝回调时传递的参数进行整理,将sign这个参数获取出来,然后利用剩余的那些参数进行签名(支付宝公钥),签名之后会得到一个新的sign,然后用这个新的sign和回调传过来的sign进行对比,如果值一样,说明是支付宝在回调。
     processed_dict = {}
     for key, value in request.POST.items():
         processed_dict[key] = value
     sign = processed_dict.pop('sign', None)
     # 然后将剩余的参数重新进行签名
     alipay = AliPay(
         appid="2016091100484002",
         app_notify_url="http://114.116.83.180:8000/trades/alipay/redirect/",
         app_private_key_path=settings.app_private_key_path,
         alipay_public_key_path=settings.alipay_public_key_path,
         debug=True,  # 默认False,
         return_url="http://114.116.83.180:8000/trades/alipay/redirect/"
     )
     result = alipay.verify(processed_dict, sign)
     if result:
         # 是支付宝回调
         # 获取支付宝回传的订单号,利用这个订单号,修改数据库中订单的状态
         order_sn = processed_dict.get('out_trade_no', None)
         order = OrderInfo.objects.filter(order_sn=order_sn).first()
         order.pay_status = processed_dict.get('trade_status')
         order.trade_no = processed_dict.get('trade_no')
         order.pay_time = datetime.now()
         order.save()
         return Response('success')
     else:
         return Response('')
Ejemplo n.º 25
0
    def get(self, request):
        """
        处理支付宝url_return返回
        :param request:
        :return:
        """
        process_dict = {}
        for key, value in request.GET.items():
            process_dict[key] = value

        sign = process_dict.pop('sign', None)

        alipay = AliPay(
            appid="2016091500519386",
            app_notify_url="http://122.152.225.37:8000/alipay/return/",
            app_private_key_path=private_key_path,
            alipay_public_key_path=ali_pub_key_path,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://122.152.225.37:8000/alipay/return/")
        verify_result = alipay.verify(process_dict, sign)

        if verify_result:
            order_sn = process_dict.get('out_trade_no', None)
            trade_no = process_dict.get('trade_no', None)
            trade_status = process_dict.get('trade_status', None)

            exist_orders = OrderInfo.objects.filter(order_sn=order_sn)
            for exist_order in exist_orders:
                exist_order.pay_status = trade_status
                exist_order.trade_no = trade_no
                exist_order.pay_time = datetime.now()
                exist_order.save()

            return Response('success')
Ejemplo n.º 26
0
    def get_alipay_url(self, obj):
        alipay = AliPay(
            # 沙箱里面的appid值
            appid=ali_appid,
            # notify_url是异步的url
            app_notify_url="http://39.107.94.185:8000/alipay/return/",
            # 我们自己商户的密钥
            app_private_key_path=private_key_path,
            # 支付宝的公钥
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            # debug为true时使用沙箱的url。如果不是用正式环境的url
            debug=True,  # 默认False,
            return_url="http://39.107.94.185:8000/alipay/return/")
        url = alipay.direct_pay(
            # 订单标题
            subject=obj.order_sn,
            # 我们商户自行生成的订单号
            out_trade_no=obj.order_sn,
            # 订单金额
            total_amount=obj.order_mount,
            # 成功付款后跳转到的页面,return_url同步的url
            # return_url="http://39.107.94.185:8000/alipay/return/"
        )
        # 将生成的请求字符串拿到我们的url中进行拼接
        re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(
            data=url)

        return re_url
Ejemplo n.º 27
0
    def get_alipay_url(self, obj):
        """
        动态返回alipay_url的值
        :param obj:
        :return:
        """
        alipay = AliPay(
            appid="2016082100304253",
            app_notify_url="http://123.206.229.93:8000/alipay/return/",
            app_private_key_path=alipay_private_key,
            alipay_public_key_path=
            alipay_pub_key,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url=
            "http://123.206.229.93:8000/alipay/return/"  # 支付宝付款完成后返回的url
        )

        # 生成支付url
        url = alipay.direct_pay(
            subject=obj.order_sn,
            out_trade_no=obj.order_sn,
            total_amount=obj.order_mount,
            # return_url="http://123.206.229.93:8000/" # 返回链接
        )
        re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(
            data=url)
        return re_url
Ejemplo n.º 28
0
	def post(self,request):
		""" 处理支付宝的notify_url"""
		print("post request==", request)

		process_dict = {}
		for key, value in request.POST.items():
			process_dict[key] = value

		print(process_dict)
		alipay = AliPay(
			appid="2016091300503705",
			# post请求
			app_notify_url="http://118.190.202.67:8000/alipay/return/",
			app_private_key_path=app_private_key_path,
			alipay_public_key_path=alipay_public_key_path,
			# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
			debug=True,  # 默认False,
			# get请求
			return_url="http://118.190.202.67:8000/alipay/return/"
		)
		# 把签名删除掉
		sign_type = process_dict.pop("sign", None)
		# 如果是True,数据没有修改;False校验不通过
		verify_result = alipay.verify(process_dict, sign_type)
		print(verify_result)
		if verify_result:
			# 支付宝交易号
			trade_no = process_dict.get("trade_no", None)

			# 商品号,网站唯一商品号
			goods_sn = process_dict.get("out_trade_no", None)

			pay_status = process_dict.get("pay_status", "TRADE_SUCCESS")

			# 查询订单
			exsited_orders = OrderInfo.objects.filter(order_sn=goods_sn)

			for exsited_order in exsited_orders:
				# 支付宝交易号
				exsited_order.trade_no = trade_no
				# 支付状态
				exsited_order.pay_status = pay_status
				# 支付时间
				exsited_order.pay_time = datetime.now()

				# 保存
				exsited_order.save()

			# 返回支付成功状态
			# return Response("success")

			response = redirect("index")
			# 设置cookie
			response.set_cookie("nextPath", "pay", max_age=2)
			return response
		else:
			# 跳转到首页
			response = redirect("index")
			return response
Ejemplo n.º 29
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')
Ejemplo n.º 30
0
    def get(self, request):
        """
        处理支付宝的return_url返回
        :param request:
        :return:
        """
        processed_dict = {}  #新建一个字典
        for key, value in request.GET.items():
            processed_dict[
                key] = value  #将 request中POST请求中数据放到processed_dict字典中

        sign = processed_dict.pop("sign", None)  #将processed_dict中的sign删除

        alipay = AliPay(
            appid="2016080600180695",
            app_notify_url="http://127.0.0.1:9000/alipay/return/",
            app_private_key_path=private_key_path,  # 应用私钥的路径
            alipay_public_key_path=
            ali_pub_key_path,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,
            return_url="http://127.0.0.1:9000/alipay/return/")

        verify_re = alipay.verify(processed_dict,
                                  sign)  #验证是否是支付宝请求过来的数据,验证支付是否有效

        if verify_re is True:  #如果是True就进行处理,如果不是就认为是恶意攻击,不进行处理
            order_sn = processed_dict.get(
                'out_trade_no', None)  #获取processed_dict中的out_trade_no值
            trade_no = processed_dict.get('trade_no', None)
            trade_status = processed_dict.get('trade_status', None)

            #对商品的售卖数量进行修改
            existed_orders = OrderInfo.objects.filter(order_sn=order_sn)  #获取订单
            for existed_order in existed_orders:
                order_goods = existed_order.goods.all(
                )  #反向去用related_name即可,goods为反向取的related_name
                for order_good in order_goods:
                    goods = order_good.goods  #获取goods
                    goods.sold_num += order_good.goods_num  #商品的售卖量加等于 订单里的商品数量
                    goods.save()  #保存 #对商品的售卖数量进行修改

                existed_order.pay_status = trade_status
                existed_order.trade_no = trade_no
                existed_order.pay_time = datetime.now()
                existed_order.save()  #保存

            response = redirect("index")  #跳转到index路径
            response.set_cookie("nextPath", "pay",
                                max_age=2)  #跳转到Vue中的pay页面,max_age设置为2秒 ,
            # max_age尽量设置时间短点,保证使用一次就过期
            # 在cookie中 添加nextPath,值为pay
            #设置cookie
            return response  #返回
        else:  #如果验证不通过,则直接返回,跳转到index路径
            response = redirect("index")  #跳转到index路径
            return response  # 返回