예제 #1
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
예제 #2
0
def zfb_callback_login(request):
    app_auto_code = request.GET.get("app_auto_code")

    model = AlipayOpenAuthTokenAppModel()
    model.grant_type = "authorization_code"
    model.code = app_auto_code

    client = DefaultAlipayClient(
        alipay_client_config=zfb_conf.alipay_client_config)

    request = AlipayOpenAuthTokenAppRequest(biz_model=model)

    response_content = client.execute(request)

    response = AlipayOpenAuthTokenAppResponse()

    response.parse_response_content(response_content)

    app_auto_token = response.app_auth_token
    expires = response.expires_in

    app_refresh_token = response.app_refresh_token
    re_expires = response.re_expires_in

    alipay_user_id = response.user_id

    return HttpResponse(response.body)
예제 #3
0
    def post(self):

        bid = self.get_argument('bid')
        out_trade_no = self.get_argument('out_trade_no')
        payConfig = self.DefaultValues[bid]

        # 设置配置信息
        alipay_client_config = AlipayClientConfig()
        alipay_client_config.server_url = payConfig['zfbpay']['url']
        alipay_client_config.app_id = payConfig['zfbpay']['appId']
        alipay_client_config.app_private_key = payConfig['zfbpay']['app_private_key']
        alipay_client_config.alipay_public_key = payConfig['zfbpay']['alipay_public_key']

        # 客户端对象
        client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger)

        # 构造请求对象
        model = AlipayTradeQueryModel()
        model.out_trade_no = out_trade_no
        request = AlipayTradeQueryRequest(biz_model=model)
        response_content = None
        try:
            response_content = client.execute(request)
        except Exception as e:
            print('1-' + traceback.format_exc())
        if not response_content:
            print( "2-failed execute")
        else:
            response = AlipayTradeQueryResponse()
            # 解析响应结果
            response.parse_response_content(response_content)
            print(response.body)
            if response.is_success():
                # 业务成功,则通过respnse属性获取需要的值
                print("业务成功- get response trade_no:" + response.trade_no)
                info = {
                    'errCode': '0',
                    'errMsg':  '',
                    'detail': {
                        'trade_no': response.trade_no
                    }
                }
                result = {
                    'result': info
                }
                self.write(json.dumps(result, ensure_ascii=False))
            else:
                # 业务失败
                print('业务失败-' + response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg)
                info = {
                    'errCode': response.code,
                    'errMsg':  response.sub_msg
                }
                result = {
                    'result': info
                }
                self.write(json.dumps(result, ensure_ascii=False))
예제 #4
0
 def get_access_token_and_userid(self, alipay_client_config, auth_code):
     """
     设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
     """
     client = DefaultAlipayClient(alipay_client_config=alipay_client_config)
     """
     系统接口:alipay.system.oauth.token
     """
     # 对照接口文档,构造请求对象
     from alipay.aop.api.request.AlipaySystemOauthTokenRequest import AlipaySystemOauthTokenRequest
     model = AlipaySystemOauthTokenRequest()
     model.grant_type = "authorization_code"
     model.code = auth_code
     result = client.execute(model)
     logging.info(">>>支付宝返回结果:{}".format(result))
예제 #5
0
파일: main.py 프로젝트: yumusb/scan2pay
def pay(userinfo):
    """
    设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
    """
    alipay_client_config = AlipayClientConfig()
    alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
    alipay_client_config.app_id = ''  # appid
    alipay_client_config.app_private_key = ''  # 用户私钥
    alipay_client_config.alipay_public_key = ''  # 支付宝公钥(填入用户私钥,返回的支付宝公钥,而不是上面用户私钥对应的公钥,如果不会配置的话可以看我另一项目中的文档 https://github.com/yumusb/alipay-f2fpay/tree/master/%E5%AF%86%E9%92%A5%E5%AF%B9%E7%94%9F%E6%88%90%E4%B8%8E%E8%AE%BE%E7%BD%AE%E6%95%99%E7%A8%8B)
    """
    得到客户端对象。
    注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
    logger参数用于打印日志,不传则不打印,建议传递。
    """
    #client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger)
    client = DefaultAlipayClient(alipay_client_config=alipay_client_config)
    """
    系统接口示例:alipay.trade.pay
    """
    # 对照接口文档,构造请求对象
    model = AlipayTradePayModel()
    model.auth_code = userinfo
    model.subject = "Test"  # 订单标题
    model.out_trade_no = time()  # 订单账号
    model.scene = "bar_code"
    model.total_amount = 0.01  # 订单金额
    request = AlipayTradePayRequest(biz_model=model)
    response_content = None
    try:
        response_content = client.execute(request)
    except Exception as e:
        print(traceback.format_exc())
    if not response_content:
        print("failed execute")
    else:
        response = AlipayTradePayResponse()
        # 解析响应结果
        response.parse_response_content(response_content)
        #print(response.body)
        #返回结果集,如果不能成功支付的话,建议输出以排错
        if response.is_success():
            # 如果业务成功,则通过respnse属性获取需要的值
            print("get response trade_no:" + response.trade_no)
        else:
            # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
            print(response.code + "," + response.msg + "," +
                  response.sub_code + "," + response.sub_msg)
