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
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
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'))
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')
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())
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())
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)