wxpay-nodejs-sdk 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,8 +1,15 @@
1
- import fs from 'fs';
1
+ import fs2 from 'fs';
2
2
  import os from 'os';
3
3
  import crypto2 from 'crypto';
4
+ import zlib from 'zlib';
4
5
 
5
6
  // src/core/client.ts
7
+
8
+ // package.json
9
+ var version = "0.2.5";
10
+
11
+ // src/version.ts
12
+ var SDK_VERSION = version;
6
13
  var CertificateManager = class {
7
14
  /** 平台证书缓存 Map<序列号, 证书信息> */
8
15
  certificates = /* @__PURE__ */ new Map();
@@ -57,6 +64,7 @@ var CertificateManager = class {
57
64
  * 获取用于验签的公钥
58
65
  *
59
66
  * 优先返回微信支付公钥(公钥模式),否则根据证书序列号查找平台证书。
67
+ * 在组合模式下,如果证书未找到,会回退到微信支付公钥。
60
68
  *
61
69
  * @param serialNo - 证书序列号或公钥ID
62
70
  * @returns PEM 格式的公钥,不存在则返回 null
@@ -69,7 +77,12 @@ var CertificateManager = class {
69
77
  return this.wxpayPublicKey;
70
78
  }
71
79
  const cert = this.certificates.get(serialNo);
72
- if (!cert) return null;
80
+ if (!cert) {
81
+ if (this.wxpayPublicKey) {
82
+ return this.wxpayPublicKey;
83
+ }
84
+ return null;
85
+ }
73
86
  const { ciphertext, nonce, associatedData, algorithm } = cert.encryptCertificate;
74
87
  if (algorithm === "RAW_PUBLIC_KEY") {
75
88
  return Buffer.from(ciphertext, "base64").toString("utf-8");
@@ -90,6 +103,17 @@ var CertificateManager = class {
90
103
  return null;
91
104
  }
92
105
  }
106
+ /**
107
+ * 判断当前是否为组合验签模式
108
+ *
109
+ * 当同时配置了微信支付公钥和平台证书时,返回 true。
110
+ * 组合模式用于平台证书→微信支付公钥的灰度迁移期间。
111
+ *
112
+ * @returns 是否为组合模式
113
+ */
114
+ isCombinedMode() {
115
+ return this.wxpayPublicKey !== null && this.certificates.size > 0;
116
+ }
93
117
  /**
94
118
  * 更新平台证书
95
119
  */
@@ -256,7 +280,6 @@ var MalformedMessageException = class extends WxPayError {
256
280
  };
257
281
 
258
282
  // src/utils/http.ts
259
- var SDK_VERSION = "0.2.1";
260
283
  function getUserAgent() {
261
284
  const platform = os.platform();
262
285
  const arch = os.arch();
@@ -458,14 +481,12 @@ var WxPayClient = class _WxPayClient {
458
481
  static PRODUCTION_BACKUP = "https://api2.mch.weixin.qq.com";
459
482
  /** 沙箱环境 API 地址 */
460
483
  static SANDBOX_BASE = "https://api.mch.weixin.qq.com/sandboxnew";
461
- /** SDK 版本号 */
462
- static SDK_VERSION = "0.2.1";
463
484
  /** 动态 User-Agent 字符串 */
464
485
  static USER_AGENT = (() => {
465
486
  const platform = os.platform();
466
487
  const arch = os.arch();
467
488
  const nodeVersion = process.version;
468
- return `wxpay-nodejs-sdk/${_WxPayClient.SDK_VERSION} (${platform} ${arch}) Node.js/${nodeVersion}`;
489
+ return `wxpay-nodejs-sdk/${SDK_VERSION} (${platform} ${arch}) Node.js/${nodeVersion}`;
469
490
  })();
470
491
  /** 商户号 */
471
492
  mchid;
@@ -476,6 +497,7 @@ var WxPayClient = class _WxPayClient {
476
497
  baseUrl;
477
498
  backupUrl;
478
499
  enableResponseVerification;
500
+ customFetch;
479
501
  /** 平台证书管理器 */
480
502
  certificates;
481
503
  constructor(options) {
@@ -487,6 +509,7 @@ var WxPayClient = class _WxPayClient {
487
509
  this.baseUrl = options.sandbox ? _WxPayClient.SANDBOX_BASE : _WxPayClient.PRODUCTION_BASE;
488
510
  this.backupUrl = options.sandbox ? null : _WxPayClient.PRODUCTION_BACKUP;
489
511
  this.enableResponseVerification = options.enableResponseVerification ?? true;
512
+ this.customFetch = options.customFetch ?? fetch;
490
513
  this.certificates = new CertificateManager(this.apiV3Key, options.platformCertificates);
491
514
  if (options.wxpayPublicKeyId && options.wxpayPublicKey) {
492
515
  const publicKey = this.resolvePublicKey(options.wxpayPublicKey);
@@ -568,7 +591,7 @@ var WxPayClient = class _WxPayClient {
568
591
  controller.abort();
569
592
  }, this.timeout);
570
593
  try {
571
- const response = await fetch(url, {
594
+ const response = await this.customFetch(url, {
572
595
  method,
573
596
  headers,
574
597
  signal: controller.signal
@@ -695,7 +718,7 @@ var WxPayClient = class _WxPayClient {
695
718
  controller.abort();
696
719
  }, this.timeout);
697
720
  try {
698
- const response = await fetch(url, {
721
+ const response = await this.customFetch(url, {
699
722
  method: "POST",
700
723
  headers,
701
724
  body,
@@ -771,7 +794,7 @@ var WxPayClient = class _WxPayClient {
771
794
  controller.abort();
772
795
  }, this.timeout);
773
796
  try {
774
- const response = await fetch(url, {
797
+ const response = await this.customFetch(url, {
775
798
  method,
776
799
  headers,
777
800
  body: bodyStr || void 0,
@@ -822,7 +845,7 @@ var WxPayClient = class _WxPayClient {
822
845
  if (Buffer.isBuffer(key)) return key;
823
846
  if (key.startsWith("-----BEGIN")) return key;
824
847
  try {
825
- return fs.readFileSync(key, "utf-8");
848
+ return fs2.readFileSync(key, "utf-8");
826
849
  } catch {
827
850
  return key;
828
851
  }
@@ -834,7 +857,7 @@ var WxPayClient = class _WxPayClient {
834
857
  if (Buffer.isBuffer(key)) return key.toString("utf-8");
835
858
  if (key.startsWith("-----BEGIN")) return key;
836
859
  try {
837
- return fs.readFileSync(key, "utf-8");
860
+ return fs2.readFileSync(key, "utf-8");
838
861
  } catch {
839
862
  return key;
840
863
  }
@@ -964,56 +987,422 @@ var CertificateService = class {
964
987
  return decrypted.toString("utf-8");
965
988
  }
966
989
  };
967
-
968
- // src/services/jsapi.ts
969
- var JsapiService = class {
970
- client;
971
- constructor(client) {
972
- this.client = client;
973
- }
974
- /**
975
- * JSAPI/小程序下单
976
- *
977
- * 商户通过此接口生成预付单并获取 prepay_id。
978
- * prepay_id 有效期为 2 小时,超过 2 小时需重新请求。
979
- *
980
- * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791856
981
- */
982
- async createOrder(request) {
983
- return this.client.post("/v3/pay/transactions/jsapi", request);
984
- }
985
- /**
986
- * 查询 JSAPI 支付订单
987
- *
988
- * 支持通过微信支付订单号或商户订单号查询订单状态。
989
- *
990
- * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791858 (微信支付订单号查询订单)
991
- * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791859 (商户订单号查询订单)
992
- */
993
- async queryOrderById(params) {
994
- if (params.transactionId) {
995
- return this.client.get(
996
- `/v3/pay/transactions/id/${params.transactionId}`,
997
- { mchid: this.client.mchid }
998
- );
990
+ function generateAppPaySign(appId, timeStamp, nonceStr, prepayId, privateKey) {
991
+ const signString = `${appId}
992
+ ${timeStamp}
993
+ ${nonceStr}
994
+ prepay_id=${prepayId}
995
+ `;
996
+ const signer = crypto2.createSign("RSA-SHA256");
997
+ signer.update(signString);
998
+ signer.end();
999
+ return signer.sign(privateKey, "base64");
1000
+ }
1001
+ function buildAppBridgeConfig(appId, partnerId, prepayId, privateKey) {
1002
+ const timeStamp = String(Math.floor(Date.now() / 1e3));
1003
+ const nonceStr = generateNonceStr();
1004
+ const sign2 = generateAppPaySign(appId, timeStamp, nonceStr, prepayId, privateKey);
1005
+ return {
1006
+ appId,
1007
+ partnerId,
1008
+ prepayId,
1009
+ packageValue: "Sign=WXPay",
1010
+ nonceStr,
1011
+ timeStamp,
1012
+ sign: sign2
1013
+ };
1014
+ }
1015
+ function generatePaySign(appId, timeStamp, nonceStr, prepayId, privateKey) {
1016
+ const signString = `${appId}
1017
+ ${timeStamp}
1018
+ ${nonceStr}
1019
+ prepay_id=${prepayId}
1020
+ `;
1021
+ const signer = crypto2.createSign("RSA-SHA256");
1022
+ signer.update(signString);
1023
+ signer.end();
1024
+ return signer.sign(privateKey, "base64");
1025
+ }
1026
+ function generateNonceStr() {
1027
+ return crypto2.randomUUID().replace(/-/g, "");
1028
+ }
1029
+ function buildJsapiBridgeConfig(appId, prepayId, privateKey) {
1030
+ const timeStamp = String(Math.floor(Date.now() / 1e3));
1031
+ const nonceStr = generateNonceStr();
1032
+ const paySign = generatePaySign(appId, timeStamp, nonceStr, prepayId, privateKey);
1033
+ return {
1034
+ appId,
1035
+ timeStamp,
1036
+ nonceStr,
1037
+ package: `prepay_id=${prepayId}`,
1038
+ signType: "RSA",
1039
+ paySign
1040
+ };
1041
+ }
1042
+ function buildMiniProgramBridgeConfig(appId, prepayId, privateKey) {
1043
+ const timeStamp = String(Math.floor(Date.now() / 1e3));
1044
+ const nonceStr = generateNonceStr();
1045
+ const paySign = generatePaySign(appId, timeStamp, nonceStr, prepayId, privateKey);
1046
+ return {
1047
+ timeStamp,
1048
+ nonceStr,
1049
+ package: `prepay_id=${prepayId}`,
1050
+ signType: "RSA",
1051
+ paySign
1052
+ };
1053
+ }
1054
+ function generatePayScorePaySign(appId, timeStamp, nonceStr, serviceId, outOrderNo, privateKey) {
1055
+ const packageStr = `service_id=${serviceId}&out_order_no=${outOrderNo}&need_sign_type=RSA`;
1056
+ const signString = `${appId}
1057
+ ${timeStamp}
1058
+ ${nonceStr}
1059
+ ${packageStr}
1060
+ `;
1061
+ const signer = crypto2.createSign("RSA-SHA256");
1062
+ signer.update(signString);
1063
+ signer.end();
1064
+ return signer.sign(privateKey, "base64");
1065
+ }
1066
+ function buildPayScoreJsapiBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
1067
+ const timestamp = String(Math.floor(Date.now() / 1e3));
1068
+ const nonceStr = generateNonceStr();
1069
+ const sign2 = generatePayScorePaySign(
1070
+ appId,
1071
+ timestamp,
1072
+ nonceStr,
1073
+ serviceId,
1074
+ outOrderNo,
1075
+ privateKey
1076
+ );
1077
+ return {
1078
+ appid: appId,
1079
+ mchid: mchId,
1080
+ service_id: serviceId,
1081
+ out_order_no: outOrderNo,
1082
+ timestamp,
1083
+ nonce_str: nonceStr,
1084
+ sign_type: "RSA",
1085
+ sign: sign2
1086
+ };
1087
+ }
1088
+ function buildPayScoreMiniProgramBridgeConfig(mchId, serviceId, outOrderNo, appId, privateKey) {
1089
+ const timestamp = String(Math.floor(Date.now() / 1e3));
1090
+ const nonceStr = generateNonceStr();
1091
+ const sign2 = generatePayScorePaySign(
1092
+ appId,
1093
+ timestamp,
1094
+ nonceStr,
1095
+ serviceId,
1096
+ outOrderNo,
1097
+ privateKey
1098
+ );
1099
+ return {
1100
+ mchid: mchId,
1101
+ service_id: serviceId,
1102
+ out_order_no: outOrderNo,
1103
+ timestamp,
1104
+ nonce_str: nonceStr,
1105
+ sign_type: "RSA",
1106
+ sign: sign2
1107
+ };
1108
+ }
1109
+ function buildPayScoreAppBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
1110
+ const timestamp = String(Math.floor(Date.now() / 1e3));
1111
+ const nonceStr = generateNonceStr();
1112
+ const sign2 = generatePayScorePaySign(
1113
+ appId,
1114
+ timestamp,
1115
+ nonceStr,
1116
+ serviceId,
1117
+ outOrderNo,
1118
+ privateKey
1119
+ );
1120
+ return {
1121
+ appid: appId,
1122
+ mchid: mchId,
1123
+ service_id: serviceId,
1124
+ out_order_no: outOrderNo,
1125
+ timestamp,
1126
+ nonce_str: nonceStr,
1127
+ sign_type: "RSA",
1128
+ sign: sign2
1129
+ };
1130
+ }
1131
+ function buildMerchantTransferJsapiBridgeConfig(mchId, appId, packageInfo) {
1132
+ return {
1133
+ mchId,
1134
+ appId,
1135
+ package: packageInfo
1136
+ };
1137
+ }
1138
+ function buildMerchantTransferMiniProgramBridgeConfig(mchId, appId, packageInfo) {
1139
+ return {
1140
+ mchId,
1141
+ appId,
1142
+ package: packageInfo
1143
+ };
1144
+ }
1145
+ function buildMerchantTransferAuthorizationJsapiBridgeConfig(mchId, appId, packageInfo) {
1146
+ return {
1147
+ mchId,
1148
+ appId,
1149
+ package: packageInfo
1150
+ };
1151
+ }
1152
+ var PARKING_SERVICE_APPID = "wxbcad394b3d99dac9";
1153
+ var PARKING_SERVICE_PATH = "/pages/auth-creditpay/auth-creditpay";
1154
+ var PARKING_REPAY_APPID = "wx5e73c65404eee268";
1155
+ var PARKING_REPAY_PATH = "pages/invest_list/invest_list";
1156
+ function buildParkingQueryString(mchid, openid, plateNumber, plateColor) {
1157
+ const params = new URLSearchParams({
1158
+ mchid,
1159
+ openid,
1160
+ plate_number: plateNumber,
1161
+ plate_color: plateColor,
1162
+ trade_scene: "PARKING"
1163
+ });
1164
+ return params.toString();
1165
+ }
1166
+ function buildParkingMiniProgramBridgeConfig(mchid, openid, plateNumber, plateColor) {
1167
+ return {
1168
+ appId: PARKING_SERVICE_APPID,
1169
+ path: PARKING_SERVICE_PATH,
1170
+ extraData: {
1171
+ mchid,
1172
+ openid,
1173
+ plate_number: plateNumber,
1174
+ plate_color: plateColor,
1175
+ trade_scene: "PARKING"
999
1176
  }
1000
- if (params.outTradeNo) {
1001
- return this.client.get(
1002
- `/v3/pay/transactions/out-trade-no/${params.outTradeNo}`,
1003
- { mchid: this.client.mchid }
1004
- );
1177
+ };
1178
+ }
1179
+ function buildParkingH5BridgeUrl(mchid, openid, plateNumber, plateColor) {
1180
+ const queryString = buildParkingQueryString(mchid, openid, plateNumber, plateColor);
1181
+ return `${PARKING_SERVICE_PATH}?${queryString}`;
1182
+ }
1183
+ function buildParkingAppBridgePath(mchid, openid, plateNumber, plateColor) {
1184
+ const queryString = buildParkingQueryString(mchid, openid, plateNumber, plateColor);
1185
+ return `${PARKING_SERVICE_PATH}?${queryString}`;
1186
+ }
1187
+ function buildParkingRepayBridgeConfig(mchid, openid) {
1188
+ return {
1189
+ appId: PARKING_REPAY_APPID,
1190
+ path: PARKING_REPAY_PATH,
1191
+ extraData: {
1192
+ mchid,
1193
+ nonce_str: generateNonceStr(),
1194
+ openid
1005
1195
  }
1006
- throw new Error("outTradeNo \u6216 transactionId \u5FC5\u987B\u63D0\u4F9B\u5176\u4E2D\u4E00\u4E2A");
1007
- }
1008
- /**
1009
- * 关闭订单
1010
- *
1011
- * 对于未支付的订单,商户可通过此接口关闭订单。
1012
- * 关单后,订单状态从未支付(NOTPAY)流转为已关闭(CLOSED)。
1013
- *
1014
- * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791860
1015
- */
1016
- async closeOrder(outTradeNo, request) {
1196
+ };
1197
+ }
1198
+ var H5_COUPON_URL = "https://action.weixin.qq.com/busifavor/getcouponinfo";
1199
+ function buildH5CouponUrl(params, signKey) {
1200
+ const signFields = {
1201
+ stock_id: params.stock_id,
1202
+ out_request_no: params.out_request_no,
1203
+ send_coupon_merchant: params.send_coupon_merchant,
1204
+ open_id: params.open_id
1205
+ };
1206
+ if (params.coupon_code) {
1207
+ signFields["coupon_code"] = params.coupon_code;
1208
+ }
1209
+ const sortedKeys = Object.keys(signFields).sort();
1210
+ const signStr = sortedKeys.map((k) => `${k}=${signFields[k]}`).join("&") + `&key=${signKey}`;
1211
+ const sign2 = crypto2.createHmac("sha256", signKey).update(signStr).digest("hex").toUpperCase();
1212
+ const urlParams = new URLSearchParams({
1213
+ stock_id: params.stock_id,
1214
+ out_request_no: params.out_request_no,
1215
+ sign: sign2,
1216
+ send_coupon_merchant: params.send_coupon_merchant,
1217
+ open_id: params.open_id
1218
+ });
1219
+ if (params.coupon_code) {
1220
+ urlParams.set("coupon_code", params.coupon_code);
1221
+ }
1222
+ if (params.customize_send_time) {
1223
+ urlParams.set("customize_send_time", params.customize_send_time);
1224
+ }
1225
+ return `${H5_COUPON_URL}?${urlParams.toString()}#wechat_pay&wechat_redirect`;
1226
+ }
1227
+ function buildPayScoreDetailJsapiBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
1228
+ const timestamp = String(Math.floor(Date.now() / 1e3));
1229
+ const nonceStr = generateNonceStr();
1230
+ const sign2 = generatePayScorePaySign(
1231
+ appId,
1232
+ timestamp,
1233
+ nonceStr,
1234
+ serviceId,
1235
+ outOrderNo,
1236
+ privateKey
1237
+ );
1238
+ return {
1239
+ appid: appId,
1240
+ mchid: mchId,
1241
+ service_id: serviceId,
1242
+ out_order_no: outOrderNo,
1243
+ timestamp,
1244
+ nonce_str: nonceStr,
1245
+ sign_type: "RSA",
1246
+ sign: sign2
1247
+ };
1248
+ }
1249
+ function buildPayScoreDetailMiniProgramBridgeConfig(mchId, serviceId, outOrderNo, appId, privateKey) {
1250
+ const timestamp = String(Math.floor(Date.now() / 1e3));
1251
+ const nonceStr = generateNonceStr();
1252
+ const sign2 = generatePayScorePaySign(
1253
+ appId,
1254
+ timestamp,
1255
+ nonceStr,
1256
+ serviceId,
1257
+ outOrderNo,
1258
+ privateKey
1259
+ );
1260
+ return {
1261
+ mchid: mchId,
1262
+ service_id: serviceId,
1263
+ out_order_no: outOrderNo,
1264
+ timestamp,
1265
+ nonce_str: nonceStr,
1266
+ sign_type: "RSA",
1267
+ sign: sign2
1268
+ };
1269
+ }
1270
+ function buildPayScoreDetailAppBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
1271
+ const timestamp = String(Math.floor(Date.now() / 1e3));
1272
+ const nonceStr = generateNonceStr();
1273
+ const sign2 = generatePayScorePaySign(
1274
+ appId,
1275
+ timestamp,
1276
+ nonceStr,
1277
+ serviceId,
1278
+ outOrderNo,
1279
+ privateKey
1280
+ );
1281
+ return {
1282
+ appid: appId,
1283
+ mchid: mchId,
1284
+ service_id: serviceId,
1285
+ out_order_no: outOrderNo,
1286
+ timestamp,
1287
+ nonce_str: nonceStr,
1288
+ sign_type: "RSA",
1289
+ sign: sign2
1290
+ };
1291
+ }
1292
+ var MED_INS_APPID = "wxbcad394b3d99dac9";
1293
+ var MED_INS_PATH = "/pages/med-ins/pay/pay";
1294
+ function buildMedInsMiniProgramBridgeConfig(mchid, mixTradeNo) {
1295
+ return {
1296
+ appId: MED_INS_APPID,
1297
+ path: MED_INS_PATH,
1298
+ extraData: {
1299
+ mchid,
1300
+ mix_trade_no: mixTradeNo
1301
+ }
1302
+ };
1303
+ }
1304
+ function buildMedInsJsapiBridgeConfig(appId, mchId, mixTradeNo, privateKey) {
1305
+ const timestamp = String(Math.floor(Date.now() / 1e3));
1306
+ const nonceStr = generateNonceStr();
1307
+ const packageStr = `mchid=${mchId}&mix_trade_no=${mixTradeNo}`;
1308
+ const signString = `${appId}
1309
+ ${timestamp}
1310
+ ${nonceStr}
1311
+ ${packageStr}
1312
+ `;
1313
+ const signer = crypto2.createSign("RSA-SHA256");
1314
+ signer.update(signString);
1315
+ signer.end();
1316
+ const sign2 = signer.sign(privateKey, "base64");
1317
+ return {
1318
+ appid: appId,
1319
+ mchid: mchId,
1320
+ mix_trade_no: mixTradeNo,
1321
+ timestamp,
1322
+ nonce_str: nonceStr,
1323
+ sign_type: "RSA",
1324
+ sign: sign2
1325
+ };
1326
+ }
1327
+
1328
+ // src/services/jsapi.ts
1329
+ var JsapiService = class {
1330
+ client;
1331
+ constructor(client) {
1332
+ this.client = client;
1333
+ }
1334
+ /**
1335
+ * JSAPI/小程序下单
1336
+ *
1337
+ * 商户通过此接口生成预付单并获取 prepay_id。
1338
+ * prepay_id 有效期为 2 小时,超过 2 小时需重新请求。
1339
+ *
1340
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791856
1341
+ */
1342
+ async createOrder(request) {
1343
+ return this.client.post("/v3/pay/transactions/jsapi", request);
1344
+ }
1345
+ /**
1346
+ * 查询 JSAPI 支付订单
1347
+ *
1348
+ * 支持通过微信支付订单号或商户订单号查询订单状态。
1349
+ *
1350
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791858 (微信支付订单号查询订单)
1351
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791859 (商户订单号查询订单)
1352
+ */
1353
+ async queryOrderById(params) {
1354
+ if (params.transactionId) {
1355
+ return this.queryOrderByTransactionId(params.transactionId);
1356
+ }
1357
+ if (params.outTradeNo) {
1358
+ return this.queryOrderByOutTradeNo(params.outTradeNo);
1359
+ }
1360
+ throw new Error("outTradeNo \u6216 transactionId \u5FC5\u987B\u63D0\u4F9B\u5176\u4E2D\u4E00\u4E2A");
1361
+ }
1362
+ /**
1363
+ * 通过商户订单号查询订单
1364
+ *
1365
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791859
1366
+ */
1367
+ async queryOrderByOutTradeNo(outTradeNo) {
1368
+ return this.client.get(`/v3/pay/transactions/out-trade-no/${outTradeNo}`, {
1369
+ mchid: this.client.mchid
1370
+ });
1371
+ }
1372
+ /**
1373
+ * 通过微信支付订单号查询订单
1374
+ *
1375
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791858
1376
+ */
1377
+ async queryOrderByTransactionId(transactionId) {
1378
+ return this.client.get(`/v3/pay/transactions/id/${transactionId}`, {
1379
+ mchid: this.client.mchid
1380
+ });
1381
+ }
1382
+ /**
1383
+ * JSAPI 下单并生成调起支付参数
1384
+ *
1385
+ * 封装了下单和调起支付参数生成两个步骤,一次调用即可获得
1386
+ * prepay_id 和前端 WeixinJSBridge.invoke() 所需的全部参数。
1387
+ *
1388
+ * @param request - 下单请求参数(需包含 appid)
1389
+ * @param privateKey - 商户私钥
1390
+ * @returns 下单响应 + 调起支付参数
1391
+ */
1392
+ async prepayWithRequestPayment(request, privateKey) {
1393
+ const response = await this.createOrder(request);
1394
+ const bridgeConfig = buildJsapiBridgeConfig(request.appid, response.data.prepay_id, privateKey);
1395
+ return { ...response, bridgeConfig };
1396
+ }
1397
+ /**
1398
+ * 关闭订单
1399
+ *
1400
+ * 对于未支付的订单,商户可通过此接口关闭订单。
1401
+ * 关单后,订单状态从未支付(NOTPAY)流转为已关闭(CLOSED)。
1402
+ *
1403
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4012791860
1404
+ */
1405
+ async closeOrder(outTradeNo, request) {
1017
1406
  return this.client.post(`/v3/pay/transactions/out-trade-no/${outTradeNo}/close`, request);
1018
1407
  }
1019
1408
  /**
@@ -1117,19 +1506,23 @@ var H5Service = class {
1117
1506
  */
1118
1507
  async queryOrderById(params) {
1119
1508
  if (params.transactionId) {
1120
- return this.client.get(
1121
- `/v3/pay/transactions/id/${params.transactionId}`,
1122
- { mchid: this.client.mchid }
1123
- );
1509
+ return this.queryOrderByTransactionId(params.transactionId);
1124
1510
  }
1125
1511
  if (params.outTradeNo) {
1126
- return this.client.get(
1127
- `/v3/pay/transactions/out-trade-no/${params.outTradeNo}`,
1128
- { mchid: this.client.mchid }
1129
- );
1512
+ return this.queryOrderByOutTradeNo(params.outTradeNo);
1130
1513
  }
1131
1514
  throw new Error("outTradeNo \u6216 transactionId \u5FC5\u987B\u63D0\u4F9B\u5176\u4E2D\u4E00\u4E2A");
1132
1515
  }
1516
+ async queryOrderByOutTradeNo(outTradeNo) {
1517
+ return this.client.get(`/v3/pay/transactions/out-trade-no/${outTradeNo}`, {
1518
+ mchid: this.client.mchid
1519
+ });
1520
+ }
1521
+ async queryOrderByTransactionId(transactionId) {
1522
+ return this.client.get(`/v3/pay/transactions/id/${transactionId}`, {
1523
+ mchid: this.client.mchid
1524
+ });
1525
+ }
1133
1526
  /**
1134
1527
  * 关闭订单
1135
1528
  *
@@ -1242,19 +1635,33 @@ var AppService = class {
1242
1635
  */
1243
1636
  async queryOrderById(params) {
1244
1637
  if (params.transactionId) {
1245
- return this.client.get(
1246
- `/v3/pay/transactions/id/${params.transactionId}`,
1247
- { mchid: this.client.mchid }
1248
- );
1638
+ return this.queryOrderByTransactionId(params.transactionId);
1249
1639
  }
1250
1640
  if (params.outTradeNo) {
1251
- return this.client.get(
1252
- `/v3/pay/transactions/out-trade-no/${params.outTradeNo}`,
1253
- { mchid: this.client.mchid }
1254
- );
1641
+ return this.queryOrderByOutTradeNo(params.outTradeNo);
1255
1642
  }
1256
1643
  throw new Error("outTradeNo \u6216 transactionId \u5FC5\u987B\u63D0\u4F9B\u5176\u4E2D\u4E00\u4E2A");
1257
1644
  }
1645
+ async queryOrderByOutTradeNo(outTradeNo) {
1646
+ return this.client.get(`/v3/pay/transactions/out-trade-no/${outTradeNo}`, {
1647
+ mchid: this.client.mchid
1648
+ });
1649
+ }
1650
+ async queryOrderByTransactionId(transactionId) {
1651
+ return this.client.get(`/v3/pay/transactions/id/${transactionId}`, {
1652
+ mchid: this.client.mchid
1653
+ });
1654
+ }
1655
+ async prepayWithRequestPayment(request, privateKey) {
1656
+ const response = await this.createOrder(request);
1657
+ const bridgeConfig = buildAppBridgeConfig(
1658
+ request.appid,
1659
+ this.client.mchid,
1660
+ response.data.prepay_id,
1661
+ privateKey
1662
+ );
1663
+ return { ...response, bridgeConfig };
1664
+ }
1258
1665
  /**
1259
1666
  * 关闭订单
1260
1667
  *
@@ -1370,19 +1777,23 @@ var NativeService = class {
1370
1777
  */
1371
1778
  async queryOrderById(params) {
1372
1779
  if (params.transactionId) {
1373
- return this.client.get(
1374
- `/v3/pay/transactions/id/${params.transactionId}`,
1375
- { mchid: this.client.mchid }
1376
- );
1780
+ return this.queryOrderByTransactionId(params.transactionId);
1377
1781
  }
1378
1782
  if (params.outTradeNo) {
1379
- return this.client.get(
1380
- `/v3/pay/transactions/out-trade-no/${params.outTradeNo}`,
1381
- { mchid: this.client.mchid }
1382
- );
1783
+ return this.queryOrderByOutTradeNo(params.outTradeNo);
1383
1784
  }
1384
1785
  throw new Error("outTradeNo \u6216 transactionId \u5FC5\u987B\u63D0\u4F9B\u5176\u4E2D\u4E00\u4E2A");
1385
1786
  }
1787
+ async queryOrderByOutTradeNo(outTradeNo) {
1788
+ return this.client.get(`/v3/pay/transactions/out-trade-no/${outTradeNo}`, {
1789
+ mchid: this.client.mchid
1790
+ });
1791
+ }
1792
+ async queryOrderByTransactionId(transactionId) {
1793
+ return this.client.get(`/v3/pay/transactions/id/${transactionId}`, {
1794
+ mchid: this.client.mchid
1795
+ });
1796
+ }
1386
1797
  /**
1387
1798
  * 关闭订单
1388
1799
  *
@@ -2634,8 +3045,6 @@ var ParkingService = class {
2634
3045
  );
2635
3046
  }
2636
3047
  };
2637
-
2638
- // src/services/bill.ts
2639
3048
  var BillService = class {
2640
3049
  constructor(client) {
2641
3050
  this.client = client;
@@ -2717,6 +3126,45 @@ var BillService = class {
2717
3126
  tar_type: params.tar_type
2718
3127
  });
2719
3128
  }
3129
+ /**
3130
+ * 申请单个子商户资金账单
3131
+ *
3132
+ * 服务商调用该接口获取单个子商户资金账单的下载链接。
3133
+ * 返回的账单文件使用 AES-256-GCM 加密,需用子商户的 API 证书私钥解密。
3134
+ *
3135
+ * @param params - 账单请求参数
3136
+ * @returns 加密账单下载信息
3137
+ *
3138
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4013071235
3139
+ */
3140
+ async applySubMerchantFundFlowBill(params) {
3141
+ return this.client.get("/v3/bill/sub-merchant-fundflowbill", {
3142
+ sub_mchid: params.sub_mchid,
3143
+ bill_date: params.bill_date,
3144
+ account_type: params.account_type,
3145
+ algorithm: params.algorithm,
3146
+ tar_type: params.tar_type
3147
+ });
3148
+ }
3149
+ /**
3150
+ * 申请二级商户资金账单
3151
+ *
3152
+ * 电商平台调用该接口获取二级商户资金账单的下载链接。
3153
+ * 返回的账单文件使用 AES-256-GCM 加密,需用平台的 API 证书私钥解密。
3154
+ *
3155
+ * @param params - 账单请求参数
3156
+ * @returns 加密账单下载信息
3157
+ *
3158
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4013071235
3159
+ */
3160
+ async applyEcommerceFundFlowBill(params) {
3161
+ return this.client.get("/v3/ecommerce/bill/fundflowbill", {
3162
+ bill_date: params.bill_date,
3163
+ account_type: params.account_type,
3164
+ tar_type: params.tar_type,
3165
+ algorithm: params.algorithm
3166
+ });
3167
+ }
2720
3168
  /**
2721
3169
  * 下载账单文件
2722
3170
  *
@@ -2754,6 +3202,41 @@ var BillService = class {
2754
3202
  async downloadBill(downloadUrl) {
2755
3203
  return this.client.downloadRaw(downloadUrl);
2756
3204
  }
3205
+ /**
3206
+ * 下载账单文件并自动解压、校验摘要
3207
+ *
3208
+ * 封装了完整的账单下载流程:
3209
+ * 1. 下载原始文件
3210
+ * 2. 自动检测并解压 GZIP 格式
3211
+ * 3. 可选:与申请账单返回的 hash_value 进行 SHA-1 摘要校验
3212
+ *
3213
+ * @param downloadUrl - 申请账单接口返回的 download_url
3214
+ * @param expectedDigest - 期望的 SHA-1 摘要值(来自申请账单接口返回的 hash_value)
3215
+ * @returns 包含解压后账单文件 Buffer 的响应
3216
+ * @throws 如果摘要校验失败
3217
+ *
3218
+ * @example
3219
+ * ```ts
3220
+ * const result = await billService.downloadAndVerifyBill(
3221
+ * applyResult.data.download_url,
3222
+ * applyResult.data.hash_value,
3223
+ * );
3224
+ * ```
3225
+ */
3226
+ async downloadAndVerifyBill(downloadUrl, expectedDigest) {
3227
+ const response = await this.client.downloadRaw(downloadUrl);
3228
+ let data = response.data;
3229
+ if (data.length >= 2 && data[0] === 31 && data[1] === 139) {
3230
+ data = zlib.gunzipSync(data);
3231
+ }
3232
+ if (expectedDigest) {
3233
+ const actualDigest = crypto2.createHash("sha1").update(data).digest("hex");
3234
+ if (actualDigest.toLowerCase() !== expectedDigest.toLowerCase()) {
3235
+ throw new Error(`\u8D26\u5355\u6458\u8981\u6821\u9A8C\u5931\u8D25: \u671F\u671B ${expectedDigest}, \u5B9E\u9645 ${actualDigest}`);
3236
+ }
3237
+ }
3238
+ return { ...response, data };
3239
+ }
2757
3240
  };
2758
3241
  var SUPPORTED_SIGNATURE_TYPES = /* @__PURE__ */ new Set(["WECHATPAY2-SHA256-RSA2048"]);
2759
3242
  var DEFAULT_SIGNATURE_TYPE = "WECHATPAY2-SHA256-RSA2048";
@@ -4537,344 +5020,922 @@ var MerchantExclusiveCouponService = class {
4537
5020
  return this.client.get(`/v3/marketing/busifavor/users/coupons/${couponId}`, params);
4538
5021
  }
4539
5022
  };
4540
- function generateAppPaySign(appId, timeStamp, nonceStr, prepayId, privateKey) {
4541
- const signString = `${appId}
4542
- ${timeStamp}
4543
- ${nonceStr}
4544
- prepay_id=${prepayId}
4545
- `;
4546
- const signer = crypto2.createSign("RSA-SHA256");
4547
- signer.update(signString);
4548
- signer.end();
4549
- return signer.sign(privateKey, "base64");
4550
- }
4551
- function buildAppBridgeConfig(appId, partnerId, prepayId, privateKey) {
4552
- const timeStamp = String(Math.floor(Date.now() / 1e3));
4553
- const nonceStr = generateNonceStr();
4554
- const sign2 = generateAppPaySign(appId, timeStamp, nonceStr, prepayId, privateKey);
4555
- return {
4556
- appId,
4557
- partnerId,
4558
- prepayId,
4559
- packageValue: "Sign=WXPay",
4560
- nonceStr,
4561
- timeStamp,
4562
- sign: sign2
4563
- };
4564
- }
4565
- function generatePaySign(appId, timeStamp, nonceStr, prepayId, privateKey) {
4566
- const signString = `${appId}
4567
- ${timeStamp}
4568
- ${nonceStr}
4569
- prepay_id=${prepayId}
4570
- `;
4571
- const signer = crypto2.createSign("RSA-SHA256");
4572
- signer.update(signString);
4573
- signer.end();
4574
- return signer.sign(privateKey, "base64");
4575
- }
4576
- function generateNonceStr() {
4577
- return crypto2.randomUUID().replace(/-/g, "");
4578
- }
4579
- function buildJsapiBridgeConfig(appId, prepayId, privateKey) {
4580
- const timeStamp = String(Math.floor(Date.now() / 1e3));
4581
- const nonceStr = generateNonceStr();
4582
- const paySign = generatePaySign(appId, timeStamp, nonceStr, prepayId, privateKey);
4583
- return {
4584
- appId,
4585
- timeStamp,
4586
- nonceStr,
4587
- package: `prepay_id=${prepayId}`,
4588
- signType: "RSA",
4589
- paySign
4590
- };
4591
- }
4592
- function buildMiniProgramBridgeConfig(appId, prepayId, privateKey) {
4593
- const timeStamp = String(Math.floor(Date.now() / 1e3));
4594
- const nonceStr = generateNonceStr();
4595
- const paySign = generatePaySign(appId, timeStamp, nonceStr, prepayId, privateKey);
4596
- return {
4597
- timeStamp,
4598
- nonceStr,
4599
- package: `prepay_id=${prepayId}`,
4600
- signType: "RSA",
4601
- paySign
4602
- };
4603
- }
4604
- function generatePayScorePaySign(appId, timeStamp, nonceStr, serviceId, outOrderNo, privateKey) {
4605
- const packageStr = `service_id=${serviceId}&out_order_no=${outOrderNo}&need_sign_type=RSA`;
4606
- const signString = `${appId}
4607
- ${timeStamp}
4608
- ${nonceStr}
4609
- ${packageStr}
4610
- `;
4611
- const signer = crypto2.createSign("RSA-SHA256");
4612
- signer.update(signString);
4613
- signer.end();
4614
- return signer.sign(privateKey, "base64");
4615
- }
4616
- function buildPayScoreJsapiBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
4617
- const timestamp = String(Math.floor(Date.now() / 1e3));
4618
- const nonceStr = generateNonceStr();
4619
- const sign2 = generatePayScorePaySign(
4620
- appId,
4621
- timestamp,
4622
- nonceStr,
4623
- serviceId,
4624
- outOrderNo,
4625
- privateKey
4626
- );
4627
- return {
4628
- appid: appId,
4629
- mchid: mchId,
4630
- service_id: serviceId,
4631
- out_order_no: outOrderNo,
4632
- timestamp,
4633
- nonce_str: nonceStr,
4634
- sign_type: "RSA",
4635
- sign: sign2
4636
- };
4637
- }
4638
- function buildPayScoreMiniProgramBridgeConfig(mchId, serviceId, outOrderNo, appId, privateKey) {
4639
- const timestamp = String(Math.floor(Date.now() / 1e3));
4640
- const nonceStr = generateNonceStr();
4641
- const sign2 = generatePayScorePaySign(
4642
- appId,
4643
- timestamp,
4644
- nonceStr,
4645
- serviceId,
4646
- outOrderNo,
4647
- privateKey
4648
- );
4649
- return {
4650
- mchid: mchId,
4651
- service_id: serviceId,
4652
- out_order_no: outOrderNo,
4653
- timestamp,
4654
- nonce_str: nonceStr,
4655
- sign_type: "RSA",
4656
- sign: sign2
4657
- };
4658
- }
4659
- function buildPayScoreAppBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
4660
- const timestamp = String(Math.floor(Date.now() / 1e3));
4661
- const nonceStr = generateNonceStr();
4662
- const sign2 = generatePayScorePaySign(
4663
- appId,
4664
- timestamp,
4665
- nonceStr,
4666
- serviceId,
4667
- outOrderNo,
4668
- privateKey
4669
- );
4670
- return {
4671
- appid: appId,
4672
- mchid: mchId,
4673
- service_id: serviceId,
4674
- out_order_no: outOrderNo,
4675
- timestamp,
4676
- nonce_str: nonceStr,
4677
- sign_type: "RSA",
4678
- sign: sign2
4679
- };
4680
- }
4681
- function buildMerchantTransferJsapiBridgeConfig(mchId, appId, packageInfo) {
4682
- return {
4683
- mchId,
4684
- appId,
4685
- package: packageInfo
4686
- };
4687
- }
4688
- function buildMerchantTransferMiniProgramBridgeConfig(mchId, appId, packageInfo) {
4689
- return {
4690
- mchId,
4691
- appId,
4692
- package: packageInfo
4693
- };
4694
- }
4695
- function buildMerchantTransferAuthorizationJsapiBridgeConfig(mchId, appId, packageInfo) {
4696
- return {
4697
- mchId,
4698
- appId,
4699
- package: packageInfo
4700
- };
4701
- }
4702
- var PARKING_SERVICE_APPID = "wxbcad394b3d99dac9";
4703
- var PARKING_SERVICE_PATH = "/pages/auth-creditpay/auth-creditpay";
4704
- var PARKING_REPAY_APPID = "wx5e73c65404eee268";
4705
- var PARKING_REPAY_PATH = "pages/invest_list/invest_list";
4706
- function buildParkingQueryString(mchid, openid, plateNumber, plateColor) {
4707
- const params = new URLSearchParams({
4708
- mchid,
4709
- openid,
4710
- plate_number: plateNumber,
4711
- plate_color: plateColor,
4712
- trade_scene: "PARKING"
4713
- });
4714
- return params.toString();
4715
- }
4716
- function buildParkingMiniProgramBridgeConfig(mchid, openid, plateNumber, plateColor) {
4717
- return {
4718
- appId: PARKING_SERVICE_APPID,
4719
- path: PARKING_SERVICE_PATH,
4720
- extraData: {
4721
- mchid,
4722
- openid,
4723
- plate_number: plateNumber,
4724
- plate_color: plateColor,
4725
- trade_scene: "PARKING"
4726
- }
4727
- };
4728
- }
4729
- function buildParkingH5BridgeUrl(mchid, openid, plateNumber, plateColor) {
4730
- const queryString = buildParkingQueryString(mchid, openid, plateNumber, plateColor);
4731
- return `${PARKING_SERVICE_PATH}?${queryString}`;
4732
- }
4733
- function buildParkingAppBridgePath(mchid, openid, plateNumber, plateColor) {
4734
- const queryString = buildParkingQueryString(mchid, openid, plateNumber, plateColor);
4735
- return `${PARKING_SERVICE_PATH}?${queryString}`;
4736
- }
4737
- function buildParkingRepayBridgeConfig(mchid, openid) {
4738
- return {
4739
- appId: PARKING_REPAY_APPID,
4740
- path: PARKING_REPAY_PATH,
4741
- extraData: {
4742
- mchid,
4743
- nonce_str: generateNonceStr(),
4744
- openid
4745
- }
4746
- };
4747
- }
4748
- var H5_COUPON_URL = "https://action.weixin.qq.com/busifavor/getcouponinfo";
4749
- function buildH5CouponUrl(params, signKey) {
4750
- const signFields = {
4751
- stock_id: params.stock_id,
4752
- out_request_no: params.out_request_no,
4753
- send_coupon_merchant: params.send_coupon_merchant,
4754
- open_id: params.open_id
4755
- };
4756
- if (params.coupon_code) {
4757
- signFields["coupon_code"] = params.coupon_code;
5023
+
5024
+ // src/services/refund.ts
5025
+ var RefundService = class {
5026
+ client;
5027
+ constructor(client) {
5028
+ this.client = client;
5029
+ }
5030
+ /**
5031
+ * 申请退款
5032
+ *
5033
+ * 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,
5034
+ * 卖家可以通过退款接口将支付款退还给买家。
5035
+ * 支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。
5036
+ * 一笔退款失败后重新提交,要采用原来的退款单号。
5037
+ *
5038
+ * @param request - 退款请求参数,包含商户订单号、退款单号、退款金额等信息
5039
+ * @returns 退款申请结果,包含微信退款单号、退款状态等
5040
+ *
5041
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4013071036
5042
+ */
5043
+ async create(request) {
5044
+ return this.client.post("/v3/refund/domestic/refunds", request);
5045
+ }
5046
+ /**
5047
+ * 查询单笔退款(通过商户退款单号)
5048
+ *
5049
+ * 提交退款申请后,通过调用该接口查询退款状态。
5050
+ * 退款有一定延时,建议在提交退款申请后1分钟再查询退款状态。
5051
+ *
5052
+ * @param params - 查询参数,需包含 outRefundNo(商户退款单号)
5053
+ * @returns 退款单详情,包含退款状态、退款金额、退款渠道等
5054
+ *
5055
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4013071041
5056
+ */
5057
+ async queryByOutRefundNo(params) {
5058
+ return this.client.get(
5059
+ `/v3/refund/domestic/refunds/${params.outRefundNo}`
5060
+ );
5061
+ }
5062
+ /**
5063
+ * 发起异常退款
5064
+ *
5065
+ * 当退款因为用户账户异常而无法原路退回时,可使用此接口将退款资金
5066
+ * 退到用户的其他银行卡或商户的银行账户。
5067
+ *
5068
+ * @param refundId - 微信支付退款单号
5069
+ * @param request - 异常退款请求参数,包含退款方式、收款账户信息等
5070
+ * @returns 异常退款处理结果
5071
+ *
5072
+ * @see https://pay.weixin.qq.com/doc/v3/merchant/4013071193
5073
+ */
5074
+ async applyAbnormalRefund(refundId, request) {
5075
+ return this.client.post(
5076
+ `/v3/refund/domestic/refunds/${refundId}/apply-abnormal-refund`,
5077
+ request
5078
+ );
5079
+ }
5080
+ };
5081
+
5082
+ // src/services/partner-jsapi.ts
5083
+ var PartnerJsapiService = class {
5084
+ client;
5085
+ constructor(client) {
5086
+ this.client = client;
5087
+ }
5088
+ /**
5089
+ * 服务商 JSAPI/小程序下单
5090
+ *
5091
+ * 服务商通过此接口代特约商户发起 JSAPI 支付下单,获取 prepay_id。
5092
+ *
5093
+ * @param request - 下单请求参数,需包含 sp_appid、sp_mchid、sub_mchid 等
5094
+ * @returns 下单结果,包含 prepay_id
5095
+ *
5096
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012738519
5097
+ */
5098
+ async createOrder(request) {
5099
+ return this.client.post(
5100
+ "/v3/pay/partner/transactions/jsapi",
5101
+ request
5102
+ );
5103
+ }
5104
+ /**
5105
+ * 通过商户订单号查询订单
5106
+ *
5107
+ * @param params - 查询参数,需包含 out_trade_no、sp_mchid、sub_mchid
5108
+ * @returns 订单详情
5109
+ *
5110
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012739008
5111
+ */
5112
+ async queryOrderByOutTradeNo(params) {
5113
+ return this.client.get(
5114
+ `/v3/pay/partner/transactions/out-trade-no/${params.out_trade_no}`,
5115
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5116
+ );
5117
+ }
5118
+ /**
5119
+ * 通过微信支付订单号查询订单
5120
+ *
5121
+ * @param params - 查询参数,需包含 transaction_id、sp_mchid、sub_mchid
5122
+ * @returns 订单详情
5123
+ *
5124
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012738964
5125
+ */
5126
+ async queryOrderByTransactionId(params) {
5127
+ return this.client.get(
5128
+ `/v3/pay/partner/transactions/id/${params.transaction_id}`,
5129
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5130
+ );
5131
+ }
5132
+ /**
5133
+ * 关闭订单
5134
+ *
5135
+ * 对于未支付的订单,服务商可通过此接口代特约商户关闭订单。
5136
+ *
5137
+ * @param outTradeNo - 商户订单号
5138
+ * @param request - 关单请求参数,需包含 sp_mchid、sub_mchid
5139
+ *
5140
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012739019
5141
+ */
5142
+ async closeOrder(outTradeNo, request) {
5143
+ return this.client.post(
5144
+ `/v3/pay/partner/transactions/out-trade-no/${outTradeNo}/close`,
5145
+ request
5146
+ );
5147
+ }
5148
+ /**
5149
+ * 服务商 JSAPI 下单并生成调起支付参数
5150
+ *
5151
+ * 封装了下单和调起支付参数生成两个步骤,一次调用即可获得
5152
+ * prepay_id 和前端 WeixinJSBridge.invoke() 所需的全部参数。
5153
+ *
5154
+ * @param request - 下单请求参数
5155
+ * @param privateKey - 商户私钥,用于生成调起支付签名
5156
+ * @returns 下单响应 + 调起支付参数
5157
+ */
5158
+ async prepayWithRequestPayment(request, privateKey) {
5159
+ const response = await this.createOrder(request);
5160
+ const bridgeConfig = buildJsapiBridgeConfig(
5161
+ request.sp_appid,
5162
+ response.data.prepay_id,
5163
+ privateKey
5164
+ );
5165
+ return { ...response, bridgeConfig };
5166
+ }
5167
+ };
5168
+
5169
+ // src/services/partner-app.ts
5170
+ var PartnerAppService = class {
5171
+ client;
5172
+ constructor(client) {
5173
+ this.client = client;
5174
+ }
5175
+ /**
5176
+ * 服务商 APP 下单
5177
+ *
5178
+ * @param request - 下单请求参数
5179
+ * @returns 下单结果,包含 prepay_id
5180
+ *
5181
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4013080231
5182
+ */
5183
+ async createOrder(request) {
5184
+ return this.client.post(
5185
+ "/v3/pay/partner/transactions/app",
5186
+ request
5187
+ );
5188
+ }
5189
+ /**
5190
+ * 通过商户订单号查询订单
5191
+ *
5192
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4013080235
5193
+ */
5194
+ async queryOrderByOutTradeNo(params) {
5195
+ return this.client.get(
5196
+ `/v3/pay/partner/transactions/out-trade-no/${params.out_trade_no}`,
5197
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5198
+ );
5199
+ }
5200
+ /**
5201
+ * 通过微信支付订单号查询订单
5202
+ *
5203
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4013080234
5204
+ */
5205
+ async queryOrderByTransactionId(params) {
5206
+ return this.client.get(
5207
+ `/v3/pay/partner/transactions/id/${params.transaction_id}`,
5208
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5209
+ );
5210
+ }
5211
+ /**
5212
+ * 关闭订单
5213
+ *
5214
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4013080236
5215
+ */
5216
+ async closeOrder(outTradeNo, request) {
5217
+ return this.client.post(
5218
+ `/v3/pay/partner/transactions/out-trade-no/${outTradeNo}/close`,
5219
+ request
5220
+ );
5221
+ }
5222
+ /**
5223
+ * 服务商 APP 下单并生成调起支付参数
5224
+ *
5225
+ * @param request - 下单请求参数
5226
+ * @param privateKey - 商户私钥
5227
+ * @returns 下单响应 + 调起支付参数
5228
+ */
5229
+ async prepayWithRequestPayment(request, privateKey) {
5230
+ const response = await this.createOrder(request);
5231
+ const bridgeConfig = buildAppBridgeConfig(
5232
+ request.sp_appid,
5233
+ this.client.mchid,
5234
+ response.data.prepay_id,
5235
+ privateKey
5236
+ );
5237
+ return { ...response, bridgeConfig };
5238
+ }
5239
+ };
5240
+
5241
+ // src/services/partner-h5.ts
5242
+ var PartnerH5Service = class {
5243
+ client;
5244
+ constructor(client) {
5245
+ this.client = client;
5246
+ }
5247
+ /**
5248
+ * 服务商 H5 下单
5249
+ *
5250
+ * @param request - 下单请求参数,需包含 scene_info.h5_info
5251
+ * @returns 下单结果,包含 h5_url
5252
+ *
5253
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012738604
5254
+ */
5255
+ async createOrder(request) {
5256
+ return this.client.post(
5257
+ "/v3/pay/partner/transactions/h5",
5258
+ request
5259
+ );
5260
+ }
5261
+ /**
5262
+ * 通过商户订单号查询订单
5263
+ *
5264
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012759661
5265
+ */
5266
+ async queryOrderByOutTradeNo(params) {
5267
+ return this.client.get(
5268
+ `/v3/pay/partner/transactions/out-trade-no/${params.out_trade_no}`,
5269
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5270
+ );
5271
+ }
5272
+ /**
5273
+ * 通过微信支付订单号查询订单
5274
+ *
5275
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012738969
5276
+ */
5277
+ async queryOrderByTransactionId(params) {
5278
+ return this.client.get(
5279
+ `/v3/pay/partner/transactions/id/${params.transaction_id}`,
5280
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5281
+ );
5282
+ }
5283
+ /**
5284
+ * 关闭订单
5285
+ *
5286
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012759669
5287
+ */
5288
+ async closeOrder(outTradeNo, request) {
5289
+ return this.client.post(
5290
+ `/v3/pay/partner/transactions/out-trade-no/${outTradeNo}/close`,
5291
+ request
5292
+ );
5293
+ }
5294
+ };
5295
+
5296
+ // src/services/partner-native.ts
5297
+ var PartnerNativeService = class {
5298
+ client;
5299
+ constructor(client) {
5300
+ this.client = client;
5301
+ }
5302
+ /**
5303
+ * 服务商 Native 下单
5304
+ *
5305
+ * @param request - 下单请求参数
5306
+ * @returns 下单结果,包含 code_url
5307
+ *
5308
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012738659
5309
+ */
5310
+ async createOrder(request) {
5311
+ return this.client.post(
5312
+ "/v3/pay/partner/transactions/native",
5313
+ request
5314
+ );
5315
+ }
5316
+ /**
5317
+ * 通过商户订单号查询订单
5318
+ *
5319
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012759714
5320
+ */
5321
+ async queryOrderByOutTradeNo(params) {
5322
+ return this.client.get(
5323
+ `/v3/pay/partner/transactions/out-trade-no/${params.out_trade_no}`,
5324
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5325
+ );
5326
+ }
5327
+ /**
5328
+ * 通过微信支付订单号查询订单
5329
+ *
5330
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012738971
5331
+ */
5332
+ async queryOrderByTransactionId(params) {
5333
+ return this.client.get(
5334
+ `/v3/pay/partner/transactions/id/${params.transaction_id}`,
5335
+ { sp_mchid: params.sp_mchid, sub_mchid: params.sub_mchid }
5336
+ );
5337
+ }
5338
+ /**
5339
+ * 关闭订单
5340
+ *
5341
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012759725
5342
+ */
5343
+ async closeOrder(outTradeNo, request) {
5344
+ return this.client.post(
5345
+ `/v3/pay/partner/transactions/out-trade-no/${outTradeNo}/close`,
5346
+ request
5347
+ );
5348
+ }
5349
+ };
5350
+
5351
+ // src/services/partner-transfer.ts
5352
+ var PartnerTransferService = class {
5353
+ client;
5354
+ constructor(client) {
5355
+ this.client = client;
5356
+ }
5357
+ /**
5358
+ * 服务商发起商家转账
5359
+ *
5360
+ * @param request - 转账请求参数
5361
+ * @returns 转账结果
5362
+ *
5363
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4012716434
5364
+ */
5365
+ async createTransfer(request) {
5366
+ return this.client.post(
5367
+ "/v3/fund-app/mch-transfer/partner/transfer-bills",
5368
+ request
5369
+ );
5370
+ }
5371
+ /**
5372
+ * 通过商户单号查询转账单
5373
+ *
5374
+ * @param outBillNo - 商户转账单号
5375
+ * @param subMchid - 特约商户号
5376
+ * @returns 转账单详情
5377
+ */
5378
+ async queryTransferByOutBillNo(outBillNo, subMchid) {
5379
+ return this.client.get(
5380
+ `/v3/fund-app/mch-transfer/partner/transfer-bills/out-bill-no/${outBillNo}`,
5381
+ { sub_mchid: subMchid }
5382
+ );
5383
+ }
5384
+ /**
5385
+ * 撤销转账
5386
+ *
5387
+ * @param outBillNo - 商户转账单号
5388
+ * @param subMchid - 特约商户号
5389
+ */
5390
+ async cancelTransfer(outBillNo, subMchid) {
5391
+ return this.client.post(
5392
+ `/v3/fund-app/mch-transfer/partner/transfer-bills/out-bill-no/${outBillNo}/cancel`,
5393
+ { sub_mchid: subMchid }
5394
+ );
5395
+ }
5396
+ };
5397
+
5398
+ // src/services/transfer-batch.ts
5399
+ var TransferBatchService = class {
5400
+ client;
5401
+ constructor(client) {
5402
+ this.client = client;
5403
+ }
5404
+ /**
5405
+ * 发起批量转账
5406
+ *
5407
+ * @param request - 批量转账请求参数
5408
+ * @returns 批量转账结果
5409
+ */
5410
+ async initiateBatchTransfer(request) {
5411
+ return this.client.post("/v3/transfer/batches", request);
5412
+ }
5413
+ /**
5414
+ * 通过微信批次单号查询批次单
5415
+ *
5416
+ * @param batchId - 微信批次单号
5417
+ * @param params - 可选查询参数
5418
+ * @returns 批次单详情
5419
+ */
5420
+ async getTransferBatchByNo(batchId, params) {
5421
+ return this.client.get(
5422
+ `/v3/transfer/batches/batch-id/${batchId}`,
5423
+ params
5424
+ );
5425
+ }
5426
+ /**
5427
+ * 通过商家批次单号查询批次单
5428
+ *
5429
+ * @param outBatchNo - 商家批次单号
5430
+ * @param params - 可选查询参数
5431
+ * @returns 批次单详情
5432
+ */
5433
+ async getTransferBatchByOutNo(outBatchNo, params) {
5434
+ return this.client.get(
5435
+ `/v3/transfer/batches/out-batch-no/${outBatchNo}`,
5436
+ params
5437
+ );
5438
+ }
5439
+ /**
5440
+ * 通过微信明细单号查询明细单
5441
+ *
5442
+ * @param batchId - 微信批次单号
5443
+ * @param detailId - 微信明细单号
5444
+ * @returns 明细单详情
5445
+ */
5446
+ async getTransferDetailByNo(batchId, detailId) {
5447
+ return this.client.get(
5448
+ `/v3/transfer/batches/batch-id/${batchId}/details/detail-id/${detailId}`
5449
+ );
5450
+ }
5451
+ /**
5452
+ * 通过商家明细单号查询明细单
5453
+ *
5454
+ * @param outBatchNo - 商家批次单号
5455
+ * @param outDetailNo - 商家明细单号
5456
+ * @returns 明细单详情
5457
+ */
5458
+ async getTransferDetailByOutNo(outBatchNo, outDetailNo) {
5459
+ return this.client.get(
5460
+ `/v3/transfer/batches/out-batch-no/${outBatchNo}/details/out-detail-no/${outDetailNo}`
5461
+ );
5462
+ }
5463
+ };
5464
+
5465
+ // src/services/partner-transfer-batch.ts
5466
+ var PartnerTransferBatchService = class {
5467
+ client;
5468
+ constructor(client) {
5469
+ this.client = client;
5470
+ }
5471
+ /**
5472
+ * 发起服务商批量转账
5473
+ *
5474
+ * @param request - 批量转账请求参数
5475
+ * @returns 批量转账结果
5476
+ */
5477
+ async initiateBatchTransfer(request) {
5478
+ return this.client.post(
5479
+ "/v3/partner-transfer/batches",
5480
+ request
5481
+ );
5482
+ }
5483
+ /**
5484
+ * 通过微信批次单号查询批次单
5485
+ *
5486
+ * @param batchId - 微信批次单号
5487
+ * @param params - 可选查询参数
5488
+ * @returns 批次单详情
5489
+ */
5490
+ async getTransferBatchByNo(batchId, params) {
5491
+ return this.client.get(
5492
+ `/v3/partner-transfer/batches/batch-id/${batchId}`,
5493
+ params
5494
+ );
5495
+ }
5496
+ /**
5497
+ * 通过商家批次单号查询批次单
5498
+ *
5499
+ * @param outBatchNo - 商家批次单号
5500
+ * @param params - 可选查询参数
5501
+ * @returns 批次单详情
5502
+ */
5503
+ async getTransferBatchByOutNo(outBatchNo, params) {
5504
+ return this.client.get(
5505
+ `/v3/partner-transfer/batches/out-batch-no/${outBatchNo}`,
5506
+ params
5507
+ );
5508
+ }
5509
+ /**
5510
+ * 通过微信明细单号查询明细单
5511
+ *
5512
+ * @param batchId - 微信批次单号
5513
+ * @param detailId - 微信明细单号
5514
+ * @returns 明细单详情
5515
+ */
5516
+ async getTransferDetailByNo(batchId, detailId) {
5517
+ return this.client.get(
5518
+ `/v3/partner-transfer/batches/batch-id/${batchId}/details/detail-id/${detailId}`
5519
+ );
5520
+ }
5521
+ /**
5522
+ * 通过商家明细单号查询明细单
5523
+ *
5524
+ * @param outBatchNo - 商家批次单号
5525
+ * @param outDetailNo - 商家明细单号
5526
+ * @returns 明细单详情
5527
+ */
5528
+ async getTransferDetailByOutNo(outBatchNo, outDetailNo) {
5529
+ return this.client.get(
5530
+ `/v3/partner-transfer/batches/out-batch-no/${outBatchNo}/details/out-detail-no/${outDetailNo}`
5531
+ );
5532
+ }
5533
+ };
5534
+
5535
+ // src/services/ecommerce-profitsharing.ts
5536
+ var EcommerceProfitSharingService = class {
5537
+ client;
5538
+ constructor(client) {
5539
+ this.client = client;
5540
+ }
5541
+ /**
5542
+ * 请求分账
5543
+ *
5544
+ * @param request - 分账请求参数
5545
+ * @returns 分账结果
5546
+ */
5547
+ async createOrder(request) {
5548
+ return this.client.post(
5549
+ "/v3/ecommerce/profitsharing/orders",
5550
+ request
5551
+ );
5552
+ }
5553
+ /**
5554
+ * 查询分账结果
5555
+ *
5556
+ * @param subMchid - 特约商户号
5557
+ * @param transactionId - 微信支付订单号
5558
+ * @param outOrderNo - 商户分账单号
5559
+ * @returns 分账结果详情
5560
+ */
5561
+ async queryOrder(subMchid, transactionId, outOrderNo) {
5562
+ return this.client.get(
5563
+ "/v3/ecommerce/profitsharing/orders",
5564
+ { sub_mchid: subMchid, transaction_id: transactionId, out_order_no: outOrderNo }
5565
+ );
5566
+ }
5567
+ /**
5568
+ * 请求分账回退
5569
+ *
5570
+ * @param request - 分账回退请求参数
5571
+ * @returns 回退结果
5572
+ */
5573
+ async createReturnOrder(request) {
5574
+ return this.client.post(
5575
+ "/v3/ecommerce/profitsharing/returnorders",
5576
+ request
5577
+ );
5578
+ }
5579
+ /**
5580
+ * 查询分账回退结果
5581
+ *
5582
+ * @param subMchid - 特约商户号
5583
+ * @param orderId - 微信分账单号
5584
+ * @param outReturnNo - 商户回退单号
5585
+ * @returns 回退结果详情
5586
+ */
5587
+ async queryReturnOrder(subMchid, orderId, outReturnNo) {
5588
+ return this.client.get(
5589
+ "/v3/ecommerce/profitsharing/returnorders",
5590
+ { sub_mchid: subMchid, order_id: orderId, out_return_no: outReturnNo }
5591
+ );
5592
+ }
5593
+ /**
5594
+ * 完结分账
5595
+ *
5596
+ * @param request - 完结分账请求参数
5597
+ */
5598
+ async finishOrder(request) {
5599
+ return this.client.post("/v3/ecommerce/profitsharing/finish-order", request);
5600
+ }
5601
+ /**
5602
+ * 请求售后服务分账
5603
+ *
5604
+ * @param request - 售后服务分账请求参数
5605
+ * @returns 售后服务分账结果
5606
+ */
5607
+ async createAfterSalesOrder(request) {
5608
+ return this.client.post(
5609
+ "/v3/ecommerce/profitsharing/after-sales-orders",
5610
+ request
5611
+ );
5612
+ }
5613
+ /**
5614
+ * 查询售后服务分账结果
5615
+ *
5616
+ * @param subMchid - 子商户号
5617
+ * @param transactionId - 微信支付订单号
5618
+ * @returns 售后服务分账结果详情
5619
+ */
5620
+ async queryAfterSalesOrder(subMchid, transactionId) {
5621
+ return this.client.get(
5622
+ "/v3/ecommerce/profitsharing/after-sales-orders",
5623
+ { sub_mchid: subMchid, transaction_id: transactionId }
5624
+ );
5625
+ }
5626
+ /**
5627
+ * 查询订单剩余待分金额
5628
+ *
5629
+ * @param transactionId - 微信支付订单号
5630
+ * @returns 订单剩余待分金额
5631
+ */
5632
+ async queryOrderAmount(transactionId) {
5633
+ return this.client.get(
5634
+ `/v3/ecommerce/profitsharing/orders/${transactionId}/amounts`
5635
+ );
5636
+ }
5637
+ /**
5638
+ * 添加分账接收方
5639
+ *
5640
+ * @param request - 添加接收方请求参数
5641
+ * @returns 添加接收方结果
5642
+ */
5643
+ async addReceiver(request) {
5644
+ return this.client.post(
5645
+ "/v3/ecommerce/profitsharing/receivers/add",
5646
+ request
5647
+ );
5648
+ }
5649
+ /**
5650
+ * 删除分账接收方
5651
+ *
5652
+ * @param request - 删除接收方请求参数
5653
+ * @returns 删除接收方结果
5654
+ */
5655
+ async deleteReceiver(request) {
5656
+ return this.client.post(
5657
+ "/v3/ecommerce/profitsharing/receivers/delete",
5658
+ request
5659
+ );
5660
+ }
5661
+ };
5662
+
5663
+ // src/services/ecommerce-refund.ts
5664
+ var EcommerceRefundService = class {
5665
+ client;
5666
+ constructor(client) {
5667
+ this.client = client;
4758
5668
  }
4759
- const sortedKeys = Object.keys(signFields).sort();
4760
- const signStr = sortedKeys.map((k) => `${k}=${signFields[k]}`).join("&") + `&key=${signKey}`;
4761
- const sign2 = crypto2.createHmac("sha256", signKey).update(signStr).digest("hex").toUpperCase();
4762
- const urlParams = new URLSearchParams({
4763
- stock_id: params.stock_id,
4764
- out_request_no: params.out_request_no,
4765
- sign: sign2,
4766
- send_coupon_merchant: params.send_coupon_merchant,
4767
- open_id: params.open_id
4768
- });
4769
- if (params.coupon_code) {
4770
- urlParams.set("coupon_code", params.coupon_code);
5669
+ /**
5670
+ * 申请退款
5671
+ *
5672
+ * @param request - 退款请求参数
5673
+ * @returns 退款结果
5674
+ *
5675
+ * @see https://pay.weixin.qq.com/doc/v3/partner/4013080625
5676
+ */
5677
+ async create(request) {
5678
+ return this.client.post("/v3/ecommerce/refunds/apply", request);
4771
5679
  }
4772
- if (params.customize_send_time) {
4773
- urlParams.set("customize_send_time", params.customize_send_time);
5680
+ /**
5681
+ * 查询单笔退款(通过商户退款单号)
5682
+ *
5683
+ * @param subMchid - 特约商户号
5684
+ * @param outRefundNo - 商户退款单号
5685
+ * @returns 退款详情
5686
+ */
5687
+ async queryByOutRefundNo(subMchid, outRefundNo) {
5688
+ return this.client.get(
5689
+ `/v3/ecommerce/refunds/out-refund-no/${outRefundNo}`,
5690
+ { sub_mchid: subMchid }
5691
+ );
4774
5692
  }
4775
- return `${H5_COUPON_URL}?${urlParams.toString()}#wechat_pay&wechat_redirect`;
5693
+ /**
5694
+ * 查询单笔退款(通过微信支付退款单号)
5695
+ *
5696
+ * @param subMchid - 特约商户号
5697
+ * @param refundId - 微信支付退款单号
5698
+ * @returns 退款详情
5699
+ */
5700
+ async queryByRefundId(subMchid, refundId) {
5701
+ return this.client.get(`/v3/ecommerce/refunds/id/${refundId}`, {
5702
+ sub_mchid: subMchid
5703
+ });
5704
+ }
5705
+ /**
5706
+ * 垫付退款回补
5707
+ *
5708
+ * 当电商平台已垫付退款给用户,后续从二级商户处回补该笔退款资金。
5709
+ *
5710
+ * @param request - 垫付回补请求参数
5711
+ * @returns 垫付回补结果
5712
+ */
5713
+ async createReturnAdvance(request) {
5714
+ return this.client.post(
5715
+ `/v3/ecommerce/refunds/${request.refund_id}/return-advance`,
5716
+ { sub_mchid: request.sub_mchid }
5717
+ );
5718
+ }
5719
+ /**
5720
+ * 查询垫付回补结果
5721
+ *
5722
+ * @param subMchid - 特约商户号
5723
+ * @param refundId - 微信退款单号
5724
+ * @returns 垫付回补结果
5725
+ */
5726
+ async queryReturnAdvance(subMchid, refundId) {
5727
+ return this.client.get(
5728
+ `/v3/ecommerce/refunds/${refundId}/return-advance`,
5729
+ { sub_mchid: subMchid }
5730
+ );
5731
+ }
5732
+ };
5733
+
5734
+ // src/services/ecommerce-subsidy.ts
5735
+ var EcommerceSubsidyService = class {
5736
+ client;
5737
+ constructor(client) {
5738
+ this.client = client;
5739
+ }
5740
+ /**
5741
+ * 请求补差
5742
+ *
5743
+ * @param request - 补差请求参数
5744
+ * @returns 补差结果
5745
+ */
5746
+ async create(request) {
5747
+ return this.client.post(
5748
+ "/v3/ecommerce/subsidies/create",
5749
+ request
5750
+ );
5751
+ }
5752
+ /**
5753
+ * 请求补差回退
5754
+ *
5755
+ * @param request - 补差回退请求参数
5756
+ * @returns 回退结果
5757
+ */
5758
+ async returnSubsidy(request) {
5759
+ return this.client.post(
5760
+ "/v3/ecommerce/subsidies/return",
5761
+ request
5762
+ );
5763
+ }
5764
+ /**
5765
+ * 取消补差
5766
+ *
5767
+ * @param request - 取消补差请求参数
5768
+ * @returns 取消补差结果
5769
+ */
5770
+ async cancelSubsidy(request) {
5771
+ return this.client.post(
5772
+ "/v3/ecommerce/subsidies/cancel",
5773
+ request
5774
+ );
5775
+ }
5776
+ };
5777
+
5778
+ // src/services/brand-profitsharing.ts
5779
+ var BrandProfitSharingService = class {
5780
+ client;
5781
+ constructor(client) {
5782
+ this.client = client;
5783
+ }
5784
+ /**
5785
+ * 请求分账
5786
+ *
5787
+ * @param request - 分账请求参数
5788
+ * @returns 分账结果
5789
+ */
5790
+ async createOrder(request) {
5791
+ return this.client.post(
5792
+ "/v3/brand/profitsharing/orders",
5793
+ request
5794
+ );
5795
+ }
5796
+ /**
5797
+ * 查询分账结果
5798
+ *
5799
+ * @param brandMchid - 品牌主商户号
5800
+ * @param subMchid - 特约商户号
5801
+ * @param transactionId - 微信支付订单号
5802
+ * @param outOrderNo - 商户分账单号
5803
+ * @returns 分账结果详情
5804
+ */
5805
+ async queryOrder(brandMchid, subMchid, transactionId, outOrderNo) {
5806
+ return this.client.get("/v3/brand/profitsharing/orders", {
5807
+ brand_mchid: brandMchid,
5808
+ sub_mchid: subMchid,
5809
+ transaction_id: transactionId,
5810
+ out_order_no: outOrderNo
5811
+ });
5812
+ }
5813
+ /**
5814
+ * 请求分账回退
5815
+ *
5816
+ * @param request - 分账回退请求参数
5817
+ * @returns 回退结果
5818
+ */
5819
+ async createReturnOrder(request) {
5820
+ return this.client.post(
5821
+ "/v3/brand/profitsharing/returnorders",
5822
+ request
5823
+ );
5824
+ }
5825
+ /**
5826
+ * 查询分账回退结果
5827
+ *
5828
+ * @param brandMchid - 品牌主商户号
5829
+ * @param subMchid - 特约商户号
5830
+ * @param orderId - 微信分账单号
5831
+ * @param outReturnNo - 商户回退单号
5832
+ * @returns 回退结果详情
5833
+ */
5834
+ async queryReturnOrder(brandMchid, subMchid, orderId, outReturnNo) {
5835
+ return this.client.get(
5836
+ "/v3/brand/profitsharing/returnorders",
5837
+ {
5838
+ brand_mchid: brandMchid,
5839
+ sub_mchid: subMchid,
5840
+ order_id: orderId,
5841
+ out_return_no: outReturnNo
5842
+ }
5843
+ );
5844
+ }
5845
+ /**
5846
+ * 完结分账
5847
+ *
5848
+ * @param request - 完结分账请求参数
5849
+ */
5850
+ async finishOrder(request) {
5851
+ return this.client.post("/v3/brand/profitsharing/finish-order", request);
5852
+ }
5853
+ /**
5854
+ * 查询最大分账比例
5855
+ *
5856
+ * @param brandMchid - 品牌主商户号
5857
+ * @returns 最大分账比例
5858
+ */
5859
+ async queryBrandMerchantRatio(brandMchid) {
5860
+ return this.client.get(
5861
+ `/v3/brand/profitsharing/brand-configs/${brandMchid}`
5862
+ );
5863
+ }
5864
+ /**
5865
+ * 查询订单剩余待分金额
5866
+ *
5867
+ * @param transactionId - 微信支付订单号
5868
+ * @returns 订单剩余待分金额
5869
+ */
5870
+ async queryOrderAmount(transactionId) {
5871
+ return this.client.get(
5872
+ `/v3/brand/profitsharing/orders/${transactionId}/amounts`
5873
+ );
5874
+ }
5875
+ /**
5876
+ * 添加分账接收方
5877
+ *
5878
+ * @param request - 添加接收方请求参数
5879
+ * @returns 添加接收方结果
5880
+ */
5881
+ async addReceiver(request) {
5882
+ return this.client.post(
5883
+ "/v3/brand/profitsharing/receivers/add",
5884
+ request
5885
+ );
5886
+ }
5887
+ /**
5888
+ * 删除分账接收方
5889
+ *
5890
+ * @param request - 删除接收方请求参数
5891
+ * @returns 删除接收方结果
5892
+ */
5893
+ async deleteReceiver(request) {
5894
+ return this.client.post(
5895
+ "/v3/brand/profitsharing/receivers/delete",
5896
+ request
5897
+ );
5898
+ }
5899
+ };
5900
+ function loadCertificate(certificate) {
5901
+ return new crypto2.X509Certificate(certificate);
4776
5902
  }
4777
- function buildPayScoreDetailJsapiBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
4778
- const timestamp = String(Math.floor(Date.now() / 1e3));
4779
- const nonceStr = generateNonceStr();
4780
- const sign2 = generatePayScorePaySign(
4781
- appId,
4782
- timestamp,
4783
- nonceStr,
4784
- serviceId,
4785
- outOrderNo,
4786
- privateKey
4787
- );
4788
- return {
4789
- appid: appId,
4790
- mchid: mchId,
4791
- service_id: serviceId,
4792
- out_order_no: outOrderNo,
4793
- timestamp,
4794
- nonce_str: nonceStr,
4795
- sign_type: "RSA",
4796
- sign: sign2
4797
- };
5903
+ function loadCertificateFromPath(path) {
5904
+ return new crypto2.X509Certificate(fs2.readFileSync(path, "utf-8"));
4798
5905
  }
4799
- function buildPayScoreDetailMiniProgramBridgeConfig(mchId, serviceId, outOrderNo, appId, privateKey) {
4800
- const timestamp = String(Math.floor(Date.now() / 1e3));
4801
- const nonceStr = generateNonceStr();
4802
- const sign2 = generatePayScorePaySign(
4803
- appId,
4804
- timestamp,
4805
- nonceStr,
4806
- serviceId,
4807
- outOrderNo,
4808
- privateKey
4809
- );
4810
- return {
4811
- mchid: mchId,
4812
- service_id: serviceId,
4813
- out_order_no: outOrderNo,
4814
- timestamp,
4815
- nonce_str: nonceStr,
4816
- sign_type: "RSA",
4817
- sign: sign2
4818
- };
5906
+ function loadPrivateKey(key) {
5907
+ if (Buffer.isBuffer(key)) return key.toString("utf-8");
5908
+ if (key.startsWith("-----BEGIN")) return key;
5909
+ try {
5910
+ return fs2.readFileSync(key, "utf-8");
5911
+ } catch {
5912
+ return key;
5913
+ }
4819
5914
  }
4820
- function buildPayScoreDetailAppBridgeConfig(appId, mchId, serviceId, outOrderNo, privateKey) {
4821
- const timestamp = String(Math.floor(Date.now() / 1e3));
4822
- const nonceStr = generateNonceStr();
4823
- const sign2 = generatePayScorePaySign(
4824
- appId,
4825
- timestamp,
4826
- nonceStr,
4827
- serviceId,
4828
- outOrderNo,
4829
- privateKey
4830
- );
4831
- return {
4832
- appid: appId,
4833
- mchid: mchId,
4834
- service_id: serviceId,
4835
- out_order_no: outOrderNo,
4836
- timestamp,
4837
- nonce_str: nonceStr,
4838
- sign_type: "RSA",
4839
- sign: sign2
4840
- };
5915
+ function loadPublicKey(key) {
5916
+ if (Buffer.isBuffer(key)) return key.toString("utf-8");
5917
+ if (key.startsWith("-----BEGIN")) return key;
5918
+ try {
5919
+ return fs2.readFileSync(key, "utf-8");
5920
+ } catch {
5921
+ return key;
5922
+ }
4841
5923
  }
4842
- var MED_INS_APPID = "wxbcad394b3d99dac9";
4843
- var MED_INS_PATH = "/pages/med-ins/pay/pay";
4844
- function buildMedInsMiniProgramBridgeConfig(mchid, mixTradeNo) {
4845
- return {
4846
- appId: MED_INS_APPID,
4847
- path: MED_INS_PATH,
4848
- extraData: {
4849
- mchid,
4850
- mix_trade_no: mixTradeNo
4851
- }
4852
- };
5924
+ function getCertificateSerialNumber(cert) {
5925
+ return cert.serialNumber.toUpperCase();
4853
5926
  }
4854
- function buildMedInsJsapiBridgeConfig(appId, mchId, mixTradeNo, privateKey) {
4855
- const timestamp = String(Math.floor(Date.now() / 1e3));
4856
- const nonceStr = generateNonceStr();
4857
- const packageStr = `mchid=${mchId}&mix_trade_no=${mixTradeNo}`;
4858
- const signString = `${appId}
4859
- ${timestamp}
4860
- ${nonceStr}
4861
- ${packageStr}
4862
- `;
4863
- const signer = crypto2.createSign("RSA-SHA256");
4864
- signer.update(signString);
4865
- signer.end();
4866
- const sign2 = signer.sign(privateKey, "base64");
4867
- return {
4868
- appid: appId,
4869
- mchid: mchId,
4870
- mix_trade_no: mixTradeNo,
4871
- timestamp,
4872
- nonce_str: nonceStr,
4873
- sign_type: "RSA",
4874
- sign: sign2
4875
- };
5927
+ function isCertificateExpired(cert, now) {
5928
+ const checkTime = now ?? /* @__PURE__ */ new Date();
5929
+ const validTo = new Date(cert.validTo);
5930
+ return checkTime > validTo;
5931
+ }
5932
+ function isCertificateValid(cert, now) {
5933
+ const checkTime = now ?? /* @__PURE__ */ new Date();
5934
+ const validFrom = new Date(cert.validFrom);
5935
+ const validTo = new Date(cert.validTo);
5936
+ return checkTime >= validFrom && checkTime <= validTo;
4876
5937
  }
4877
5938
 
4878
- export { AppService, BillService, BusinessCircleService, CallbackHandler, CertificateManager, CertificateService, CombineAppService, CombineH5Service, CombineMiniProgramService, CombineNativeService, CombineService, ComplaintService, CouponService, DecryptionException, GoldPlanService, H5Service, HttpException, JsapiService, LoveFeastService, MalformedMessageException, MedInsService, MediaService, MerchantExclusiveCouponService, MerchantTransferService, NativeService, ParkingService, PartnershipService, PayGiftActivityService, PayScoreService, PayrollCardService, ProfitSharingService, RetailStoreService, ScanAndRideService, SecurityService, ServiceException, SmartGuideService, ValidationException, WxPayClient, WxPayError, buildAppBridgeConfig, buildAuthorization, buildH5CouponUrl, buildJsapiBridgeConfig, buildMedInsJsapiBridgeConfig, buildMedInsMiniProgramBridgeConfig, buildMerchantTransferAuthorizationJsapiBridgeConfig, buildMerchantTransferJsapiBridgeConfig, buildMerchantTransferMiniProgramBridgeConfig, buildMiniProgramBridgeConfig, buildParkingAppBridgePath, buildParkingH5BridgeUrl, buildParkingMiniProgramBridgeConfig, buildParkingRepayBridgeConfig, buildPayScoreAppBridgeConfig, buildPayScoreDetailAppBridgeConfig, buildPayScoreDetailJsapiBridgeConfig, buildPayScoreDetailMiniProgramBridgeConfig, buildPayScoreJsapiBridgeConfig, buildPayScoreMiniProgramBridgeConfig, buildSignString, decryptSensitiveFields, decryptSensitiveFieldsInArray, encryptSensitiveFields, encryptSensitiveFieldsInArray, generateAppPaySign, generateNonce, generateNonceStr, generatePayScorePaySign, generatePaySign, isTimestampValid, oaepDecrypt, oaepEncrypt, registerSensitiveFields, sign, verifySignature };
5939
+ export { AppService, BillService, BrandProfitSharingService, BusinessCircleService, CallbackHandler, CertificateManager, CertificateService, CombineAppService, CombineH5Service, CombineMiniProgramService, CombineNativeService, CombineService, ComplaintService, CouponService, DecryptionException, EcommerceProfitSharingService, EcommerceRefundService, EcommerceSubsidyService, GoldPlanService, H5Service, HttpException, JsapiService, LoveFeastService, MalformedMessageException, MedInsService, MediaService, MerchantExclusiveCouponService, MerchantTransferService, NativeService, ParkingService, PartnerAppService, PartnerH5Service, PartnerJsapiService, PartnerNativeService, PartnerTransferBatchService, PartnerTransferService, PartnershipService, PayGiftActivityService, PayScoreService, PayrollCardService, ProfitSharingService, RefundService, RetailStoreService, ScanAndRideService, SecurityService, ServiceException, SmartGuideService, TransferBatchService, ValidationException, WxPayClient, WxPayError, buildAppBridgeConfig, buildAuthorization, buildH5CouponUrl, buildJsapiBridgeConfig, buildMedInsJsapiBridgeConfig, buildMedInsMiniProgramBridgeConfig, buildMerchantTransferAuthorizationJsapiBridgeConfig, buildMerchantTransferJsapiBridgeConfig, buildMerchantTransferMiniProgramBridgeConfig, buildMiniProgramBridgeConfig, buildParkingAppBridgePath, buildParkingH5BridgeUrl, buildParkingMiniProgramBridgeConfig, buildParkingRepayBridgeConfig, buildPayScoreAppBridgeConfig, buildPayScoreDetailAppBridgeConfig, buildPayScoreDetailJsapiBridgeConfig, buildPayScoreDetailMiniProgramBridgeConfig, buildPayScoreJsapiBridgeConfig, buildPayScoreMiniProgramBridgeConfig, buildSignString, decryptSensitiveFields, decryptSensitiveFieldsInArray, encryptSensitiveFields, encryptSensitiveFieldsInArray, generateAppPaySign, generateNonce, generateNonceStr, generatePayScorePaySign, generatePaySign, getCertificateSerialNumber, isCertificateExpired, isCertificateValid, isTimestampValid, loadCertificate, loadCertificateFromPath, loadPrivateKey, loadPublicKey, oaepDecrypt, oaepEncrypt, registerSensitiveFields, sign, verifySignature };
4879
5940
  //# sourceMappingURL=index.mjs.map
4880
5941
  //# sourceMappingURL=index.mjs.map