Exemple #1
0
def sync_transfer_to_deposit():
    c = Client()
    resp = c.get_transfer_list(status='SUCCESS',
                               limit=10,
                               type='deposit',
                               order='desc')
    logging.info('get transfer %s', resp)
    for transfer in resp['items']:
        user = c.get_user(transfer['user.id'], cache=True)
        deposit_id = transfer['args'].get('deposit_id')
        amount = decimal.Decimal(transfer['amount'])

        if not deposit_id:
            continue

        with transaction.atomic():
            try:
                deposit = Deposit.objects.select_for_update().get(
                    pk=deposit_id, user=user)
            except Deposit.DoesNotExist:
                continue

            if deposit.status != 'PENDING':
                continue

            fund = Fund.objects.select_for_update().filter(user=user).first()
            balance = fund.balance + amount
            fund.balance = balance
            fund.save()
            deposit.amount = amount
            deposit.status = 'SUCCESS'
            deposit.save()

            logging.info('asset fund %s incr balance %s, new=%s', fund.id,
                         amount, balance)
    def process_event(self):
        handler = self.get_event_handler(self.event.subject)
        if not handler:
            return error_json('unknown event %s' % self.event.subject)

        self.client = Client()
        with transaction.atomic():
            resp = handler()
            self.event.status = 'PROCESSED'
            self.event.save()

        return resp
Exemple #3
0
    def save(self):
        amount = self.cleaned_data['amount']

        with transaction.atomic():

            withdraw = Withdraw.objects.create(user=self.user, amount=amount)

            fund = Fund.objects.select_for_update().filter(user=self.user).first()
            balance = fund.balance - amount
            fund.balance = balance
            fund.save()
            logging.info('fund %s decr balance %s, remain=%s', fund.id, amount, balance)

            c = Client()
            c.send_withdraw(withdraw)

            return withdraw
Exemple #4
0
def bot_login(request, bot_token):

    bot = Bot()
    expire = 60 * 60 * 24
    platform_user_id = bot.valid_token(bot_token, expire=expire)
    if not platform_user_id:
        logging.warn("Invalid  bot_token {} return 401".format(bot_token))
        return error_json('Invalid bot token', status=401)

    c = Client()
    user = c.get_user(platform_user_id, cache=True)

    request.session['expire'] = int(time.time()) + expire
    request.session['site_userid'] = user.id
    site_userid = user.id

    return redirect(reverse('account:index'))
Exemple #5
0
def bot_detail(request):
    vendor_name = settings.APP_NAME
    user = request.bx_user
    target_id = user.target_id

    c = Client()
    jssdk_ticket = c.get_jsapi_ticket()['ticket']
    nonce = get_random_str()
    timestamp = get_timestamp()
    url = settings.JS_SDK_CALLBACK
    sign = create_signature(nonce=nonce, timestamp=timestamp,
                            url=url, jssdk_ticket=jssdk_ticket)


    # pay
    deposit_req = Deposit.objects.create(user=user)
    resp = c.get_vendor_address_list(currency='BTC')
    address = resp.get('items', [])[0]

    # pay demo1
    amount = 0.01
    note = 'test'
    category = 'pay for test'
    args={'request_uuid': deposit_req.uuid}


    #pay demo2
    param2 = {
        'target_id': target_id,
        'conv_type': 'private',
        'amount': amount,
        'category': category,
        'args': args,
    }
    protocol1 = format_transfer_protocol(None, 'BTC', **param2)

    #pay demo3
    param3 = {
        'amount': amount,
        'category': category,
        'args': args,
    }
    protocol2 = format_transfer_protocol(address, 'BTC', **param3)

    return render(request, 'detail.html', locals())
