@h-ai/payment 0.1.0-alpha.67 → 0.1.0-alpha.69
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/README.en.md +125 -41
- package/README.ja.md +125 -41
- package/README.md +139 -42
- package/dist/chunk-YQD4KPT5.js +103 -0
- package/dist/chunk-YQD4KPT5.js.map +1 -0
- package/dist/client/index.d.ts +26 -25
- package/dist/client/index.js +61 -60
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +17 -19
- package/dist/index.js +646 -170
- package/dist/index.js.map +1 -1
- package/dist/payment-types-D02t-Pc9.d.ts +500 -0
- package/package.json +6 -4
- package/dist/chunk-4IUARFWH.js +0 -67
- package/dist/chunk-4IUARFWH.js.map +0 -1
- package/dist/payment-types-Cf3kF6Tn.d.ts +0 -211
package/dist/client/index.js
CHANGED
|
@@ -1,87 +1,88 @@
|
|
|
1
|
-
import { HaiPaymentError, paymentM } from '../chunk-
|
|
2
|
-
import {
|
|
1
|
+
import { HaiPaymentError, paymentM } from '../chunk-YQD4KPT5.js';
|
|
2
|
+
import { ok, err } from '@h-ai/core';
|
|
3
3
|
|
|
4
|
+
function requireStrings(params, fields) {
|
|
5
|
+
if (fields.some((field) => typeof params[field] !== "string" || !params[field].trim()))
|
|
6
|
+
throw new Error("Invalid payment client parameters");
|
|
7
|
+
}
|
|
4
8
|
function invokeWechatJsapi(clientParams) {
|
|
9
|
+
requireStrings(clientParams, ["appId", "timeStamp", "nonceStr", "package", "signType", "paySign"]);
|
|
10
|
+
if (clientParams.signType !== "RSA" || !/^prepay_id=.+$/.test(String(clientParams.package)) || !/^\d+$/.test(String(clientParams.timeStamp))) {
|
|
11
|
+
throw new Error("Invalid Wechat JSAPI parameters");
|
|
12
|
+
}
|
|
13
|
+
const bridge = window.WeixinJSBridge;
|
|
14
|
+
if (typeof bridge?.invoke !== "function")
|
|
15
|
+
return Promise.resolve({ invoked: false, message: paymentM("payment_wechatBridgeUnavailable") });
|
|
5
16
|
return new Promise((resolve) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
resolve({ invoked: false, message: "WeixinJSBridge not available" });
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
WeixinJSBridge.invoke("getBrandWCPayRequest", clientParams, (res) => {
|
|
12
|
-
resolve({
|
|
13
|
-
invoked: true,
|
|
14
|
-
message: res.err_msg
|
|
15
|
-
});
|
|
17
|
+
bridge.invoke("getBrandWCPayRequest", clientParams, (response) => {
|
|
18
|
+
resolve({ invoked: true, message: response.err_msg });
|
|
16
19
|
});
|
|
17
20
|
});
|
|
18
21
|
}
|
|
19
|
-
function invokeWechatH5(clientParams) {
|
|
20
|
-
const h5Url = clientParams.h5Url;
|
|
21
|
-
if (h5Url) {
|
|
22
|
-
window.location.href = h5Url;
|
|
23
|
-
return { invoked: true };
|
|
24
|
-
}
|
|
25
|
-
return { invoked: false, message: "Missing h5Url" };
|
|
26
|
-
}
|
|
27
22
|
function invokeAlipayH5(clientParams) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const parser = new DOMParser();
|
|
32
|
-
const doc = parser.parseFromString(formHtml, "text/html");
|
|
33
|
-
const form = doc.querySelector("form");
|
|
34
|
-
if (form) {
|
|
35
|
-
document.body.appendChild(document.adoptNode(form));
|
|
36
|
-
form.submit();
|
|
37
|
-
return { invoked: true };
|
|
38
|
-
}
|
|
39
|
-
return { invoked: false, message: "No form element found in response" };
|
|
23
|
+
const { gateway, fields } = clientParams;
|
|
24
|
+
if (gateway !== "https://openapi.alipay.com/gateway.do" && gateway !== "https://openapi-sandbox.dl.alipaydev.com/gateway.do" || Object.keys(clientParams).some((key) => key !== "gateway" && key !== "fields") || typeof fields !== "object" || fields === null || Array.isArray(fields)) {
|
|
25
|
+
throw new Error("Invalid Alipay page parameters");
|
|
40
26
|
}
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
const required = ["app_id", "method", "format", "charset", "sign_type", "timestamp", "version", "notify_url", "return_url", "biz_content", "sign"];
|
|
28
|
+
const entries = [];
|
|
29
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
30
|
+
if (!required.includes(key) || typeof value !== "string" || !value.trim())
|
|
31
|
+
throw new Error("Invalid Alipay form fields");
|
|
32
|
+
entries.push([key, value]);
|
|
33
|
+
}
|
|
34
|
+
if (entries.length !== required.length)
|
|
35
|
+
throw new Error("Invalid Alipay form fields");
|
|
36
|
+
const params = Object.fromEntries(entries);
|
|
37
|
+
if (params.method !== "alipay.trade.wap.pay" || params.format !== "JSON" || params.charset !== "utf-8" || params.version !== "1.0" || params.sign_type !== "RSA2" && params.sign_type !== "RSA") {
|
|
38
|
+
throw new Error("Invalid Alipay form method");
|
|
39
|
+
}
|
|
40
|
+
const form = document.createElement("form");
|
|
41
|
+
form.action = gateway;
|
|
42
|
+
form.method = "POST";
|
|
43
|
+
form.acceptCharset = "utf-8";
|
|
44
|
+
for (const [key, value] of entries) {
|
|
45
|
+
const input = document.createElement("input");
|
|
46
|
+
input.type = "hidden";
|
|
47
|
+
input.name = key;
|
|
48
|
+
input.value = value;
|
|
49
|
+
form.appendChild(input);
|
|
50
|
+
}
|
|
51
|
+
document.body.appendChild(form);
|
|
52
|
+
try {
|
|
53
|
+
form.submit();
|
|
43
54
|
return { invoked: true };
|
|
55
|
+
} finally {
|
|
56
|
+
form.remove();
|
|
44
57
|
}
|
|
45
|
-
return { invoked: false, message: "Missing alipay form or pay_url" };
|
|
46
58
|
}
|
|
47
59
|
function invokeStripeCheckout(clientParams) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return { invoked:
|
|
60
|
+
requireStrings(clientParams, ["checkoutUrl"]);
|
|
61
|
+
const checkoutUrl = new URL(String(clientParams.checkoutUrl));
|
|
62
|
+
if (checkoutUrl.protocol !== "https:" || checkoutUrl.username || checkoutUrl.password)
|
|
63
|
+
throw new Error("Invalid Stripe Checkout URL");
|
|
64
|
+
window.location.href = checkoutUrl.href;
|
|
65
|
+
return { invoked: true };
|
|
54
66
|
}
|
|
55
67
|
async function invokePayment(order) {
|
|
56
68
|
try {
|
|
57
|
-
let result;
|
|
58
69
|
switch (order.provider) {
|
|
59
70
|
case "wechat":
|
|
60
|
-
if (order.tradeType === "jsapi")
|
|
61
|
-
|
|
62
|
-
} else {
|
|
63
|
-
result = invokeWechatH5(order.clientParams);
|
|
64
|
-
}
|
|
71
|
+
if (order.tradeType === "jsapi")
|
|
72
|
+
return ok(await invokeWechatJsapi(order.clientParams));
|
|
65
73
|
break;
|
|
66
74
|
case "alipay":
|
|
67
|
-
|
|
75
|
+
if (order.tradeType === "h5")
|
|
76
|
+
return ok(invokeAlipayH5(order.clientParams));
|
|
68
77
|
break;
|
|
69
78
|
case "stripe":
|
|
70
|
-
|
|
79
|
+
if (order.tradeType === "h5")
|
|
80
|
+
return ok(invokeStripeCheckout(order.clientParams));
|
|
71
81
|
break;
|
|
72
|
-
default:
|
|
73
|
-
return err(
|
|
74
|
-
HaiPaymentError.INVOKE_WEB_FAILED,
|
|
75
|
-
paymentM("payment_invokeWebFailed")
|
|
76
|
-
);
|
|
77
82
|
}
|
|
78
|
-
return
|
|
83
|
+
return err(HaiPaymentError.UNSUPPORTED_TRADE_TYPE, paymentM("payment_unsupportedTradeType"));
|
|
79
84
|
} catch (cause) {
|
|
80
|
-
return err(
|
|
81
|
-
HaiPaymentError.INVOKE_WEB_FAILED,
|
|
82
|
-
paymentM("payment_invokeWebFailed"),
|
|
83
|
-
cause
|
|
84
|
-
);
|
|
85
|
+
return err(HaiPaymentError.INVOKE_WEB_FAILED, paymentM("payment_invokeWebFailed"), cause);
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/payment-client-web.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../../src/client/payment-client-web.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/payment/client — 浏览器支付调起\n *\n * 微信 JSAPI、支付宝 WAP 表单与 Stripe 托管页面使用各自完整的客户端协议。\n * @module payment-client-web\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PaymentOrder } from '../payment-types.js'\nimport type { InvokePaymentResult } from './payment-client-types.js'\nimport { err, ok } from '@h-ai/core'\nimport { paymentM } from '../payment-i18n.js'\nimport { HaiPaymentError } from '../payment-types.js'\n\n/**\n * 微信内置浏览器注入的公众号支付桥接对象。\n * @internal\n * @example 模块内部上下文\n * ```ts\n * function submit(bridge: WechatPaymentBridge, params: Record<string, unknown>) {\n * bridge.invoke('getBrandWCPayRequest', params, response => {\n * const clientMessage = response.err_msg // 仅用于客户端反馈,不能触发发货。\n * })\n * }\n * ```\n */\ninterface WechatPaymentBridge {\n invoke: (api: string, params: Record<string, unknown>, callback: (response: { err_msg: string }) => void) => void\n}\n\n/** 验证必填的字符串字段,拒绝空参数被浏览器当作已成功调起。 */\nfunction requireStrings(params: Record<string, unknown>, fields: readonly string[]): void {\n if (fields.some(field => typeof params[field] !== 'string' || !params[field].trim()))\n throw new Error('Invalid payment client parameters')\n}\n\n/** 微信 JSAPI 只在桥接对象已就绪时调起;回调仅表示客户端响应,不能证明已付款。 */\nfunction invokeWechatJsapi(clientParams: Record<string, unknown>): Promise<InvokePaymentResult> {\n requireStrings(clientParams, ['appId', 'timeStamp', 'nonceStr', 'package', 'signType', 'paySign'])\n if (clientParams.signType !== 'RSA' || !/^prepay_id=.+$/.test(String(clientParams.package))\n || !/^\\d+$/.test(String(clientParams.timeStamp))) {\n throw new Error('Invalid Wechat JSAPI parameters')\n }\n const bridge = (window as Window & { WeixinJSBridge?: WechatPaymentBridge }).WeixinJSBridge\n if (typeof bridge?.invoke !== 'function')\n return Promise.resolve({ invoked: false, message: paymentM('payment_wechatBridgeUnavailable') })\n return new Promise((resolve) => {\n bridge.invoke('getBrandWCPayRequest', clientParams, (response) => {\n resolve({ invoked: true, message: response.err_msg })\n })\n })\n}\n\n/** 支付宝 WAP 仅向固定网关 POST 签名字段;不解析 HTML,也不将业务数据放进 URL。 */\nfunction invokeAlipayH5(clientParams: Record<string, unknown>): InvokePaymentResult {\n const { gateway, fields } = clientParams\n if ((gateway !== 'https://openapi.alipay.com/gateway.do'\n && gateway !== 'https://openapi-sandbox.dl.alipaydev.com/gateway.do')\n || Object.keys(clientParams).some(key => key !== 'gateway' && key !== 'fields')\n || typeof fields !== 'object' || fields === null || Array.isArray(fields)) {\n throw new Error('Invalid Alipay page parameters')\n }\n const required = ['app_id', 'method', 'format', 'charset', 'sign_type', 'timestamp', 'version', 'notify_url', 'return_url', 'biz_content', 'sign']\n const entries: Array<[string, string]> = []\n for (const [key, value] of Object.entries(fields) as Array<[string, unknown]>) {\n if (!required.includes(key) || typeof value !== 'string' || !value.trim())\n throw new Error('Invalid Alipay form fields')\n entries.push([key, value])\n }\n if (entries.length !== required.length)\n throw new Error('Invalid Alipay form fields')\n const params = Object.fromEntries(entries)\n if (params.method !== 'alipay.trade.wap.pay' || params.format !== 'JSON' || params.charset !== 'utf-8' || params.version !== '1.0'\n || (params.sign_type !== 'RSA2' && params.sign_type !== 'RSA')) {\n throw new Error('Invalid Alipay form method')\n }\n // 逐个构造 input,字段值中的引号、尖括号和脚本始终只是文本。\n const form = document.createElement('form')\n form.action = gateway\n form.method = 'POST'\n form.acceptCharset = 'utf-8'\n for (const [key, value] of entries) {\n const input = document.createElement('input')\n input.type = 'hidden'\n input.name = key\n input.value = value\n form.appendChild(input)\n }\n document.body.appendChild(form)\n try {\n form.submit()\n return { invoked: true }\n }\n finally {\n form.remove()\n }\n}\n\n/** Stripe 托管页使用 HTTPS 跳转,禁止 javascript/file 等可执行或本地协议。 */\nfunction invokeStripeCheckout(clientParams: Record<string, unknown>): InvokePaymentResult {\n requireStrings(clientParams, ['checkoutUrl'])\n const checkoutUrl = new URL(String(clientParams.checkoutUrl))\n if (checkoutUrl.protocol !== 'https:' || checkoutUrl.username || checkoutUrl.password)\n throw new Error('Invalid Stripe Checkout URL')\n window.location.href = checkoutUrl.href\n return { invoked: true }\n}\n\n/**\n * 按服务端返回的渠道与场景调起支付;不支持的组合直接返回错误。\n *\n * 调用前等待微信 WeixinJSBridgeReady;invoked 只表示已提交调起,付款状态由服务端确认。\n *\n * @param order - 服务端创建的支付订单\n * @returns 调起结果;失败时应向用户提示并允许重试。\n * @example\n * ```ts\n * import { invokePayment } from '@h-ai/payment/client'\n * import type { PaymentOrder } from '@h-ai/payment'\n * async function pay(orderFromServer: PaymentOrder) {\n * // 浏览器环境;微信先等待 WeixinJSBridgeReady。参数来自受信服务端创建订单接口。\n * const result = await invokePayment(orderFromServer)\n * if (!result.success) throw new Error(result.error.message)\n * if (!result.data.invoked) throw new Error(result.data.message)\n * // 继续等待服务端查询/通知确认,不能依据 invoked、页面跳转或用户返回就发货。\n * }\n * ```\n */\nexport async function invokePayment(order: PaymentOrder): Promise<HaiResult<InvokePaymentResult>> {\n try {\n switch (order.provider) {\n case 'wechat':\n if (order.tradeType === 'jsapi')\n return ok(await invokeWechatJsapi(order.clientParams))\n break\n case 'alipay':\n if (order.tradeType === 'h5')\n return ok(invokeAlipayH5(order.clientParams))\n break\n case 'stripe':\n if (order.tradeType === 'h5')\n return ok(invokeStripeCheckout(order.clientParams))\n break\n }\n return err(HaiPaymentError.UNSUPPORTED_TRADE_TYPE, paymentM('payment_unsupportedTradeType'))\n }\n catch (cause) {\n return err(HaiPaymentError.INVOKE_WEB_FAILED, paymentM('payment_invokeWebFailed'), cause)\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as PaymentFunctions } from './payment-types-
|
|
2
|
-
export { A as AlipayConfig, b as AlipayConfigSchema, C as CreateOrderInput, H as HaiPaymentError, O as OrderStatus, c as OrderStatusValue, d as PaymentConfig, e as PaymentConfigInput, f as PaymentConfigSchema, g as PaymentNotifyRequest, h as PaymentNotifyResult, P as PaymentOrder, i as PaymentProvider, R as RefundInput, j as RefundResult, S as StripeConfig, k as StripeConfigSchema, T as TradeType, W as WechatPayConfig, l as WechatPayConfigSchema } from './payment-types-
|
|
1
|
+
import { a as PaymentFunctions } from './payment-types-D02t-Pc9.js';
|
|
2
|
+
export { A as AlipayConfig, b as AlipayConfigSchema, C as CreateOrderInput, H as HaiPaymentError, O as OrderStatus, c as OrderStatusValue, d as PaymentConfig, e as PaymentConfigInput, f as PaymentConfigSchema, g as PaymentNotifyRequest, h as PaymentNotifyResult, P as PaymentOrder, i as PaymentProvider, R as RefundInput, j as RefundResult, S as StripeConfig, k as StripeConfigSchema, T as TradeType, W as WechatPayConfig, l as WechatPayConfigSchema } from './payment-types-D02t-Pc9.js';
|
|
3
3
|
import '@h-ai/core';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
|
@@ -13,25 +13,23 @@ import 'zod';
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* 支付生命周期与统一渠道操作入口;初始化失败必须停止依赖该模块的业务。
|
|
18
17
|
* @example
|
|
19
18
|
* ```ts
|
|
20
|
-
* import { payment } from '@h-ai/payment'
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* })
|
|
19
|
+
* import { payment, type PaymentConfigInput } from '@h-ai/payment'
|
|
20
|
+
* async function run(config: PaymentConfigInput) {
|
|
21
|
+
* // 使用 Stripe 时,宿主已先初始化同一共享 reldb;payment.close 不关闭它。
|
|
22
|
+
* const initialized = await payment.init(config)
|
|
23
|
+
* if (!initialized.success) throw new Error(initialized.error.message)
|
|
24
|
+
* try {
|
|
25
|
+
* const order = await payment.queryOrder('stripe', 'ORDER_1')
|
|
26
|
+
* if (!order.success) throw new Error(order.error.message)
|
|
27
|
+
* return order.data
|
|
28
|
+
* }
|
|
29
|
+
* finally {
|
|
30
|
+
* await payment.close()
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
35
33
|
* ```
|
|
36
34
|
*/
|
|
37
35
|
declare const payment: PaymentFunctions;
|