@moksa/plugin-ecpay 0.0.0-stage → 0.1.1

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 ADDED
@@ -0,0 +1,1587 @@
1
+ // Auto-generated by emdash-plugin build. Do not edit.
2
+ // Source: emdash-plugin.jsonc + package.json
3
+ //
4
+ // Default-exports a sandboxed plugin descriptor. Pass it directly into
5
+ // emdash's `plugins:` or `sandboxed:` array — no factory call needed.
6
+
7
+ /** @type {import("emdash").PluginDescriptor} */
8
+ const descriptor = Object.freeze({
9
+ "id": "moksa-ecpay",
10
+ "version": "0.1.1",
11
+ "format": "standard",
12
+ "entrypoint": "@moksa/plugin-ecpay/sandbox",
13
+ "capabilities": [
14
+ "network:request"
15
+ ],
16
+ "allowedHosts": [
17
+ "payment-stage.ecpay.com.tw",
18
+ "payment.ecpay.com.tw",
19
+ "ecpayment-stage.ecpay.com.tw",
20
+ "ecpayment.ecpay.com.tw",
21
+ "ecpg-stage.ecpay.com.tw",
22
+ "ecpg.ecpay.com.tw",
23
+ "logistics-stage.ecpay.com.tw",
24
+ "logistics.ecpay.com.tw",
25
+ "einvoice-stage.ecpay.com.tw",
26
+ "einvoice.ecpay.com.tw"
27
+ ],
28
+ "storage": {
29
+ "trades": {
30
+ "indexes": [
31
+ "orderNumber",
32
+ "status",
33
+ "createdAt",
34
+ [
35
+ "orderNumber",
36
+ "createdAt"
37
+ ]
38
+ ]
39
+ },
40
+ "events": {
41
+ "indexes": [
42
+ "createdAt"
43
+ ]
44
+ },
45
+ "orders": {
46
+ "indexes": [
47
+ "updatedAt",
48
+ "invoiceDueAt"
49
+ ]
50
+ },
51
+ "shipments": {
52
+ "indexes": [
53
+ "orderNumber",
54
+ "status",
55
+ "updatedAt",
56
+ [
57
+ "open",
58
+ "updatedAt"
59
+ ],
60
+ [
61
+ "orderNumber",
62
+ "updatedAt"
63
+ ]
64
+ ]
65
+ },
66
+ "invoices": {
67
+ "indexes": [
68
+ "status",
69
+ "updatedAt"
70
+ ]
71
+ },
72
+ "reports": {
73
+ "indexes": [
74
+ "status",
75
+ "nextAt",
76
+ [
77
+ "status",
78
+ "nextAt"
79
+ ]
80
+ ]
81
+ },
82
+ "mandates": {
83
+ "indexes": [
84
+ "status",
85
+ "cardRef",
86
+ "orderNumber",
87
+ "updatedAt"
88
+ ]
89
+ },
90
+ "charges": {
91
+ "indexes": [
92
+ "state",
93
+ "mandateId",
94
+ "orderNumber",
95
+ "updatedAt",
96
+ [
97
+ "state",
98
+ "updatedAt"
99
+ ]
100
+ ]
101
+ },
102
+ "members": {
103
+ "indexes": [
104
+ "createdAt"
105
+ ]
106
+ }
107
+ },
108
+ "hooks": [
109
+ "plugin:activate",
110
+ "cron"
111
+ ],
112
+ "routes": [
113
+ {
114
+ "name": "migrate/import",
115
+ "methods": [
116
+ "POST"
117
+ ],
118
+ "permission": "plugins:manage"
119
+ },
120
+ {
121
+ "name": "migrate/kv",
122
+ "methods": [
123
+ "POST"
124
+ ],
125
+ "permission": "plugins:manage"
126
+ },
127
+ {
128
+ "name": "migrate/stats",
129
+ "methods": [
130
+ "GET",
131
+ "POST"
132
+ ],
133
+ "permission": "plugins:manage"
134
+ },
135
+ {
136
+ "name": "bus/methods",
137
+ "methods": [
138
+ "POST"
139
+ ],
140
+ "request": {
141
+ "body": "text",
142
+ "maxBytes": 262144,
143
+ "headers": [
144
+ "x-moksa-bus-ts",
145
+ "x-moksa-bus-id",
146
+ "x-moksa-bus-sig"
147
+ ]
148
+ },
149
+ "public": true
150
+ },
151
+ {
152
+ "name": "bus/checkout",
153
+ "methods": [
154
+ "POST"
155
+ ],
156
+ "request": {
157
+ "body": "text",
158
+ "maxBytes": 262144,
159
+ "headers": [
160
+ "x-moksa-bus-ts",
161
+ "x-moksa-bus-id",
162
+ "x-moksa-bus-sig"
163
+ ]
164
+ },
165
+ "public": true
166
+ },
167
+ {
168
+ "name": "bus/bind/step",
169
+ "methods": [
170
+ "POST"
171
+ ],
172
+ "request": {
173
+ "body": "text",
174
+ "maxBytes": 262144,
175
+ "headers": [
176
+ "x-moksa-bus-ts",
177
+ "x-moksa-bus-id",
178
+ "x-moksa-bus-sig"
179
+ ]
180
+ },
181
+ "public": true
182
+ },
183
+ {
184
+ "name": "bus/gw/bind-pay",
185
+ "methods": [
186
+ "POST"
187
+ ],
188
+ "request": {
189
+ "body": "text",
190
+ "maxBytes": 262144,
191
+ "headers": [
192
+ "x-moksa-bus-ts",
193
+ "x-moksa-bus-id",
194
+ "x-moksa-bus-sig"
195
+ ]
196
+ },
197
+ "public": true
198
+ },
199
+ {
200
+ "name": "bus/gw/bind-result",
201
+ "methods": [
202
+ "POST"
203
+ ],
204
+ "request": {
205
+ "body": "text",
206
+ "maxBytes": 262144,
207
+ "headers": [
208
+ "x-moksa-bus-ts",
209
+ "x-moksa-bus-id",
210
+ "x-moksa-bus-sig"
211
+ ]
212
+ },
213
+ "public": true
214
+ },
215
+ {
216
+ "name": "bus/gw/bind-notify",
217
+ "methods": [
218
+ "POST"
219
+ ],
220
+ "request": {
221
+ "body": "text",
222
+ "maxBytes": 262144,
223
+ "headers": [
224
+ "x-moksa-bus-ts",
225
+ "x-moksa-bus-id",
226
+ "x-moksa-bus-sig"
227
+ ]
228
+ },
229
+ "public": true
230
+ },
231
+ {
232
+ "name": "bus/recurring/charge",
233
+ "methods": [
234
+ "POST"
235
+ ],
236
+ "request": {
237
+ "body": "text",
238
+ "maxBytes": 262144,
239
+ "headers": [
240
+ "x-moksa-bus-ts",
241
+ "x-moksa-bus-id",
242
+ "x-moksa-bus-sig"
243
+ ]
244
+ },
245
+ "public": true
246
+ },
247
+ {
248
+ "name": "bus/recurring/action",
249
+ "methods": [
250
+ "POST"
251
+ ],
252
+ "request": {
253
+ "body": "text",
254
+ "maxBytes": 262144,
255
+ "headers": [
256
+ "x-moksa-bus-ts",
257
+ "x-moksa-bus-id",
258
+ "x-moksa-bus-sig"
259
+ ]
260
+ },
261
+ "public": true
262
+ },
263
+ {
264
+ "name": "bus/notify",
265
+ "methods": [
266
+ "POST"
267
+ ],
268
+ "request": {
269
+ "body": "text",
270
+ "maxBytes": 262144,
271
+ "headers": [
272
+ "x-moksa-bus-ts",
273
+ "x-moksa-bus-id",
274
+ "x-moksa-bus-sig"
275
+ ]
276
+ },
277
+ "public": true
278
+ },
279
+ {
280
+ "name": "bus/gw/return",
281
+ "methods": [
282
+ "POST"
283
+ ],
284
+ "request": {
285
+ "body": "text",
286
+ "maxBytes": 262144,
287
+ "headers": [
288
+ "x-moksa-bus-ts",
289
+ "x-moksa-bus-id",
290
+ "x-moksa-bus-sig"
291
+ ]
292
+ },
293
+ "public": true
294
+ },
295
+ {
296
+ "name": "bus/events",
297
+ "methods": [
298
+ "POST"
299
+ ],
300
+ "request": {
301
+ "body": "text",
302
+ "maxBytes": 262144,
303
+ "headers": [
304
+ "x-moksa-bus-ts",
305
+ "x-moksa-bus-id",
306
+ "x-moksa-bus-sig"
307
+ ]
308
+ },
309
+ "public": true
310
+ },
311
+ {
312
+ "name": "bus/reports/due",
313
+ "methods": [
314
+ "POST"
315
+ ],
316
+ "request": {
317
+ "body": "text",
318
+ "maxBytes": 262144,
319
+ "headers": [
320
+ "x-moksa-bus-ts",
321
+ "x-moksa-bus-id",
322
+ "x-moksa-bus-sig"
323
+ ]
324
+ },
325
+ "public": true
326
+ },
327
+ {
328
+ "name": "bus/reports/ack",
329
+ "methods": [
330
+ "POST"
331
+ ],
332
+ "request": {
333
+ "body": "text",
334
+ "maxBytes": 262144,
335
+ "headers": [
336
+ "x-moksa-bus-ts",
337
+ "x-moksa-bus-id",
338
+ "x-moksa-bus-sig"
339
+ ]
340
+ },
341
+ "public": true
342
+ },
343
+ {
344
+ "name": "bus/shipping/methods",
345
+ "methods": [
346
+ "POST"
347
+ ],
348
+ "request": {
349
+ "body": "text",
350
+ "maxBytes": 262144,
351
+ "headers": [
352
+ "x-moksa-bus-ts",
353
+ "x-moksa-bus-id",
354
+ "x-moksa-bus-sig"
355
+ ]
356
+ },
357
+ "public": true
358
+ },
359
+ {
360
+ "name": "bus/invoice/options",
361
+ "methods": [
362
+ "POST"
363
+ ],
364
+ "request": {
365
+ "body": "text",
366
+ "maxBytes": 262144,
367
+ "headers": [
368
+ "x-moksa-bus-ts",
369
+ "x-moksa-bus-id",
370
+ "x-moksa-bus-sig"
371
+ ]
372
+ },
373
+ "public": true
374
+ },
375
+ {
376
+ "name": "bus/invoice/verify",
377
+ "methods": [
378
+ "POST"
379
+ ],
380
+ "request": {
381
+ "body": "text",
382
+ "maxBytes": 262144,
383
+ "headers": [
384
+ "x-moksa-bus-ts",
385
+ "x-moksa-bus-id",
386
+ "x-moksa-bus-sig"
387
+ ]
388
+ },
389
+ "public": true
390
+ },
391
+ {
392
+ "name": "bus/gw/logistics-map",
393
+ "methods": [
394
+ "POST"
395
+ ],
396
+ "request": {
397
+ "body": "text",
398
+ "maxBytes": 262144,
399
+ "headers": [
400
+ "x-moksa-bus-ts",
401
+ "x-moksa-bus-id",
402
+ "x-moksa-bus-sig"
403
+ ]
404
+ },
405
+ "public": true
406
+ },
407
+ {
408
+ "name": "bus/gw/logistics-map-reply",
409
+ "methods": [
410
+ "POST"
411
+ ],
412
+ "request": {
413
+ "body": "text",
414
+ "maxBytes": 262144,
415
+ "headers": [
416
+ "x-moksa-bus-ts",
417
+ "x-moksa-bus-id",
418
+ "x-moksa-bus-sig"
419
+ ]
420
+ },
421
+ "public": true
422
+ },
423
+ {
424
+ "name": "bus/gw/logistics-notify",
425
+ "methods": [
426
+ "POST"
427
+ ],
428
+ "request": {
429
+ "body": "text",
430
+ "maxBytes": 262144,
431
+ "headers": [
432
+ "x-moksa-bus-ts",
433
+ "x-moksa-bus-id",
434
+ "x-moksa-bus-sig"
435
+ ]
436
+ },
437
+ "public": true
438
+ },
439
+ {
440
+ "name": "bus/refund",
441
+ "methods": [
442
+ "POST"
443
+ ],
444
+ "request": {
445
+ "body": "text",
446
+ "maxBytes": 262144,
447
+ "headers": [
448
+ "x-moksa-bus-ts",
449
+ "x-moksa-bus-id",
450
+ "x-moksa-bus-sig"
451
+ ]
452
+ },
453
+ "public": true
454
+ },
455
+ {
456
+ "name": "recurring/list",
457
+ "methods": [
458
+ "GET",
459
+ "POST"
460
+ ],
461
+ "permission": "plugins:manage"
462
+ },
463
+ {
464
+ "name": "trades/list",
465
+ "methods": [
466
+ "GET",
467
+ "POST"
468
+ ],
469
+ "permission": "plugins:manage"
470
+ },
471
+ {
472
+ "name": "trades/query",
473
+ "methods": [
474
+ "GET",
475
+ "POST"
476
+ ],
477
+ "permission": "plugins:manage"
478
+ },
479
+ {
480
+ "name": "trades/refund",
481
+ "methods": [
482
+ "POST"
483
+ ],
484
+ "permission": "plugins:manage"
485
+ },
486
+ {
487
+ "name": "trades/capture",
488
+ "methods": [
489
+ "POST"
490
+ ],
491
+ "permission": "plugins:manage"
492
+ },
493
+ {
494
+ "name": "trades/card-status",
495
+ "methods": [
496
+ "GET",
497
+ "POST"
498
+ ],
499
+ "permission": "plugins:manage"
500
+ },
501
+ {
502
+ "name": "shipments/create",
503
+ "methods": [
504
+ "POST"
505
+ ],
506
+ "permission": "plugins:manage"
507
+ },
508
+ {
509
+ "name": "shipments/list",
510
+ "methods": [
511
+ "GET",
512
+ "POST"
513
+ ],
514
+ "permission": "plugins:manage"
515
+ },
516
+ {
517
+ "name": "shipments/sync",
518
+ "methods": [
519
+ "GET",
520
+ "POST"
521
+ ],
522
+ "permission": "plugins:manage"
523
+ },
524
+ {
525
+ "name": "shipments/print",
526
+ "methods": [
527
+ "GET",
528
+ "POST"
529
+ ],
530
+ "permission": "plugins:manage"
531
+ },
532
+ {
533
+ "name": "shipments/sync-all",
534
+ "methods": [
535
+ "POST"
536
+ ],
537
+ "permission": "plugins:manage"
538
+ },
539
+ {
540
+ "name": "shipments/void",
541
+ "methods": [
542
+ "POST"
543
+ ],
544
+ "permission": "plugins:manage"
545
+ },
546
+ {
547
+ "name": "shipments/print-batch",
548
+ "methods": [
549
+ "GET",
550
+ "POST"
551
+ ],
552
+ "permission": "plugins:manage"
553
+ },
554
+ {
555
+ "name": "invoices/issue",
556
+ "methods": [
557
+ "POST"
558
+ ],
559
+ "permission": "plugins:manage"
560
+ },
561
+ {
562
+ "name": "invoices/get",
563
+ "methods": [
564
+ "GET",
565
+ "POST"
566
+ ],
567
+ "permission": "plugins:manage"
568
+ },
569
+ {
570
+ "name": "invoices/void",
571
+ "methods": [
572
+ "POST"
573
+ ],
574
+ "permission": "plugins:manage"
575
+ },
576
+ {
577
+ "name": "invoices/allowance",
578
+ "methods": [
579
+ "POST"
580
+ ],
581
+ "permission": "plugins:manage"
582
+ },
583
+ {
584
+ "name": "invoices/due",
585
+ "methods": [
586
+ "POST"
587
+ ],
588
+ "permission": "plugins:manage"
589
+ },
590
+ {
591
+ "name": "invoices/query",
592
+ "methods": [
593
+ "GET",
594
+ "POST"
595
+ ],
596
+ "permission": "plugins:manage"
597
+ },
598
+ {
599
+ "name": "admin",
600
+ "permission": "plugins:manage"
601
+ }
602
+ ],
603
+ "mcp": {
604
+ "tools": [
605
+ {
606
+ "name": "list_recurring_charges",
607
+ "description": "Subscription renewal charges made with ECPay saved cards (站內付 2.0 綁卡): state paid / failed / declined / uncertain, ECPay's code and message, the MerchantTradeNo, plus the saved cards (brand, last four digits, expiry; never the card token). Optional order number or state filter.",
608
+ "route": "recurring/list",
609
+ "permission": "plugins:manage",
610
+ "destructive": false,
611
+ "inputSchema": {
612
+ "$schema": "http://json-schema.org/draft-07/schema#",
613
+ "type": "object",
614
+ "properties": {
615
+ "orderNumber": {
616
+ "type": "string",
617
+ "minLength": 1,
618
+ "maxLength": 18,
619
+ "pattern": "^[A-Z0-9]+$"
620
+ },
621
+ "state": {
622
+ "enum": [
623
+ "calling",
624
+ "paid",
625
+ "failed",
626
+ "declined",
627
+ "uncertain"
628
+ ]
629
+ },
630
+ "limit": {
631
+ "type": "integer",
632
+ "minimum": 1,
633
+ "maximum": 100,
634
+ "default": 20
635
+ }
636
+ },
637
+ "additionalProperties": true
638
+ }
639
+ },
640
+ {
641
+ "name": "list_trades",
642
+ "description": "List ECPay trades (one per payment attempt), newest first, optionally for one order number. Status: created, awaiting (ATM/CVS code issued), paid, failed.",
643
+ "route": "trades/list",
644
+ "permission": "plugins:manage",
645
+ "destructive": false,
646
+ "inputSchema": {
647
+ "$schema": "http://json-schema.org/draft-07/schema#",
648
+ "type": "object",
649
+ "properties": {
650
+ "orderNumber": {
651
+ "type": "string",
652
+ "minLength": 1,
653
+ "maxLength": 18,
654
+ "pattern": "^[A-Z0-9]+$"
655
+ },
656
+ "limit": {
657
+ "type": "integer",
658
+ "minimum": 1,
659
+ "maximum": 100,
660
+ "default": 20
661
+ }
662
+ },
663
+ "additionalProperties": true
664
+ }
665
+ },
666
+ {
667
+ "name": "query_trade",
668
+ "description": "Ask ECPay for the current status of a trade by MerchantTradeNo (TradeStatus 1 = paid, 0 = not paid).",
669
+ "route": "trades/query",
670
+ "permission": "plugins:manage",
671
+ "destructive": false,
672
+ "inputSchema": {
673
+ "$schema": "http://json-schema.org/draft-07/schema#",
674
+ "type": "object",
675
+ "properties": {
676
+ "merchantTradeNo": {
677
+ "type": "string",
678
+ "minLength": 1,
679
+ "maxLength": 20,
680
+ "pattern": "^[A-Za-z0-9]+$"
681
+ }
682
+ },
683
+ "additionalProperties": true,
684
+ "required": [
685
+ "merchantTradeNo"
686
+ ]
687
+ }
688
+ },
689
+ {
690
+ "name": "card_status",
691
+ "description": "A paid ECPay card trade's authorization and capture status (Authorized, To be captured, Captured, Refunded, Cancelled) with the captured amount and history.",
692
+ "route": "trades/card-status",
693
+ "permission": "plugins:manage",
694
+ "destructive": false,
695
+ "inputSchema": {
696
+ "$schema": "http://json-schema.org/draft-07/schema#",
697
+ "type": "object",
698
+ "properties": {
699
+ "merchantTradeNo": {
700
+ "type": "string",
701
+ "minLength": 1,
702
+ "maxLength": 20,
703
+ "pattern": "^[A-Za-z0-9]+$"
704
+ }
705
+ },
706
+ "additionalProperties": true,
707
+ "required": [
708
+ "merchantTradeNo"
709
+ ]
710
+ }
711
+ },
712
+ {
713
+ "name": "capture_trade",
714
+ "description": "Capture (關帳) a paid ECPay card trade for its amount less refunds, when automatic capture is off.",
715
+ "route": "trades/capture",
716
+ "permission": "plugins:manage",
717
+ "destructive": true,
718
+ "inputSchema": {
719
+ "$schema": "http://json-schema.org/draft-07/schema#",
720
+ "type": "object",
721
+ "properties": {
722
+ "merchantTradeNo": {
723
+ "type": "string",
724
+ "minLength": 1,
725
+ "maxLength": 20,
726
+ "pattern": "^[A-Za-z0-9]+$"
727
+ }
728
+ },
729
+ "additionalProperties": true,
730
+ "required": [
731
+ "merchantTradeNo"
732
+ ]
733
+ }
734
+ },
735
+ {
736
+ "name": "list_shipments",
737
+ "description": "List 綠界物流 shipments, newest first, optionally for one order number (status, tracking number, provider fields).",
738
+ "route": "shipments/list",
739
+ "permission": "plugins:manage",
740
+ "destructive": false,
741
+ "inputSchema": {
742
+ "$schema": "http://json-schema.org/draft-07/schema#",
743
+ "type": "object",
744
+ "properties": {
745
+ "orderNumber": {
746
+ "type": "string",
747
+ "maxLength": 20
748
+ },
749
+ "limit": {
750
+ "type": "integer",
751
+ "minimum": 1,
752
+ "maximum": 100,
753
+ "default": 20
754
+ }
755
+ },
756
+ "additionalProperties": true
757
+ }
758
+ },
759
+ {
760
+ "name": "create_shipment",
761
+ "description": "Create the 綠界物流 shipment for a paid (or cash-on-delivery) order; an existing live shipment is returned instead.",
762
+ "route": "shipments/create",
763
+ "permission": "plugins:manage",
764
+ "destructive": true,
765
+ "inputSchema": {
766
+ "$schema": "http://json-schema.org/draft-07/schema#",
767
+ "type": "object",
768
+ "properties": {
769
+ "orderNumber": {
770
+ "type": "string",
771
+ "minLength": 1,
772
+ "maxLength": 20,
773
+ "pattern": "^[A-Z0-9]+$"
774
+ }
775
+ },
776
+ "additionalProperties": true,
777
+ "required": [
778
+ "orderNumber"
779
+ ]
780
+ }
781
+ },
782
+ {
783
+ "name": "sync_all_shipments",
784
+ "description": "Ask 綠界物流 for the status of every open shipment now (up to 100, oldest first) and apply the changes.",
785
+ "route": "shipments/sync-all",
786
+ "permission": "plugins:manage",
787
+ "destructive": false,
788
+ "inputSchema": {
789
+ "$schema": "http://json-schema.org/draft-07/schema#",
790
+ "type": "object",
791
+ "properties": {},
792
+ "additionalProperties": true
793
+ }
794
+ },
795
+ {
796
+ "name": "sync_shipment",
797
+ "description": "Ask 綠界物流 for a shipment's current status and apply it.",
798
+ "route": "shipments/sync",
799
+ "permission": "plugins:manage",
800
+ "destructive": false,
801
+ "inputSchema": {
802
+ "$schema": "http://json-schema.org/draft-07/schema#",
803
+ "type": "object",
804
+ "properties": {
805
+ "shipmentId": {
806
+ "type": "string",
807
+ "minLength": 1,
808
+ "maxLength": 64
809
+ }
810
+ },
811
+ "additionalProperties": true,
812
+ "required": [
813
+ "shipmentId"
814
+ ]
815
+ }
816
+ },
817
+ {
818
+ "name": "print_shipment_label",
819
+ "description": "The 綠界物流 shipping label: a signed form (action + params) to open in a browser, a URL, or label HTML.",
820
+ "route": "shipments/print",
821
+ "permission": "plugins:manage",
822
+ "destructive": false,
823
+ "inputSchema": {
824
+ "$schema": "http://json-schema.org/draft-07/schema#",
825
+ "type": "object",
826
+ "properties": {
827
+ "shipmentId": {
828
+ "type": "string",
829
+ "minLength": 1,
830
+ "maxLength": 64
831
+ }
832
+ },
833
+ "additionalProperties": true,
834
+ "required": [
835
+ "shipmentId"
836
+ ]
837
+ }
838
+ },
839
+ {
840
+ "name": "void_shipment",
841
+ "description": "Void a 綠界物流 shipment that has not shipped yet (cancel at the carrier's back office when it has no cancel API).",
842
+ "route": "shipments/void",
843
+ "permission": "plugins:manage",
844
+ "destructive": true,
845
+ "inputSchema": {
846
+ "$schema": "http://json-schema.org/draft-07/schema#",
847
+ "type": "object",
848
+ "properties": {
849
+ "shipmentId": {
850
+ "type": "string",
851
+ "minLength": 1,
852
+ "maxLength": 64
853
+ }
854
+ },
855
+ "additionalProperties": true,
856
+ "required": [
857
+ "shipmentId"
858
+ ]
859
+ }
860
+ },
861
+ {
862
+ "name": "issue_invoice",
863
+ "description": "Issue the 綠界電子發票 invoice for a paid order (idempotent: an issued invoice is returned).",
864
+ "route": "invoices/issue",
865
+ "permission": "plugins:manage",
866
+ "destructive": false,
867
+ "inputSchema": {
868
+ "$schema": "http://json-schema.org/draft-07/schema#",
869
+ "type": "object",
870
+ "properties": {
871
+ "orderNumber": {
872
+ "type": "string",
873
+ "minLength": 1,
874
+ "maxLength": 20,
875
+ "pattern": "^[A-Z0-9]+$"
876
+ }
877
+ },
878
+ "additionalProperties": true,
879
+ "required": [
880
+ "orderNumber"
881
+ ]
882
+ }
883
+ },
884
+ {
885
+ "name": "get_invoice",
886
+ "description": "The 綠界電子發票 invoice of an order: number, date, random code, allowances.",
887
+ "route": "invoices/get",
888
+ "permission": "plugins:manage",
889
+ "destructive": false,
890
+ "inputSchema": {
891
+ "$schema": "http://json-schema.org/draft-07/schema#",
892
+ "type": "object",
893
+ "properties": {
894
+ "orderNumber": {
895
+ "type": "string",
896
+ "minLength": 1,
897
+ "maxLength": 20,
898
+ "pattern": "^[A-Z0-9]+$"
899
+ }
900
+ },
901
+ "additionalProperties": true,
902
+ "required": [
903
+ "orderNumber"
904
+ ]
905
+ }
906
+ },
907
+ {
908
+ "name": "query_invoice",
909
+ "description": "Ask 綠界電子發票 for the invoice as it recorded it.",
910
+ "route": "invoices/query",
911
+ "permission": "plugins:manage",
912
+ "destructive": false,
913
+ "inputSchema": {
914
+ "$schema": "http://json-schema.org/draft-07/schema#",
915
+ "type": "object",
916
+ "properties": {
917
+ "orderNumber": {
918
+ "type": "string",
919
+ "minLength": 1,
920
+ "maxLength": 20,
921
+ "pattern": "^[A-Z0-9]+$"
922
+ }
923
+ },
924
+ "additionalProperties": true,
925
+ "required": [
926
+ "orderNumber"
927
+ ]
928
+ }
929
+ },
930
+ {
931
+ "name": "void_invoice",
932
+ "description": "Void an order's 綠界電子發票 invoice (its allowances are voided first).",
933
+ "route": "invoices/void",
934
+ "permission": "plugins:manage",
935
+ "destructive": true,
936
+ "inputSchema": {
937
+ "$schema": "http://json-schema.org/draft-07/schema#",
938
+ "type": "object",
939
+ "properties": {
940
+ "orderNumber": {
941
+ "type": "string",
942
+ "minLength": 1,
943
+ "maxLength": 20,
944
+ "pattern": "^[A-Z0-9]+$"
945
+ },
946
+ "reason": {
947
+ "type": "string",
948
+ "minLength": 1,
949
+ "maxLength": 50,
950
+ "default": "訂單取消"
951
+ }
952
+ },
953
+ "additionalProperties": true,
954
+ "required": [
955
+ "orderNumber"
956
+ ]
957
+ }
958
+ },
959
+ {
960
+ "name": "allowance_invoice",
961
+ "description": "Issue a 綠界電子發票 allowance (折讓, whole NT$) against an order's invoice.",
962
+ "route": "invoices/allowance",
963
+ "permission": "plugins:manage",
964
+ "destructive": true,
965
+ "inputSchema": {
966
+ "$schema": "http://json-schema.org/draft-07/schema#",
967
+ "type": "object",
968
+ "properties": {
969
+ "orderNumber": {
970
+ "type": "string",
971
+ "minLength": 1,
972
+ "maxLength": 20,
973
+ "pattern": "^[A-Z0-9]+$"
974
+ },
975
+ "amount": {
976
+ "type": "integer",
977
+ "minimum": 1,
978
+ "maximum": 99999999
979
+ },
980
+ "reason": {
981
+ "type": "string",
982
+ "minLength": 1,
983
+ "maxLength": 50,
984
+ "default": "折讓"
985
+ }
986
+ },
987
+ "additionalProperties": true,
988
+ "required": [
989
+ "orderNumber",
990
+ "amount"
991
+ ]
992
+ }
993
+ },
994
+ {
995
+ "name": "print_shipment_labels",
996
+ "description": "ECPay shipping labels for several shipments at once: one label page (HTML) per logistics subtype. mode A6 applies to 7-ELEVEN and post only; other subtypes print A4.",
997
+ "route": "shipments/print-batch",
998
+ "permission": "plugins:manage",
999
+ "destructive": false,
1000
+ "inputSchema": {
1001
+ "$schema": "http://json-schema.org/draft-07/schema#",
1002
+ "type": "object",
1003
+ "properties": {
1004
+ "shipmentIds": {
1005
+ "type": "array",
1006
+ "items": {
1007
+ "type": "string",
1008
+ "minLength": 1,
1009
+ "maxLength": 64
1010
+ },
1011
+ "minItems": 1,
1012
+ "maxItems": 50
1013
+ },
1014
+ "mode": {
1015
+ "enum": [
1016
+ "A4",
1017
+ "A6"
1018
+ ]
1019
+ }
1020
+ },
1021
+ "additionalProperties": true,
1022
+ "required": [
1023
+ "shipmentIds"
1024
+ ]
1025
+ }
1026
+ },
1027
+ {
1028
+ "name": "refund_trade",
1029
+ "description": "Refund a paid ECPay credit-card trade (whole NT$). An uncaptured charge can only be released in full. ATM / CVS payments must be refunded by hand.",
1030
+ "route": "trades/refund",
1031
+ "permission": "plugins:manage",
1032
+ "destructive": true,
1033
+ "inputSchema": {
1034
+ "$schema": "http://json-schema.org/draft-07/schema#",
1035
+ "type": "object",
1036
+ "properties": {
1037
+ "merchantTradeNo": {
1038
+ "type": "string",
1039
+ "minLength": 1,
1040
+ "maxLength": 20,
1041
+ "pattern": "^[A-Za-z0-9]+$"
1042
+ },
1043
+ "amount": {
1044
+ "type": "integer",
1045
+ "minimum": 1,
1046
+ "maximum": 99999999
1047
+ }
1048
+ },
1049
+ "additionalProperties": true,
1050
+ "required": [
1051
+ "merchantTradeNo",
1052
+ "amount"
1053
+ ]
1054
+ }
1055
+ }
1056
+ ]
1057
+ },
1058
+ "adminPages": [
1059
+ {
1060
+ "path": "/trades",
1061
+ "label": "綠界金流",
1062
+ "icon": "credit-card"
1063
+ },
1064
+ {
1065
+ "path": "/payment-labels",
1066
+ "label": "付款方式名稱與說明",
1067
+ "icon": "list"
1068
+ },
1069
+ {
1070
+ "path": "/shipments",
1071
+ "label": "綠界物流",
1072
+ "icon": "truck"
1073
+ },
1074
+ {
1075
+ "path": "/shipping-methods",
1076
+ "label": "物流方式設定",
1077
+ "icon": "list"
1078
+ },
1079
+ {
1080
+ "path": "/invoices",
1081
+ "label": "綠界電子發票",
1082
+ "icon": "receipt"
1083
+ }
1084
+ ],
1085
+ "settingsSchema": {
1086
+ "environment": {
1087
+ "label": "環境",
1088
+ "type": "select",
1089
+ "options": [
1090
+ {
1091
+ "value": "stage",
1092
+ "label": "測試環境(stage)"
1093
+ },
1094
+ {
1095
+ "value": "production",
1096
+ "label": "正式環境"
1097
+ }
1098
+ ],
1099
+ "default": "stage"
1100
+ },
1101
+ "merchantId": {
1102
+ "label": "特店編號(MerchantID)",
1103
+ "description": "測試環境留空時使用綠界公開測試帳號 3002607。",
1104
+ "type": "string",
1105
+ "default": ""
1106
+ },
1107
+ "hashKey": {
1108
+ "label": "HashKey",
1109
+ "type": "secret"
1110
+ },
1111
+ "hashIv": {
1112
+ "label": "HashIV",
1113
+ "type": "secret"
1114
+ },
1115
+ "methodCredit": {
1116
+ "label": "信用卡",
1117
+ "type": "boolean",
1118
+ "default": true
1119
+ },
1120
+ "methodCredit3": {
1121
+ "label": "信用卡分 3 期(需向綠界申請)",
1122
+ "type": "boolean",
1123
+ "default": false
1124
+ },
1125
+ "methodCredit6": {
1126
+ "label": "信用卡分 6 期(需向綠界申請)",
1127
+ "type": "boolean",
1128
+ "default": false
1129
+ },
1130
+ "methodCredit12": {
1131
+ "label": "信用卡分 12 期(需向綠界申請)",
1132
+ "type": "boolean",
1133
+ "default": false
1134
+ },
1135
+ "methodCredit18": {
1136
+ "label": "信用卡分 18 期(需向綠界申請)",
1137
+ "type": "boolean",
1138
+ "default": false
1139
+ },
1140
+ "methodCredit24": {
1141
+ "label": "信用卡分 24 期(需向綠界申請)",
1142
+ "type": "boolean",
1143
+ "default": false
1144
+ },
1145
+ "methodCredit30N": {
1146
+ "label": "信用卡分 30 期(永豐,需向綠界申請)",
1147
+ "type": "boolean",
1148
+ "default": false
1149
+ },
1150
+ "credit30NMinAmount": {
1151
+ "label": "永豐 30 期最低交易金額",
1152
+ "description": "綠界廠商後台可查;訂單金額大於這個金額才提供 30 期。0 表示不提供。",
1153
+ "type": "number",
1154
+ "default": 0,
1155
+ "min": 0
1156
+ },
1157
+ "methodUnionPay": {
1158
+ "label": "銀聯卡(需向綠界申請)",
1159
+ "type": "boolean",
1160
+ "default": false
1161
+ },
1162
+ "creditRedeem": {
1163
+ "label": "信用卡紅利折抵(需向綠界申請)",
1164
+ "description": "一次付清的信用卡付款頁提供紅利折抵;分期與銀聯卡不適用。",
1165
+ "type": "boolean",
1166
+ "default": false
1167
+ },
1168
+ "methodATM": {
1169
+ "label": "ATM 轉帳",
1170
+ "type": "boolean",
1171
+ "default": false
1172
+ },
1173
+ "methodCVS": {
1174
+ "label": "超商代碼繳費",
1175
+ "type": "boolean",
1176
+ "default": false
1177
+ },
1178
+ "methodBARCODE": {
1179
+ "label": "超商條碼繳費",
1180
+ "type": "boolean",
1181
+ "default": false
1182
+ },
1183
+ "methodWebATM": {
1184
+ "label": "網路 ATM(手機版不支援)",
1185
+ "type": "boolean",
1186
+ "default": false
1187
+ },
1188
+ "methodApplePay": {
1189
+ "label": "Apple Pay",
1190
+ "type": "boolean",
1191
+ "default": false
1192
+ },
1193
+ "methodTWQR": {
1194
+ "label": "TWQR 行動支付(需申請,6–49,999 元)",
1195
+ "type": "boolean",
1196
+ "default": false
1197
+ },
1198
+ "methodBNPL": {
1199
+ "label": "無卡分期:裕富/中租(需申請,50–500,000 元)",
1200
+ "type": "boolean",
1201
+ "default": false
1202
+ },
1203
+ "methodWeiXin": {
1204
+ "label": "微信支付(需申請,6–500,000 元)",
1205
+ "type": "boolean",
1206
+ "default": false
1207
+ },
1208
+ "methodJkopay": {
1209
+ "label": "街口支付(需申請)",
1210
+ "type": "boolean",
1211
+ "default": false
1212
+ },
1213
+ "methodiPASS": {
1214
+ "label": "一卡通 iPASS MONEY(需申請)",
1215
+ "type": "boolean",
1216
+ "default": false
1217
+ },
1218
+ "methodALL": {
1219
+ "label": "綠界付款頁自選",
1220
+ "type": "boolean",
1221
+ "default": false
1222
+ },
1223
+ "methodCreditBind": {
1224
+ "label": "信用卡綁定:定期定額自動扣款(站內付 2.0,需向綠界申請綁卡)",
1225
+ "description": "只在訂閱商品結帳時出現。首期刷卡同時綁定卡片,之後每期由網站自動扣款;請在綠界廠商後台開啟每日自動關帳。測試環境用綠界公開測試帳號。",
1226
+ "type": "boolean",
1227
+ "default": false
1228
+ },
1229
+ "atmExpireDays": {
1230
+ "label": "ATM 繳費期限(天)",
1231
+ "type": "number",
1232
+ "default": 3,
1233
+ "min": 1,
1234
+ "max": 60
1235
+ },
1236
+ "cvsExpireDays": {
1237
+ "label": "超商代碼繳費期限(天,最多 30)",
1238
+ "type": "number",
1239
+ "default": 7,
1240
+ "min": 1,
1241
+ "max": 30
1242
+ },
1243
+ "barcodeExpireDays": {
1244
+ "label": "超商條碼繳費期限(天,最多 30)",
1245
+ "type": "number",
1246
+ "default": 7,
1247
+ "min": 1,
1248
+ "max": 30
1249
+ },
1250
+ "orderPrefix": {
1251
+ "label": "訂單編號前綴(最多 5 個英數字)",
1252
+ "description": "多個商店共用同一個綠界帳號時,用前綴區分訂單編號。",
1253
+ "type": "string",
1254
+ "default": ""
1255
+ },
1256
+ "itemName": {
1257
+ "label": "付款頁顯示的商品名稱",
1258
+ "description": "留空時列出訂單的商品;填寫固定文字(例如「網路商品」)時每筆訂單都顯示這段文字。",
1259
+ "type": "string",
1260
+ "default": ""
1261
+ },
1262
+ "siteUrl": {
1263
+ "label": "網站網址",
1264
+ "description": "例:https://shop.example.com。物流狀態回呼使用;留空時沿用網站最近一次轉來的網址。",
1265
+ "type": "string",
1266
+ "default": ""
1267
+ },
1268
+ "logisticsEnabled": {
1269
+ "label": "啟用綠界物流",
1270
+ "type": "boolean",
1271
+ "default": false
1272
+ },
1273
+ "logisticsEnvironment": {
1274
+ "label": "物流環境",
1275
+ "type": "select",
1276
+ "options": [
1277
+ {
1278
+ "value": "stage",
1279
+ "label": "測試環境(stage)"
1280
+ },
1281
+ {
1282
+ "value": "production",
1283
+ "label": "正式環境"
1284
+ }
1285
+ ],
1286
+ "default": "stage"
1287
+ },
1288
+ "logisticsContract": {
1289
+ "label": "超商合約類型",
1290
+ "type": "select",
1291
+ "options": [
1292
+ {
1293
+ "value": "C2C",
1294
+ "label": "C2C 店到店"
1295
+ },
1296
+ {
1297
+ "value": "B2C",
1298
+ "label": "B2C 大宗寄倉"
1299
+ }
1300
+ ],
1301
+ "default": "C2C"
1302
+ },
1303
+ "logisticsC2cMerchantId": {
1304
+ "label": "C2C 物流特店編號",
1305
+ "description": "店到店(交貨便)用。測試環境未填時使用綠界公開測試帳號 2000933。",
1306
+ "type": "string",
1307
+ "default": ""
1308
+ },
1309
+ "logisticsC2cHashKey": {
1310
+ "label": "C2C 物流 HashKey",
1311
+ "type": "secret"
1312
+ },
1313
+ "logisticsC2cHashIv": {
1314
+ "label": "C2C 物流 HashIV",
1315
+ "type": "secret"
1316
+ },
1317
+ "logisticsB2cMerchantId": {
1318
+ "label": "B2C/宅配物流特店編號",
1319
+ "description": "大宗寄倉、黑貓、郵局用。測試環境未填時使用綠界公開測試帳號 2000132。",
1320
+ "type": "string",
1321
+ "default": ""
1322
+ },
1323
+ "logisticsB2cHashKey": {
1324
+ "label": "B2C/宅配物流 HashKey",
1325
+ "type": "secret"
1326
+ },
1327
+ "logisticsB2cHashIv": {
1328
+ "label": "B2C/宅配物流 HashIV",
1329
+ "type": "secret"
1330
+ },
1331
+ "cvsUnimart": {
1332
+ "label": "7-ELEVEN 取貨(B2C 可含冷凍,另拆一張冷凍單)",
1333
+ "type": "boolean",
1334
+ "default": true
1335
+ },
1336
+ "cvsFami": {
1337
+ "label": "全家取貨",
1338
+ "type": "boolean",
1339
+ "default": true
1340
+ },
1341
+ "cvsHilife": {
1342
+ "label": "萊爾富取貨",
1343
+ "type": "boolean",
1344
+ "default": false
1345
+ },
1346
+ "cvsOkmart": {
1347
+ "label": "OK 取貨",
1348
+ "type": "boolean",
1349
+ "default": false
1350
+ },
1351
+ "cvsUnimartFreeze": {
1352
+ "label": "7-ELEVEN 冷凍取貨(僅 B2C)",
1353
+ "type": "boolean",
1354
+ "default": false
1355
+ },
1356
+ "homeTcat": {
1357
+ "label": "黑貓宅急便(常溫/冷藏/冷凍,依溫層拆單)",
1358
+ "type": "boolean",
1359
+ "default": true
1360
+ },
1361
+ "homePost": {
1362
+ "label": "中華郵政(僅常溫)",
1363
+ "type": "boolean",
1364
+ "default": false
1365
+ },
1366
+ "cvsFee": {
1367
+ "label": "超商取貨運費",
1368
+ "type": "number",
1369
+ "default": 60,
1370
+ "min": 0
1371
+ },
1372
+ "homeFee": {
1373
+ "label": "宅配運費(常溫)",
1374
+ "type": "number",
1375
+ "default": 100,
1376
+ "min": 0
1377
+ },
1378
+ "coldFee": {
1379
+ "label": "低溫配送運費",
1380
+ "type": "number",
1381
+ "default": 160,
1382
+ "min": 0
1383
+ },
1384
+ "senderName": {
1385
+ "label": "寄件人姓名(最多 10 字)",
1386
+ "type": "string",
1387
+ "default": ""
1388
+ },
1389
+ "senderPhone": {
1390
+ "label": "寄件人電話",
1391
+ "type": "string",
1392
+ "default": ""
1393
+ },
1394
+ "senderCellphone": {
1395
+ "label": "寄件人手機",
1396
+ "type": "string",
1397
+ "default": ""
1398
+ },
1399
+ "senderZipcode": {
1400
+ "label": "寄件人郵遞區號(宅配用)",
1401
+ "description": "3、5 或 6 碼數字。留空時只採用寄件地址開頭的郵遞區號。",
1402
+ "type": "string",
1403
+ "default": ""
1404
+ },
1405
+ "senderAddress": {
1406
+ "label": "寄件地址(宅配用)",
1407
+ "description": "沒填郵遞區號時,地址開頭的 3–6 位數字當作郵遞區號。",
1408
+ "type": "string",
1409
+ "default": ""
1410
+ },
1411
+ "labelMode": {
1412
+ "label": "託運單格式",
1413
+ "description": "A6 只用於 7-ELEVEN(含冷凍)與中華郵政;全家、萊爾富、OK、黑貓沒有 A6,一律印 A4。",
1414
+ "type": "select",
1415
+ "options": [
1416
+ {
1417
+ "value": "1",
1418
+ "label": "A4"
1419
+ },
1420
+ {
1421
+ "value": "2",
1422
+ "label": "A6"
1423
+ }
1424
+ ],
1425
+ "default": "1"
1426
+ },
1427
+ "logisticsAutoShip": {
1428
+ "label": "付款後(貨到付款為下單後)自動建立物流單",
1429
+ "type": "boolean",
1430
+ "default": false
1431
+ },
1432
+ "invoiceEnabled": {
1433
+ "label": "啟用綠界電子發票",
1434
+ "type": "boolean",
1435
+ "default": false
1436
+ },
1437
+ "invoiceEnvironment": {
1438
+ "label": "發票環境",
1439
+ "type": "select",
1440
+ "options": [
1441
+ {
1442
+ "value": "stage",
1443
+ "label": "測試環境(stage)"
1444
+ },
1445
+ {
1446
+ "value": "production",
1447
+ "label": "正式環境"
1448
+ }
1449
+ ],
1450
+ "default": "stage"
1451
+ },
1452
+ "invoiceMerchantId": {
1453
+ "label": "發票特店編號",
1454
+ "description": "未填時使用綠界公開測試帳號 2000132(測試環境開立的發票不會上傳財政部)。",
1455
+ "type": "string",
1456
+ "default": ""
1457
+ },
1458
+ "invoiceHashKey": {
1459
+ "label": "發票 HashKey",
1460
+ "type": "secret"
1461
+ },
1462
+ "invoiceHashIv": {
1463
+ "label": "發票 HashIV",
1464
+ "type": "secret"
1465
+ },
1466
+ "invoicePrefix": {
1467
+ "label": "發票關聯編號前綴(最多 5 個英數字)",
1468
+ "description": "多個商店共用同一個綠界發票帳號時,用前綴區分。",
1469
+ "type": "string",
1470
+ "default": ""
1471
+ },
1472
+ "invoiceAuto": {
1473
+ "label": "自動開立",
1474
+ "type": "boolean",
1475
+ "default": true
1476
+ },
1477
+ "invoiceIssueWhen": {
1478
+ "label": "開立時機",
1479
+ "type": "select",
1480
+ "options": [
1481
+ {
1482
+ "value": "paid",
1483
+ "label": "付款完成(貨到付款於下單後)"
1484
+ },
1485
+ {
1486
+ "value": "completed",
1487
+ "label": "訂單完成(取貨完成)"
1488
+ }
1489
+ ],
1490
+ "default": "paid"
1491
+ },
1492
+ "invoiceDelayDays": {
1493
+ "label": "延後開立天數(0–30)",
1494
+ "type": "number",
1495
+ "default": 0,
1496
+ "min": 0,
1497
+ "max": 30
1498
+ },
1499
+ "invoiceAutoVoid": {
1500
+ "label": "訂單取消或全額退款時自動作廢",
1501
+ "type": "boolean",
1502
+ "default": false
1503
+ },
1504
+ "invoiceAutoAllowance": {
1505
+ "label": "部分退款時自動開立折讓",
1506
+ "type": "boolean",
1507
+ "default": false
1508
+ },
1509
+ "invoiceVerifyOnline": {
1510
+ "label": "結帳時向綠界驗證捐贈碼與手機條碼",
1511
+ "type": "boolean",
1512
+ "default": true
1513
+ },
1514
+ "invoiceAllowDonate": {
1515
+ "label": "結帳可選捐贈發票",
1516
+ "type": "boolean",
1517
+ "default": true
1518
+ },
1519
+ "invoiceAllowB2b": {
1520
+ "label": "結帳可打統編(三聯式)",
1521
+ "type": "boolean",
1522
+ "default": true
1523
+ },
1524
+ "invoiceChannelMember": {
1525
+ "label": "個人載具:綠界會員載具",
1526
+ "type": "boolean",
1527
+ "default": true
1528
+ },
1529
+ "invoiceChannelMobile": {
1530
+ "label": "個人載具:手機條碼",
1531
+ "type": "boolean",
1532
+ "default": true
1533
+ },
1534
+ "invoiceChannelCert": {
1535
+ "label": "個人載具:自然人憑證",
1536
+ "type": "boolean",
1537
+ "default": true
1538
+ },
1539
+ "invoiceChannelPaper": {
1540
+ "label": "個人載具:紙本發票",
1541
+ "description": "至少保留一種;全部取消時自動保留紙本。紙本發票請到綠界後台列印寄送。",
1542
+ "type": "boolean",
1543
+ "default": true
1544
+ },
1545
+ "invoiceDefaultCarrier": {
1546
+ "label": "預設的個人載具",
1547
+ "type": "select",
1548
+ "options": [
1549
+ {
1550
+ "value": "member",
1551
+ "label": "綠界會員載具"
1552
+ },
1553
+ {
1554
+ "value": "mobile",
1555
+ "label": "手機條碼"
1556
+ },
1557
+ {
1558
+ "value": "cert",
1559
+ "label": "自然人憑證"
1560
+ },
1561
+ {
1562
+ "value": "paper",
1563
+ "label": "紙本發票"
1564
+ }
1565
+ ],
1566
+ "default": "member"
1567
+ },
1568
+ "invoiceDonateOrgs": {
1569
+ "label": "捐贈單位(每行「名稱|愛心碼」)",
1570
+ "description": "例:伊甸社會福利基金會|25885。填寫後結帳改為下拉選單。",
1571
+ "type": "string",
1572
+ "default": ""
1573
+ },
1574
+ "vaultKey": {
1575
+ "label": "卡片憑證加密金鑰",
1576
+ "description": "第一次綁卡時自動產生,用來加密綠界綁卡代碼(BindCardID)。請勿修改或刪除,否則已綁定的卡片無法再扣款。",
1577
+ "type": "secret"
1578
+ },
1579
+ "busKey": {
1580
+ "label": "匯流排金鑰",
1581
+ "description": "由網站部署腳本寫入(scripts/provision-bus.mjs),請勿手動修改。",
1582
+ "type": "secret"
1583
+ }
1584
+ }
1585
+ });
1586
+
1587
+ export default descriptor;