qrcode-alipay 1.0.0

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/vue.d.cts ADDED
@@ -0,0 +1,64 @@
1
+ import * as vue from 'vue';
2
+ import { PropType } from 'vue';
3
+
4
+ declare const AlipayQRCode: vue.DefineComponent<vue.ExtractPropTypes<{
5
+ value: {
6
+ type: StringConstructor;
7
+ required: true;
8
+ };
9
+ size: {
10
+ type: PropType<number | string>;
11
+ default: undefined;
12
+ };
13
+ margin: {
14
+ type: NumberConstructor;
15
+ default: undefined;
16
+ };
17
+ title: {
18
+ type: StringConstructor;
19
+ default: undefined;
20
+ };
21
+ ariaLabel: {
22
+ type: StringConstructor;
23
+ default: undefined;
24
+ };
25
+ className: {
26
+ type: StringConstructor;
27
+ default: undefined;
28
+ };
29
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
30
+ [key: string]: any;
31
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
32
+ value: {
33
+ type: StringConstructor;
34
+ required: true;
35
+ };
36
+ size: {
37
+ type: PropType<number | string>;
38
+ default: undefined;
39
+ };
40
+ margin: {
41
+ type: NumberConstructor;
42
+ default: undefined;
43
+ };
44
+ title: {
45
+ type: StringConstructor;
46
+ default: undefined;
47
+ };
48
+ ariaLabel: {
49
+ type: StringConstructor;
50
+ default: undefined;
51
+ };
52
+ className: {
53
+ type: StringConstructor;
54
+ default: undefined;
55
+ };
56
+ }>> & Readonly<{}>, {
57
+ title: string;
58
+ size: string | number;
59
+ margin: number;
60
+ ariaLabel: string;
61
+ className: string;
62
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
63
+
64
+ export { AlipayQRCode, AlipayQRCode as default };
package/dist/vue.d.ts ADDED
@@ -0,0 +1,64 @@
1
+ import * as vue from 'vue';
2
+ import { PropType } from 'vue';
3
+
4
+ declare const AlipayQRCode: vue.DefineComponent<vue.ExtractPropTypes<{
5
+ value: {
6
+ type: StringConstructor;
7
+ required: true;
8
+ };
9
+ size: {
10
+ type: PropType<number | string>;
11
+ default: undefined;
12
+ };
13
+ margin: {
14
+ type: NumberConstructor;
15
+ default: undefined;
16
+ };
17
+ title: {
18
+ type: StringConstructor;
19
+ default: undefined;
20
+ };
21
+ ariaLabel: {
22
+ type: StringConstructor;
23
+ default: undefined;
24
+ };
25
+ className: {
26
+ type: StringConstructor;
27
+ default: undefined;
28
+ };
29
+ }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
30
+ [key: string]: any;
31
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
32
+ value: {
33
+ type: StringConstructor;
34
+ required: true;
35
+ };
36
+ size: {
37
+ type: PropType<number | string>;
38
+ default: undefined;
39
+ };
40
+ margin: {
41
+ type: NumberConstructor;
42
+ default: undefined;
43
+ };
44
+ title: {
45
+ type: StringConstructor;
46
+ default: undefined;
47
+ };
48
+ ariaLabel: {
49
+ type: StringConstructor;
50
+ default: undefined;
51
+ };
52
+ className: {
53
+ type: StringConstructor;
54
+ default: undefined;
55
+ };
56
+ }>> & Readonly<{}>, {
57
+ title: string;
58
+ size: string | number;
59
+ margin: number;
60
+ ariaLabel: string;
61
+ className: string;
62
+ }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
63
+
64
+ export { AlipayQRCode, AlipayQRCode as default };
package/dist/vue.js ADDED
@@ -0,0 +1,68 @@
1
+ import {
2
+ createAlipayQRCode
3
+ } from "./chunk-BECJ3Y2B.js";
4
+
5
+ // src/vue.ts
6
+ import { defineComponent, h } from "vue";
7
+ function renderVueNode(node) {
8
+ if (typeof node === "string") return node;
9
+ return h(
10
+ node.tag,
11
+ node.attrs ?? {},
12
+ node.children?.map((child) => renderVueNode(child))
13
+ );
14
+ }
15
+ var AlipayQRCode = defineComponent({
16
+ name: "AlipayQRCode",
17
+ inheritAttrs: false,
18
+ props: {
19
+ value: {
20
+ type: String,
21
+ required: true
22
+ },
23
+ size: {
24
+ type: [Number, String],
25
+ default: void 0
26
+ },
27
+ margin: {
28
+ type: Number,
29
+ default: void 0
30
+ },
31
+ title: {
32
+ type: String,
33
+ default: void 0
34
+ },
35
+ ariaLabel: {
36
+ type: String,
37
+ default: void 0
38
+ },
39
+ className: {
40
+ type: String,
41
+ default: void 0
42
+ }
43
+ },
44
+ setup(props, { attrs }) {
45
+ return () => {
46
+ const descriptor = createAlipayQRCode(props.value, {
47
+ size: props.size,
48
+ margin: props.margin,
49
+ title: props.title,
50
+ ariaLabel: props.ariaLabel,
51
+ className: props.className
52
+ });
53
+ return h(
54
+ descriptor.tag,
55
+ {
56
+ ...descriptor.attrs,
57
+ ...attrs
58
+ },
59
+ descriptor.children?.map((child) => renderVueNode(child))
60
+ );
61
+ };
62
+ }
63
+ });
64
+ var vue_default = AlipayQRCode;
65
+ export {
66
+ AlipayQRCode,
67
+ vue_default as default
68
+ };
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "qrcode-alipay",
3
+ "version": "1.0.0",
4
+ "description": "支付宝品牌二维码 SVG 生成器,提供框架无关核心方法和 React/Vue 组件。",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./react": {
16
+ "types": "./dist/react.d.ts",
17
+ "import": "./dist/react.js",
18
+ "require": "./dist/react.cjs"
19
+ },
20
+ "./vue": {
21
+ "types": "./dist/vue.d.ts",
22
+ "import": "./dist/vue.js",
23
+ "require": "./dist/vue.cjs"
24
+ },
25
+ "./package.json": "./package.json"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "publicDocs",
30
+ "README.md",
31
+ "LICENSE",
32
+ "LEGAL.md"
33
+ ],
34
+ "sideEffects": false,
35
+ "publishConfig": {
36
+ "registry": "https://registry.npmjs.org/",
37
+ "access": "public"
38
+ },
39
+ "packageManager": "pnpm@10.28.2",
40
+ "scripts": {
41
+ "build": "tsup src/index.ts src/react.ts src/vue.ts --format esm,cjs --dts --clean",
42
+ "demo": "vite --host 127.0.0.1 --config demo/vite.config.ts",
43
+ "prepublishOnly": "npm run typecheck && npm test && npm run build",
44
+ "test": "vitest run",
45
+ "typecheck": "tsc --noEmit"
46
+ },
47
+ "dependencies": {
48
+ "qrcode": "^1.5.4"
49
+ },
50
+ "peerDependencies": {
51
+ "react": ">=18.0.0",
52
+ "vue": ">=3.3.0"
53
+ },
54
+ "peerDependenciesMeta": {
55
+ "react": {
56
+ "optional": true
57
+ },
58
+ "vue": {
59
+ "optional": true
60
+ }
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^25.0.2",
64
+ "@types/react": "^19.2.7",
65
+ "@types/react-dom": "^19.2.3",
66
+ "@vitejs/plugin-react": "^5.1.2",
67
+ "@vue/server-renderer": "^3.5.25",
68
+ "jsqr": "^1.4.0",
69
+ "react": "^19.2.1",
70
+ "react-dom": "^19.2.1",
71
+ "sharp": "^0.34.5",
72
+ "tsup": "^8.5.1",
73
+ "typescript": "^5.9.3",
74
+ "vite": "^7.3.0",
75
+ "vitest": "^4.0.15",
76
+ "vue": "^3.5.25"
77
+ },
78
+ "keywords": [
79
+ "qrcode",
80
+ "alipay",
81
+ "svg",
82
+ "react",
83
+ "vue"
84
+ ],
85
+ "author": "marshall.lhy",
86
+ "license": "SEE LICENSE IN LICENSE"
87
+ }
@@ -0,0 +1,139 @@
1
+ # qrcode-alipay 使用说明
2
+
3
+ `qrcode-alipay` 用于生成支付宝品牌二维码。它适合支付页、订阅页、收银台弹窗等需要展示支付宝扫码支付二维码的场景。
4
+
5
+ ## 能力特点
6
+
7
+ - 核心方法框架无关,可在任意前端框架、SSR 环境或构建脚本中使用。
8
+ - 默认生成自包含 SVG,不依赖远程图片资源。
9
+ - 默认使用支付宝蓝定位点和中心支付宝「支」logo。
10
+ - React 与 Vue 3 提供组件封装,接入时不需要手动处理 SVG 字符串。
11
+ - 二维码使用 `H` 级纠错,并按二维码模块尺寸自适应中心 logo。
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ pnpm add qrcode-alipay
17
+ ```
18
+
19
+ 也可以使用 npm 或 yarn:
20
+
21
+ ```bash
22
+ npm install qrcode-alipay
23
+ yarn add qrcode-alipay
24
+ ```
25
+
26
+ ## 核心 API
27
+
28
+ ### `toSvg(value, options?)`
29
+
30
+ 返回完整的 SVG 字符串,适合直接写入 HTML、服务端模板或保存为文件。
31
+
32
+ ```ts
33
+ import { toSvg } from 'qrcode-alipay';
34
+
35
+ const svg = toSvg('https://qr.alipay.com/example', {
36
+ size: 240,
37
+ title: '支付宝支付二维码',
38
+ });
39
+ ```
40
+
41
+ ### `toDataURL(value, options?)`
42
+
43
+ 返回 `data:image/svg+xml` 地址,适合用于 `<img src>`。
44
+
45
+ ```ts
46
+ import { toDataURL } from 'qrcode-alipay';
47
+
48
+ const src = toDataURL('https://qr.alipay.com/example', {
49
+ size: 240,
50
+ });
51
+ ```
52
+
53
+ ```html
54
+ <img src="..." alt="支付宝支付二维码" />
55
+ ```
56
+
57
+ ### `createAlipayQRCode(value, options?)`
58
+
59
+ 返回结构化 SVG descriptor,适合需要自行渲染节点的运行时或框架适配层。
60
+
61
+ ```ts
62
+ import { createAlipayQRCode } from 'qrcode-alipay';
63
+
64
+ const descriptor = createAlipayQRCode('https://qr.alipay.com/example');
65
+
66
+ console.log(descriptor.tag); // svg
67
+ console.log(descriptor.metadata.moduleCount);
68
+ ```
69
+
70
+ ## React 用法
71
+
72
+ ```tsx
73
+ import { AlipayQRCode } from 'qrcode-alipay/react';
74
+
75
+ export function CheckoutQRCode({ value }: { value: string }) {
76
+ return (
77
+ <AlipayQRCode
78
+ value={value}
79
+ size={240}
80
+ ariaLabel="支付宝支付二维码"
81
+ className="checkout-qr"
82
+ />
83
+ );
84
+ }
85
+ ```
86
+
87
+ React 组件会渲染真实 SVG 节点,不使用 `dangerouslySetInnerHTML`。
88
+
89
+ ## Vue 3 用法
90
+
91
+ ```vue
92
+ <script setup lang="ts">
93
+ import { AlipayQRCode } from 'qrcode-alipay/vue';
94
+
95
+ defineProps<{
96
+ value: string;
97
+ }>();
98
+ </script>
99
+
100
+ <template>
101
+ <AlipayQRCode
102
+ :value="value"
103
+ :size="240"
104
+ aria-label="支付宝支付二维码"
105
+ class-name="checkout-qr"
106
+ />
107
+ </template>
108
+ ```
109
+
110
+ ## 配置项
111
+
112
+ | 参数 | 类型 | 默认值 | 说明 |
113
+ | --- | --- | --- | --- |
114
+ | `size` | `number \| string` | `240` | SVG 根节点的 `width` 和 `height`。不传时是固定 `240`,不会自动变成 `100%`。传字符串时可使用 `100%` 等响应式值。 |
115
+ | `margin` | `number` | `0` | quiet zone,单位为二维码模块。 |
116
+ | `title` | `string` | - | SVG 内部标题,便于辅助技术识别。 |
117
+ | `ariaLabel` | `string` | `Alipay QR code` | SVG 根节点 `aria-label`。 |
118
+ | `className` | `string` | - | SVG 根节点 class。 |
119
+
120
+ ## 尺寸建议
121
+
122
+ - 常规支付弹窗推荐 `size=240`。
123
+ - 页面主二维码推荐 `size=240` 到 `320`。
124
+ - 小尺寸展示不建议低于 `96`,过小会影响扫码体验。
125
+ - 外层容器可以继续加边框、阴影或说明文字,但不要再额外覆盖中心 logo。
126
+ - `size` 不传默认是 `240`,不是 `100%`。如果需要跟随父容器自适应,请显式传 `size: '100%'`,并确保父容器有稳定的宽高或 `aspect-ratio: 1`。
127
+
128
+ ## 扫码安全建议
129
+
130
+ - `margin` 默认是 `0`,更适合组件化使用:业务通常会把二维码放在白色卡片、弹窗或带 padding 的容器里,外层留白已经承担 quiet zone。
131
+ - 如果二维码是裸 SVG,外层没有白色 padding,建议传 `margin: 1` 或更高,给扫码器保留边界识别空间。
132
+ - 如果二维码外层背景不是白色,也建议使用白色容器或传入 `margin: 1`,避免边界和背景混在一起。
133
+
134
+ ## 注意事项
135
+
136
+ - `value` 必须是非空字符串。
137
+ - 默认纠错等级固定为 `H`,不需要业务方单独配置。
138
+ - 默认品牌色和中心 logo 固定,公开 API 不开放品牌样式修改,避免不同业务渲染不一致。
139
+ - 如果使用 `toSvg` 后通过 `innerHTML` 插入页面,请确保 `value` 来自可信业务数据;库内部会转义可访问性文本,但二维码内容本身仍应由业务侧校验。