Пример #1
0
    def post(self, request, *args, **kwargs):
        try:
            package_id = request.POST.get('package_id')
            order = VIPOrder.create_order(request.user, int(package_id))
            if order:
                log.info('****** order id: {} ******'.format(order.id))
                order.pay_type = VIPOrder.PAY_TYPE_BY_ALIPAY_APP
                out_trade_no = create_trade_id(order.id)
                order.outtradeno = out_trade_no
                order.save()
                result = {'order_id': order.id}

                alipay_client_config = AlipayClientConfig()
                alipay_client_config.app_id = smart_str(settings.ALIPAY_APP_INFO['basic_info']['APP_ID'])
                alipay_client_config.sign_type = smart_str(settings.ALIPAY_APP_INFO['other_info']['SIGN_TYPE'])
                with open(settings.ALIPAY_APP_INFO['basic_info']['APP_PRIVATE_KEY'], 'r') as fp:
                    alipay_client_config.app_private_key = fp.read()

                client = DefaultAlipayClient(alipay_client_config=alipay_client_config)

                model = AlipayTradeAppPayModel()
                model.total_amount = smart_str(str_to_specify_digits(str(order.price)))
                model.product_code = smart_str("QUICK_MSECURITY_PAY")
                model.body = smart_str(order.name)
                model.subject = smart_str(order.name)
                model.out_trade_no = smart_str(out_trade_no)
                model.passback_params = smart_str(settings.LMS_ROOT_URL + reverse("vip_purchase"))

                request = AlipayTradeAppPayRequest(biz_model=model)
                request.notify_url = smart_str(settings.ALIPAY_APP_INFO['other_info']['NOTIFY_URL'])
                result['alipay_request'] = client.sdk_execute(request)

                return Response(data=result)
        except Exception, e:
            log.exception(e)
Пример #2
0
def get_alipay_oauth_token_response(app_id, app_private_key, alipay_public_key, auth_code=''):
    '''
    初始化一个支付宝请求client
    '''
    alipay_client_config = AlipayClientConfig()
    alipay_client_config.server_url = constants.SERVER_URL
    alipay_client_config.app_id = app_id
    alipay_client_config.app_private_key = app_private_key
    alipay_client_config.alipay_public_key = alipay_public_key
    alipay_client_config.format = 'json'
    alipay_client_config.charset = 'utf-8'
    alipay_client_config.sign_type = 'RSA2'
    client = DefaultAlipayClient(alipay_client_config=alipay_client_config)
    model = AlipaySystemOauthTokenModel()
    request = AlipaySystemOauthTokenRequest(biz_model=model)
    request.code = auth_code
    request.grant_type = 'authorization_code'
    response_content = None
    try:
        response_content = client.execute(request)
    except AopException:
        print(traceback.format_exc())
    if not response_content:
        raise ValidationError({'app_id|app_private_key|alipay_public_key': ['all should be correct']})
    res = AlipaySystemOauthTokenResponse()
    res.parse_response_content(response_content)
    return res
Пример #3
0
    def alipay_query(cls, out_trade_no, trade_no, receipt, trade_type):
        '''alipay query'''
        try:
            config_dict = {
                VIPOrder.PAY_TYPE_BY_ALIPAY_APP: settings.ALIPAY_APP_INFO,
                VIPOrder.PAY_TYPE_BY_ALIPAY: settings.ALIPAY_APP_INFO,
            }
            config = config_dict[trade_type]
            alipay_client_config = AlipayClientConfig()
            alipay_client_config.app_id = smart_str(config['basic_info']['APP_ID'])
            alipay_client_config.sign_type = smart_str(config['other_info']['SIGN_TYPE'])
            with open(config['basic_info']['APP_PRIVATE_KEY'], 'r') as fp:
                alipay_client_config.app_private_key = fp.read()
            client = DefaultAlipayClient(alipay_client_config=alipay_client_config)

            model = AlipayTradeQueryModel()
            model.out_trade_no = smart_str(out_trade_no)
            if trade_no:
                model.trade_no = smart_str(trade_no)
            request = AlipayTradeQueryRequest(biz_model=model)

            request_params = client.sdk_execute(request)
            resp = requests.get('{}?{}'.format(SERVER_URL, request_params)).json()
            log.info('********** alipay query result ***********')
            log.info(resp)
            query_resp = resp['alipay_trade_query_response']
            return {
                'trade_status': query_resp.get('trade_status') == 'TRADE_SUCCESS',
                'total_fee': float(query_resp.get('total_amount', 0)),
                'refno': query_resp.get('trade_no', ''),
            }
        except Exception, e:
            log.exception(e)
