示例#1
0
文件: payios.py 项目: lordsky/hall0
    def doIosCallback(cls, rpath):

        platformOrderId = TyContext.RunHttp.getRequestParam('iosOrderId', '')
        TyContext.RunMode.get_server_link(platformOrderId)

        isReturn, params = AccountCheck.normal_check(rpath, True)
        if isReturn:
            return params
        userId = params['userId']
        appId = params['appId']
        clientId = params['clientId']
        appInfo = TyContext.RunHttp.getRequestParam('appInfo', '')

        isMock = bool(TyContext.RunHttp.getRequestParam('isMock'))

        receipt = TyContext.RunHttp.getRequestParam('receipt', '')
        receiptData = {'receiptJsonStr': '{"receipt-data" : "' + receipt + '"}',
                       'platformOrder': platformOrderId, 'userId': userId}

        TyContext.ftlog.info('IOS->doIosCallback->userId', userId, 'appId', appId,
                             'clientId', clientId, 'appInfo', appInfo,
                             'platformOrderId', platformOrderId, 'receipt', receipt,
                             'isMock', isMock)

        rparam = PayHelper.getArgsDict()
        rparam['chargeType'] = 'tuyooios'
        rparam['userId'] = params['userId']
        rparam['appId'] = params['appId']
        rparam['clientId'] = params['clientId']

        isSandbox = is_sandbox_receipt(receipt)
        ret = cls.doIosCallbackVerify(receiptData, isSandbox, isMock)
        TyContext.ftlog.debug('IOS->doIosCallback->doIosCallbackVerify ret=', ret)

        if ret != 'ok' and ret != 'uuid_prohibit':
            PayHelper.callback_error(platformOrderId, ret, rparam)
            return ret
        # 如果是被封禁的uuid,不进行发货处理
        if ret == 'uuid_prohibit':
            return 'success'

        transaction_id = receiptData['original_transaction_id']
        rparam['third_orderid'] = transaction_id
        rparam['third_prodid'] = receiptData.get('product_id', 'na')
        rparam['isTestOrder'] = receiptData.get('sandbox', False)

        if cls._is_ios_transaction_delivered(transaction_id):
            PayHelper.callback_error(platformOrderId, 'error-transaction-already-delivered', rparam)
            TyContext.ftlog.info('IOS->doIosCallback error-transaction-already-delivered '
                                 'userId', userId, 'platformOrder', platformOrderId)
            return 'error-transaction-already-delivered'

        if not platformOrderId:
            ret = cls._deliver_missing_order(rparam)
            if not ret:
                return 'error-platform-order-missing'
            else:
                platformOrderId = ret
        # 根据商品Id过滤刷单的订单---------------start
        try:
            chargeKey = 'sdk.charge:' + platformOrderId
            chargeInfo = TyContext.RedisPayData.execute('HGET', chargeKey, 'charge')
            if chargeInfo == None:
                TyContext.ftlog.info('IOS->doIosCallback error-platformOrderId-not-found '
                                     'userId', userId, 'platformOrder', platformOrderId)
                return 'error-platform-order-missing'

            chargeInfo = TyContext.strutil.loads(chargeInfo, decodeutf8=True)
            if 'chargeData' in chargeInfo and 'orderIosCode' in chargeInfo['chargeData'] and chargeInfo['chargeData'][
                'orderIosCode'] != rparam['third_prodid']:
                TyContext.ftlog.info('IOS->doIosCallback error-product_id '
                                     'userId', userId, 'platformOrder', platformOrderId, 'orderIosCode',
                                     chargeInfo['chargeData']['orderIosCode'], 'receipt_product_id',
                                     rparam['third_prodid'])
                return 'error-product_id'
        except:
            pass

        from paytuyooios import TuYouPayMyIos
        product = TuYouPayMyIos.get_pay_ios_product(appId, rparam['third_prodid'], clientId, 'iosid')
        if not product:
            TyContext.ftlog.error('get_pay_ios_product products not found!'
                                  ' appId=', appId, 'iosId=', rparam['third_prodid'],
                                  'clientId=', clientId, 'checkIdKey=iosid')
            return 'error-product_id'
        # 根据商品Id过滤刷单的订单---------------end

        isOk = PayHelper.callback_ok(platformOrderId, -1, rparam)
        if isOk:
            cls._mark_ios_transaction_as_delivered(transaction_id)
            try:
                # 328 & 628 第一次购买后只能使用微信支付
                ios_control = TyContext.Configure.get_global_item_json('ios_weinxin_pay_control', {})
                if product['tyid'] in ios_control.get('weixin_products', []):
                    wxpay_count = TyContext.RedisUser.execute(userId, 'HGET', 'user:'******'wxpay_flag')
                    if not wxpay_count:
                        wxpay_count = 0
                    TyContext.RedisUser.execute(userId, 'HSET', 'user:'******'wxpay_flag',
                                                int(wxpay_count) + 1)
            except:
                TyContext.ftlog.exception()
            return 'success'
        else:
            return 'error-handle-callback'