class CallbackHandler(object):
    def __init__(self, event):
        self.event = event

    def process_event(self):
        handler = self.get_event_handler(self.event.subject)
        if not handler:
            return error_json('unknown event %s' % self.event.subject)

        self.client = Client()
        with transaction.atomic():
            resp = handler()
            self.event.status = 'PROCESSED'
            self.event.save()

        return resp

    def get_event_handler(self, subject):
        event_handlers = {
            'vendor_qr_login': self.process_qr_login,
            'user2vendor.created': self.process_platform_deposit,
        }
        return event_handlers.get(subject)

    def process_qr_login(self):
        content = json.loads(self.event.content)
        user_id = content.get('user_id')
        if not user_id:
            return error_json('missing user id in platform event')

        qr_uuid = content.get('qr_uuid')
        if not qr_uuid:
            return error_json('missing qr uuid in platform event')

        try:
            qr_session = QRSession.objects.get(uuid=qr_uuid)
        except QRSession.DoesNotExist:
            return error_json('qr code not found')

        if qr_session.user:
            return error_json('qr code used')

        if qr_session.is_expired():
            return error_json('qr code expired')

        else:
            user, user_info = self.client.fetch_user(user_id)
            qr_session.user = user
            qr_session.save()

            return ok_json(result='success')

    def process_platform_deposit(self):
        sync_transfer_to_deposit()
        return ok_json(result='suucess')
Exemple #7
0
def scheme_detail(request):
    vendor_name = settings.APP_NAME
    user = request.bx_user
    user_target_id = user.target_id
    bot_target_id = settings.BOT_TARGET_ID  # your bot target id

    currency = "BTC"
    category = 'pay for test'

    # pay demo1
    amount = 0.001
    order_id = uuid.uuid4().hex  # 订单号,用户可自定义,最大长度是64
    transfer_type = 'spend'

    param1 = {
        'target_id': user_target_id,
        'conv_type': 'private',
        'amount': 1,
        'category': category,
    }
    protocol1 = format_transfer_protocol(None, 'AE', **param1)

    #pay demo2
    c = Client()
    resp = c.get_vendor_address_list(currency='ETH')
    eth_address = resp.get('items', [])[0]
    param2 = {
        'amount': 0.01,
        'category': category,
        'order_id': order_id,
        'transfer_type': transfer_type,
        'x-name': 'test',
    }
    protocol2 = format_transfer_protocol(eth_address, 'ETH', **param2)

    protocol3 = format_conversation_protocol(user_target_id, 'private')
    protocol4 = format_conversation_protocol(bot_target_id, 'bot', 'test',
                                             'action_demo')

    return render(request, 'scheme_detail.html', locals())
Exemple #8
0
def jssdk_detail(request):
    vendor_name = settings.APP_NAME
    user = request.bx_user
    user_target_id = user.target_id

    bot_target_id = settings.BOT_TARGET_ID  # your bot target id

    c = Client()
    jssdk_ticket = c.get_jsapi_ticket()['ticket']
    nonce = get_random_str()
    timestamp = get_timestamp()
    url = settings.JS_SDK_CALLBACK
    sign = create_signature(nonce=nonce,
                            timestamp=timestamp,
                            url=url,
                            jssdk_ticket=jssdk_ticket)

    currency = "BTC"

    #转发文章
    bot_target_id = settings.BOT_TARGET_ID  # your bot target id
    share_url = 'https://bixin.im'
    share_title = '转发示例'
    share_desc = '转发示例'
    share_image_url = 'https://bixin.im/static/images/[email protected]'

    # pay
    deposit_req = Deposit.objects.create(user=user)
    resp = c.get_vendor_address_list(currency='BTC')
    btc_address = resp.get('items', [])[0]

    category = 'pay for test'
    amount = 0.001

    #pay demo2
    order_id = uuid.uuid4().hex  # 订单号,用户可自定义,最大长度是64
    transfer_type = 'spend'

    return render(request, 'jssdk_detail.html', locals())
Exemple #9
0
def request_deposit(request):
    user = request.bx_user
    currency = 'BTC'

    client = Client()
    resp = client.get_vendor_address_list(currency=currency)
    vendor_addresses = resp.get('items', [])

    if len(vendor_addresses) == 0:
        return error_json(error='vendor does not have address for %s' %
                          currency)

    vendor_address = vendor_addresses[0]

    deposit = Deposit.objects.create(user=user)

    transfer_protocal = format_transfer_protocol(
        target_addr=vendor_address,
        currency=currency,
        category='deposit',
        args={'deposit_id': deposit.id})

    return ok_json(result=transfer_protocal)