示例#1
0
文件: paysll.py 项目: lordsky/hall0
    def _notify_game_server(cls, params):
        clientId = TyContext.UserSession.get_session_clientid(params['userId'])
        control = TyContext.ServerControl.findServerControl(
            params['appId'], clientId)
        if not control:
            TyContext.ftlog.error(
                '_notify_game_server can not find'
                ' server control, params', params)
            return
        notifyUrl = str(control['http'] + '/v2/game/charge/qipainotify?' +
                        urlencode(params))
        TyContext.ftlog.debug('_notify_game_server'
                              ' arguments', params, 'notifyUrl', notifyUrl)
        # 通知游戏服务端进行vip等级的更新
        rmbs = 0.0
        diamonds = 0
        if 'delta_chip' in params:
            rmbs += params['delta_chip'] / 10000.0
            diamonds += int(params['delta_chip'] / 1000)
        if 'delta_diamond' in params:
            rmbs += params['delta_diamond'] / 10.0
            diamonds += int(params['delta_diamond'])
        PayHelper.notify_game_server_on_diamond_change({
            'appId':
            params['appId'],
            'clientId':
            clientId,
            'buttonId':
            '360KP_PROD',
            'userId':
            params['userId'],
            'diamonds':
            diamonds,
            'rmbs':
            rmbs
        })

        from twisted.web import client
        d = client.getPage(notifyUrl, method='GET')

        def ok_callback(response):
            TyContext.ftlog.info('_notify_game_server response', response)

        def err_callback(error):
            TyContext.ftlog.error('_notify_game_server error', error)

        d.addCallbacks(ok_callback, err_callback)
