我正在使用Firebase上的node设置功能来测试Swish集成。 Swish是用于在钱包(银行帐户)之间进行转账的移动应用程序。目前,Im正在测试其商户Swish Simulator测试环境,可供商户测试其与Swish Commerce API的集成。

他们的开发者网站上有可用的手册:https://developer.getswish.se/merchants/

可以通过unix终端(以测试其端点之一)完成的示例请求对我而言非常有效(获得201响应):

curl -s -S -i --cert ./Swish_Merchant_TestCertificate_1231181189.p12:swish --cert-type p12 --cacert ./Swish_TLS_RootCA.pem --tlsv1.1 --header "Content-Type: application/json" https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests --data '{ "payeePaymentReference" : "0123456789", "callbackUrl" : "https://myfakehost.se/swishcallback.cfm", "payerAlias" : "46766268608", "payeeAlias" : "1231181189", "amount" : "100", "currency" : "SEK", "message" : "Kingston USB Flash Drive 8 GB" }'


问题是我不确定如何使用firebase发出包含证书的类似请求。

const functions = require('firebase-functions');
const express = require('express');
const app = express();
let fs = require('fs');
let request = require('request');

app.post('/request-payment', async (req, res) => {
    const url = 'https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests';

    let data = {
        payeePaymentReference : '0123456789',
        message: 'Kingston USB Flash Drive 8 GB',
        callbackUrl: 'https://myfakehost.se/swishcallback.cfm',
        amount: '100',
        currency: 'SEK',
        payeeAlias: '1231181189',
        payerAlias: '46766268608'
    };

    let options = {
        url: url,
        headers: {
            "content-type": "application/json",
        },
        agentOptions: {
            pfx: fs.readFileSync('certificates/Swish_Merchant_TestCertificate_1231181189.p12'),
            passphrase: 'swish',
        },
        ca: fs.readFileSync('certificates/Swish_TLS_RootCA.pem'),
        body: data,
        json: true
    };

    return await request.post(options, async (error, response, body) => {
        if (!error && response.statusCode === 201) {
            return res.status(200).json({
                url: response.body.url,
            })
        } else {
            console.log('error', error);
            return res.status(404).json({
                message: 'Error: ' + error,
            })
        }
    });
});

exports.swish = functions.https.onRequest(app);


当我向上方的端点发出请求时,我一直试图传递.p12和.pem文件,并即时发送与上述完全相同的数据。我仍然收到此错误:


  错误{错误:通过TLSWrap.onread(net.js:622:25)读取ECONNRESET errno:'ECONNRESET',代码:'ECONNRESET',系统调用:'read'}


谁能看到我做错了什么?

我还尝试为.pem文件设置“二进制”选项。然后,我确实从节点崩溃,说标题太长了。

最佳答案

这是我填充request使其生效的选项的方式:

const options = {
            url: "https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests",
            json: true,
            cert: fs.readFileSync("Swish_Merchant_TestCertificate_1231181189.pem", "ascii"),
            passphrase: "swish",
            body: data,
            ca: fs.readFileSync("Swish_TLS_RootCA.pem", "ascii"),
            key: fs.readFileSync("Swish_Merchant_TestCertificate_1231181189.key", "ascii")
        };


注意重要的区别:


“ ascii”编码读取文件
使用“ pem”证书而不是“ p12”。

09-12 03:35