diff --git a/packages/core/basic/src/utils/util.hash.ts b/packages/core/basic/src/utils/util.hash.ts index 3b3452bea..7816a8ab8 100644 --- a/packages/core/basic/src/utils/util.hash.ts +++ b/packages/core/basic/src/utils/util.hash.ts @@ -11,6 +11,10 @@ function hmacSha256(data: string, digest: BinaryToTextEncoding = "base64") { return crypto.createHmac("sha256", data).update(Buffer.alloc(0)).digest(digest); } +function hmacSha256WithKey(key: string, data: string, digest: BinaryToTextEncoding = "base64") { + return crypto.createHmac("sha256", key).update(data).digest(digest); +} + function base64(data: string) { return Buffer.from(data).toString("base64"); } @@ -39,4 +43,5 @@ export const hashUtils = { toHex, hexToStr, hexToNumber, + hmacSha256WithKey, }; diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index 7b9bd4f19..b3d7b0a56 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -130,7 +130,9 @@ "@google-cloud/publicca": "^1.3.0", "jsrsasign": "^11.1.0", "ssh2": "^1.17.0", - "@alicloud/openapi-util": "^0.3.2" + "@alicloud/openapi-util": "^0.3.2", + "wechatpay-node-v3": "^2.2.1", + "alipay-sdk": "^4.13.0" }, "devDependencies": { "@midwayjs/mock": "3.20.11", diff --git a/packages/ui/certd-server/src/modules/auto/auto-b-load-plugins.ts b/packages/ui/certd-server/src/modules/auto/auto-b-load-plugins.ts index 8296438ff..9439b0a3e 100644 --- a/packages/ui/certd-server/src/modules/auto/auto-b-load-plugins.ts +++ b/packages/ui/certd-server/src/modules/auto/auto-b-load-plugins.ts @@ -1,6 +1,7 @@ import { Autoload, Init, Inject, Scope, ScopeEnum } from "@midwayjs/core"; import { logger } from "@certd/basic"; import { PluginService } from "../plugin/service/plugin-service.js"; +import { registerPaymentProviders } from "../suite/payments/index.js"; @Autoload() @Scope(ScopeEnum.Request, { allowDowngrade: true }) @@ -19,6 +20,8 @@ export class AutoBLoadPlugins { } // await import("../../plugins/index.js") await this.pluginService.registerFromDb() + + await registerPaymentProviders(); logger.info(`加载插件完成,加载模式:${process.env.certd_plugin_loadmode}`); } diff --git a/packages/ui/certd-server/src/modules/suite/payments/alipay.ts b/packages/ui/certd-server/src/modules/suite/payments/alipay.ts new file mode 100644 index 000000000..19cd19eb4 --- /dev/null +++ b/packages/ui/certd-server/src/modules/suite/payments/alipay.ts @@ -0,0 +1,148 @@ +import { IPaymentProvider, TradeEntity, UpdateTrade, UpdateTradeInfo } from "@certd/commercial-core"; +import dayjs from "dayjs"; +import { logger, utils } from "@certd/basic"; +import { AlipayAccess } from "../../../plugins/plugin-plus/alipay/access.js"; + +export class PaymentAlipay implements IPaymentProvider { + access: AlipayAccess; + + constructor(access: AlipayAccess) { + this.access = access; + } + + async getDetail(tradeNo: string): Promise { + const alipaySdk = await this.createAlipaySdk(); + + const result: any = await alipaySdk.curl("POST", "/v3/alipay/trade/query", { + body: { + out_trade_no: tradeNo, + }, + }); + logger.info("获取支付宝订单详情", JSON.stringify(result)); + if (result.responseHttpStatus !== 200) { + throw new Error("请求支付宝失败:" + result.responseHttpStatus); + } + const data = result.data; + + let status: string = undefined; + let payTime: number = undefined; + if (data.trade_status === "TRADE_SUCCESS") { + status = "paid"; + payTime = dayjs(data.send_pay_date).valueOf(); + } else if (data.trade_status === "TRADE_CLOSED") { + status = "closed"; + } else { + logger.info("支付宝订单状态为:" + data.trade_status); + } + + return { + tradeNo, + status: status, + amount: utils.amount.toCent(parseFloat(data.total_amount)), + payNo: data.trade_no, + payTime: payTime, + }; + } + + async createOrder(trade: TradeEntity, opts: { bindUrl: string; clientIp: string }) { + const return_url = `${opts.bindUrl}/#/certd/payment/return/alipay`; + const notify_url = `${opts.bindUrl}/api/payment/notify/alipay`; + + const alipaySdk = await this.createAlipaySdk(); + const url = alipaySdk.pageExec("alipay.trade.page.pay", "GET", { + return_url, + notify_url, + bizContent: { + out_trade_no: trade.tradeNo, + total_amount: utils.amount.toYuan(trade.amount), + subject: trade.title, + product_code: "FAST_INSTANT_TRADE_PAY", + // qr_pay_mode: "1", + // qrcode_width: "100", + // time_expire: "2016-12-31+10:05:01", + // sub_merchant: { + // merchant_id: "2088000603999128", + // merchant_type: "alipay", + // }, + // extend_params: { + // sys_service_provider_id: "2088511833207846", + // hb_fq_seller_percent: "100", + // hb_fq_num: "3", + // industry_reflux_info: '{\\"scene_code\\":\\"metro_tradeorder\\",\\"channel\\":\\"xxxx\\",\\"scene_data\\":{\\"asset_name\\":\\"ALIPAY\\"}}', + // specified_seller_name: "XXX的跨境小铺", + // royalty_freeze: "true", + // card_type: "S0JP0000", + // }, + // business_params: '{"mc_create_trade_ip":"127.0.0.1"}', + // promo_params: '{"storeIdType":"1"}', + // integration_type: "PCWEB", + // request_from_url: "https://", + // store_id: "NJ_001", + // merchant_order_no: "20161008001", + // ext_user_info: { + // cert_type: "IDENTITY_CARD", + // cert_no: "362334768769238881", + // name: "李明", + // mobile: "16587658765", + // min_age: "18", + // need_check_info: "F", + // identity_hash: "27bfcd1dee4f22c8fe8a2374af9b660419d1361b1c207e9b41a754a113f38fcc", + // }, + // invoice_info: { + // key_info: { + // tax_num: "1464888883494", + // is_support_invoice: "true", + // invoice_merchant_name: "ABC|003", + // }, + // details: '[{"code":"100294400","name":"服饰","num":"2","sumPrice":"200.00","taxRate":"6%"}]', + // }, + }, + }); + return { + url, + body: {}, + }; + } + + private async createAlipaySdk() { + const AlipaySdk = await import("alipay-sdk"); + + const alipaySdk = new AlipaySdk.AlipaySdk({ + appId: this.access.appId, + privateKey: this.access.privateKey, + alipayPublicKey: this.access.alipayPublicKey, + gateway: "https://openapi.alipay.com/gateway.do", + }); + return alipaySdk; + } + + async onNotify(data: any, updateTrade: UpdateTrade) { + const alipaySdk = await this.createAlipaySdk(); + logger.info(`支付宝notify:${JSON.stringify(data)}`); + // true | false + let success = alipaySdk.checkNotifySign(data); + if (!success) { + success = alipaySdk.checkNotifySignV2(data); + if (!success) { + throw new Error("签名验证失败"); + } + } + if (data.trade_status === "TRADE_SUCCESS") { + await updateTrade({ + tradeNo: data.out_trade_no, + status: "paid", + amount: utils.amount.toCent(parseFloat(data.total_amount)), + payNo: data.trade_no, + payTime: dayjs().valueOf(), + }); + } else if (data.trade_status === "TRADE_CLOSED") { + await updateTrade({ + tradeNo: data.out_trade_no, + status: "closed", + payNo: data.trade_no, + }); + + return "success"; + } + } +} diff --git a/packages/ui/certd-server/src/modules/suite/payments/index.ts b/packages/ui/certd-server/src/modules/suite/payments/index.ts new file mode 100644 index 000000000..e5d401f45 --- /dev/null +++ b/packages/ui/certd-server/src/modules/suite/payments/index.ts @@ -0,0 +1,7 @@ +import {paymentProviderFactory} from "@certd/commercial-core" +export function registerPaymentProviders() { + + paymentProviderFactory.registerProvider("alipay", async () => (await import("./alipay.js")).PaymentAlipay); + paymentProviderFactory.registerProvider("wxpay", async () => (await import("./wxpay.js")).PaymentWxpay); + paymentProviderFactory.registerProvider("yizhifu", async () => (await import("./yizhifu.js")).PaymentYizhifu); +} diff --git a/packages/ui/certd-server/src/modules/suite/payments/wxpay.ts b/packages/ui/certd-server/src/modules/suite/payments/wxpay.ts new file mode 100644 index 000000000..727cfbdef --- /dev/null +++ b/packages/ui/certd-server/src/modules/suite/payments/wxpay.ts @@ -0,0 +1,136 @@ +import { IPaymentProvider, TradeEntity, UpdateTrade, UpdateTradeInfo } from "@certd/commercial-core"; +import WxPay from "wechatpay-node-v3"; +import dayjs from "dayjs"; +import { logger } from "@certd/basic"; // 支持使用require +import { WxpayAccess } from "../../../plugins/plugin-plus/wxpay/access.js"; +export class PaymentWxpay implements IPaymentProvider { + access: WxpayAccess; + constructor(access: WxpayAccess) { + this.access = access; + } + async getDetail(tradeNo: string): Promise { + /** + * const result = await pay.query({out_trade_no: '1609914303237'}); + * # 或者 const result = await pay.query({transaction_id: ''}); + * console.log(result); + * { + * status: 200, + * appid: 'appid', + * attach: '', + * mchid: '商户号', + * out_trade_no: '1609899981750', + * payer: {}, + * promotion_detail: [], + * trade_state: 'CLOSED', + * trade_state_desc: '订单已关闭' + * } + */ + + const pay = this.createSdk(); + + const result: any = await pay.query({ out_trade_no: tradeNo }); + logger.info(`微信支付查询订单返回:${JSON.stringify(result)}`); + if (result.status !== 200) { + throw new Error("查询微信支付订单失败:" + result.status); + } + const data = result.data; + let status: string = undefined; + let payTime: number = undefined; + let amount: number = undefined; + if (data.trade_state === "SUCCESS") { + status = "paid"; + payTime = dayjs(data.success_time).valueOf(); + amount = data.amount.total; + } else if (data.trade_state === "CLOSED") { + status = "closed"; + } else { + logger.info("微信支付订单状态为:" + data.trade_state); + } + + return { + tradeNo: data.out_trade_no, + status, + amount, + payNo: data.transaction_id, + payTime, + }; + } + async createOrder(trade: TradeEntity, opts: { bindUrl: string; clientIp: string }) { + const notify_url = `${opts.bindUrl}/api/payment/notify/wxpay`; + + const pay = this.createSdk(); + + const params = { + description: trade.title, + out_trade_no: trade.tradeNo, + notify_url, + amount: { + total: trade.amount, + }, + scene_info: { + payer_client_ip: "ip", + }, + }; + + logger.info(`微信支付下单请求:${JSON.stringify(params)}`); + const result: any = await pay.transactions_native(params); + logger.info(`微信支付下单返回:${JSON.stringify(result)}`); + if (result.status !== 200) { + throw new Error("请求微信支付失败:" + result.status); + } + return { + qrcode: result.data.code_url, + }; + } + + private createSdk() { + const pay = new WxPay({ + appid: this.access.appId, + mchid: this.access.mchid, + publicKey: Buffer.from(this.access.publicKey), // 公钥 + privateKey: Buffer.from(this.access.privateKey), // 秘钥 + }); + return pay; + } + + async onNotify(notifyData: any, updateTrade: UpdateTrade) { + const pay = this.createSdk(); + const { ciphertext, associated_data, nonce } = notifyData.resource; + logger.info(`微信支付notify:${JSON.stringify(notifyData)}`); + const key = this.access.key; + const result: any = pay.decipher_gcm(ciphertext, associated_data, nonce, key); + logger.info(`微信支付解析结果:${JSON.stringify(result)}`); + /** + * mchid: '商户号', + * # appid: 'appid', + * # out_trade_no: '1610419296553', + * # transaction_id: '4200000848202101120290526543', + * # trade_type: 'NATIVE', + * # trade_state: 'SUCCESS', + * # trade_state_desc: '支付成功', + * # bank_type: 'OTHERS', + * # attach: '', + * # success_time: '2021-01-12T10:43:43+08:00', + * # payer: { openid: '' }, + * # amount: { total: 1, payer_total: 1, currency: 'CNY', payer_currency: 'CNY' } + */ + const data: any = result; + if (data.trade_state === "SUCCESS") { + await updateTrade({ + tradeNo: data.out_trade_no, + status: "paid", + amount: data.amount.total, + payNo: data.transaction_id, + payTime: dayjs(data.success_time).valueOf(), + }); + } else if (data.trade_state === "CLOSED") { + await updateTrade({ + tradeNo: data.out_trade_no, + status: "closed", + payNo: data.transaction_id, + }); + } + + return "success"; + } +} diff --git a/packages/ui/certd-server/src/modules/suite/payments/yizhifu.ts b/packages/ui/certd-server/src/modules/suite/payments/yizhifu.ts new file mode 100644 index 000000000..390528d5a --- /dev/null +++ b/packages/ui/certd-server/src/modules/suite/payments/yizhifu.ts @@ -0,0 +1,184 @@ +import { logger, utils } from "@certd/basic"; +import { IPaymentProvider, TradeEntity, UpdateTrade, UpdateTradeInfo } from "@certd/commercial-core"; +import dayjs from "dayjs"; +import { YizhifuAccess } from "../../../plugins/plugin-plus/yizhifu/access.js"; + +export class PaymentYizhifu implements IPaymentProvider { + access: YizhifuAccess; + constructor(access: YizhifuAccess) { + this.access = access; + } + + async getDetail(tradeNo: string): Promise { + /** + * http://pay.docmirror.cn/api.php?act=order&pid={商户ID}&key={商户密钥}&out_trade_no={商户订单号} + * + * 请求参数说明: + * + * 字段名 变量名 必填 类型 示例值 描述 + * 操作类型 act 是 String order 此API固定值 + * 商户ID pid 是 Int 1001 + * 商户密钥 key 是 String 89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i + * 系统订单号 trade_no 选择 String 20160806151343312 + * 商户订单号 out_trade_no 选择 String 20160806151343349 + */ + + const paymentReq = { + pid: this.access.pid, + act: "order", + key: this.access.key, + out_trade_no: tradeNo, + }; + let url = this.access.url; + if (url.endsWith("/")) { + url = url.substring(0, url.length - 1); + } + const res = await utils.http.request({ + url: url + "/api.php", + method: "get", + params: paymentReq, + }); + + if (res.code !== 1) { + throw new Error(res.msg); + } + + if (res.status !== "1") { + throw new Error("该订单还未支付"); + } + /** + * 易支付订单号 trade_no String 2016080622555342651 袖手科技聚合支付平台订单号 + * 商户订单号 out_trade_no String 20160806151343349 商户系统内部的订单号 + * 第三方订单号 api_trade_no String 20160806151343349 支付宝微信等接口方订单号 + * 支付方式 type String alipay 支付方式列表 + * 商户ID pid Int 1001 发起支付的商户ID + * 创建订单时间 addtime String 2016-08-06 22:55:52 + * 完成交易时间 endtime String 2016-08-06 22:55:52 + * 商品名称 name String VIP会员 + * 商品金额 money String 1.00 + * 支付状态 status Int 0 1为支付成功,0为未支付 + * 业务扩展参数 param String 默认留空 + * 支付者账号 buyer String 默认留空 + */ + + let status: string = null; + let payTime: number = null; + if (res.status === "1") { + status = "paid"; + payTime = dayjs(res.endtime).valueOf(); + } else { + throw new Error("订单未支付"); + } + + return { + tradeNo: res.out_trade_no, + payNo: res.trade_no, + remark: "支付类型:" + res.type, + amount: utils.amount.toCent(parseFloat(res.money)), + status: status, + payTime: payTime, + }; + } + sign(paymentReq: any): any { + const keys = Object.keys(paymentReq); + if (paymentReq.pid && paymentReq.pid + "" !== this.access.pid + "") { + throw new Error("pid not match"); + } + paymentReq.pid = this.access.pid; + const params: any[] = []; + + for (const key of keys) { + const value = paymentReq[key]; + if (value != null && value !== "" && key !== "sign" && key !== "sign_type") { + params.push({ name: key, value: value }); + } + } + /** + * 1、将发送或接收到的所有参数按照参数名ASCII码从小到大排序(a-z),sign、sign_type、和空值不参与签名! + * 2、将排序后的参数拼接成URL键值对的格式,例如 a=b&c=d&e=f,参数值不要进行url编码。 + * 3、再将拼接好的字符串与商户密钥KEY进行MD5加密得出sign签名参数,sign = md5 ( a=b&c=d&e=f + KEY ) (注意:+ 为各语言的拼接符,不是字符!),md5结果为小写。 + */ + //sort + const sortedParams = params.sort((a, b) => a.name.localeCompare(b.name)); + //join + const signStr = sortedParams.map(p => `${p.name}=${p.value}`).join("&"); + //md5 + const signType = this.access.signType; + + let sign = ""; + if (signType === "MD5") { + sign = utils.hash.md5(signStr + this.access.key); + } else if (signType === "SHA256") { + sign = utils.hash.sha256(signStr + this.access.key); + } else { + throw new Error("不支持的签名方式"); + } + + sign = sign.toLowerCase(); + + params.push({ name: "sign", value: sign }); + + params.push({ name: "sign_type", value: signType }); + + const body = {}; + params.forEach(p => { + body[p.name] = p.value; + }); + + return body; + } + async createOrder(trade: TradeEntity, opts: { bindUrl: string; clientIp: string }) { + const { bindUrl } = opts; + const paymentReq: any = { + pid: this.access.pid, + out_trade_no: trade.tradeNo, + return_url: `${bindUrl}/#/certd/payment/return/yizhifu`, + notify_url: `${bindUrl}/api/payment/notify/yizhifu`, + name: trade.title, + money: utils.amount.toYuan(trade.amount), + }; + + if (this.access.payType) { + paymentReq.type = this.access.payType; + } + + const body = this.sign(paymentReq); + + let url = this.access.url; + if (url.endsWith("/")) { + url = url.substring(0, url.length - 1); + } + return { + url: url + "/submit.php", + body, + }; + } + + checkSign(paymentRes: any) { + // const { pid, trade_no, out_trade_no, type, name, money, trade_status, param, sign, sign_type } = paymentRes; + const body = this.sign(paymentRes); + const pass = body.sign === paymentRes.sign; + if (!pass) { + throw new Error("签名校验失败"); + } + return pass; + } + + async onNotify(paymentRes: any, updateTrade: UpdateTrade) { + logger.info(`易支付notify:${JSON.stringify(paymentRes)}`); + this.checkSign(paymentRes); + + const success = paymentRes.trade_status === "TRADE_SUCCESS"; + if (success) { + await updateTrade({ + tradeNo: paymentRes.out_trade_no, + status: "paid", + amount: utils.amount.toCent(parseFloat(paymentRes.money)), + remark: "支付类型:" + paymentRes.type, + payNo: paymentRes.trade_no, + payTime: dayjs().valueOf(), + }); + } + return "success"; + } +} diff --git a/packages/ui/certd-server/src/plugins/plugin-zenlayer/access.ts b/packages/ui/certd-server/src/plugins/plugin-zenlayer/access.ts index 495e77180..9bf2987c7 100644 --- a/packages/ui/certd-server/src/plugins/plugin-zenlayer/access.ts +++ b/packages/ui/certd-server/src/plugins/plugin-zenlayer/access.ts @@ -316,7 +316,7 @@ Signature const StringToSign = `${signMethod}\n${timestamp}\n${this.accessKeyId}\n${CanonicalRequest}`; - const signature = this.ctx.utils.hash.hmacSha256(StringToSign, "hex"); + const signature = this.ctx.utils.hash.hmacSha256WithKey(this.accessKeyPassword, StringToSign, "hex"); const authorization = `${signMethod} Credential=${this.accessKeyId}, SignedHeaders=${SignedHeaders}, Signature=${signature}`; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b78f131e0..5ecf7dfe7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -788,9 +788,6 @@ importers: '@certd/pipeline': specifier: ^1.37.17 version: link:../../core/pipeline - '@certd/plugin-plus': - specifier: ^1.37.17 - version: link:../plugin-plus '@certd/plus-core': specifier: ^1.37.17 version: link:../plus-core @@ -806,18 +803,12 @@ importers: '@midwayjs/typeorm': specifier: 3.20.11 version: 3.20.11 - alipay-sdk: - specifier: ^4.13.0 - version: 4.14.0 dayjs: specifier: ^1.11.7 version: 1.11.13 typeorm: specifier: ^0.3.20 version: 0.3.24(better-sqlite3@11.10.0)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3)) - wechatpay-node-v3: - specifier: ^2.2.1 - version: 2.2.1 devDependencies: '@rollup/plugin-json': specifier: ^6.0.0 @@ -868,130 +859,6 @@ importers: specifier: ^5.4.2 version: 5.8.3 - packages/pro/plugin-plus: - dependencies: - '@alicloud/pop-core': - specifier: ^1.7.10 - version: 1.8.0 - '@baiducloud/sdk': - specifier: ^1.0.2 - version: 1.0.3 - '@certd/basic': - specifier: ^1.37.17 - version: link:../../core/basic - '@certd/lib-k8s': - specifier: ^1.37.17 - version: link:../../libs/lib-k8s - '@certd/pipeline': - specifier: ^1.37.17 - version: link:../../core/pipeline - '@certd/plugin-cert': - specifier: ^1.37.17 - version: link:../../plugins/plugin-cert - '@certd/plugin-lib': - specifier: ^1.37.17 - version: link:../../plugins/plugin-lib - '@certd/plus-core': - specifier: ^1.37.17 - version: link:../plus-core - ali-oss: - specifier: ^6.21.0 - version: 6.23.0 - baidu-aip-sdk: - specifier: ^4.16.16 - version: 4.16.16 - basic-ftp: - specifier: ^5.0.5 - version: 5.0.5 - cos-nodejs-sdk-v5: - specifier: ^2.14.6 - version: 2.14.7 - crypto-js: - specifier: ^4.2.0 - version: 4.2.0 - dayjs: - specifier: ^1.11.7 - version: 1.11.13 - form-data: - specifier: ^4.0.0 - version: 4.0.2 - https-proxy-agent: - specifier: ^7.0.5 - version: 7.0.6 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - jsencrypt: - specifier: ^3.3.2 - version: 3.3.2 - jsrsasign: - specifier: ^11.1.0 - version: 11.1.0 - qiniu: - specifier: ^7.12.0 - version: 7.14.0 - tencentcloud-sdk-nodejs: - specifier: ^4.0.44 - version: 4.1.112(encoding@0.1.13) - devDependencies: - '@rollup/plugin-json': - specifier: ^6.0.0 - version: 6.1.0(rollup@3.29.5) - '@rollup/plugin-terser': - specifier: ^0.4.3 - version: 0.4.4(rollup@3.29.5) - '@rollup/plugin-typescript': - specifier: ^11.0.0 - version: 11.1.6(rollup@3.29.5)(tslib@2.8.1)(typescript@5.8.3) - '@types/ali-oss': - specifier: ^6.16.11 - version: 6.16.11 - '@types/chai': - specifier: ^4.3.10 - version: 4.3.20 - '@types/mocha': - specifier: ^10.0.7 - version: 10.0.10 - '@types/node': - specifier: ^18 - version: 18.19.100 - '@typescript-eslint/eslint-plugin': - specifier: ^8.26.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@8.57.0)(typescript@5.8.3))(eslint@8.57.0)(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.26.1 - version: 8.32.1(eslint@8.57.0)(typescript@5.8.3) - chai: - specifier: 4.3.10 - version: 4.3.10 - eslint: - specifier: ^8.41.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^8.8.0 - version: 8.10.0(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) - mocha: - specifier: ^10.2.0 - version: 10.8.2 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - rimraf: - specifier: ^5.0.5 - version: 5.0.10 - rollup: - specifier: ^3.7.4 - version: 3.29.5 - tslib: - specifier: ^2.8.1 - version: 2.8.1 - typescript: - specifier: ^5.4.2 - version: 5.8.3 - packages/pro/plus-core: dependencies: '@certd/basic': @@ -1520,7 +1387,7 @@ importers: version: link:../../plugins/plugin-lib '@certd/plugin-plus': specifier: ^1.37.17 - version: link:../../pro/plugin-plus + version: 1.37.17(encoding@0.1.13) '@certd/plus-core': specifier: ^1.37.17 version: link:../../pro/plus-core @@ -1581,6 +1448,9 @@ importers: ali-oss: specifier: ^6.21.0 version: 6.23.0 + alipay-sdk: + specifier: ^4.13.0 + version: 4.14.0 axios: specifier: ^1.9.0 version: 1.9.0(debug@4.4.1) @@ -1731,6 +1601,9 @@ importers: uuid: specifier: ^10.0.0 version: 10.0.0 + wechatpay-node-v3: + specifier: ^2.2.1 + version: 2.2.1 xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -2888,6 +2761,9 @@ packages: '@certd/cv4pve-api-javascript@8.4.2': resolution: {integrity: sha512-udGce7ewrVl4DmZvX+17PjsnqsdDIHEDatr8QP0AVrY2p+8JkaSPW4mXCKiLGf82C9K2+GXgT+qNIqgW7tfF9Q==} + '@certd/plugin-plus@1.37.17': + resolution: {integrity: sha512-yIBCdHc+vdOQa9cMRRKHvyLgVCQvwqYzCzOFzODEWL7zZ3e6T3YLueG49vqyr0dyEEcY/JXfqT4vDo+r3Zs1zw==} + '@certd/vue-js-cron-core@6.0.3': resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==} @@ -15446,6 +15322,34 @@ snapshots: transitivePeerDependencies: - supports-color + '@certd/plugin-plus@1.37.17(encoding@0.1.13)': + dependencies: + '@alicloud/pop-core': 1.8.0 + '@baiducloud/sdk': 1.0.3 + '@certd/basic': link:packages/core/basic + '@certd/lib-k8s': link:packages/libs/lib-k8s + '@certd/pipeline': link:packages/core/pipeline + '@certd/plugin-cert': link:packages/plugins/plugin-cert + '@certd/plugin-lib': link:packages/plugins/plugin-lib + '@certd/plus-core': link:packages/pro/plus-core + ali-oss: 6.23.0 + baidu-aip-sdk: 4.16.16 + basic-ftp: 5.0.5 + cos-nodejs-sdk-v5: 2.14.7 + crypto-js: 4.2.0 + dayjs: 1.11.13 + form-data: 4.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.0 + jsencrypt: 3.3.2 + jsrsasign: 11.1.0 + qiniu: 7.14.0 + tencentcloud-sdk-nodejs: 4.1.112(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - proxy-agent + - supports-color + '@certd/vue-js-cron-core@6.0.3': dependencies: mustache: 4.2.0