簡體   English   中英

為什么我的雲 function 返回帶有代碼 INTERNAL 和詳細信息 null 的異常,帶有未處理的錯誤 TypeError: is not a function

[英]Why does my cloud function return an exception with code INTERNAL and details null with Unhandled error TypeError: is not a function

我第一次嘗試在我的 android 應用程序中使用 Firebase Cloud Functions。 我得到的 output 是一個異常,代碼為“INTERNAl”,詳細信息為“null”。

下面是我的雲function文件index.js:

"use strict";

const functions = require('firebase-functions');

// Create and Deploy Your First Cloud Functions
// https://firebase.google.com/docs/functions/write-firebase-functions

var crypto = require('crypto');

class PaytmChecksum {

    static encrypt(input, key) {
        var cipher = crypto.createCipheriv('AES-128-CBC', key, PaytmChecksum.iv);
        var encrypted = cipher.update(input, 'binary', 'base64');
        encrypted += cipher.final('base64');
        return encrypted;
    }
    static decrypt(encrypted, key) {
        var decipher = crypto.createDecipheriv('AES-128-CBC', key, PaytmChecksum.iv);
        var decrypted = decipher.update(encrypted, 'base64', 'binary');
        try {
            decrypted += decipher.final('binary');
        }
        catch (e) {
            console.log(e);
            throw new functions.https.HttpsError('decryption-failed', e);
        }
        return decrypted;
    }
    static generateSignature(params, key) {
        if (typeof params !== "object" && typeof params !== "string") {
            var error = "string or object expected, " + (typeof params) + " given.";
            //throw new functions.https.HttpsError('generate-signature-failed', error);
            return Promise.reject(error);
        }
        if (typeof params !== "string"){
            params = PaytmChecksum.getStringByParams(params);
        }
        return PaytmChecksum.generateSignatureByString(params, key);
    }


    static verifySignature(params, key, checksum) {
        if (typeof params !== "object" && typeof params !== "string") {
            var error = "string or object expected, " + (typeof params) + " given.";
            //throw new functions.https.HttpsError('verify-signature-failed', error);
            return Promise.reject(error);
        }
        if(params.hasOwnProperty("CHECKSUMHASH")){
            delete params.CHECKSUMHASH
        }
        if (typeof params !== "string"){
            params = PaytmChecksum.getStringByParams(params);
        }
        return PaytmChecksum.verifySignatureByString(params, key, checksum);
    }

    static async generateSignatureByString(params, key) {
        var salt = await PaytmChecksum.generateRandomString(4);
        return PaytmChecksum.calculateChecksum(params, key, salt);
    }

    static verifySignatureByString(params, key, checksum) {
        var paytm_hash = PaytmChecksum.decrypt(checksum, key);
        var salt = paytm_hash.substr(paytm_hash.length - 4);
        return (paytm_hash === PaytmChecksum.calculateHash(params, salt));
    }

    static generateRandomString(length) {
        return new Promise((resolve, reject) => {
            crypto.randomBytes((length * 3.0) / 4.0, (err, buf) => {
                if (!err) {
                    var salt = buf.toString("base64");
                    resolve(salt);
                }
                else {
                    console.log("error occurred in generateRandomString: " + err);
                    //throw new functions.https.HttpsError('generate-random-string-error', err);
                    reject(err);
                }
            });
        });
    }

    static getStringByParams(params) {
        var data = {};
        Object.keys(params).sort().forEach((key,value) => {
            data[key] = (params[key] !== null && params[key].toLowerCase() !== "null") ? params[key] : "";
        });
        return Object.values(data).join('|');
    }

    static calculateHash(params, salt) {
        var finalString = params + "|" + salt;
        return crypto.createHash('sha256').update(finalString).digest('hex') + salt;
    }
    static calculateChecksum(params, key, salt) {
        var hashString = PaytmChecksum.calculateHash(params, salt);
        return PaytmChecksum.encrypt(hashString,key);
    }
}
PaytmChecksum.iv = '@@@@&&&&####$$$$';

exports.generateSignature = functions.https.onCall((data, context) => {
    // Checking that the user is authenticated.
    if (!context.auth) {
        // Throwing an HttpsError so that the client gets the error details.
        throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
            'while authenticated.');
    }
    let paymentChecksum = new PaytmChecksum();
    let result = paymentChecksum.generateSignature(data.params, data.key);
    return result;
});

這是我調用 function 並處理它的響應的活動:

    private void getChecksum(String orderId, String mId) {

        Map<String, String> params = new HashMap<>();
        params.put("MID", mId);
        params.put("ORDERID", orderId);

        String key = "000000000000000000";

        Task<String> taskData = generateSignature(params, key);
        taskData.addOnSuccessListener(this, new OnSuccessListener<String>() {
            @Override
            public void onSuccess(String s) {
                Log.d(TAG, "onSuccess: paytmChecksum" + s);
            }
        }).addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                FirebaseFunctionsException ffe = (FirebaseFunctionsException) e;
                FirebaseFunctionsException.Code code = ffe.getCode();
                Object details = ffe.getDetails();
                Toast.makeText(getApplicationContext(), code + " " + details, Toast.LENGTH_LONG).show();
            }
        });
    }

    private Task<String> generateSignature(Map<String, String> params, String merchantKey) {

        Map<String, Object> data = new HashMap<>();
        data.put("params", params);
        data.put("key", merchantKey);

        return mFunctions.getHttpsCallable("generateSignature").call(data).continueWith(
                task -> (String) task.getResult().getData()
        );
    }
}

當我運行此代碼時,我看到一個顯示“INTERNAL null”的吐司。 此外,在 Cloud Functions 控制台日志中,這是錯誤:

generateSignature
Unhandled error TypeError: paymentChecksum.generateSignature is not a function
at exports.generateSignature.functions.https.onCall (/srv/index.js:112:34)
at func (/srv/node_modules/firebase-functions/lib/providers/https.js:272:32)
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:229:7)

為什么我會收到此錯誤? 有人可以幫忙嗎? 我無法理解為什么它說它不是 function。 我在網上查了很多樣品。 請指導我如何編寫正確的可調用雲函數。 提前致謝: :)

您在函數日志中收到錯誤消息,因為您嘗試調用 static function generateSignature作為 object 上的方法,這是無效的。

您的代碼組織有些奇怪。 PaytmChecksum僅包含 static 方法,這意味着像現在這樣嘗試創建它的實例沒有真正的價值。 如果您只想在某些 class 上調用 static 方法,請完全跳過new方法,直接調用PaytmChecksum.generateSignature()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM