def get_payment_params(self, payment_params):
        if settings.DEBUG:
            debug = True
        elif settings.STAGE:
            debug = True
        else:
            debug = False

        alipay = AliPay(
            debug=debug,
            appid=resources.get_alipay_app_id(),
            app_notify_url=urlmapper.get_url('ALIPAY_CALLBACK_URL'),
            app_private_key_path=resources.get_viastelle_pri_key(),
            alipay_public_key_path=resources.get_viastelle_pub_key(),
            sign_type="RSA2"
        )

        payment_order = alipay.api_alipay_trade_app_pay(
            out_trade_no=payment_params['order_id'],
            total_amount=payment_params['total_price'],
            subject=payment_params['product_title'],
        )
        self.logger_info.info(payment_order)
        param_result = {'alipay_order': payment_order}

        return param_result
Ejemplo n.º 2
0
class AliPayJzz(object):
    def __init__(self):
        self.ali_pay = AliPay(
            appid=app_id,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=ali_pay_public_key_string,
            sign_type="RSA2",
            debug=False  # 默认False
        )

    def pc_pay(self, out_trade_no, total_amount, subject, return_url,
               notify_url):
        """
        :param out_trade_no: 订单号
        :param total_amount: 金额
        :param subject: 商品描述
        :param return_url: 回跳的url
        :param notify_url: 返回通知
        :return: order_string or none
        """
        try:
            order_string = self.ali_pay.api_alipay_trade_page_pay(
                out_trade_no=out_trade_no,
                total_amount=total_amount,
                subject=subject
                # return_url=None
                # notify_url=notify_url
            )
        except Exception as e:
            print("pc_pay_error %s" % str(e))
            return None
        return order_string

    def app_pay(self, out_trade_no, total_amount, subject, notify_url):
        try:
            order_string = self.ali_pay.api_alipay_trade_app_pay(
                out_trade_no=out_trade_no,
                total_amount=total_amount,
                subject=subject,
                notify_url=notify_url)
        except Exception as e:
            print("app_pay_error %s" % str(e))
            return None
        return order_string

    def verify_pay_result(self, data, signature):
        """
        :param data: ali pay return data
        :param signature: data.pop("sign")
        :return: "trade succeed" or none
        """
        try:
            result = self.ali_pay.verify(data, signature)
        except Exception as e:
            print("verify_pay_result_error %s:" % str(e))
            return None
        if result and data["trade_status"] in ("TRADE_SUCCESS",
                                               "TRADE_FINISHED"):
            return "trade succeed"
Ejemplo n.º 3
0
class AliAppPayment:
    """
    支付宝app支付功能
    """
    def __init__(self):
        self.app_private_key_string = open("./private_key.txt").read()
        self.ali_public_key_string = open("./public_key.txt").read()
        self.alipay = AliPay(
            appid="2019042664373131",  # 商户appid
            app_notify_url=None,  # 默认回调url
            # 支付宝私钥
            app_private_key_string=self.app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=self.ali_public_key_string,
            sign_type="RSA2",
            debug=False)

    def get_order_string(self, out_trade_no, t_amount, subject):
        order_string = self.alipay.api_alipay_trade_app_pay(
            out_trade_no=str(out_trade_no),
            total_amount=str(t_amount),
            subject=subject,
            # 部署时,修改该url为http+本机外网ip或域名
            # notify_url="http://106.14.127.164:8080/amount/deposit/return"
            notify_url="http://106.14.127.164:5000/pay/alipayment_notify")
        return order_string