Пример #4
0
 def _set_config(self):
     " 设置配置项 "
     config = AlipayClientConfig()
     config.server_url = 'https://openapi.alipay.com/gateway.do'
     config.app_id = settings.ALIPAY['appid']
     config.app_private_key = settings.ALIPAY['app_private_key']
     config.alipay_public_key = settings.ALIPAY['alipay_public_key']
     config.sign_type = 'RSA2'
     self.config = config
Пример #5
0
    def get(self, request, *args, **kwargs):
        try:
            package_id = request.GET.get('package_id')
            order = VIPOrder.create_order(request.user, int(package_id))
            if order:
                order.pay_type = VIPOrder.PAY_TYPE_BY_ALIPAY_APP
                out_trade_no = create_trade_id(order.id)
                order.outtradeno = out_trade_no
                order.save()
                result = {'order_id': order.id}

                alipay_client_config = AlipayClientConfig()
                alipay_client_config.app_id = smart_str(
                    settings.ALIPAY_APP_INFO['basic_info']['APP_ID'])
                alipay_client_config.sign_type = smart_str(
                    settings.ALIPAY_APP_INFO['other_info']['SIGN_TYPE'])
                with open(
                        settings.ALIPAY_APP_INFO['basic_info']
                    ['APP_PRIVATE_KEY'], 'r') as fp:
                    alipay_client_config.app_private_key = fp.read()

                client = DefaultAlipayClient(
                    alipay_client_config=alipay_client_config)

                model = AlipayTradeWapPayModel()
                model.total_amount = smart_str(
                    str_to_specify_digits(str(order.price)))
                model.product_code = smart_str("QUICK_WAP_WAY")
                model.subject = smart_str(_(order.name))
                model.out_trade_no = smart_str(out_trade_no)
                # 返回页面时不使用缓存
                quit_url = settings.LMS_ROOT_URL + reverse(
                    "vip_alipay_h5_result")
                model.quit_url = smart_str(quit_url)
                model.passback_params = smart_str(settings.LMS_ROOT_URL +
                                                  reverse("vip_purchase"))

                request = AlipayTradeWapPayRequest(biz_model=model)
                request.notify_url = smart_str(
                    settings.ALIPAY_APP_INFO['other_info']['NOTIFY_URL'])
                result['alipay_request'] = client.sdk_execute(request)
                log.error(SERVER_URL + "?" + result['alipay_request'])
                data = {
                    'alipay_url': SERVER_URL + "?" + result['alipay_request'],
                    'order_id': order.id
                }
                return Response(xresult(data=data))
        except Exception, e:
            log.exception(e)