示例#2
0
    def callback(cls, platformOrderId, total_fee, state, rparam, errorInfo):
        TyContext.ftlog.info('****** callback platformOrderId=',
                             platformOrderId, 'total_fee=', total_fee,
                             'state=', state, 'errorInfo=', errorInfo,
                             'rparam=', rparam)

        chargeKey = 'sdk.charge:' + platformOrderId
        oldState, chargeInfo, consumeInfo = TyContext.RedisPayData.execute(
            'HMGET', chargeKey, 'state', 'charge', 'consume')
        if oldState == None or chargeInfo == None:
            TyContext.ftlog.error('platformOrderId not found !',
                                  platformOrderId)
            return True

        chargeInfo = TyContext.strutil.loads(chargeInfo, decodeutf8=True)
        paytype = rparam.get('chargeType', chargeInfo.get('chargeType', 'na'))
        if state == PayConst.CHARGE_STATE_ERROR_CALLBACK:
            if oldState < PayConst.CHARGE_STATE_ERROR_REQUEST:
                # 第三方通知充值失败
                if errorInfo == None or len(errorInfo) == 0:
                    errorInfo = '充值失败,请关闭页面重试'
                cls.__change_callback_state__(chargeKey, state, errorInfo,
                                              None)
            else:
                TyContext.ftlog.info('callback platformOrderId=',
                                     platformOrderId,
                                     'old state error, oldState=', oldState,
                                     'newState=', state)

            Order.log(
                platformOrderId,
                Order.CALLBACK_FAIL,
                chargeInfo['uid'],
                chargeInfo['appId'],
                chargeInfo['clientId'],
                info=errorInfo,
                prodid=chargeInfo.get('prodId', 'na'),
                diamondid=chargeInfo['diamondId'],
                charge_price=chargeInfo.get('chargeTotal', 'na'),
                succ_price=total_fee,
                paytype=paytype,
                sub_paytype=rparam.get('sub_paytype', 'na'),
                third_prodid=rparam.get('third_prodid', 'na'),
                third_orderid=rparam.get('third_orderid', 'na'),
                third_provid=rparam.get('third_provid', 'na'),
                third_userid=rparam.get('third_userid', 'na'),
                pay_appid=rparam.get('pay_appid', 'na'),
            )
            return True

        if state == PayConst.CHARGE_STATE_CALLBACK_OK:
            isDone = True
            if oldState < PayConst.CHARGE_STATE_CALLBACK_OK:
                if oldState < PayConst.CHARGE_STATE_CLIENT_PAY_DONE:
                    Order.log(platformOrderId,
                              Order.CLIENT_FINISHED,
                              chargeInfo['uid'],
                              chargeInfo['appId'],
                              chargeInfo['clientId'],
                              paytype=paytype,
                              prodid=chargeInfo.get('prodId', 'na'),
                              diamondid=chargeInfo['diamondId'],
                              charge_price=chargeInfo.get('chargeTotal', 'na'),
                              succ_price=total_fee)
                isDone = False
            if oldState >= PayConst.CHARGE_STATE_ERROR_REQUEST:
                isDone = False
            if isDone:
                # XXX if external orderid is new, consider re-delivery the order?!
                Order.log(
                    platformOrderId,
                    Order.INTERNAL_ERR,
                    chargeInfo['uid'],
                    chargeInfo['appId'],
                    chargeInfo['clientId'],
                    paytype=paytype,
                    prodid=chargeInfo.get('prodId', 'na'),
                    diamondid=chargeInfo['diamondId'],
                    charge_price=chargeInfo['chargeTotal'],
                    succ_price=total_fee,
                    sub_paytype=rparam.get('sub_paytype', 'na'),
                    third_prodid=rparam.get('third_prodid', 'na'),
                    third_orderid=rparam.get('third_orderid', 'na'),
                    third_provid=rparam.get('third_provid', 'na'),
                    third_userid=rparam.get('third_userid', 'na'),
                    pay_appid=rparam.get('pay_appid', 'na'),
                    info='order state charged',
                )
                TyContext.ftlog.info('callback platformOrderId=',
                                     platformOrderId,
                                     'old state is done, oldState=', oldState,
                                     'newState=', state)
                return True

            # save charge data
            UniversalUser().increase_user_charge_data(
                chargeInfo['uid'], chargeInfo['appId'], chargeInfo['clientId'],
                chargeInfo.get('chargeTotal', 1),
                chargeInfo.get('chargeType', 'na'))

            chargecategories_config = TyContext.Configure.get_global_item_json(
                'charge_categories_config', {})
            # 单机商城商品TY9999R00020DJ的订单,没有chargeType
            if 'chargeType' in chargeInfo:
                for key in chargecategories_config.keys():
                    if chargeInfo['chargeType'] in key:
                        lastChargeCategory = chargecategories_config[key]
                        TyContext.RedisUser.execute(
                            chargeInfo['uid'], 'HSET',
                            'user:'******'uid']),
                            'lastChargeCategory', lastChargeCategory)
                        break

            try:
                chargeInfo['isTestOrder'] = rparam['isTestOrder']
            except:
                pass
            try:
                chargeInfo['chargeType'] = rparam['chargeType']
            except:
                pass

            if consumeInfo:
                consumeInfo = json.loads(consumeInfo)

            Order.log(
                platformOrderId,
                Order.CALLBACK_OK,
                chargeInfo['uid'],
                chargeInfo['appId'],
                chargeInfo['clientId'],
                paytype=rparam.get('chargeType', 'na'),
                prodid=chargeInfo.get('prodId', 'na'),
                diamondid=chargeInfo['diamondId'],
                prod_price=consumeInfo['consumeCoin'] if consumeInfo else 'na',
                charge_price=chargeInfo['chargeTotal'],
                succ_price=total_fee,
                sub_paytype=rparam.get('sub_paytype', 'na'),
                third_prodid=rparam.get('third_prodid', 'na'),
                third_provid=rparam.get('third_provid', 'na'),
                third_userid=rparam.get('third_userid', 'na'),
                third_orderid=rparam.get('third_orderid', 'na'),
                pay_appid=rparam.get('pay_appid', 'na'),
                mobile=chargeInfo.get('vouchMobile', 'na'),
            )
            try:
                chargeInfo['paytype_w_appid'] = '_'.join(
                    [chargeInfo['chargeType'], rparam['pay_appid']])
            except:
                pass
            # 记录支付通道的子渠道
            try:
                chargeInfo['sub_paytype'] = rparam.get('sub_paytype', '')
            except:
                pass
            PayBaseV4.upgrade_user_paylimit_state(chargeInfo['uid'],
                                                  chargeInfo['chargeType'],
                                                  chargeInfo['chargeTotal'])
            cls.__change_user_coin__(platformOrderId, total_fee, chargeInfo,
                                     consumeInfo)

            if not consumeInfo:
                cls.__change_callback_state__(chargeKey,
                                              PayConst.CHARGE_STATE_DONE, '',
                                              None)
                Order.log(
                    platformOrderId,
                    Order.DELIVER_OK,
                    chargeInfo['uid'],
                    chargeInfo['appId'],
                    chargeInfo['clientId'],
                    paytype=paytype,
                    diamondid=chargeInfo['diamondId'],
                    charge_price=chargeInfo['chargeTotal'],
                    succ_price=total_fee,
                    sub_paytype=rparam.get('sub_paytype', 'na'),
                    third_prodid=rparam.get('third_prodid', 'na'),
                    third_orderid=rparam.get('third_orderid', 'na'),
                    pay_appid=rparam.get('pay_appid', 'na'),
                )
                PayHelper.notify_game_server_on_diamond_change({
                    'appId':
                    chargeInfo['appId'],
                    'clientId':
                    chargeInfo['clientId'],
                    'userId':
                    chargeInfo['uid'],
                    'buttonId':
                    chargeInfo['diamondId'],
                    'diamonds':
                    chargeInfo['chargedDiamonds'],
                    'rmbs':
                    chargeInfo['chargedRmbs']
                })
                return True

            cls.__change_callback_state__(chargeKey,
                                          PayConst.CHARGE_STATE_CONSUME, '',
                                          None)
            appId = consumeInfo['appId']
            appInfo = consumeInfo['appInfo']
            clientId = consumeInfo['clientId']
            userId = consumeInfo['userId']
            consumeCoin = consumeInfo['consumeCoin']
            prodId = consumeInfo['prodId']
            prodPrice = consumeInfo['prodPrice']
            prodCount = consumeInfo['prodCount']
            prodName = consumeInfo['prodName']
            prodOrderId = consumeInfo['prodOrderId']

            mo = TyContext.Cls_MsgPack()
            mo.setCmd('consume')
            # modified by zhangshibo at 2015-09-09
            if 'isYouyifuMonthVip' in rparam:
                TyContext.ftlog.debug(
                    'callback-> Has isYouyifuMonthVip info in rparam.')
                mo.setParam('is_monthly', '1')
            # end modify
            TuyouPayConsume.__consume_user_coin__(appId, appInfo, clientId,
                                                  userId, consumeCoin, prodId,
                                                  prodPrice, prodCount,
                                                  prodName, prodOrderId, mo,
                                                  chargeInfo)
            if mo.isError():
                cls.__change_callback_state__(
                    chargeKey, PayConst.CHARGE_STATE_ERROR_CONSUME, '', mo)
            else:
                cls.__change_callback_state__(
                    chargeKey, PayConst.CHARGE_STATE_DONE_CONSUME, '', mo)
            PayHelper.notify_game_server_on_diamond_change({
                'appId':
                appId,
                'clientId':
                clientId,
                'userId':
                userId,
                'buttonId':
                prodId,
                'diamonds':
                chargeInfo['chargedDiamonds'],
                'rmbs':
                chargeInfo['chargedRmbs']
            })
            return True

        TyContext.ftlog.error('SHOULDNOT REACH HERE: callback invalid state',
                              state, 'platformOrderId', platformOrderId)
        return True