Ejemplo n.º 4
0
def create_recharge(money=10):
    """创建充值订单"""
    current_user_id = get_jwt_identity()
    user = User.query.get(current_user_id)
    if user is None:
        return {
            "errno": status.CODE_NO_USER,
            "errmsg": message.user_not_exists,
        }
    order_number = datetime.now().strftime(
        "%y%m%d%H%M%S") + "%08d" % user.id + "%04d" % random.randint(0, 9999)

    print(order_number)

    recharge = Recharge(status=False,
                        out_trade_number=order_number,
                        name="账号充值-%s元" % money,
                        user_id=user.id,
                        money=money)
    db.session.add(recharge)
    db.session.commit()
    # 创建支付宝sdk对象
    app_private_key_string = open(
        os.path.join(
            current_app.BASE_DIR,
            "application/apps/users/keys/app_private_key.pem")).read()
    alipay_public_key_string = open(
        os.path.join(current_app.BASE_DIR,
                     "application/apps/users/keys/app_public_key.pem")).read()

    alipay = AliPay(
        appid=current_app.config.get("ALIPAY_APP_ID"),
        app_notify_url=None,  # 默认回调url
        app_private_key_string=app_private_key_string,
        # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        alipay_public_key_string=alipay_public_key_string,
        sign_type=current_app.config.get("ALIPAY_SIGN_TYPE"),
        debug=False,  # 默认False
        config=AliPayConfig(timeout=15)  # 可选, 请求超时时间
    )

    order_string = alipay.api_alipay_trade_app_pay(
        out_trade_no=recharge.out_trade_number,  # 订单号
        total_amount=float(recharge.money),  # 订单金额
        subject=recharge.name,  # 订单标题
        notify_url=current_app.config.get(
            "ALIPAY_NOTIFY_URL")  # 服务端的地址,自定义一个视图函数给alipay
    )

    return {
        "errno": status.CODE_OK,
        "errmsg": message.ok,
        "sandbox": current_app.config.get("ALIPAY_SANDBOX"),
        "order_string": order_string,
        "order_number": recharge.out_trade_number,
    }
Ejemplo n.º 5
0
    def get(self):
        order_id = request.args.get('order_id')

        # 构建支付
        alipay_client = AliPay(
            appid=ALIPAY_APPID,
            # 默认回调
            app_notify_url=None,
            app_private_key_string=APP_PRIVATE_KEY,
            alipay_public_key_string=APP_PUBLIC_KEY,
            sign_type='RSA',
            debug=False)

        subject = 'I20 系列 30核 '

        # 电脑网站支付,跳转:https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay_client.api_alipay_trade_app_pay(
            out_trade_no='1100000',
            total_amount='10000',
            subject=subject,
            return_url='https://github.com/sajinchang',
            notify_url='https://github.com/sajinchang'  #可选
        )

        # 手机网站支付
        # order_string = alipay_client.api_alipay_trade_wap_pay(
        #     out_trade_no = '1100000',
        #     total_amount = '10000',
        #     subject = subject,
        #     return_url = 'https://github.com/sajinchang',
        #     notify_url = 'https://github.com/sajincahng'
        #
        # )

        # 客户端支付
        pay_url = "https://openapi.alipaydev.com/gateway.do?" + order_string

        data = {
            'msg': 'ok',
            'status': 200,
            'data': {
                'pay_url': pay_url,
                'order_id': order_id
            }
        }
        return data
Ejemplo n.º 6
0
    def get(self, request, order_id):
        #1.接受订单id
        user = request.user
        #2.根据订单id查询订单
        try:
            #为了查询的准确性,我们尽量多家几个条件
            order = OrderInfo.objects.get(
                order_id=order_id,
                user=user,
                status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        #3.生成alipay实力对象
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH)
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH)

        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.ALIPAY_DEBUG  # 默认False
        )

        #4.调用支付接口生成order_string
        subject = '测试订单'

        # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_app_pay(
            out_trade_no=order_id,
            total_amount=str(
                order.total_amount),  # total_amount是 decimal类型 要转换为 str
            subject=subject,
            return_url="http://www.meiduo.site:8080/pay_success.html",
            # notify_url="https://example.com/notify"  # 可选, 不填则使用默认notify url)
        )
        #5.拼接url
        alipay_url = settings.ALIPAY_URL + '?' + order_string
        #6.返回url
        return Response({'alipay_url': alipay_url})
Ejemplo n.º 7
0
    def get(self, request, order_id):
        # 构建跳转链接
        try:
            order = OrderInfo.objects.get(order_id=order_id)
        except:
            return JsonResponse({'error': '订单不存在'}, status=400)
        path = os.path.join(settings.BASE_DIR,
                            'apps/payments/keys/app_private_key.pem')
        # 初始话支付对象
        alipay = AliPay(
            # 支付宝应用中心id
            appid=settings.ALIPAY_APPID,
            # 默认url
            app_notify_url=None,
            # 没多四要
            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",
            debug=settings.ALIPAY_DEBUG)

        # 构建网址中的查询字符串
        order_string = alipay.api_alipay_trade_app_pay(
            # 制定当前的订单编号
            out_trade_no=order_id,
            #     制定订单的金额
            total_amount=str(order.total_amount),
            #     标题
            subject='美多商城-%s' % order_id,
            # 支付成的跳转链接
            return_url=settings.ALIPAY_RETURN_URL,  # 支付成功后跳转美多连接地址
        )
        alipay_url = settings.ALIPAY_URL + order_string

        return JsonResponse({'alipay_url': alipay_url, 'code': 0})
