ts-glitter 21.0.4 → 21.0.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.
Files changed (159) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-blog.js +22 -37
  4. package/lowcode/backend-manager/bg-blog.ts +45 -34
  5. package/lowcode/backend-manager/bg-list-component.js +2 -2
  6. package/lowcode/backend-manager/bg-list-component.ts +2 -2
  7. package/lowcode/backend-manager/bg-widget.js +21 -0
  8. package/lowcode/backend-manager/bg-widget.ts +21 -0
  9. package/lowcode/cms-plugin/filter-options.js +3 -3
  10. package/lowcode/cms-plugin/filter-options.ts +1 -1
  11. package/lowcode/cms-plugin/shopping-finance-setting.js +251 -6
  12. package/lowcode/cms-plugin/shopping-finance-setting.ts +291 -6
  13. package/lowcode/cms-plugin/shopping-order-manager.js +56 -46
  14. package/lowcode/cms-plugin/shopping-order-manager.ts +59 -47
  15. package/lowcode/cms-plugin/shopping-product-setting.js +10 -5
  16. package/lowcode/cms-plugin/shopping-product-setting.ts +14 -6
  17. package/lowcode/cms-plugin/shopping-setting-advance.js +21 -72
  18. package/lowcode/cms-plugin/shopping-setting-advance.ts +31 -98
  19. package/lowcode/css/editor.css +48 -16
  20. package/lowcode/css/front-end.css +16 -17
  21. package/lowcode/glitter-base/global/language.js +2 -0
  22. package/lowcode/glitter-base/global/language.ts +3 -0
  23. package/lowcode/glitter-base/global/shipment-config.js +4 -4
  24. package/lowcode/glitter-base/global/shipment-config.ts +1 -1
  25. package/lowcode/glitter-base/route/shopping.js +11 -0
  26. package/lowcode/glitter-base/route/shopping.ts +12 -0
  27. package/lowcode/official_view_component/form-widget/input-custom.js +0 -1
  28. package/lowcode/official_view_component/form-widget/input-custom.ts +0 -1
  29. package/lowcode/public-components/checkout/index.js +578 -780
  30. package/lowcode/public-components/checkout/index.ts +2457 -2652
  31. package/lowcode/public-components/headers/header-class.js +252 -324
  32. package/lowcode/public-components/headers/header-class.ts +389 -480
  33. package/lowcode/public-components/modules/cart-module.js +433 -0
  34. package/lowcode/public-components/modules/cart-module.ts +491 -0
  35. package/lowcode/public-components/modules/product-module.js +45 -0
  36. package/lowcode/public-components/modules/product-module.ts +58 -0
  37. package/lowcode/public-components/product/product-detail.js +178 -184
  38. package/lowcode/public-components/product/product-detail.ts +564 -579
  39. package/lowcode/public-components/user-manager/um-order.js +162 -32
  40. package/lowcode/public-components/user-manager/um-order.ts +181 -46
  41. package/lowcode/public-models/product.ts +1 -0
  42. package/package.json +1 -1
  43. package/src/Language.js +1 -0
  44. package/src/Language.js.map +1 -1
  45. package/src/Language.ts +3 -0
  46. package/src/api-public/controllers/article.js +33 -29
  47. package/src/api-public/controllers/article.js.map +1 -1
  48. package/src/api-public/controllers/article.ts +152 -146
  49. package/src/api-public/controllers/index.js +2 -0
  50. package/src/api-public/controllers/index.js.map +1 -1
  51. package/src/api-public/controllers/index.ts +2 -0
  52. package/src/api-public/controllers/shop.js +125 -47
  53. package/src/api-public/controllers/shop.js.map +1 -1
  54. package/src/api-public/controllers/shop.ts +148 -61
  55. package/src/api-public/controllers/user.js +51 -52
  56. package/src/api-public/controllers/user.js.map +1 -1
  57. package/src/api-public/controllers/user.ts +63 -52
  58. package/src/api-public/models/glitter-finance.js +2 -1
  59. package/src/api-public/models/glitter-finance.js.map +5 -1
  60. package/src/api-public/services/checkout-event.d.ts +1 -0
  61. package/src/api-public/services/checkout-event.js +18 -10
  62. package/src/api-public/services/checkout-event.js.map +1 -1
  63. package/src/api-public/services/checkout-event.ts +18 -7
  64. package/src/api-public/services/factories/payment-strategy-factory.d.ts +6 -0
  65. package/src/api-public/services/factories/payment-strategy-factory.js +49 -0
  66. package/src/api-public/services/factories/payment-strategy-factory.js.map +1 -0
  67. package/src/api-public/services/factories/payment-strategy-factory.ts +71 -0
  68. package/src/api-public/services/fb-service.js +4 -4
  69. package/src/api-public/services/fb-service.js.map +1 -1
  70. package/src/api-public/services/financial-service.d.ts +2 -1
  71. package/src/api-public/services/financial-service.js +48 -53
  72. package/src/api-public/services/financial-service.js.map +1 -1
  73. package/src/api-public/services/financial-service.ts +29 -38
  74. package/src/api-public/services/financial-serviceV2.d.ts +298 -0
  75. package/src/api-public/services/financial-serviceV2.js +1158 -0
  76. package/src/api-public/services/financial-serviceV2.js.map +1 -0
  77. package/src/api-public/services/financial-serviceV2.ts +1518 -0
  78. package/src/api-public/services/interface/payment-keys-interface.d.ts +37 -0
  79. package/src/api-public/services/interface/payment-keys-interface.js +3 -0
  80. package/src/api-public/services/interface/payment-keys-interface.js.map +1 -0
  81. package/src/api-public/services/interface/payment-keys-interface.ts +46 -0
  82. package/src/api-public/services/interface/payment-strategy-interface.d.ts +17 -0
  83. package/src/api-public/services/interface/payment-strategy-interface.js +3 -0
  84. package/src/api-public/services/interface/payment-strategy-interface.js.map +1 -0
  85. package/src/api-public/services/interface/payment-strategy-interface.ts +48 -0
  86. package/src/api-public/services/migrate-event/public-user-config.d.ts +5 -0
  87. package/src/api-public/services/migrate-event/public-user-config.js +81 -0
  88. package/src/api-public/services/migrate-event/public-user-config.js.map +1 -0
  89. package/src/api-public/services/migrate-event/public-user-config.ts +106 -0
  90. package/src/api-public/services/model/handlePaymentTransaction.js +0 -68
  91. package/src/api-public/services/model/handlePaymentTransaction.js.map +1 -1
  92. package/src/api-public/services/model/handlePaymentTransaction.ts +62 -54
  93. package/src/api-public/services/monitor.d.ts +1 -0
  94. package/src/api-public/services/payment-service.d.ts +12 -0
  95. package/src/api-public/services/payment-service.js +83 -0
  96. package/src/api-public/services/payment-service.js.map +1 -0
  97. package/src/api-public/services/payment-service.ts +112 -0
  98. package/src/api-public/services/shopping.d.ts +2 -1
  99. package/src/api-public/services/shopping.js +60 -23
  100. package/src/api-public/services/shopping.js.map +1 -1
  101. package/src/api-public/services/shopping.ts +88 -16
  102. package/src/api-public/services/strategies/ecpay-strategy.d.ts +8 -0
  103. package/src/api-public/services/strategies/ecpay-strategy.js +26 -0
  104. package/src/api-public/services/strategies/ecpay-strategy.js.map +1 -0
  105. package/src/api-public/services/strategies/ecpay-strategy.ts +30 -0
  106. package/src/api-public/services/strategies/ezpay-strategy.d.ts +8 -0
  107. package/src/api-public/services/strategies/ezpay-strategy.js +26 -0
  108. package/src/api-public/services/strategies/ezpay-strategy.js.map +1 -0
  109. package/src/api-public/services/strategies/ezpay-strategy.ts +31 -0
  110. package/src/api-public/services/strategies/jkopay-strategy.d.ts +8 -0
  111. package/src/api-public/services/strategies/jkopay-strategy.js +32 -0
  112. package/src/api-public/services/strategies/jkopay-strategy.js.map +1 -0
  113. package/src/api-public/services/strategies/jkopay-strategy.ts +36 -0
  114. package/src/api-public/services/strategies/linepay-strategy.d.ts +8 -0
  115. package/src/api-public/services/strategies/linepay-strategy.js +32 -0
  116. package/src/api-public/services/strategies/linepay-strategy.js.map +1 -0
  117. package/src/api-public/services/strategies/linepay-strategy.ts +35 -0
  118. package/src/api-public/services/strategies/paynow-strategy.d.ts +8 -0
  119. package/src/api-public/services/strategies/paynow-strategy.js +26 -0
  120. package/src/api-public/services/strategies/paynow-strategy.js.map +1 -0
  121. package/src/api-public/services/strategies/paynow-strategy.ts +29 -0
  122. package/src/api-public/services/strategies/paypal-strategy.d.ts +8 -0
  123. package/src/api-public/services/strategies/paypal-strategy.js +28 -0
  124. package/src/api-public/services/strategies/paypal-strategy.js.map +1 -0
  125. package/src/api-public/services/strategies/paypal-strategy.ts +31 -0
  126. package/src/api-public/services/updated-table-checked.d.ts +1 -0
  127. package/src/api-public/services/updated-table-checked.js +37 -15
  128. package/src/api-public/services/updated-table-checked.js.map +1 -1
  129. package/src/api-public/services/updated-table-checked.ts +56 -36
  130. package/src/api-public/utils/ut-permission.d.ts +1 -0
  131. package/src/app-project/serverless/src/index.js +17 -7
  132. package/src/app-project/serverless/src/index.js.map +1 -1
  133. package/src/app-project/serverless/src/modules/CryptoJS.js +17 -7
  134. package/src/app-project/serverless/src/modules/CryptoJS.js.map +1 -1
  135. package/src/app-project/serverless/src/modules/ssh.js +17 -7
  136. package/src/app-project/serverless/src/modules/ssh.js.map +1 -1
  137. package/src/config.d.ts +1 -1
  138. package/src/modules/AWSLib.js +3 -2
  139. package/src/modules/AWSLib.js.map +1 -1
  140. package/src/modules/CryptoJS.js +17 -7
  141. package/src/modules/CryptoJS.js.map +1 -1
  142. package/src/modules/database.d.ts +1 -1
  143. package/src/modules/redis.d.ts +1 -1
  144. package/src/modules/ssh.js +17 -7
  145. package/src/modules/ssh.js.map +1 -1
  146. package/src/modules/tool.d.ts +4 -4
  147. package/src/modules/tool.js +2 -1
  148. package/src/modules/tool.js.map +1 -1
  149. package/src/run.js +2 -1
  150. package/src/run.js.map +1 -1
  151. package/src/services/create-instance.js +4 -3
  152. package/src/services/create-instance.js.map +1 -1
  153. package/src/services/saas-table-check.js +2 -2
  154. package/src/services/saas-table-check.js.map +5 -1
  155. package/src/services/tool.js +3 -2
  156. package/src/services/tool.js.map +1 -1
  157. package/vp00rqhw1r.json +1 -0
  158. package/src/api-public/services/product-migrate.d.ts +0 -8
  159. package/src/api-public/services/product-migrate.js.map +0 -1
