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