Ejemplo n.º 8
0
class AlipayBase(object):
    def __init__(self, isVip=None):

        # print(AliPay_alipay_private_key)
        #
        #
        # print(AliPay_alipay_public_key)
        #
        # print(AliPay_Appid)

        self.alipay = AliPay(
            appid=AliPay_Appid,
            app_notify_url=Alipay_callbackUrl
            if not isVip else Alipay_callbackUrlForVip,
            app_private_key_string=AliPay_app_private_key,
            alipay_public_key_string=AliPay_alipay_public_key,
            sign_type="RSA2",
            debug=False,  # 上线则改为False , 沙箱True
        )

    def query(self, orderid):
        response = self.alipay.api_alipay_trade_query(out_trade_no=orderid)
        return response

    def create(self, order_id, amount, subject=None):

        order_string = self.alipay.api_alipay_trade_app_pay(
            out_trade_no=order_id,
            total_amount=str(amount.quantize(Decimal('0.00'))),
            subject='支付订单:%s' % order_id if not subject else subject,
            return_url=None,
            notify_url=None,
        )
        logger.info(order_string)
        return order_string

    def refund(self, order, orderid, refund_amount):

        response = self.alipay.api_alipay_trade_refund(refund_amount=str(
            refund_amount.quantize(Decimal('0.00'))),
                                                       out_trade_no=orderid)
        logger.info("退款信息->{}".format(response))
        if response['code'] != '10000':
            raise PubErrorCustom(response['msg'])

        try:
            for item in OrderGoodsLink.objects.filter(
                    linkid__in=json.loads(order.linkid)['linkids']):
                try:
                    glObj = GoodsLinkSku.objects.select_for_update().get(
                        id=item.skugoodslinkid)
                    glObj.stock += item.gdnum
                    glObj.number -= item.gdnum
                    glObj.save()
                except GoodsLinkSku.DoesNotExist:
                    pass
        except Exception as e:
            print(str(e))

    def callback_vip(self, data):
        iData = dict()
        for item in data:
            iData[item] = data[item]

        sign = iData.pop("sign", None)
        if not self.alipay.verify(iData, sign):
            print(iData)
            raise PubErrorCustom("验签失败!")

        if iData.get("trade_status", None) != 'TRADE_SUCCESS':
            print(iData)
            raise PubErrorCustom("交易状态异常!")

        try:
            orderObj = OrderVip.objects.select_for_update().get(
                orderid=iData.get("out_trade_no", ""))
            if orderObj.status == '1':
                logger.info("订单{}已处理".format(orderObj.orderid))
                raise PubErrorCustom("订单{}已处理".format(orderObj.orderid))
        except Order.DoesNotExist:
            raise PubErrorCustom("订单不存在!")

        orderObj.status = '1'

        user = Users.objects.select_for_update().get(userid=orderObj.userid)
        if user.isvip == '1':
            user.exprise = viphandler(user.exprise, orderObj.unit,
                                      orderObj.term)
            orderObj.exprise = user.exprise
        else:
            user.isvip = '1'
            user.term = orderObj.term
            user.unit = orderObj.unit
            user.exprise = orderObj.exprise

        orderObj.save()
        user.save()

    def callback(self, data):

        iData = dict()
        for item in data:
            iData[item] = data[item]

        sign = iData.pop("sign", None)
        if not self.alipay.verify(iData, sign):
            print(iData)
            raise PubErrorCustom("验签失败!")

        if iData.get("trade_status", None) != 'TRADE_SUCCESS':
            print(iData)
            raise PubErrorCustom("交易状态异常!")

        try:
            orderObj = Order.objects.select_for_update().get(
                orderid=iData.get("out_trade_no", ""))
            if orderObj.status == '1':
                logger.info("订单{}已处理".format(orderObj.orderid))
                raise PubErrorCustom("订单{}已处理".format(orderObj.orderid))
        except Order.DoesNotExist:
            raise PubErrorCustom("订单不存在!")

        orderObj.status = '1'
        orderObj.trade_no = iData['trade_no']
        orderObj.trade_info = json.dumps(iData, ensure_ascii=False)
        orderObj.save()

        user = Users.objects.select_for_update().get(userid=orderObj.userid)

        logger.info("用户{}积分余额{}使用积分{}获得积分{}".format(user.mobile, user.jf,
                                                    orderObj.use_jf,
                                                    orderObj.get_jf))
        user.jf -= orderObj.use_jf
        user.jf += orderObj.get_jf
        user.save()

        logger.info("支付宝回调订单处理成功!=>{}".format(iData))