示例#2
0
    def doGoogleIABCallback(cls, rpath):
        action = TyContext.RunHttp.getRequestParam('action', '')
        appId = TyContext.RunHttp.getRequestParam('appId')
        clientId = TyContext.RunHttp.getRequestParam('clientId')
        # google支付需要向客户端返回公钥
        publicKey = cls._get_google_public_key(appId, clientId,
                                               'google_publickeys', clientId)
        TyContext.ftlog.debug('doGoogleIABCallback->action=', action, 'appId=',
                              appId)

        result = {}
        if not action or action == '':
            result['action'] = ''
            result['state'] = 'error'
            result['info'] = 'error-action is null'
            return cls._dict2string(result)
        elif action == 'getKey':
            result['action'] = 'getKey'
            if publicKey == '':
                result['state'] = 'error'
                result['info'] = 'error-get publickey failed'
                return cls._dict2string(result)
            else:
                result['state'] = 'success'
                result['publicKey'] = publicKey
                result['info'] = 'get publickey success'
                return cls._dict2string(result)
        else:
            platformOrderId = TyContext.RunHttp.getRequestParam(
                'platformOrderId', '')

            result['platformOrderId'] = platformOrderId

            if action == 'redelivery':
                result['action'] = 'redilivery'
            elif action == 'verify':
                result['action'] = 'verify'
                isReturn, params = AccountCheck.normal_check(rpath, True)

                if isReturn:
                    result['state'] = 'error'
                    result['info'] = 'error-accountcheck failed'
                    TyContext.ftlog.error(
                        'doGoogleIABCallback->accountcheck failed:', params)
                    return cls._dict2string(result)

                if not platformOrderId or platformOrderId is '':
                    result['state'] = 'error'
                    result['info'] = 'error-null platformOrderId'
                    TyContext.ftlog.error(
                        'doGoogleIABCallback error platformOrderId is null')
                    return cls._dict2string(result)

                signData = TyContext.RunHttp.getRequestParam(
                    'purchaseData', '')
                signature = TyContext.RunHttp.getRequestParam(
                    'dataSignature', '')

                TyContext.ftlog.info(
                    'TuyouPayGoogleIAB.doGoogleIABCallback->action=', action,
                    'platformOrderId=', platformOrderId, 'appId=', appId,
                    'signData=', signData, 'signature=', signature)

                base64PublicKey = '-----BEGIN PUBLIC KEY-----' + '\n' + publicKey + '\n' + '-----END PUBLIC KEY-----'

                if False and cls.doGoogleIABCallbackVerify(
                        base64PublicKey, signData, signature) != True:
                    result['state'] = 'error'
                    result['info'] = 'error-verify failed'
                    return cls._dict2string(result)

            if cls._is_google_transaction_delivered(platformOrderId):
                result['state'] = 'success'
                result['info'] = 'transaction-already-delivered'
                TyContext.ftlog.error(
                    'doGoogleIABCallback->order is already-delivered:',
                    platformOrderId)
                return cls._dict2string(result)

            rparam = PayHelper.getArgsDict()
            rparam['chargeType'] = 'googleiab'
            isOk = PayHelper.callback_ok(platformOrderId, -1, rparam)
            if isOk:
                cls._mark_google_transaction_as_delivered(platformOrderId)
                result['state'] = 'success'
                result['info'] = 'googleiab callback success'
                return cls._dict2string(result)
            else:
                result['state'] = 'error'
                result['info'] = 'error-delivery'
                TyContext.ftlog.error('doGoogleIABCallback error delivery')
                return cls._dict2string(result)