const crypto = require('crypto')
const fetch = require('node-fetch')
const { query } = require('../config/database')
// 微信支付配置
const APPID = process.env.WECHAT_APPID
const MCH_ID = process.env.WECHAT_MCH_ID
const API_KEY = process.env.WECHAT_API_KEY
const NOTIFY_URL = process.env.WECHAT_NOTIFY_URL
const CERT_PATH = process.env.WECHAT_CERT_PATH
const KEY_PATH = process.env.WECHAT_KEY_PATH
// 微信支付API地址
const UNIFIED_ORDER_URL = 'https://api.mch.weixin.qq.com/pay/unifiedorder'
const REFUND_URL = 'https://api.mch.weixin.qq.com/secapi/pay/refund'
const ORDER_QUERY_URL = 'https://api.mch.weixin.qq.com/pay/orderquery'
/**
* 生成随机字符串
* @param {number} [length=32] - 字符串长度
* @returns {string} 随机字符串
*/
function generateNonceStr(length = 32) {
return crypto.randomBytes(length).toString('hex').slice(0, length)
}
/**
* 生成微信支付签名
* @param {Object} params - 参与签名的参数对象
* @returns {string} 签名字符串
*/
function generateSign(params) {
// 按字典序排序参数
const sortedKeys = Object.keys(params).sort()
// 拼接键值对(跳过空值和sign字段)
const stringA = sortedKeys
.filter(key => params[key] !== '' && params[key] !== undefined && params[key] !== null && key !== 'sign')
.map(key => `${key}=${params[key]}`)
.join('&')
// 拼接API密钥
const stringSignTemp = `${stringA}&key=${API_KEY}`
// MD5签名并转大写
return crypto.createHash('md5').update(stringSignTemp, 'utf8').digest('hex').toUpperCase()
}
/**
* 对象转XML
* @param {Object} obj - 需要转换的对象
* @returns {string} XML字符串
*/
function buildXML(obj) {
let xml = ''
for (const key of Object.keys(obj)) {
const val = obj[key]
if (typeof val === 'number') {
xml += `<${key}>${val}${key}>`
} else {
xml += `<${key}>${key}>`
}
}
xml += ''
return xml
}
/**
* XML转对象
* @param {string} xml - XML字符串
* @returns {Promise