Ejemplo n.º 9
0
    def post(self, request):
        # 接受参数
        serializer = OrderInfoSerializer(data=request.data)
        if not serializer.is_valid():
            return response_400(serializer.errors)

        pay_method = serializer.validated_data.get('pay_method')
        payee = serializer.validated_data.get('payee')
        amount = serializer.validated_data.get('amount')
        pay_item_class = serializer.validated_data.get('pay_item_class')
        pay_item_id = serializer.validated_data.get('pay_item_id')

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

        # 业务处理:使用sdk调用支付宝的支付接口
        # 初始化
        app_private_key_string = open(
            os.path.join(settings.BASE_DIR, "app_private_key.pem")).read()
        alipay_public_key_string = open(
            os.path.join(settings.BASE_DIR, "alipay_public_key.pem")).read()
        alipay = AliPay(
            appid="2019080766140322",
            app_notify_url=SITE_DOMAIN + '/api/order/alipay_notifiy/',
            # app_notify_url=None,
            # app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/blog/app_private_key.pem'),
            app_private_key_string=app_private_key_string,
            # alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/blog/alipay_public_key.pem'),
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",
            debug=False  # 不是调试模式,访问实际环境地址
            # debug=True  # 沙箱开发环境
        )
        user = request.user
        order_no = datetime.now().strftime('%Y%m%d%H%M%S') + str(user.id)
        OrderInfo.objects.create(order_no=order_no,
                                 pay_item_id=pay_item_id,
                                 user=user,
                                 payee=payee,
                                 pay_method=pay_method,
                                 amount=decimal.Decimal(amount),
                                 pay_item_class=pay_item_class,
                                 trade_status='WAIT_BUYER_PAY')

        # 调用支付宝接口
        # App支付,将order_string返回给app即可
        order_string = alipay.api_alipay_trade_app_pay(
            out_trade_no=order_no,  # 订单id
            total_amount=str(amount),
            subject='艺起评%s' % order_no,
        )

        # # 手机网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        # order_string = alipay.api_alipay_trade_wap_pay(
        # 	out_trade_no=order_id,   #订单id
        # 	total_amount=0.01,
        # 	subject='app 名%s'%order_id,
        # 	return_url=None,
        # 	notify_url=None,   # 可选, 不填则使用默认notify url
        # )

        # 返回应答
        # pay_url = 'https://openapi.alipay.com/gateway.do?' + order_string

        # 沙箱
        # pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
        order_string = json.dumps({
            "order_string": order_string,
            "order_no": order_no
        })
        return HttpResponse(order_string)
Ejemplo n.º 10
0
#!/usr/bin/env python
# encoding: utf-8
'''
@author: qiuyan
@contact: [email protected]
@file: demo_alipay.py
@time: 2019/8/26 6:04 PM
@desc:
'''

#支付宝初始化
from alipay import AliPay

app_private_key_string = open("alipay/private_key_2048.txt").read()
alipay_public_key_string = open("alipay/alipay_pub_key").read()

_alipay = AliPay(
    appid="2019082666427588",
    app_notify_url="http://api.ytodanhao.com.cn/alipay/notify",
    # app_private_key_path="pay_key/private_2048.txt",
    # alipay_public_key_path="pay_key/public_2048.txt"
    app_private_key_string=app_private_key_string,
    alipay_public_key_string=alipay_public_key_string)

order_string = _alipay.api_alipay_trade_app_pay(out_trade_no='2019082618092',
                                                total_amount=100,
                                                subject='厨房电器勺子')
print(order_string)