我正在使用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”。