예제 #6
0
class Alipay():
    def __init__(self):
        self.appid = settings.ALIPAY_APPID
        self.server_url = settings.ALIPAY_SERVER_URL
        self.alipay_public_key = settings.ALIPAY_PUBLIC_KEY
        self.app_private_key = settings.APP_PRIVATE_KEY

        client_config = AlipayClientConfig()
        client_config.server_url = self.server_url
        client_config.app_id = self.appid
        client_config.alipay_public_key = self.alipay_public_key
        client_config.app_private_key = self.app_private_key
        self.client = DefaultAlipayClient(client_config)

    def payorders(self, order_id, total_amount):
        model = AlipayTradePagePayModel()
        model.product_code = 'FAST_INSTANT_TRADE_PAY'
        model.total_amount = str(total_amount)
        model.subject = '天天生鲜订单支付-天天艹楼雅倩'
        model.out_trade_no = order_id

        request = AlipayTradePagePayRequest(biz_model=model)
        response_content = self.client.page_execute(request, http_method='GET')
        if not response_content:
            return "caolouyaqianshibai"

        # response = AlipayTradePagePayResponse()
        # response.parse_response_content(response_content)
        # # 响应成功的业务处理
        # if response.is_success():
        #     # 如果业务成功,可以通过response属性获取需要的值
        #     print("get response trade_no:" + response.trade_no)
        # # 响应失败的业务处理
        # else:
        #     # 如果业务失败,可以从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
        #     print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg)

        return response_content

    def order_status_query(self, order_id):
        model = AlipayTradeQueryModel()
        model.out_trade_no = order_id
        request = AlipayTradeQueryRequest(biz_model=model)
        response_content = self.client.execute(request)
        response = AlipayTradeQueryResponse()
        response.parse_response_content(response_content)
        return response
예제 #7
0
def trans_to_account(out_biz_no, amount, alipay, name):  # TODO 待测试
    alipay_client_config = AlipayClientConfig()
    alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
    alipay_client_config.app_id = alipay_app_id
    alipay_client_config.app_private_key = alipay_app_private
    alipay_client_config.alipay_public_key = alipay_public_key
    client = DefaultAlipayClient(alipay_client_config=alipay_client_config)
    alipay_model = AlipayFundTransToaccountTransferModel()
    alipay_model.out_biz_no = out_biz_no
    alipay_model.payee_type = "ALIPAY_LOGONID"
    alipay_model.amount = str(amount)
    alipay_model.payee_account = alipay
    alipay_model.payee_real_name = name
    alipay_model.remark = "猪猪惠返提现"  # TODO 修改app名字
    request = AlipayFundTransToaccountTransferRequest(biz_model=alipay_model)
    response_content = client.execute(request)
    print(response_content)
    return json.loads(response_content)
예제 #8
0
    def get_pay_status(cls, order_id):
        # 获取内容
        with open(ALIPAY_KEY_PATH) as f:
            alipay_public_key = f.read()

        with open(APP_KEY_PRIVATE_PATH) as f:
            app_private_key = f.read()

        #  设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥;
        config = AlipayClientConfig()
        config.server_url = settings.SERVER_URL
        config.app_id = settings.APP_ID
        config.app_private_key = app_private_key
        config.alipay_public_key = alipay_public_key

        # 得到
        client = DefaultAlipayClient(alipay_client_config=config)
        model = AlipayTradeQueryModel()
        model.out_trade_no = order_id
        request = AlipayTradeQueryRequest(biz_model=model)
        # 得到构造的请求,获取返回内容
        import time
        i = 1
        while True:
            time.sleep(10)
            response_content = None
            try:
                response_content = client.execute(request)
            except Exception as ex:
                print(ex)
            if not response_content:
                return None
            else:
                # 解析相应结果
                response = AlipayTradeQueryResponse()
                response.parse_response_content(response_content)
                if response.is_success(
                ) and response.trade_status == 'TRADE_SUCCESS':
                    return response.trade_no
                i += 1
                if i == 30:
                    # 五分钟后还是失败
                    # 判定支付失败
                    return None
예제 #9
0
def test_alipay():
    # 实例化客户端
    alipay_client_config = AlipayClientConfig()
    alipay_client_config.server_url = 'https://openapi.alipaydev.com/gateway.do'
    alipay_client_config.app_id = '请填写appi_id'
    alipay_client_config.app_private_key = '请填写开发者私钥去头去尾去回车,单行字符串'
    alipay_client_config.alipay_public_key = '请填写支付宝公钥,单行字符串'
    client = DefaultAlipayClient(alipay_client_config, logger)

    # 构造请求参数对象
    model = AlipayTradeCreateModel()
    model.out_trade_no = "20150320010101001";
    model.total_amount = "88.88";
    model.subject = "Iphone6 16G";
    model.buyer_id = "2088102177846880";
    request = AlipayTradeCreateRequest(biz_model=model)

    # 执行API调用
    try:
        response_content = client.execute(request)
    except Exception as e:
        print(traceback.format_exc())

    if not response_content:
        print("failed execute")
    else:
        # 解析响应结果
        response = AlipayTradeCreateResponse()
        response.parse_response_content(response_content)
        # 响应成功的业务处理
        if response.is_success():
            # 如果业务成功,可以通过response属性获取需要的值
            print("get response trade_no:" + response.trade_no)
        # 响应失败的业务处理
        else:
            # 如果业务失败,可以从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
            print(response.code + "," + response.msg + "," + response.sub_code + "," + response.sub_msg)
예제 #10
0
    alipay_client_config.app_id = '请填写appi_id'
    alipay_client_config.app_private_key = '请填写开发者私钥去头去尾去回车,单行字符串'
    alipay_client_config.alipay_public_key = '请填写支付宝公钥,单行字符串'
    client = DefaultAlipayClient(alipay_client_config, logger)

    # 构造请求参数对象
    model = AlipayTradeCreateModel()
    model.out_trade_no = "20150320010101001"
    model.total_amount = "88.88"
    model.subject = "Iphone6 16G"
    model.buyer_id = "2088102177846880"
    request = AlipayTradeCreateRequest(biz_model=model)

    # 执行API调用
    try:
        response_content = client.execute(request)
    except Exception as e:
        print(traceback.format_exc())

    if not response_content:
        print("failed execute")
    else:
        # 解析响应结果
        response = AlipayTradeCreateResponse()
        response.parse_response_content(response_content)
        # 响应成功的业务处理
        if response.is_success():
            # 如果业务成功,可以通过response属性获取需要的值
            print("get response trade_no:" + response.trade_no)
        # 响应失败的业务处理
        else:
예제 #11
0
class AliFacePay:
    logger = logging.getLogger('')

    def __init__(self,
                 app_id,
                 app_private_key,
                 alipay_public_key,
                 notify_url=None,
                 sandbox_debug=False):
        '''
        设置配置,包括支付宝网关地址、app_id、应用私钥、支付宝公钥等,其他配置值可以查看AlipayClientConfig的定义。
        '''
        alipay_client_config = AlipayClientConfig(sandbox_debug=sandbox_debug)
        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对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
        logger参数用于打印日志,不传则不打印,建议传递。
        '''
        self.client = DefaultAlipayClient(
            alipay_client_config=alipay_client_config,
            logger=AliFacePay.logger)
        self.notify_url = notify_url
        self.alipay_public_key = alipay_public_key

    '''
    功能:生成支付二维码,生成二维码后,展示给用户,由用户扫描二维码创建支付订单
    
    参数:
    out_trade_no:订单号,不可重复,用来区分每一笔订单
    total_amount:订单金额,单位元,精确到小数点后2位
    subject:订单标题
    body:订单详细描述
    
    返回值:string 付款二维码链接,使用二维码生成工具生成二维码提供给用户付款
    '''

    def precreate(self, out_trade_no, total_amount, subject, body=None):
        '''
        系统接口示例:alipay.trade.precreate
        '''
        # 对照接口文档,构造请求对象
        precreate_model = AlipayTradePrecreateModel()
        precreate_model.out_trade_no = out_trade_no
        precreate_model.total_amount = total_amount
        precreate_model.subject = subject

        # 该笔订单允许的最晚付款时间,逾期将自动关闭交易(TRADE_CLOSED),时间从用户扫描付款二维码以后开始计算
        # 扫码后的最晚付款时间限制 默认交易超时时间为15天
        precreate_model.timeout_express = '5m'

        # 二维码有效期,从创建二维码开始直到用户扫码,默认2h,要求最小2m
        # (沙箱目前qr_code_timeout_express这个参数是不生效的,实际环境才有效果)
        # 到期二维码失效,不会影响订单状态,因为此时订单还没有创建
        # 二维码创建后的最晚扫码时间限制
        precreate_model.qr_code_timeout_express = '5m'

        # 花呗,默认支持吗?
        #precreate_model.enable_pay_channels = 'pcredit'
        # 花呗分期
        #precreate_model.enable_pay_channels = 'pcreditpayInstallment'

        if body:
            precreate_model.body = body

        precreate_request = AlipayTradePrecreateRequest(
            biz_model=precreate_model)
        precreate_request.notify_url = self.notify_url
        precreate_response_content = None
        qr_code = None
        try:
            precreate_response_content = self.client.execute(precreate_request)
        except Exception as e:
            print(traceback.format_exc())

        if not precreate_response_content:
            print("failed execute precreate")
        else:
            precreate_response = AlipayTradePrecreateResponse()
            # 解析响应结果
            precreate_response.parse_response_content(
                precreate_response_content)
            if precreate_response.is_success():
                # 如果业务成功,则通过respnse属性获取需要的值
                qr_code = precreate_response.qr_code
                # print("get response out_trade_no:" + precreate_response.out_trade_no)
                # print("get response qr_code:" + precreate_response.qr_code)
            else:
                # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
                print(precreate_response.code + "," + precreate_response.msg +
                      "," + precreate_response.sub_code + "," +
                      precreate_response.sub_msg)
        return qr_code

    '''
    功能:主动查询订单状态(只有用户扫描了二维码以后才会创建订单,用户扫描之前得到的结果会是 40004 交易不存在)

    参数:
    out_trade_no:订单号,不可重复,用来区分每一笔订单        

    返回值:dict
    out_trade_no:订单号
    buyer_logon_id:买家支付宝账号
    trade_status:交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
    交易状态 TRADE_FINISHED 的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限
    total_amount:交易金额
    '''

    def query(self, out_trade_no):
        '''
        系统接口示例:alipay.trade.query
        '''
        # 对照接口文档,构造请求对象
        query_model = AlipayTradeQueryModel()
        query_model.out_trade_no = out_trade_no

        query_request = AlipayTradeQueryRequest(biz_model=query_model)
        query_response_content = None
        ret_dict = {}
        try:
            query_response_content = self.client.execute(query_request)
        except Exception as e:
            print(traceback.format_exc())

        if not query_response_content:
            print("failed execute query")
        else:
            query_response = AlipayTradeQueryResponse()
            # 解析响应结果
            query_response.parse_response_content(query_response_content)
            if query_response.is_success():
                # 如果业务成功,则通过respnse属性获取需要的值
                ret_dict['out_trade_no'] = query_response.out_trade_no
                ret_dict['buyer_logon_id'] = query_response.buyer_logon_id
                ret_dict['trade_status'] = query_response.trade_status
                ret_dict['total_amount'] = query_response.total_amount
            else:
                # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
                print(query_response.code + "," + query_response.msg + "," +
                      query_response.sub_code + "," + query_response.sub_msg)
        return ret_dict

    '''
    功能:支付交易返回失败或支付系统超时,调用该接口撤销交易。
    cancel和close的区别是,交易完成后不可以close,但是可以cancel,cancel会退款给用户
    生成二维码之后,扫描之前也可以cancel,但是不可以close

    参数:
    out_trade_no:订单号,不可重复,用来区分每一笔订单
        
    返回值:bool 是否执行成功
    '''

    def cancel(self, out_trade_no):
        '''
        系统接口示例:alipay.trade.cancel
        '''
        # 对照接口文档,构造请求对象
        cancel_model = AlipayTradeCancelModel()
        cancel_model.out_trade_no = out_trade_no

        cancel_request = AlipayTradeCancelRequest(biz_model=cancel_model)
        cancel_response_content = None
        ret = False
        try:
            cancel_response_content = self.client.execute(cancel_request)
        except Exception as e:
            print(traceback.format_exc())

        if not cancel_response_content:
            print("failed execute cancel")
        else:
            cancel_response = AlipayTradeCancelResponse()
            # 解析响应结果
            cancel_response.parse_response_content(cancel_response_content)
            if cancel_response.is_success():
                # 如果业务成功,则通过respnse属性获取需要的值
                ret = True
            else:
                # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
                print(cancel_response.code + "," + cancel_response.msg + "," +
                      cancel_response.sub_code + "," + cancel_response.sub_msg)
        return ret

    '''
    功能:用于交易创建后,用户在一定时间内未进行支付,可调用该接口直接将未付款的交易进行关闭。
    也就是用户扫码创建了订单,用户支付之前我们可以close订单
    也就是说当且仅当订单状态为WAIT_BUYER_PAY时可以close

    参数:
    out_trade_no:订单号,不可重复,用来区分每一笔订单

    返回值:bool 是否执行成功
    '''

    def close(self, out_trade_no):
        '''
        系统接口示例:alipay.trade.cancel
        '''
        # 对照接口文档,构造请求对象
        close_model = AlipayTradeCloseModel()
        close_model.out_trade_no = out_trade_no

        close_request = AlipayTradeCloseRequest(biz_model=close_model)
        close_response_content = None
        ret = False
        try:
            close_response_content = self.client.execute(close_request)
        except Exception as e:
            print(traceback.format_exc())

        if not close_response_content:
            print("failed execute close")
        else:
            close_response = AlipayTradeCloseResponse()
            # 解析响应结果
            close_response.parse_response_content(close_response_content)
            if close_response.is_success():
                # 如果业务成功,则通过respnse属性获取需要的值
                ret = True
            else:
                # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
                print(close_response.code + "," + close_response.msg + "," +
                      close_response.sub_code + "," + close_response.sub_msg)
        return ret

    '''
    功能:退款

    参数:
    out_trade_no:订单号,不可重复,用来区分每一笔订单

    返回值:bool 是否执行成功
    '''

    def refund(self, out_trade_no, refund_amount):
        '''
        系统接口示例:alipay.trade.refund
        '''
        # 对照接口文档,构造请求对象
        refund_model = AlipayTradeRefundModel()
        refund_model.out_trade_no = out_trade_no
        refund_model.refund_amount = refund_amount

        refund_request = AlipayTradeRefundRequest(biz_model=refund_model)
        refund_response_content = None
        ret = False
        try:
            refund_response_content = self.client.execute(refund_request)
        except Exception as e:
            print(traceback.format_exc())

        if not refund_response_content:
            print("failed execute refund")
        else:
            refund_response = AlipayTradeRefundResponse()
            # 解析响应结果
            refund_response.parse_response_content(refund_response_content)
            if refund_response.is_success():
                # 如果业务成功,则通过respnse属性获取需要的值
                ret = True
                # print("get response out_trade_no:" + refund_response.out_trade_no)
                # print("get response refund_fee:" + refund_response.refund_fee)
            else:
                # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
                print(refund_response.code + "," + refund_response.msg + "," +
                      refund_response.sub_code + "," + refund_response.sub_msg)
        return ret

    '''
    功能:验证异步回调签名

    参数:
    params:回调通知参数字典,例如flask通知中使用request.form.to_dict()来构造参数(params = request.form.to_dict())

    返回值:bool 是否验证成功
    '''

    def verify_params_sign(self, params):
        # 文档 https://docs.open.alipay.com/194/103296#s5
        sign = params.pop('sign', None)  # 取出sign参数
        params.pop('sign_type')  # 取出sign_type参数
        params = sorted(params.items(), key=lambda e: e[0],
                        reverse=False)  # 取出字典元素按key的字母升序排序形成列表
        message = "&".join(u"{}={}".format(k, v)
                           for k, v in params).encode()  # 将列表转为二进制参数字符串
        try:
            status = verify_with_rsa(
                self.alipay_public_key.encode('utf-8').decode('utf-8'),
                message, sign)  # 验证签名并获取结果
            return status  # 返回验证结果
        except Exception as e:  # 如果验证失败,返回假值。
            return False

    @classmethod
    def get_rand_string(cls, length=10):
        # 生成len长度的随机字符串
        s = ""
        for _ in range(length):
            s = s + str(randint(0, 9))
        return s

    @classmethod
    def gen_trade_no(cls, pre_string=None):
        timestamp = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
        trade_no = timestamp + cls.get_rand_string()
        if pre_string:
            trade_no = pre_string + '_' + trade_no
        return trade_no
예제 #12
0
    def token(request):
        ref = request.GET.get("ref") if request.GET.get("ref") is not None else "/"
        if ref == request.path:
            ref = "/"

        # 没有auth_code未登录,算错误的请求
        if request.GET.get("auth_code") is None and not request.user.is_authenticated:
            return render(request, "weui/siginin/fail.html", {"msg": "错误的请求", "ref": ref})

        # 没有auth_code已登录,跳转ref
        if request.GET.get("auth_code") is None and request.user.is_authenticated:
            return render(request, "weui/siginin/success.html", {"ref": ref})

        # 有auth_code未登录,走登录流程
        if request.GET.get("auth_code") is not None:
            auth_code = request.GET["auth_code"]
            ssl._create_default_https_context = ssl._create_unverified_context
            # 通过auth_code获取access_token及用户信息
            alipay_config = config.Alipay(is_sandbox=True if settings.CONNECT_ALIPAY == "sandbox" else False)

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

            alipay_client_config = AlipayClientConfig(sandbox_debug=False)
            alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
            alipay_client_config.app_id = alipay_config.APP_ID
            alipay_client_config.app_private_key = alipay_config.PRIVATE_KEY
            alipay_client_config.alipay_public_key = alipay_config.ALIPAY_PUBLIC_KEY

            alipayClient = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger)
            # 获取token
            tokenRequest = AlipaySystemOauthTokenRequest()
            tokenRequest.code = auth_code
            tokenRequest.grant_type = "authorization_code"
            response_content = ""
            access_token = {}
            try:
                response_content = alipayClient.execute(tokenRequest)
            except Exception as ex:
                print(ex)

            if not response_content:
                return render(request, "weui/siginin/fail.html", {"msg": "错误的请求", "ref": ref})

            oauthTokenResponse = AlipaySystemOauthTokenResponse()
            oauthTokenResponse.parse_response_content(response_content)
            if not oauthTokenResponse.is_success():
                return render(request, "weui/siginin/fail.html", {"msg": oauthTokenResponse.sub_msg, "ref": ref})

            # 判断用户是否存在
            platform_user_id = oauthTokenResponse.user_id
            connectObj = Connect.objects.filter(oauth_platform_user_id=platform_user_id).first()
            if connectObj is not None:
                # 可以登录
                user = User.objects.get(id=connectObj.user_id)
                login(request, user)
                return render(request, "weui/siginin/success.html", {"ref": ref})

            # 构建模型,取得用户信息后即可注册
            connectObj = Connect()
            connectObj.oauth_expire = time.time() + oauthTokenResponse.expires_in
            connectObj.oauth_key = alipay_client_config.app_id
            connectObj.oauth_platform = "alipay"
            connectObj.oauth_platform_user_id = platform_user_id
            connectObj.oauth_token = oauthTokenResponse.access_token
            connectObj.oauth_token_fresh = oauthTokenResponse.refresh_token
            connectObj.oauth_token_fresh_expire = time.time() + oauthTokenResponse.re_expires_in
            connectObj.created = time.time()

            print(oauthTokenResponse.access_token)

            # 获取用户信息
            user_info_request = AlipayUserInfoShareRequest()
            user_info_request.udf_params = {"auth_token": oauthTokenResponse.access_token}
            response_content = alipayClient.execute(user_info_request)
            infoResponse = AlipayUserInfoShareResponse()
            infoResponse.parse_response_content(response_content)
            print(infoResponse)
            print(infoResponse.user_id, infoResponse.nick_name)
            # 保存新用户信息
            user = User.objects.create_user(username=infoResponse.nick_name)
            user.save()
            user_profile = UserProfile()
            user_profile.user_id = user.id
            user_profile.nickname = infoResponse.nick_name
            user_profile.avatar = infoResponse.avatar
            user_profile.save()
            connectObj.user_id = user.id
            connectObj.oauth_data = response_content
            connectObj.save()

            return HttpResponse(connectObj.user_id)
예제 #13
0
    def post(self):

        common = Common()
        print(common.re_phone('13631255697'))

        bid = self.get_argument('bid')
        payConfig = self.DefaultValues[bid]
        out_trade_no = self.get_argument('out_trade_no')
        refund_amount = self.get_argument('refund_amount')
        # if self.get_argument('out_request_no'):
        #   _request_no = self.get_argument('out_request_no')
        #self.write(str(self.get_argument('out_request_no')))
        out_request_no = common.random_str(16)

        # 设置配置信息
        alipay_client_config = AlipayClientConfig()
        alipay_client_config.server_url = payConfig['zfbpay']['url']
        alipay_client_config.app_id = payConfig['zfbpay']['appId']
        alipay_client_config.app_private_key = payConfig['zfbpay']['app_private_key']
        alipay_client_config.alipay_public_key = payConfig['zfbpay']['alipay_public_key']

        # 客户端对象
        client = DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger)

        # 直接使用引入库的表
        online_alipay_order_list = base_mode('online_alipay_order_list')

        # 获取该笔订单金额
        order_info = self.db.query(online_alipay_order_list).filter(online_alipay_order_list.bid == bid,
                                                                      online_alipay_order_list.out_trade_no == out_trade_no).scalar()
        # 退款金额大于该笔订单金额 退款失败
        if  int(refund_amount) > int(order_info.total_amount):
            info = {
                'errCode': -1,
                'errMsg': '退款失败,退款金额大于该订单金额'
            }
            result = {
                'result': info
            }
            return self.write(json.dumps(result, ensure_ascii=False))

        # 构造请求对象
        model = AlipayTradeRefundModel()
        model.out_trade_no = out_trade_no
        model.refund_amount = refund_amount
        model.out_request_no = out_request_no
        request = AlipayTradeRefundRequest(biz_model=model)
        response_content = None
        try:
            response_content = client.execute(request)
        except Exception as e:
            print('1-' + traceback.format_exc())
        if not response_content:
            print("2-failed execute")
        else:
            response = AlipayTradeRefundResponse()
            # 解析响应结果
            response.parse_response_content(response_content)
            if response.is_success():
                '''
                   退款成功更新订单信息
                '''
                if not order_info.refundList:
                    refund_list = []
                else:
                    refund_list = eval(order_info.refundList)
                refundInfo = {}
                refundInfo['refund_no'] = out_request_no
                refundInfo['refund_fee'] = int(refund_amount)
                refundInfo['refund_status'] = 1 #退款成功
                refundInfo['refund_date'] = common.current_stamp()
                refund_list.append(refundInfo)
                self.db.query(online_alipay_order_list).filter(
                    online_alipay_order_list.bid == bid,
                    online_alipay_order_list.out_trade_no == out_trade_no).update(
                    {
                        'totalFeeLeft': int(order_info.totalFeeLeft) - int(refund_amount),
                        'refundList': str(refund_list)
                    })
                self.db.commit()
                # 业务成功返回
                info = {
                    'errCode': '0',
                    'errMsg': '',
                    'detail': {
                        'refund_fee': response.refund_fee
                    }
                }
                result = {
                    'result': info
                }
                return self.write(json.dumps(result, ensure_ascii=False))
            else:
                '''
                   退款失败更新订单信息
                '''
                if not order_info.refundList:
                    refund_list = []
                else:
                    refund_list = eval(order_info.refundList)
                refundInfo = {}
                refundInfo['refund_no'] = out_request_no
                refundInfo['refund_fee'] = int(refund_amount)
                refundInfo['refund_status'] = 2  #退款失败
                refundInfo['refund_date'] = common.current_stamp()
                refundInfo['refund_errmsg'] = response.sub_msg
                refund_list.append(refundInfo)
                self.db.query(online_alipay_order_list).filter(
                    online_alipay_order_list.bid == bid,
                    online_alipay_order_list.out_trade_no == out_trade_no).update(
                    {
                       'refundList': str(refund_list)
                    })
                self.db.commit()
                # 业务失败
                info = {
                    'errCode': response.code,
                    'errMsg': response.sub_msg
                }
                result = {
                    'result': info
                }
                return self.write(json.dumps(result, ensure_ascii=False))
예제 #14
0
파일: views.py 프로젝트: laisent/dailyfresh
    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': '支付失败'})
예제 #15
0
class AlipayThread(threading.Thread):
    def __init__(self, target, thread_num=0, timeout=5.0):
        super(AlipayThread, self).__init__()
        self.target = target
        self.thread_num = thread_num
        self.stopped = False
        self.timeout = timeout
        """
        得到客户端对象。
        注意,一个alipay_client_config对象对应一个DefaultAlipayClient,定义DefaultAlipayClient对象后,alipay_client_config不得修改,如果想使用不同的配置,请定义不同的DefaultAlipayClient。
        logger参数用于打印日志,不传则不打印,建议传递。
        """
        self.client = DefaultAlipayClient(
            alipay_client_config=alipay_client_config, logger=logger)
        self.show_name_idx = 0
        self.remark_idx = 0
        self.amount_idx = 0
        self.show_names = self.target["show_name"].split("/")
        self.remarks = self.target["remark"].split("/")
        self.amounts = self.target["amount"].split("/")

    def run(self):
        logger.info("*************begin*****************\n")
        global g_idx
        global g_mobiles

        print(g_idx)

        while self.stopped == False:

            mobile = ""
            g_mutex.acquire()
            logger.info(str(g_idx) + "")
            if g_idx >= len(g_mobiles):
                g_mutex.release()
                break
            mobile = g_mobiles[g_idx]
            g_idx = g_idx + 1
            g_mutex.release()

            logger.info("**********" + mobile + "**********")

            try:
                self.once(mobile)
                pass
            except Exception as e:
                pass
        logger.info("****************end**************\n")

    def once(self, mobile):
        global g_file
        """
        系统接口示例:alipay.trade.pay
        """
        # 对照接口文档,构造请求对象
        model = AlipayFundTransToaccountTransferModel()
        model.out_biz_no = getstr(32)
        model.payee_type = "ALIPAY_LOGONID"
        model.payee_account = mobile
        #model.amount            = self.target["amount"]
        '''
        self.show_name_idx = self.show_name_idx + 1
        if self.show_name_idx >= len(self.show_names):
            self.show_name_idx = 0
        show_name = self.show_names[self.show_name_idx]
        
        self.remark_idx = self.remark_idx + 1
        if self.remark_idx >= len(self.remarks):
            self.remark_idx = 0
        remark = self.remarks[self.remark_idx]
        
        self.amount_idx = self.amount_idx + 1
        if self.amount_idx >= len(self.amounts):
            self.amount_idx = 0
        amount = self.amounts[self.amount_idx]
        model.payer_show_name    = show_name
        #model.payee_real_name   = self.target["real_name"]
        model.remark             = remark
        model.amount             = amount
        '''

        model.payer_show_name = self.show_names[random.randint(
            0, len(self.show_names))]
        model.remark = self.remarks[random.randint(0, len(self.remarks))]
        model.amount = self.amounts[random.randint(0, len(self.amounts))]

        request = AlipayFundTransToaccountTransferRequest(biz_model=model)
        # 如果有auth_token、app_auth_token等其他公共参数,放在udf_params中
        # udf_params = dict()
        # from alipay.aop.api.constant.ParamConstants import *
        # udf_params[P_APP_AUTH_TOKEN] = "xxxxxxx"
        # request.udf_params = udf_params
        # 执行请求,执行过程中如果发生异常,会抛出,请打印异常栈
        response_content = None
        try:
            response_content = self.client.execute(request)
        except Exception as e:
            #pass
            print(traceback.format_exc())
        if not response_content:
            print("failed execute\n")
        else:
            print("*******" + response_content + "**********")
            response = AlipayTradePayResponse()
            # 解析响应结果
            response.parse_response_content(response_content)
            #logger.info(response.body)
            if response.is_success(
            ) or response.sub_code == "EXCEED_LIMIT_SM_MIN_AMOUNT":
                # 如果业务成功,则通过respnse属性获取需要的值
                #print("get response trade_no:" + response.sub_msg)
                g_file.write(mobile + "\n")
                # 刷新缓冲区
                g_file.flush()
            else:
                # 如果业务失败,则从错误码中可以得知错误情况,具体错误码信息可以查看接口文档
                logger.info(response.code + "," + response.msg + "," +
                            response.sub_code + "," + response.sub_msg + "\n")

    def stop(self):
        self.stopped = True

    def isStopped(self):
        return self.stopped