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