@@ -0,0 +1,1158 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.JKOV2 = exports.PayNowV2 = exports.LinePayV2 = exports.PayPalV2 = exports.EcPayV2 = exports.EzPayV2 = void 0;
30
+ const crypto_1 = __importDefault(require("crypto"));
31
+ const database_js_1 = __importDefault(require("../../modules/database.js"));
32
+ const moment_timezone_1 = __importDefault(require("moment-timezone"));
33
+ const axios_1 = __importDefault(require("axios"));
34
+ const redis_1 = __importDefault(require("../../modules/redis"));
35
+ const process_1 = __importDefault(require("process"));
36
+ const order_event_js_1 = require("./order-event.js");
37
+ const private_config_js_1 = require("../../services/private_config.js");
38
+ const console = __importStar(require("node:console"));
39
+ const financial_service_1 = __importDefault(require("./financial-service"));
40
+ const html = String.raw;
41
+ class FinancialServiceV2 {
42
+ constructor(appName, keyData) {
43
+ this.keyData = keyData;
44
+ this.appName = appName;
45
+ }
46
+ static aesEncrypt(data, key, iv, input = 'utf-8', output = 'hex', method = 'aes-256-cbc') {
47
+ while (key.length % 32 !== 0) {
48
+ key += '\0';
49
+ }
50
+ while (iv.length % 16 !== 0) {
51
+ iv += '\0';
52
+ }
53
+ const cipher = crypto_1.default.createCipheriv(method, key, iv);
54
+ let encrypted = cipher.update(data, input, output);
55
+ encrypted += cipher.final(output);
56
+ return encrypted;
57
+ }
58
+ static JsonToQueryString(data) {
59
+ const queryString = Object.keys(data)
60
+ .map(key => {
61
+ const value = data[key];
62
+ if (Array.isArray(value)) {
63
+ return value.map(v => `${encodeURIComponent(key)}[]=${encodeURIComponent(v)}`).join('&');
64
+ }
65
+ return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
66
+ })
67
+ .join('&');
68
+ return queryString;
69
+ }
70
+ async createOrderPage(orderData) {
71
+ orderData.method = orderData.method || 'ALL';
72
+ await order_event_js_1.OrderEvent.insertOrder({
73
+ cartData: orderData,
74
+ status: 0,
75
+ app: this.appName,
76
+ });
77
+ if (this.keyData.TYPE === 'newWebPay') {
78
+ return await new EzPayV2(this.appName, this.keyData).executePayment(orderData);
79
+ }
80
+ else if (this.keyData.TYPE === 'ecPay') {
81
+ return await new EcPayV2(this.appName, this.keyData).executePayment(orderData);
82
+ }
83
+ }
84
+ async saveWallet(orderData) {
85
+ if (this.keyData.TYPE === 'newWebPay') {
86
+ return await new EzPayV2(this.appName, this.keyData).saveMoney(orderData);
87
+ }
88
+ else if (this.keyData.TYPE === 'ecPay') {
89
+ return await new EcPayV2(this.appName).saveMoney(orderData);
90
+ }
91
+ return '';
92
+ }
93
+ }
94
+ exports.default = FinancialServiceV2;
95
+ class EzPayV2 {
96
+ constructor(appName, keyData) {
97
+ this.keyData = keyData;
98
+ this.appName = appName;
99
+ }
100
+ decode(data) {
101
+ var _a, _b;
102
+ return EzPayV2.aesDecrypt(data, (_a = this.keyData.HASH_KEY) !== null && _a !== void 0 ? _a : '', (_b = this.keyData.HASH_IV) !== null && _b !== void 0 ? _b : '');
103
+ }
104
+ async executePayment(orderData) {
105
+ var _a, _b, _c, _d, _e;
106
+ const params = {
107
+ MerchantID: (_a = this.keyData.MERCHANT_ID) !== null && _a !== void 0 ? _a : '',
108
+ RespondType: 'JSON',
109
+ TimeStamp: Math.floor(Date.now() / 1000),
110
+ Version: '2.0',
111
+ MerchantOrderNo: orderData.orderID,
112
+ Amt: orderData.total - orderData.use_wallet,
113
+ ItemDesc: '商品資訊',
114
+ NotifyURL: (_b = this.keyData.NotifyURL) !== null && _b !== void 0 ? _b : '',
115
+ ReturnURL: (_c = this.keyData.ReturnURL) !== null && _c !== void 0 ? _c : '',
116
+ TradeLimit: 600,
117
+ };
118
+ if (orderData.method && orderData.method !== 'ALL') {
119
+ [
120
+ {
121
+ value: 'credit',
122
+ title: '信用卡',
123
+ realKey: 'CREDIT',
124
+ },
125
+ {
126
+ value: 'atm',
127
+ title: 'ATM',
128
+ realKey: 'VACC',
129
+ },
130
+ {
131
+ value: 'web_atm',
132
+ title: '網路ATM',
133
+ realKey: 'WEBATM',
134
+ },
135
+ {
136
+ value: 'c_code',
137
+ title: '超商代碼',
138
+ realKey: 'CVS',
139
+ },
140
+ {
141
+ value: 'c_bar_code',
142
+ title: '超商條碼',
143
+ realKey: 'BARCODE',
144
+ },
145
+ ].map(dd => {
146
+ if (dd.value === orderData.method) {
147
+ params[dd.realKey] = 1;
148
+ }
149
+ else {
150
+ params[dd.realKey] = 0;
151
+ }
152
+ });
153
+ }
154
+ const qs = financial_service_1.default.JsonToQueryString(params);
155
+ const tradeInfo = financial_service_1.default.aesEncrypt(qs, (_d = this.keyData.HASH_KEY) !== null && _d !== void 0 ? _d : '', (_e = this.keyData.HASH_IV) !== null && _e !== void 0 ? _e : '');
156
+ const tradeSha = crypto_1.default
157
+ .createHash('sha256')
158
+ .update(`HashKey=${this.keyData.HASH_KEY}&${tradeInfo}&HashIV=${this.keyData.HASH_IV}`)
159
+ .digest('hex')
160
+ .toUpperCase();
161
+ return html ` <form name="Newebpay" action="${this.keyData.ActionURL}" method="POST" class="payment">
162
+ <input type="hidden" name="MerchantID" value="${this.keyData.MERCHANT_ID}" />
163
+ <input type="hidden" name="TradeInfo" value="${tradeInfo}" />
164
+ <input type="hidden" name="TradeSha" value="${tradeSha}" />
165
+ <input type="hidden" name="Version" value="${params.Version}" />
166
+ <input type="hidden" name="MerchantOrderNo" value="${params.MerchantOrderNo}" />
167
+ <button type="submit" class="btn btn-secondary custom-btn beside-btn" id="submit" hidden></button>
168
+ </form>`;
169
+ }
170
+ async saveMoney(orderData) {
171
+ var _a, _b, _c, _d, _e, _f;
172
+ const params = {
173
+ MerchantID: (_a = this.keyData.MERCHANT_ID) !== null && _a !== void 0 ? _a : '',
174
+ RespondType: 'JSON',
175
+ TimeStamp: Math.floor(Date.now() / 1000),
176
+ Version: '2.0',
177
+ MerchantOrderNo: new Date().getTime(),
178
+ Amt: orderData.total,
179
+ ItemDesc: orderData.title,
180
+ NotifyURL: (_b = this.keyData.NotifyURL) !== null && _b !== void 0 ? _b : '',
181
+ ReturnURL: (_c = this.keyData.ReturnURL) !== null && _c !== void 0 ? _c : '',
182
+ };
183
+ const appName = this.appName;
184
+ await database_js_1.default.execute(`INSERT INTO \`${appName}\`.${orderData.table} (orderID, userID, money, status, note)
185
+ VALUES (?, ?, ?, ?, ?)
186
+ `, [params.MerchantOrderNo, orderData.userID, orderData.total * orderData.ratio, 0, orderData.note]);
187
+ const qs = financial_service_1.default.JsonToQueryString(params);
188
+ const tradeInfo = financial_service_1.default.aesEncrypt(qs, (_d = this.keyData.HASH_KEY) !== null && _d !== void 0 ? _d : '', (_e = this.keyData.HASH_IV) !== null && _e !== void 0 ? _e : '');
189
+ const tradeSha = crypto_1.default
190
+ .createHash('sha256')
191
+ .update(`HashKey=${this.keyData.HASH_KEY}&${tradeInfo}&HashIV=${(_f = this.keyData.HASH_IV) !== null && _f !== void 0 ? _f : ''}`)
192
+ .digest('hex')
193
+ .toUpperCase();
194
+ const subMitData = {
195
+ actionURL: this.keyData.ActionURL,
196
+ MerchantOrderNo: params.MerchantOrderNo,
197
+ MerchantID: this.keyData.MERCHANT_ID,
198
+ TradeInfo: tradeInfo,
199
+ TradeSha: tradeSha,
200
+ Version: params.Version,
201
+ };
202
+ return html ` <form name="Newebpay" action="${subMitData.actionURL}" method="POST" class="payment">
203
+ <input type="hidden" name="MerchantID" value="${subMitData.MerchantID}" />
204
+ <input type="hidden" name="TradeInfo" value="${subMitData.TradeInfo}" />
205
+ <input type="hidden" name="TradeSha" value="${subMitData.TradeSha}" />
206
+ <input type="hidden" name="Version" value="${subMitData.Version}" />
207
+ <input type="hidden" name="MerchantOrderNo" value="${subMitData.MerchantOrderNo}" />
208
+ <button type="submit" class="btn btn-secondary custom-btn beside-btn" id="submit" hidden></button>
209
+ </form>`;
210
+ }
211
+ }
212
+ exports.EzPayV2 = EzPayV2;
213
+ EzPayV2.aesDecrypt = (data, key, iv, input = 'hex', output = 'utf-8', method = 'aes-256-cbc') => {
214
+ while (key.length % 32 !== 0) {
215
+ key += '\0';
216
+ }
217
+ while (iv.length % 16 !== 0) {
218
+ iv += '\0';
219
+ }
220
+ const decipher = crypto_1.default.createDecipheriv(method, key, iv);
221
+ let decrypted = decipher.update(data, input, output);
222
+ try {
223
+ decrypted += decipher.final(output);
224
+ }
225
+ catch (e) {
226
+ e instanceof Error && console.error(e.message);
227
+ }
228
+ return decrypted;
229
+ };
230
+ class EcPayV2 {
231
+ constructor(appName, keyData) {
232
+ this.appName = appName;
233
+ this.keyData = keyData;
234
+ }
235
+ async key_initial() {
236
+ var _a;
237
+ const keyData = (await private_config_js_1.Private_config.getConfig({
238
+ appName: this.appName,
239
+ key: 'glitter_finance',
240
+ }))[0].value;
241
+ let kd = (_a = keyData['ecPay']) !== null && _a !== void 0 ? _a : {
242
+ ReturnURL: '',
243
+ NotifyURL: '',
244
+ };
245
+ this.keyData = kd;
246
+ }
247
+ static generateCheckMacValue(params, HashKey, HashIV) {
248
+ const sortedQueryString = Object.keys(params)
249
+ .sort()
250
+ .map(key => `${key}=${params[key]}`)
251
+ .join('&');
252
+ const rawString = `HashKey=${HashKey}&${sortedQueryString}&HashIV=${HashIV}`;
253
+ const encodedString = encodeURIComponent(rawString)
254
+ .replace(/%2d/g, '-')
255
+ .replace(/%5f/g, '_')
256
+ .replace(/%2e/g, '.')
257
+ .replace(/%21/g, '!')
258
+ .replace(/%2a/g, '*')
259
+ .replace(/%28/g, '(')
260
+ .replace(/%29/g, ')')
261
+ .replace(/%20/g, '+');
262
+ const lowerCaseString = encodedString.toLowerCase();
263
+ const sha256Hash = crypto_1.default.createHash('sha256').update(lowerCaseString).digest('hex');
264
+ return sha256Hash.toUpperCase();
265
+ }
266
+ async executePayment(orderData) {
267
+ var _a, _b;
268
+ const params = {
269
+ MerchantTradeNo: orderData.orderID,
270
+ MerchantTradeDate: (0, moment_timezone_1.default)().tz('Asia/Taipei').format('YYYY/MM/DD HH:mm:ss'),
271
+ TotalAmount: orderData.total - orderData.use_wallet,
272
+ TradeDesc: '商品資訊',
273
+ ItemName: orderData.lineItems
274
+ .map(dd => {
275
+ return dd.title + (dd.spec.join('-') && '-' + dd.spec.join('-'));
276
+ })
277
+ .join('#'),
278
+ ReturnURL: this.keyData.NotifyURL,
279
+ ChoosePayment: orderData.method && orderData.method !== 'ALL'
280
+ ? (() => {
281
+ const find = [
282
+ {
283
+ value: 'credit',
284
+ title: '信用卡',
285
+ realKey: 'Credit',
286
+ },
287
+ {
288
+ value: 'atm',
289
+ title: 'ATM',
290
+ realKey: 'ATM',
291
+ },
292
+ {
293
+ value: 'web_atm',
294
+ title: '網路ATM',
295
+ realKey: 'WebATM',
296
+ },
297
+ {
298
+ value: 'c_code',
299
+ title: '超商代碼',
300
+ realKey: 'CVS',
301
+ },
302
+ {
303
+ value: 'c_bar_code',
304
+ title: '超商條碼',
305
+ realKey: 'BARCODE',
306
+ },
307
+ ].find(dd => {
308
+ return dd.value === orderData.method;
309
+ });
310
+ return find && find.realKey;
311
+ })()
312
+ : 'ALL',
313
+ PlatformID: '',
314
+ MerchantID: this.keyData.MERCHANT_ID,
315
+ InvoiceMark: 'N',
316
+ IgnorePayment: '',
317
+ DeviceSource: '',
318
+ EncryptType: '1',
319
+ PaymentType: 'aio',
320
+ OrderResultURL: this.keyData.ReturnURL,
321
+ NeedExtraPaidInfo: 'Y',
322
+ };
323
+ const chkSum = EcPayV2.generateCheckMacValue(params, (_a = this.keyData.HASH_KEY) !== null && _a !== void 0 ? _a : '', (_b = this.keyData.HASH_IV) !== null && _b !== void 0 ? _b : '');
324
+ orderData.CheckMacValue = chkSum;
325
+ return html `
326
+ <form id="_form_aiochk" action="${this.keyData.ActionURL}" method="post">
327
+ <input type="hidden" name="MerchantTradeNo" id="MerchantTradeNo" value="${params.MerchantTradeNo}" />
328
+ <input type="hidden" name="MerchantTradeDate" id="MerchantTradeDate" value="${params.MerchantTradeDate}" />
329
+ <input type="hidden" name="TotalAmount" id="TotalAmount" value="${params.TotalAmount}" />
330
+ <input type="hidden" name="TradeDesc" id="TradeDesc" value="${params.TradeDesc}" />
331
+ <input type="hidden" name="ItemName" id="ItemName" value="${params.ItemName}" />
332
+ <input type="hidden" name="ReturnURL" id="ReturnURL" value="${params.ReturnURL}" />
333
+ <input type="hidden" name="ChoosePayment" id="ChoosePayment" value="${params.ChoosePayment}" />
334
+ <input type="hidden" name="PlatformID" id="PlatformID" value="${params.PlatformID}" />
335
+ <input type="hidden" name="MerchantID" id="MerchantID" value="${params.MerchantID}" />
336
+ <input type="hidden" name="InvoiceMark" id="InvoiceMark" value="${params.InvoiceMark}" />
337
+ <input type="hidden" name="IgnorePayment" id="IgnorePayment" value="${params.IgnorePayment}" />
338
+ <input type="hidden" name="DeviceSource" id="DeviceSource" value="${params.DeviceSource}" />
339
+ <input type="hidden" name="EncryptType" id="EncryptType" value="${params.EncryptType}" />
340
+ <input type="hidden" name="PaymentType" id="PaymentType" value="${params.PaymentType}" />
341
+ <input type="hidden" name="OrderResultURL" id="OrderResultURL" value="${params.OrderResultURL}" />
342
+ <input type="hidden" name="NeedExtraPaidInfo" id="NeedExtraPaidInfo" value="${params.NeedExtraPaidInfo}" />
343
+ <input type="hidden" name="CheckMacValue" id="CheckMacValue" value="${chkSum}" />
344
+ <button type="submit" class="btn btn-secondary custom-btn beside-btn d-none" id="submit" hidden></button>
345
+ </form>
346
+ `;
347
+ }
348
+ async checkCreditInfo(CreditRefundId, CreditAmount) {
349
+ var _a, _b;
350
+ await this.key_initial();
351
+ const params = {
352
+ CreditRefundId: `${CreditRefundId}`,
353
+ CreditAmount: CreditAmount,
354
+ MerchantID: this.keyData.MERCHANT_ID,
355
+ CreditCheckCode: this.keyData.CreditCheckCode,
356
+ };
357
+ const chkSum = EcPayV2.generateCheckMacValue(params, (_a = this.keyData.HASH_KEY) !== null && _a !== void 0 ? _a : '', (_b = this.keyData.HASH_IV) !== null && _b !== void 0 ? _b : '');
358
+ params.CheckMacValue = chkSum;
359
+ let config = {
360
+ method: 'post',
361
+ maxBodyLength: Infinity,
362
+ url: `https://payment.ecpay.com.tw/CreditDetail/QueryTrade/V2`,
363
+ headers: {},
364
+ 'Content-Type': 'application/x-www-form-urlencoded',
365
+ data: new URLSearchParams(params).toString(),
366
+ };
367
+ return await new Promise((resolve, reject) => {
368
+ axios_1.default
369
+ .request(config)
370
+ .then((response) => {
371
+ resolve(response.data.RtnValue);
372
+ })
373
+ .catch((error) => {
374
+ console.log(error);
375
+ resolve({});
376
+ });
377
+ });
378
+ }
379
+ async checkPaymentStatus(orderID) {
380
+ var _a, _b;
381
+ await this.key_initial();
382
+ const params = {
383
+ MerchantTradeNo: `${orderID}`,
384
+ TimeStamp: Math.floor(Date.now() / 1000),
385
+ MerchantID: this.keyData.MERCHANT_ID,
386
+ };
387
+ const chkSum = EcPayV2.generateCheckMacValue(params, (_a = this.keyData.HASH_KEY) !== null && _a !== void 0 ? _a : '', (_b = this.keyData.HASH_IV) !== null && _b !== void 0 ? _b : '');
388
+ params.CheckMacValue = chkSum;
389
+ let config = {
390
+ method: 'post',
391
+ maxBodyLength: Infinity,
392
+ url: EcPayV2.beta === this.keyData.ActionURL
393
+ ? 'https://payment-stage.ecpay.com.tw/Cashier/QueryTradeInfo/V5'
394
+ : 'https://payment.ecpay.com.tw/Cashier/QueryTradeInfo/V5',
395
+ headers: {},
396
+ 'Content-Type': 'application/x-www-form-urlencoded',
397
+ data: new URLSearchParams(params).toString(),
398
+ };
399
+ return await new Promise((resolve, reject) => {
400
+ axios_1.default
401
+ .request(config)
402
+ .then(async (response) => {
403
+ const params = new URLSearchParams(response.data);
404
+ const paramsObject = {};
405
+ params.forEach((value, key) => {
406
+ paramsObject[key] = value;
407
+ });
408
+ if (paramsObject.gwsr && this.keyData.CreditCheckCode && EcPayV2.beta !== this.keyData.ActionURL) {
409
+ paramsObject.credit_receipt = await this.checkCreditInfo(paramsObject.gwsr, paramsObject.TradeAmt);
410
+ if (paramsObject.credit_receipt.status !== '已授權') {
411
+ paramsObject.TradeStatus = '10200095';
412
+ }
413
+ }
414
+ resolve(paramsObject);
415
+ })
416
+ .catch((error) => {
417
+ console.log(error);
418
+ resolve({
419
+ TradeStatus: '10200095',
420
+ });
421
+ });
422
+ });
423
+ }
424
+ async brushBack(orderID, tradNo, total) {
425
+ var _a, _b;
426
+ await this.key_initial();
427
+ const params = {
428
+ MerchantTradeNo: `${orderID}`,
429
+ TradeNo: tradNo,
430
+ Action: 'N',
431
+ TotalAmount: parseInt(total, 10),
432
+ MerchantID: this.keyData.MERCHANT_ID,
433
+ };
434
+ const chkSum = EcPayV2.generateCheckMacValue(params, (_a = this.keyData.HASH_KEY) !== null && _a !== void 0 ? _a : '', (_b = this.keyData.HASH_IV) !== null && _b !== void 0 ? _b : '');
435
+ params.CheckMacValue = chkSum;
436
+ let config = {
437
+ method: 'post',
438
+ maxBodyLength: Infinity,
439
+ url: `https://payment.ecpay.com.tw/CreditDetail/DoAction`,
440
+ headers: {},
441
+ 'Content-Type': 'application/x-www-form-urlencoded',
442
+ data: new URLSearchParams(params).toString(),
443
+ };
444
+ return await new Promise((resolve, reject) => {
445
+ axios_1.default
446
+ .request(config)
447
+ .then((response) => {
448
+ const params = new URLSearchParams(response.data);
449
+ const paramsObject = {};
450
+ params.forEach((value, key) => {
451
+ paramsObject[key] = value;
452
+ });
453
+ resolve(paramsObject);
454
+ })
455
+ .catch((error) => {
456
+ console.log(error);
457
+ resolve({
458
+ RtnCode: `-1`,
459
+ });
460
+ });
461
+ });
462
+ }
463
+ async saveMoney(orderData) {
464
+ var _a, _b;
465
+ await this.key_initial();
466
+ const params = {
467
+ MerchantTradeNo: new Date().getTime(),
468
+ MerchantTradeDate: (0, moment_timezone_1.default)().tz('Asia/Taipei').format('YYYY/MM/DD HH:mm:ss'),
469
+ TotalAmount: orderData.total,
470
+ TradeDesc: '商品資訊',
471
+ ItemName: orderData.title,
472
+ ReturnURL: this.keyData.NotifyURL,
473
+ ChoosePayment: orderData.method && orderData.method !== 'ALL'
474
+ ? (() => {
475
+ const find = [
476
+ {
477
+ value: 'credit',
478
+ title: '信用卡',
479
+ realKey: 'Credit',
480
+ },
481
+ {
482
+ value: 'atm',
483
+ title: 'ATM',
484
+ realKey: 'ATM',
485
+ },
486
+ {
487
+ value: 'web_atm',
488
+ title: '網路ATM',
489
+ realKey: 'WebATM',
490
+ },
491
+ {
492
+ value: 'c_code',
493
+ title: '超商代碼',
494
+ realKey: 'CVS',
495
+ },
496
+ {
497
+ value: 'c_bar_code',
498
+ title: '超商條碼',
499
+ realKey: 'BARCODE',
500
+ },
501
+ ].find(dd => {
502
+ return dd.value === orderData.method;
503
+ });
504
+ return find && find.realKey;
505
+ })()
506
+ : 'ALL',
507
+ PlatformID: '',
508
+ MerchantID: this.keyData.MERCHANT_ID,
509
+ InvoiceMark: 'N',
510
+ IgnorePayment: '',
511
+ DeviceSource: '',
512
+ EncryptType: '1',
513
+ PaymentType: 'aio',
514
+ OrderResultURL: this.keyData.ReturnURL,
515
+ };
516
+ const chkSum = EcPayV2.generateCheckMacValue(params, (_a = this.keyData.HASH_KEY) !== null && _a !== void 0 ? _a : '', (_b = this.keyData.HASH_IV) !== null && _b !== void 0 ? _b : '');
517
+ orderData.CheckMacValue = chkSum;
518
+ await database_js_1.default.execute(`INSERT INTO \`${this.appName}\`.${orderData.table} (orderID, userID, money, status, note)
519
+ VALUES (?, ?, ?, ?, ?)
520
+ `, [params.MerchantTradeNo, orderData.userID, orderData.total * orderData.ratio, 0, orderData.note]);
521
+ return html `
522
+ <form id="_form_aiochk" action="${this.keyData.ActionURL}" method="post">
523
+ <input type="hidden" name="MerchantTradeNo" id="MerchantTradeNo" value="${params.MerchantTradeNo}" />
524
+ <input type="hidden" name="MerchantTradeDate" id="MerchantTradeDate" value="${params.MerchantTradeDate}" />
525
+ <input type="hidden" name="TotalAmount" id="TotalAmount" value="${params.TotalAmount}" />
526
+ <input type="hidden" name="TradeDesc" id="TradeDesc" value="${params.TradeDesc}" />
527
+ <input type="hidden" name="ItemName" id="ItemName" value="${params.ItemName}" />
528
+ <input type="hidden" name="ReturnURL" id="ReturnURL" value="${params.ReturnURL}" />
529
+ <input type="hidden" name="ChoosePayment" id="ChoosePayment" value="${params.ChoosePayment}" />
530
+ <input type="hidden" name="PlatformID" id="PlatformID" value="${params.PlatformID}" />
531
+ <input type="hidden" name="MerchantID" id="MerchantID" value="${params.MerchantID}" />
532
+ <input type="hidden" name="InvoiceMark" id="InvoiceMark" value="${params.InvoiceMark}" />
533
+ <input type="hidden" name="IgnorePayment" id="IgnorePayment" value="${params.IgnorePayment}" />
534
+ <input type="hidden" name="DeviceSource" id="DeviceSource" value="${params.DeviceSource}" />
535
+ <input type="hidden" name="EncryptType" id="EncryptType" value="${params.EncryptType}" />
536
+ <input type="hidden" name="PaymentType" id="PaymentType" value="${params.PaymentType}" />
537
+ <input type="hidden" name="OrderResultURL" id="OrderResultURL" value="${params.OrderResultURL}" />
538
+ <input type="hidden" name="CheckMacValue" id="CheckMacValue" value="${chkSum}" />
539
+ <button type="submit" class="btn btn-secondary custom-btn beside-btn d-none" id="submit" hidden></button>
540
+ </form>
541
+ `;
542
+ }
543
+ }
544
+ exports.EcPayV2 = EcPayV2;
545
+ EcPayV2.beta = 'https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5';
546
+ class PayPalV2 {
547
+ constructor(appName, keyData) {
548
+ this.keyData = keyData;
549
+ this.appName = appName;
550
+ this.PAYPAL_CLIENT_ID = keyData.BETA == 'true' ? "ATz7uJryxmGA2SmR5PxQ_IFXFYKeWd_R1SIzsr_bDrJQMYgRR5z_TXEnjcBh2P4DQDDYnLdHu0aNfugX" : keyData.PAYPAL_CLIENT_ID;
551
+ this.PAYPAL_SECRET = keyData.BETA == 'true' ? "ENb25ujfYB0GBzv6GvzDW2a7gx-KgsVZwxOBqF0WSH3Zr7SU1BBdI8KQ_XRpcgcjj8VWTOWwo83NxK5d" : keyData.PAYPAL_SECRET;
552
+ this.PAYPAL_BASE_URL = keyData.BETA == 'true' ? 'https://api-m.sandbox.paypal.com' : 'https://api-m.paypal.com';
553
+ }
554
+ async getAccessToken() {
555
+ var _a;
556
+ try {
557
+ const tokenUrl = `${this.PAYPAL_BASE_URL}/v1/oauth2/token`;
558
+ const config = {
559
+ method: 'POST',
560
+ url: tokenUrl,
561
+ headers: {
562
+ 'Content-Type': 'application/x-www-form-urlencoded',
563
+ },
564
+ auth: {
565
+ username: this.PAYPAL_CLIENT_ID,
566
+ password: this.PAYPAL_SECRET,
567
+ },
568
+ data: new URLSearchParams({
569
+ grant_type: 'client_credentials',
570
+ }).toString(),
571
+ };
572
+ console.log("this.PAYPAL_CLIENT_ID -- ", this.PAYPAL_CLIENT_ID);
573
+ console.log("this.PAYPAL_SECRE -- ", this.PAYPAL_SECRET);
574
+ const response = await axios_1.default.request(config);
575
+ return response.data.access_token;
576
+ }
577
+ catch (error) {
578
+ console.error('Error fetching access token:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) || error.message);
579
+ throw new Error('Failed to retrieve PayPal access token.');
580
+ }
581
+ }
582
+ async checkout(orderData) {
583
+ var _a;
584
+ const accessToken = await this.getAccessToken();
585
+ const order = await this.executePayment(accessToken, orderData);
586
+ return {
587
+ orderId: order.id,
588
+ approveLink: (_a = order.links.find((link) => link.rel === 'approve')) === null || _a === void 0 ? void 0 : _a.href,
589
+ };
590
+ }
591
+ async executePayment(accessToken, orderData) {
592
+ var _a;
593
+ try {
594
+ const createOrderUrl = `${this.PAYPAL_BASE_URL}/v2/checkout/orders`;
595
+ let itemPrice = 0;
596
+ orderData.lineItems.forEach(item => {
597
+ itemPrice += item.sale_price;
598
+ });
599
+ const config = {
600
+ method: 'POST',
601
+ url: createOrderUrl,
602
+ headers: {
603
+ 'Content-Type': 'application/json',
604
+ Authorization: `Bearer ${accessToken}`,
605
+ },
606
+ data: {
607
+ intent: 'CAPTURE',
608
+ purchase_units: [
609
+ {
610
+ reference_id: orderData.orderID,
611
+ amount: {
612
+ currency_code: 'TWD',
613
+ value: itemPrice,
614
+ breakdown: {
615
+ item_total: {
616
+ currency_code: 'TWD',
617
+ value: itemPrice,
618
+ },
619
+ },
620
+ },
621
+ items: orderData.lineItems.map(item => {
622
+ var _a;
623
+ return {
624
+ name: item.title,
625
+ unit_amount: {
626
+ currency_code: 'TWD',
627
+ value: item.sale_price,
628
+ },
629
+ quantity: item.count,
630
+ description: (_a = item.spec.join(',')) !== null && _a !== void 0 ? _a : '',
631
+ };
632
+ }),
633
+ },
634
+ ],
635
+ application_context: {
636
+ brand_name: this.appName,
637
+ landing_page: 'NO_PREFERENCE',
638
+ user_action: 'PAY_NOW',
639
+ return_url: `${this.keyData.ReturnURL}&payment=true&appName=${this.appName}&orderID=${orderData.orderID}`,
640
+ cancel_url: `${this.keyData.ReturnURL}&payment=false`,
641
+ },
642
+ },
643
+ };
644
+ const response = await axios_1.default.request(config);
645
+ await redis_1.default.setValue('paypal' + orderData.orderID, response.data.id);
646
+ return response.data;
647
+ }
648
+ catch (error) {
649
+ console.error('Error creating order:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) || error.message);
650
+ throw new Error('Failed to create PayPal order.');
651
+ }
652
+ }
653
+ async getOrderDetails(orderId, accessToken) {
654
+ var _a;
655
+ const url = `/v2/checkout/orders/${orderId}`;
656
+ const axiosInstance = axios_1.default.create({
657
+ baseURL: this.PAYPAL_BASE_URL,
658
+ headers: {
659
+ 'Content-Type': 'application/json',
660
+ },
661
+ });
662
+ const config = {
663
+ method: 'GET',
664
+ url: url,
665
+ headers: {
666
+ Authorization: `Bearer ${accessToken}`,
667
+ },
668
+ };
669
+ try {
670
+ const response = await axiosInstance.request(config);
671
+ const order = response.data;
672
+ if (order.status === 'APPROVED') {
673
+ return order;
674
+ }
675
+ else {
676
+ throw new Error(`Order status is not APPROVED. Current status: ${order.status}`);
677
+ }
678
+ }
679
+ catch (error) {
680
+ console.error('Error fetching order details:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) || error.message);
681
+ throw error;
682
+ }
683
+ }
684
+ async capturePayment(orderId, accessToken) {
685
+ var _a;
686
+ const url = `/v2/checkout/orders/${orderId}/capture`;
687
+ const axiosInstance = axios_1.default.create({
688
+ baseURL: this.PAYPAL_BASE_URL,
689
+ headers: {
690
+ 'Content-Type': 'application/json',
691
+ },
692
+ });
693
+ const config = {
694
+ method: 'POST',
695
+ url: url,
696
+ headers: {
697
+ Authorization: `Bearer ${accessToken}`,
698
+ },
699
+ };
700
+ try {
701
+ const response = await axiosInstance.request(config);
702
+ return response.data;
703
+ }
704
+ catch (error) {
705
+ console.error('Error capturing payment:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) || error.message);
706
+ throw error;
707
+ }
708
+ }
709
+ async confirmAndCaptureOrder(orderId) {
710
+ try {
711
+ const accessToken = await this.getAccessToken();
712
+ const order = await this.getOrderDetails(orderId, accessToken);
713
+ const captureResult = await this.capturePayment(order.id, accessToken);
714
+ console.log('Payment process completed successfully.');
715
+ return captureResult;
716
+ }
717
+ catch (error) {
718
+ console.error('Error during order confirmation or payment capture:', error.message);
719
+ throw error;
720
+ }
721
+ }
722
+ }
723
+ exports.PayPalV2 = PayPalV2;
724
+ class LinePayV2 {
725
+ constructor(appName, keyData) {
726
+ this.keyData = keyData;
727
+ this.appName = appName;
728
+ this.LinePay_CLIENT_ID = keyData.LinePay_CLIENT_ID;
729
+ this.LinePay_SECRET = keyData.LinePay_SECRET;
730
+ this.LinePay_BASE_URL = keyData.BETA == 'true' ? 'https://sandbox-api-pay.line.me' : 'https://api-pay.line.me';
731
+ }
732
+ async confirmAndCaptureOrder(transactionId, total) {
733
+ var _a;
734
+ const body = {
735
+ amount: parseInt(`${total}`, 10),
736
+ currency: 'TWD',
737
+ };
738
+ const uri = `/payments/requests/${transactionId}/check`;
739
+ const nonce = new Date().getTime().toString();
740
+ const url = `${this.LinePay_BASE_URL}/v3${uri}`;
741
+ const head = [this.LinePay_SECRET, `/v3${uri}`, JSON.stringify(body), nonce].join('');
742
+ const signature = crypto_1.default.createHmac('sha256', this.LinePay_SECRET).update(head).digest('base64');
743
+ const config = {
744
+ method: 'POST',
745
+ url: url,
746
+ headers: {
747
+ 'Content-Type': 'application/json',
748
+ 'X-LINE-ChannelId': this.LinePay_CLIENT_ID,
749
+ 'X-LINE-Authorization-Nonce': nonce,
750
+ 'X-LINE-Authorization': signature,
751
+ },
752
+ data: body,
753
+ };
754
+ console.log(`line-conform->
755
+ URL:${url}
756
+ X-LINE-ChannelId:${this.LinePay_CLIENT_ID}
757
+ LinePay_SECRET:${this.LinePay_SECRET}
758
+ `);
759
+ try {
760
+ const response = await axios_1.default.request(config);
761
+ return response;
762
+ }
763
+ catch (error) {
764
+ console.error('Error linePay:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data.data) || error.message);
765
+ throw error;
766
+ }
767
+ }
768
+ async executePayment(orderData) {
769
+ var _a, _b;
770
+ const confirm_url = `${this.keyData.ReturnURL}&LinePay=true&appName=${this.appName}&orderID=${orderData.orderID}`;
771
+ const cancel_url = `${this.keyData.ReturnURL}&payment=false`;
772
+ orderData.discount = parseInt((_a = orderData.discount) !== null && _a !== void 0 ? _a : 0, 10);
773
+ const body = {
774
+ amount: orderData.total,
775
+ currency: 'TWD',
776
+ orderId: orderData.orderID,
777
+ shippingFee: orderData.shipment_fee,
778
+ packages: [
779
+ {
780
+ id: 'product_list',
781
+ amount: orderData.lineItems
782
+ .map(data => {
783
+ return data.count * data.sale_price;
784
+ })
785
+ .reduce((a, b) => a + b, 0) - orderData.discount,
786
+ products: orderData.lineItems
787
+ .map(data => {
788
+ return {
789
+ id: data.spec.join(','),
790
+ name: data.title,
791
+ imageUrl: '',
792
+ quantity: data.count,
793
+ price: data.sale_price,
794
+ };
795
+ })
796
+ .concat([
797
+ {
798
+ id: 'discount',
799
+ name: '折扣',
800
+ imageUrl: '',
801
+ quantity: 1,
802
+ price: orderData.discount * -1,
803
+ },
804
+ ]),
805
+ },
806
+ ],
807
+ redirectUrls: {
808
+ confirmUrl: confirm_url,
809
+ cancelUrl: cancel_url,
810
+ },
811
+ };
812
+ body.packages.push({
813
+ id: 'shipping',
814
+ amount: orderData.shipment_fee,
815
+ products: [
816
+ {
817
+ id: 'shipping',
818
+ name: 'shipping',
819
+ imageUrl: '',
820
+ quantity: 1,
821
+ price: orderData.shipment_fee,
822
+ },
823
+ ],
824
+ });
825
+ const uri = '/payments/request';
826
+ const nonce = new Date().getTime().toString();
827
+ const url = `${this.LinePay_BASE_URL}/v3${uri}`;
828
+ const head = [this.LinePay_SECRET, `/v3${uri}`, JSON.stringify(body), nonce].join('');
829
+ const signature = crypto_1.default.createHmac('sha256', this.LinePay_SECRET).update(head).digest('base64');
830
+ const config = {
831
+ method: 'POST',
832
+ url: url,
833
+ headers: {
834
+ 'Content-Type': 'application/json',
835
+ 'X-LINE-ChannelId': this.LinePay_CLIENT_ID,
836
+ 'X-LINE-Authorization-Nonce': nonce,
837
+ 'X-LINE-Authorization': signature,
838
+ },
839
+ data: body,
840
+ };
841
+ try {
842
+ const response = await axios_1.default.request(config);
843
+ await redis_1.default.setValue('linepay' + orderData.orderID, response.data.info.transactionId);
844
+ if (response.data.returnCode === '0000') {
845
+ return response.data;
846
+ }
847
+ else {
848
+ console.log(" Line Pay Error: ", response.data.returnCode, response.data.returnMessage);
849
+ return response.data;
850
+ }
851
+ }
852
+ catch (error) {
853
+ console.error('Error linePay:', ((_b = error.response) === null || _b === void 0 ? void 0 : _b.data) || error.message);
854
+ throw error;
855
+ }
856
+ }
857
+ }
858
+ exports.LinePayV2 = LinePayV2;
859
+ class PayNowV2 {
860
+ constructor(appName, keyData) {
861
+ var _a, _b;
862
+ this.keyData = keyData;
863
+ this.appName = appName;
864
+ this.PublicKey = (_a = keyData.public_key) !== null && _a !== void 0 ? _a : '';
865
+ this.PrivateKey = (_b = keyData.private_key) !== null && _b !== void 0 ? _b : '';
866
+ this.BASE_URL = keyData.BETA == 'true' ? 'https://sandboxapi.paynow.com.tw' : 'https://api.paynow.com.tw';
867
+ }
868
+ async executePaymentIntent(transactionId, secret, paymentNo) {
869
+ var _a;
870
+ let config = {
871
+ method: 'POST',
872
+ maxBodyLength: Infinity,
873
+ url: `${this.BASE_URL}/api/v1/payment-intents/${transactionId}/checkout`,
874
+ headers: {
875
+ Accept: 'application/json',
876
+ Authorization: `Bearer ` + this.PrivateKey,
877
+ },
878
+ data: JSON.stringify({
879
+ paymentNo: paymentNo,
880
+ usePayNowSdk: true,
881
+ key: this.PublicKey,
882
+ secret: secret,
883
+ paymentMethodType: 'CreditCard',
884
+ paymentMethodData: {},
885
+ otpFlag: false,
886
+ meta: {
887
+ client: {
888
+ height: 0,
889
+ width: 0,
890
+ },
891
+ iframe: {
892
+ height: 0,
893
+ width: 0,
894
+ },
895
+ },
896
+ }),
897
+ };
898
+ try {
899
+ const response = await axios_1.default.request(config);
900
+ return response.data;
901
+ }
902
+ catch (error) {
903
+ console.error('Error paynow:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data.data) || error.message);
904
+ throw error;
905
+ }
906
+ }
907
+ async bindKey() {
908
+ var _a;
909
+ if (this.keyData.BETA == 'true') {
910
+ return {
911
+ public_key: "sm22610RIIwOTz4STCFf0dF22G067lnd",
912
+ private_key: "bES1o13CUQJhZzcOkkq2BRoSa8a4f0Kv"
913
+ };
914
+ }
915
+ const keyData = (await private_config_js_1.Private_config.getConfig({
916
+ appName: this.appName,
917
+ key: 'glitter_finance',
918
+ }))[0].value;
919
+ let kd = (_a = keyData['paynow']) !== null && _a !== void 0 ? _a : {
920
+ ReturnURL: '',
921
+ NotifyURL: '',
922
+ };
923
+ let config = {
924
+ method: 'post',
925
+ maxBodyLength: Infinity,
926
+ url: 'https://api.paynow.com.tw/api/v1/partner/merchants/binding',
927
+ headers: {
928
+ 'Content-Type': 'application/json',
929
+ Authorization: `Bearer ` + process_1.default.env.paynow_partner,
930
+ },
931
+ data: {
932
+ merchant_no: kd.account,
933
+ api_key: kd.pwd,
934
+ },
935
+ };
936
+ return await new Promise((resolve, reject) => {
937
+ axios_1.default
938
+ .request(config)
939
+ .then(async (response) => {
940
+ if (response.data.result.length) {
941
+ keyData.public_key = response.data.result[0].public_key;
942
+ keyData.private_key = response.data.result[0].private_key;
943
+ }
944
+ resolve({
945
+ public_key: keyData.public_key,
946
+ private_key: keyData.private_key,
947
+ });
948
+ })
949
+ .catch((error) => {
950
+ resolve({
951
+ public_key: '',
952
+ private_key: '',
953
+ });
954
+ });
955
+ });
956
+ }
957
+ async confirmAndCaptureOrder(transactionId) {
958
+ var _a;
959
+ let config = {
960
+ method: 'get',
961
+ maxBodyLength: Infinity,
962
+ url: `${this.BASE_URL}/api/v1/payment-intents/${transactionId}`,
963
+ headers: {
964
+ Accept: 'application/json',
965
+ Authorization: `Bearer ` + (await this.bindKey()).private_key,
966
+ },
967
+ };
968
+ try {
969
+ const response = await axios_1.default.request(config);
970
+ return response.data;
971
+ }
972
+ catch (error) {
973
+ console.error('Error paynow:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data.data) || error.message);
974
+ throw error;
975
+ }
976
+ }
977
+ async createOrder(orderData) {
978
+ var _a;
979
+ const data = JSON.stringify({
980
+ amount: orderData.total,
981
+ currency: 'TWD',
982
+ description: orderData.orderID,
983
+ resultUrl: this.keyData.ReturnURL + `&orderID=${orderData.orderID}`,
984
+ webhookUrl: this.keyData.NotifyURL + `&orderID=${orderData.orderID}`,
985
+ allowedPaymentMethods: ['CreditCard'],
986
+ expireDays: 3,
987
+ });
988
+ const url = `${this.BASE_URL}/api/v1/payment-intents`;
989
+ const key_ = (this.keyData.BETA) ? { private_key: "bES1o13CUQJhZzcOkkq2BRoSa8a4f0Kv", public_key: "sm22610RIIwOTz4STCFf0dF22G067lnd" } : await this.bindKey();
990
+ const config = {
991
+ method: 'post',
992
+ maxBodyLength: Infinity,
993
+ url: url,
994
+ headers: {
995
+ 'Content-Type': 'application/json',
996
+ Authorization: `Bearer ` + key_.private_key,
997
+ },
998
+ data: data,
999
+ };
1000
+ try {
1001
+ const response = await axios_1.default.request(config);
1002
+ orderData.paynow_id = response.data.result.id;
1003
+ await order_event_js_1.OrderEvent.insertOrder({
1004
+ cartData: orderData,
1005
+ status: 0,
1006
+ app: this.appName,
1007
+ });
1008
+ await redis_1.default.setValue('paynow' + orderData.orderID, response.data.result.id);
1009
+ return {
1010
+ data: response.data,
1011
+ publicKey: key_.public_key,
1012
+ BETA: this.keyData.BETA,
1013
+ };
1014
+ }
1015
+ catch (error) {
1016
+ console.error('Error payNow:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) || error.message);
1017
+ throw error;
1018
+ }
1019
+ }
1020
+ async executePayment(orderData) {
1021
+ var _a;
1022
+ const data = JSON.stringify({
1023
+ amount: orderData.total,
1024
+ currency: 'TWD',
1025
+ description: orderData.orderID,
1026
+ resultUrl: this.keyData.ReturnURL + `&orderID=${orderData.orderID}`,
1027
+ webhookUrl: this.keyData.NotifyURL + `&orderID=${orderData.orderID}`,
1028
+ allowedPaymentMethods: ['CreditCard'],
1029
+ expireDays: 3,
1030
+ });
1031
+ const url = `${this.BASE_URL}/api/v1/payment-intents`;
1032
+ const key_ = (this.keyData.BETA) ? { private_key: "bES1o13CUQJhZzcOkkq2BRoSa8a4f0Kv", public_key: "sm22610RIIwOTz4STCFf0dF22G067lnd" } : await this.bindKey();
1033
+ const config = {
1034
+ method: 'post',
1035
+ maxBodyLength: Infinity,
1036
+ url: url,
1037
+ headers: {
1038
+ 'Content-Type': 'application/json',
1039
+ Authorization: `Bearer ` + key_.private_key,
1040
+ },
1041
+ data: data,
1042
+ };
1043
+ try {
1044
+ const response = await axios_1.default.request(config);
1045
+ orderData.paynow_id = response.data.result.id;
1046
+ await redis_1.default.setValue('paynow' + orderData.orderID, response.data.result.id);
1047
+ return {
1048
+ returnUrl: this.keyData.ReturnURL,
1049
+ data: response.data,
1050
+ publicKey: key_.public_key,
1051
+ BETA: this.keyData.BETA,
1052
+ };
1053
+ }
1054
+ catch (error) {
1055
+ console.error('Error payNow:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) || error.message);
1056
+ throw error;
1057
+ }
1058
+ }
1059
+ }
1060
+ exports.PayNowV2 = PayNowV2;
1061
+ class JKOV2 {
1062
+ constructor(appName, keyData) {
1063
+ this.keyData = keyData;
1064
+ this.appName = appName;
1065
+ this.BASE_URL = 'https://onlinepay.jkopay.com/';
1066
+ }
1067
+ async confirmAndCaptureOrder(transactionId) {
1068
+ var _a;
1069
+ const apiKey = process_1.default.env.jko_api_key || '';
1070
+ const secretKey = process_1.default.env.jko_api_secret || '';
1071
+ const digest = this.generateDigest(`platform_order_ids=${transactionId}`, secretKey);
1072
+ let config = {
1073
+ method: 'get',
1074
+ url: `${this.BASE_URL}platform/inquiry?platform_order_ids=${transactionId}`,
1075
+ headers: {
1076
+ 'api-key': apiKey,
1077
+ digest: digest,
1078
+ 'Content-Type': 'application/json',
1079
+ },
1080
+ };
1081
+ try {
1082
+ const response = await axios_1.default.request(config);
1083
+ return response.data.result_object;
1084
+ }
1085
+ catch (error) {
1086
+ console.error('Error paynow:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data.data) || error.message);
1087
+ throw error;
1088
+ }
1089
+ }
1090
+ async executePayment(orderData) {
1091
+ var _a;
1092
+ const payload = {
1093
+ currency: 'TWD',
1094
+ total_price: orderData.total,
1095
+ final_price: orderData.total,
1096
+ platform_order_id: orderData.orderID,
1097
+ store_id: this.keyData.STORE_ID,
1098
+ result_url: this.keyData.NotifyURL + `&orderID=${orderData.orderID}`,
1099
+ result_display_url: this.keyData.ReturnURL + `&orderID=${orderData.orderID}`,
1100
+ unredeem: 0
1101
+ };
1102
+ const apiKey = process_1.default.env.jko_api_key || '';
1103
+ const secretKey = process_1.default.env.jko_api_secret || '';
1104
+ const digest = crypto_1.default.createHmac('sha256', secretKey).update(JSON.stringify(payload), 'utf8').digest('hex');
1105
+ const headers = {
1106
+ 'api-key': apiKey,
1107
+ digest: digest,
1108
+ 'Content-Type': 'application/json',
1109
+ };
1110
+ const url = `${this.BASE_URL}platform/entry`;
1111
+ const config = {
1112
+ method: 'post',
1113
+ url: url,
1114
+ headers: headers,
1115
+ data: payload,
1116
+ };
1117
+ try {
1118
+ const response = await axios_1.default.request(config);
1119
+ await order_event_js_1.OrderEvent.insertOrder({
1120
+ cartData: orderData,
1121
+ status: 0,
1122
+ app: this.appName,
1123
+ });
1124
+ return response.data;
1125
+ }
1126
+ catch (error) {
1127
+ console.error('Error jkoPay:', ((_a = error.response) === null || _a === void 0 ? void 0 : _a.data) || error.message);
1128
+ throw error;
1129
+ }
1130
+ }
1131
+ async refundOrder(platform_order_id, refund_amount) {
1132
+ const payload = JSON.stringify({
1133
+ platform_order_id: '1740299355493',
1134
+ refund_amount: 10000,
1135
+ });
1136
+ const apiKey = '689c57cd9d5b5ec80f5d5451d18fe24cfe855d21b25c7ff30bcd07829a902f7a';
1137
+ const secretKey = '8ec78345a13e3d376452d9c89c66b543ef1516c0ef1a05f0adf654c37ac8edac';
1138
+ console.log('payload -- ', payload);
1139
+ const digest = crypto_1.default.createHmac('sha256', secretKey).update(payload, 'utf8').digest('hex');
1140
+ const headers = {
1141
+ 'api-key': apiKey,
1142
+ digest: digest,
1143
+ 'Content-Type': 'application/json',
1144
+ };
1145
+ console.log('API Key:', apiKey);
1146
+ console.log('Digest:', digest);
1147
+ console.log('Headers:', headers);
1148
+ }
1149
+ generateDigest(data, apiSecret) {
1150
+ console.log('data --', data);
1151
+ console.log('apiSecret -- ', apiSecret);
1152
+ const hmac = crypto_1.default.createHmac('sha256', apiSecret);
1153
+ hmac.update(data);
1154
+ return hmac.digest('hex');
1155
+ }
1156
+ }
1157
+ exports.JKOV2 = JKOV2;
1158
+ //# sourceMappingURL=financial-serviceV2.js.map