Пример #6
0
def order_pay(order_id):
    """发起支付宝支付"""
    user_id = g.user_id

    # 判断订单状态
    try:
        order = Order.query.filter(Order.id == order_id,
                                   Order.user_id == user_id,
                                   Order.status == "WAIT_PAYMENT").first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库异常")

    if order is None:
        return jsonify(errno=RET.NODATA, errms="订单数据有误")

    # todo: 业务处理 使用python的SDK 调用支付宝的支付接口
    """
    设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
    """
    alipay_client_config = AlipayClientConfig(sandbox_debug=True)
    alipay_client_config.server_url = 'https://openapi.alipaydev.com/gateway.do'
    alipay_client_config.app_id = '2016101900724693'  # 应用id 这里是沙箱id
    alipay_client_config.charset = 'utf-8'

    with open(
            os.path.join(os.path.dirname(__file__),
                         'keys/app_private_key.txt')) as f:  # 应用私钥
        alipay_client_config.app_private_key = f.read()

    with open(
            os.path.join(os.path.dirname(__file__),
                         'keys/alipay_public_key.txt')) as f:  # 支付宝公钥
        alipay_client_config.alipay_public_key = f.read()

    alipay_client_config.sign_type = 'RSA2'  # RSA或RSA2
    """
    得到客户端对象。
    注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,
    alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
    logger参数用于打印日志,不传则不打印,建议传递。
    """
    client = DefaultAlipayClient(alipay_client_config=alipay_client_config)

    # 对照接口文档,构造请求对象
    model = AlipayTradeWapPayModel()

    model.out_trade_no = order_id  # 订单编号
    model.total_amount = "%.2f" % (order.amount / 100.0)  # 支付总金额
    model.subject = "爱家租房 %s" % order.id  # 订单标题
    model.quit_url = "http://47.98.34.63:5000/orders.html"  # 用户付款中途退出返回商户网站的地址
    model.product_code = "QUICK_WAP_WAY"  # 销售产品码,商家和支付宝签约的产品码
    model.timeout_express = "30m"  # 订单过期关闭时长(分钟)

    pay_request = AlipayTradeWapPayRequest(biz_model=model)  # 通过模型创建请求对象
    # get请求 用户支付成功后返回的页面请求地址
    pay_request.return_url = "http://47.98.34.63:5000/payComplete.html"
    # post请求 用户支付成功后返回的页面请求地址
    pay_request.notify_url = ''
    # 利用阿里支付对象发一个获取页面的请求 参数为order_string
    pay_url = client.page_execute(pay_request, http_method='GET')

    return jsonify(errno=RET.OK, errmsg="OK", data={"pay_url": pay_url})
Пример #7
0
import urllib.request
##need python3
logging.basicConfig(level=logging.INFO, filename='tornadoAliPay.log')
logger = logging.getLogger('')
#alipay public_key
public_key = 'xxxxx'
"""
设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
"""
#alipay_client_config = AlipayClientConfig()
alipay_client_config = AlipayClientConfig()
#alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
alipay_client_config.app_id = 'xxxxx'
alipay_client_config.app_private_key = 'xxxxxx'
alipay_client_config.alipay_public_key = 'xxxxx'
alipay_client_config.sign_type = 'RSA'
"""
得到客户端对象。
注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
logger参数用于打印日志,不传则不打印,建议传递。
"""
client = DefaultAlipayClient(alipay_client_config=alipay_client_config,
                             logger=logger)

url2 = "xxxxx"
appID = "55"
zoneID = "1"
mcash = "1"
platID = "888"

moneyMap = {
Пример #8
0
from statuscode import TRADE_TYPE


NOTIFY_URL = ''

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s %(levelname)s %(message)s',
    filemode='a',)
LOGGER = logging.getLogger('')

CLIENTCONFIG = AlipayClientConfig()
CLIENTCONFIG.server_url = 'https://openapi.alipaydev.com/gateway.do'
CLIENTCONFIG.app_id = '2016091700530462'
CLIENTCONFIG.charset = 'utf-8'
CLIENTCONFIG.sign_type = 'RSA2'
CLIENTCONFIG.notify_url = NOTIFY_URL
CLIENTCONFIG.app_private_key = (
    'MIIEogIBAAKCAQEAo9h9bEE9If52ENw4qp1VIfMTZ6vWldtbz/4XbXbYk+RAFhB+sTP7Y'
    '1OKryMpfkvcJwkRwF27zLSbpY8q78Udbpl+DiN1KtEeKIzqp6yaA+mwfoWytwAMyy73qX'
    'yL1WThmne88w+jixI/aNyRr7eWM41LbIuuRzZvgxBeLQjLaCoaYPOJI7dhcMcrq25cDKJ'
    'Z+i7afvin8/btT9gw8TZMTcRrRRCC9R2WpIkf/hgXrHaTczXmvoYLVwK1UQx41Z9jZfdg'
    'QEeerKuYhIYCnSmlDWbhkGJ3mhdkoUUOEdOCD89SMyUiSw/TgHsvEyh5wlhF8Z+9lE9PO'
    '6apIeQFi2b6LQIDAQABAoIBAFZugdt1ntYr8gR657m5PYunOvlZgN2U1h4moB0ysJVztw'
    'rssKiyD08aZvJ0zhK92ekNs7uSttsJ+4GewLuzdA9AEWtL8SchIZOqoq7JMoYV5PEZfml'
    'jMVyN7kAOX4W2rfxaZeaivVdDzQd4M7JKWoXfZ4ZfORR/9ttg6w0+sm7DzwGAGsxEVyDB'
    'tYER5UNjSPZeZIzS53FAUG40mhCDl+Ab/UWNSvAY44ITc6p29OdiLPwi8vpvdzL+AZtdw'
    '0B2dcsqq+H6tRyEuQwpH9SxrWCdiMWtiEsVyMl7PpI/FU0uDlSDTxFjwkesXhBXysh2rX'
    '0aHKcn1jiCljU/m1KxawECgYEA0IKUpuNZLgxIN3JYq/p6Tu15MMxLLzeoDw1m5n9qLGe'
    'QUqwkHMQbfbcN/9sT8UwgHTq4VdM0F2bIqNx5bFuT6Kz1zVWe5e7k6JC8Z9d9Xxi1lkFT'
    '+CyGFriJHT8eS/wPm4sV+WT3NuC+FDoi0tnHVBDpZYrjf9Z3GD+DtosO9X0CgYEAySmzA'
Пример #9
0
    def post(self, request):
        """查询支付结果"""
        # 校验用户是否登录'
        user = request.user
        if not user.is_authenticated:
            return JsonResponse({'res': 0, 'errmsg': '用户未登录'})

        # 接收参数
        order_id = request.POST.get('order_id')

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

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

        # todo: 业务处理 使用python的SDK 调用支付宝的支付接口
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s %(levelname)s %(message)s',
            filemode='a',
        )
        logger = logging.getLogger('')
        """
            设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
        """
        alipay_client_config = AlipayClientConfig(sandbox_debug=True)
        alipay_client_config.server_url = 'https://openapi.alipaydev.com/gateway.do'
        alipay_client_config.app_id = '2016101900724693'  # 应用id 这里是沙箱id
        alipay_client_config.charset = 'utf-8'

        with open(
                os.path.join(settings.BASE_DIR,
                             'apps/order/app_private_key.txt')) as f:
            alipay_client_config.app_private_key = f.read()

        with open(
                os.path.join(settings.BASE_DIR,
                             'apps/order/alipay_public_key.txt')) as f:
            alipay_client_config.alipay_public_key = f.read()

        alipay_client_config.sign_type = 'RSA2'  # RSA或RSA2
        """
            得到客户端对象。
            注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,
            alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
            logger参数用于打印日志,不传则不打印,建议传递。
            """
        client = DefaultAlipayClient(alipay_client_config=alipay_client_config,
                                     logger=logger)

        while True:
            # 对照接口文档,构造请求对象
            model = AlipayTradeQueryModel()
            model.out_trade_no = order_id

            query_request = AlipayTradeQueryRequest(biz_model=model)
            response = self.str_to_dict(client.execute(query_request))
            """
                response:
                {
                    "code":"10000",  # 接口调用是否成功
                    "msg":"Success",
                    "buyer_logon_id":"mnd***@sandbox.com",
                    "buyer_pay_amount":"0.00",
                    "buyer_user_id":"2088102180300991",
                    "buyer_user_type":"PRIVATE",
                    "invoice_amount":"0.00",
                    "out_trade_no":"2020010122413118",
                    "point_amount":"0.00",
                    "receipt_amount":"0.00",
                    "total_amount":"39.90",
                    "trade_no":"2020010422001400991000047401",  # 支付宝交易号
                    "trade_status":"WAIT_BUYER_PAY" # 支付结果
                }
            """

            code = response.get('code')
            if code == '10000' and response.get(
                    'trade_status') == 'TRADE_SUCCESS':
                # 支付成功
                # 获取支付宝交易号
                trade_no = response.get('trade_no')
                # 更新订单状态
                order.trade_no = trade_no
                order.order_status = 4  # 待评价
                order.save()
                # 返回结果
                return JsonResponse({'res': 3, 'message': '支付成功'})
            elif code == '40004' or code == '10000' and response.get(
                    'trade_status') == 'WAIT_BUYER_PAY':
                # 等待买家付款
                # 业务处理失败 可能一会会成功
                time.sleep(5)
                continue
            else:
                # 支付出错
                return JsonResponse({'res': 4, 'errmsg': '支付失败'})
Пример #10
0
    def post(self, request):
        """订单支付"""
        # 校验用户是否登录'
        user = request.user
        if not user.is_authenticated:
            return JsonResponse({'res': 0, 'errmsg': '用户未登录'})

        # 接收参数
        order_id = request.POST.get('order_id')

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

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

        # todo: 业务处理 使用python的SDK 调用支付宝的支付接口
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s %(levelname)s %(message)s',
            filemode='a',
        )
        logger = logging.getLogger('')
        """
            设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
        """
        alipay_client_config = AlipayClientConfig(sandbox_debug=True)
        alipay_client_config.server_url = 'https://openapi.alipaydev.com/gateway.do'
        alipay_client_config.app_id = '2016101900724693'  # 应用id 这里是沙箱id
        alipay_client_config.charset = 'utf-8'

        with open(
                os.path.join(settings.BASE_DIR,
                             'apps/order/app_private_key.txt')) as f:
            alipay_client_config.app_private_key = f.read()

        with open(
                os.path.join(settings.BASE_DIR,
                             'apps/order/alipay_public_key.txt')) as f:
            alipay_client_config.alipay_public_key = f.read()

        alipay_client_config.sign_type = 'RSA2'  # RSA或RSA2
        """
            得到客户端对象。
            注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,
            alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
            logger参数用于打印日志,不传则不打印,建议传递。
            """
        client = DefaultAlipayClient(alipay_client_config=alipay_client_config,
                                     logger=logger)

        # 计算商品金额
        total_pay = order.total_price + order.transit_price  # Decimal类型
        # 订单内容:商品信息
        alipay_body = ''
        goods = OrderGoods.objects.filter(order=order)
        for good in goods:
            alipay_body = alipay_body + good.sku.desc + ';'

        # 对照接口文档,构造请求对象
        model = AlipayTradePayModel()
        model.out_trade_no = order_id  # 订单id
        model.total_amount = str(total_pay)  # 支付总金额
        model.subject = '天天生鲜用户:%s,您正在支付[天天生鲜网站]订单号为%s' % (
            user.username, order_id)  # 订单标题
        model.body = alipay_body
        model.product_code = 'FAST_INSTANT_TRADE_PAY'  # 与支付宝签约的产品码名称,目前只支持这一种
        model.timeout_express = '30m'  # 订单过期关闭时长(分钟)

        pay_request = AlipayTradePagePayRequest(biz_model=model)  # 通过模型创建请求对象
        # get请求 用户支付成功后返回的页面请求地址
        pay_request.return_url = ''
        # post请求 用户支付成功后返回的页面请求地址
        pay_request.notify_url = ''
        # 利用阿里支付对象发一个获取页面的请求 参数为order_string
        pay_url = client.page_execute(pay_request, http_method='GET')

        # 返回应答
        return JsonResponse({'res': 3, 'pay_url': pay_url})