提交
This commit is contained in:
@@ -6,18 +6,66 @@ const fs = require('fs');
|
||||
|
||||
class AlipayService {
|
||||
constructor() {
|
||||
// 读取密钥文件
|
||||
const privateKeyPath = path.join(__dirname, '../certs/alipay-private-key.pem');
|
||||
const publicKeyPath = path.join(__dirname, '../certs/alipay-public-key.pem');
|
||||
this.privateKey = null;
|
||||
this.alipayPublicKey = null;
|
||||
this.alipaySdk = null;
|
||||
this.isInitialized = false;
|
||||
|
||||
const privateKey = fs.readFileSync(privateKeyPath, 'utf8');
|
||||
const alipayPublicKey = fs.readFileSync(publicKeyPath, 'utf8');
|
||||
this.initializeAlipay();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化支付宝服务
|
||||
*/
|
||||
initializeAlipay() {
|
||||
try {
|
||||
// 读取密钥文件
|
||||
const privateKeyPath = this.resolveCertPath('../certs/alipay-private-key.pem');
|
||||
const publicKeyPath = this.resolveCertPath('../certs/alipay-public-key.pem');
|
||||
|
||||
console.log('支付宝私钥路径:', privateKeyPath);
|
||||
console.log('支付宝公钥路径:', publicKeyPath);
|
||||
|
||||
// 验证文件有效性
|
||||
if (!this.isValidFile(privateKeyPath)) {
|
||||
throw new Error(`支付宝私钥文件无效或不存在: ${privateKeyPath}`);
|
||||
}
|
||||
|
||||
if (!this.isValidFile(publicKeyPath)) {
|
||||
throw new Error(`支付宝公钥文件无效或不存在: ${publicKeyPath}`);
|
||||
}
|
||||
|
||||
console.log('尝试加载支付宝私钥文件:', privateKeyPath);
|
||||
this.privateKey = fs.readFileSync(privateKeyPath, 'utf8');
|
||||
console.log('支付宝私钥加载成功');
|
||||
|
||||
console.log('尝试加载支付宝公钥文件:', publicKeyPath);
|
||||
this.alipayPublicKey = fs.readFileSync(publicKeyPath, 'utf8');
|
||||
console.log('支付宝公钥加载成功');
|
||||
|
||||
this.initializeSDK();
|
||||
|
||||
} catch (error) {
|
||||
console.error('支付宝服务初始化失败:', error.message);
|
||||
console.error('支付宝功能将不可用');
|
||||
// 不抛出错误,允许服务继续运行
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化支付宝SDK
|
||||
*/
|
||||
initializeSDK() {
|
||||
if (!this.privateKey || !this.alipayPublicKey) {
|
||||
console.warn('支付宝密钥未加载,跳过SDK初始化');
|
||||
return;
|
||||
}
|
||||
|
||||
// 支付宝配置
|
||||
this.config = {
|
||||
appId: process.env.ALIPAY_APP_ID || '2021001161683774', // 替换为实际的应用ID
|
||||
privateKey: privateKey, // 从文件读取的应用私钥
|
||||
alipayPublicKey: alipayPublicKey, // 从文件读取的支付宝公钥
|
||||
privateKey: this.privateKey, // 从文件读取的应用私钥
|
||||
alipayPublicKey: this.alipayPublicKey, // 从文件读取的支付宝公钥
|
||||
gateway: 'https://openapi.alipay.com/gateway.do', // 支付宝网关地址
|
||||
signType: 'RSA2',
|
||||
charset: 'utf-8',
|
||||
@@ -34,6 +82,40 @@ class AlipayService {
|
||||
signType: this.config.signType,
|
||||
timeout: this.config.timeout
|
||||
});
|
||||
|
||||
this.isInitialized = true;
|
||||
console.log('支付宝SDK初始化成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析证书文件路径
|
||||
* @param {string} relativePath - 相对路径
|
||||
* @returns {string} 绝对路径
|
||||
*/
|
||||
resolveCertPath(relativePath) {
|
||||
return path.resolve(__dirname, relativePath);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证文件是否有效
|
||||
* @param {string} filePath - 文件路径
|
||||
* @returns {boolean} 是否为有效文件
|
||||
*/
|
||||
isValidFile(filePath) {
|
||||
try {
|
||||
const stats = fs.statSync(filePath);
|
||||
return stats.isFile();
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查支付宝服务是否已初始化
|
||||
* @returns {boolean} 是否已初始化
|
||||
*/
|
||||
isServiceAvailable() {
|
||||
return this.isInitialized && this.alipaySdk !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -46,6 +128,11 @@ class AlipayService {
|
||||
* @returns {Promise<Object>} 支付结果
|
||||
*/
|
||||
async createRegistrationPayOrder({ userId, username, phone, clientIp }) {
|
||||
// 检查服务是否可用
|
||||
if (!this.isServiceAvailable()) {
|
||||
throw new Error('支付宝服务未初始化或不可用');
|
||||
}
|
||||
|
||||
try {
|
||||
const db = getDB();
|
||||
|
||||
@@ -111,6 +198,11 @@ class AlipayService {
|
||||
* @returns {Promise<Object>} 查询结果
|
||||
*/
|
||||
async queryPaymentStatus(outTradeNo) {
|
||||
// 检查服务是否可用
|
||||
if (!this.isServiceAvailable()) {
|
||||
throw new Error('支付宝服务未初始化或不可用');
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await this.alipaySdk.exec('alipay.trade.query', {
|
||||
bizContent: {
|
||||
@@ -202,6 +294,12 @@ class AlipayService {
|
||||
* @returns {boolean} 验证结果
|
||||
*/
|
||||
verifyNotifySign(params) {
|
||||
// 检查服务是否可用
|
||||
if (!this.isServiceAvailable()) {
|
||||
console.error('支付宝服务未初始化,无法验证签名');
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
return this.alipaySdk.checkNotifySign(params);
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user