cokit-cli 1.0.0 → 1.0.2
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/AGENTS.md +103 -0
- package/FAQ.md +5 -5
- package/QUICK-START.md +4 -4
- package/README.FLOW.md +237 -0
- package/README.md +153 -92
- package/agents/brainstormer.agent.md +71 -0
- package/agents/code-reviewer.agent.md +128 -0
- package/agents/database-admin.agent.md +91 -0
- package/agents/debugger.agent.md +128 -0
- package/agents/docs-manager.agent.md +121 -0
- package/agents/fullstack-developer.agent.md +96 -0
- package/agents/git-manager.agent.md +392 -0
- package/agents/mcp-manager.agent.md +93 -0
- package/agents/planner.agent.md +94 -0
- package/agents/project-manager.agent.md +124 -0
- package/agents/researcher.agent.md +32 -0
- package/agents/scout-external.agent.md +141 -0
- package/agents/scout.agent.md +107 -0
- package/agents/tester.agent.md +106 -0
- package/agents/ui-ux-designer.agent.md +225 -0
- package/collections/ck-core.collection.yml +30 -0
- package/collections/ck-development-rules.collection.yml +18 -0
- package/collections/ck-documentation.collection.yml +18 -0
- package/collections/ck-git-workflow.collection.yml +18 -0
- package/collections/ck-orchestration.collection.yml +22 -0
- package/collections/ck-ui-design.collection.yml +18 -0
- package/docs/README.md +85 -0
- package/docs/copilot-processing-flow.md +128 -0
- package/docs/migration-guide.md +12 -12
- package/instructions/ck-backend.instructions.md +48 -0
- package/instructions/ck-development.instructions.md +40 -0
- package/instructions/ck-frontend-design-pro.instructions.md +58 -0
- package/instructions/ck-frontend.instructions.md +44 -0
- package/instructions/ck-google-adk-python.instructions.md +242 -0
- package/instructions/ck-research.instructions.md +167 -0
- package/instructions/ck-testing.instructions.md +36 -0
- package/package.json +9 -2
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-01-restructure-folders.md +183 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-02-convert-agents.md +206 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-03-convert-commands-to-prompts.md +284 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-04-convert-skills-to-instructions.md +349 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-05-create-collections.md +320 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-06-update-cli-build-scripts.md +450 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/phase-07-update-documentation.md +407 -0
- package/plans/260108-0924-rebuild-cokit-awesome-copilot-format/plan.md +136 -0
- package/prompts/ck-ask.prompt.md +57 -0
- package/prompts/ck-bootstrap-auto-fast.prompt.md +108 -0
- package/prompts/ck-bootstrap-auto-parallel.prompt.md +66 -0
- package/prompts/ck-bootstrap-auto.prompt.md +114 -0
- package/prompts/ck-bootstrap.prompt.md +136 -0
- package/prompts/ck-brainstorm.prompt.md +68 -0
- package/prompts/ck-ck-help.prompt.md +114 -0
- package/prompts/ck-code-auto.prompt.md +171 -0
- package/prompts/ck-code-no-test.prompt.md +159 -0
- package/prompts/ck-code-parallel.prompt.md +56 -0
- package/prompts/ck-code.prompt.md +177 -0
- package/prompts/ck-coding-level.prompt.md +54 -0
- package/prompts/ck-cook-auto-fast.prompt.md +26 -0
- package/prompts/ck-cook-auto-parallel.prompt.md +49 -0
- package/prompts/ck-cook-auto.prompt.md +15 -0
- package/prompts/ck-cook.prompt.md +96 -0
- package/prompts/ck-debug.prompt.md +14 -0
- package/prompts/ck-design-3d.prompt.md +84 -0
- package/prompts/ck-design-describe.prompt.md +24 -0
- package/prompts/ck-design-fast.prompt.md +32 -0
- package/prompts/ck-design-good.prompt.md +36 -0
- package/prompts/ck-design-screenshot.prompt.md +35 -0
- package/prompts/ck-design-video.prompt.md +35 -0
- package/prompts/ck-docs-init.prompt.md +27 -0
- package/prompts/ck-docs-summarize.prompt.md +23 -0
- package/prompts/ck-docs-update.prompt.md +36 -0
- package/prompts/ck-fix-ci.prompt.md +18 -0
- package/prompts/ck-fix-fast.prompt.md +18 -0
- package/prompts/ck-fix-hard.prompt.md +36 -0
- package/prompts/ck-fix-logs.prompt.md +27 -0
- package/prompts/ck-fix-parallel.prompt.md +54 -0
- package/prompts/ck-fix-test.prompt.md +19 -0
- package/prompts/ck-fix-types.prompt.md +11 -0
- package/prompts/ck-fix-ui.prompt.md +49 -0
- package/prompts/ck-fix.prompt.md +44 -0
- package/prompts/ck-git-cm.prompt.md +8 -0
- package/prompts/ck-git-cp.prompt.md +7 -0
- package/prompts/ck-git-merge.prompt.md +41 -0
- package/prompts/ck-git-pr.prompt.md +49 -0
- package/prompts/ck-kanban.prompt.md +77 -0
- package/prompts/ck-plan-archive.prompt.md +58 -0
- package/prompts/ck-plan-ci.prompt.md +34 -0
- package/prompts/ck-plan-cro.prompt.md +66 -0
- package/prompts/ck-plan-fast.prompt.md +67 -0
- package/prompts/ck-plan-hard.prompt.md +89 -0
- package/prompts/ck-plan-parallel.prompt.md +126 -0
- package/prompts/ck-plan-two.prompt.md +43 -0
- package/prompts/ck-plan-validate.prompt.md +118 -0
- package/prompts/ck-plan.prompt.md +29 -1
- package/prompts/ck-preview.prompt.md +65 -0
- package/prompts/ck-review-codebase.prompt.md +44 -0
- package/prompts/ck-scout-ext.prompt.md +35 -0
- package/prompts/ck-scout.prompt.md +25 -0
- package/prompts/ck-skill-add.prompt.md +36 -0
- package/prompts/ck-skill-create.prompt.md +29 -0
- package/prompts/ck-skill-fix-logs.prompt.md +22 -0
- package/prompts/ck-skill-optimize-auto.prompt.md +25 -0
- package/prompts/ck-skill-optimize.prompt.md +34 -0
- package/prompts/ck-skill-plan.prompt.md +46 -0
- package/prompts/ck-test-ui.prompt.md +92 -0
- package/prompts/ck-test.prompt.md +10 -0
- package/prompts/ck-use-mcp.prompt.md +27 -0
- package/prompts/ck-watzup.prompt.md +11 -0
- package/prompts/ck-worktree.prompt.md +127 -0
- package/rules/README.agents.md +55 -0
- package/rules/README.collections.md +78 -0
- package/rules/README.copilot-instructions.md +66 -0
- package/rules/README.instructions.md +73 -0
- package/rules/README.md +39 -0
- package/rules/README.prompts.md +76 -0
- package/rules/README.skills.md +71 -0
- package/skills/ck-ai-artist/SKILL.md +73 -0
- package/skills/ck-ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ck-ai-artist/references/domain-code.md +66 -0
- package/skills/ck-ai-artist/references/domain-data.md +72 -0
- package/skills/ck-ai-artist/references/domain-marketing.md +66 -0
- package/skills/ck-ai-artist/references/domain-patterns.md +33 -0
- package/skills/ck-ai-artist/references/domain-writing.md +68 -0
- package/skills/ck-ai-artist/references/image-prompting.md +141 -0
- package/skills/ck-ai-artist/references/llm-prompting.md +165 -0
- package/skills/ck-ai-artist/references/nano-banana.md +59 -0
- package/skills/ck-ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ck-backend-development/SKILL.md +93 -0
- package/skills/ck-backend-development/references/backend-api-design.md +495 -0
- package/skills/ck-backend-development/references/backend-architecture.md +454 -0
- package/skills/ck-backend-development/references/backend-authentication.md +338 -0
- package/skills/ck-backend-development/references/backend-code-quality.md +659 -0
- package/skills/ck-backend-development/references/backend-debugging.md +904 -0
- package/skills/ck-backend-development/references/backend-devops.md +494 -0
- package/skills/ck-backend-development/references/backend-mindset.md +387 -0
- package/skills/ck-backend-development/references/backend-performance.md +397 -0
- package/skills/ck-backend-development/references/backend-security.md +290 -0
- package/skills/ck-backend-development/references/backend-technologies.md +256 -0
- package/skills/ck-backend-development/references/backend-testing.md +429 -0
- package/skills/ck-better-auth/SKILL.md +202 -0
- package/skills/ck-better-auth/references/advanced-features.md +553 -0
- package/skills/ck-better-auth/references/database-integration.md +577 -0
- package/skills/ck-better-auth/references/email-password-auth.md +416 -0
- package/skills/ck-better-auth/references/oauth-providers.md +430 -0
- package/skills/ck-better-auth/scripts/.coverage +0 -0
- package/skills/ck-better-auth/scripts/better_auth_init.py +521 -0
- package/skills/ck-better-auth/scripts/requirements.txt +15 -0
- package/skills/ck-better-auth/scripts/tests/.coverage +0 -0
- package/skills/ck-better-auth/scripts/tests/test_better_auth_init.py +421 -0
- package/skills/ck-chrome-devtools/SKILL.md +470 -0
- package/skills/ck-chrome-devtools/references/cdp-domains.md +694 -0
- package/skills/ck-chrome-devtools/references/performance-guide.md +940 -0
- package/skills/ck-chrome-devtools/references/puppeteer-reference.md +953 -0
- package/skills/ck-chrome-devtools/scripts/README.md +272 -0
- package/skills/ck-chrome-devtools/scripts/__tests__/selector.test.js +210 -0
- package/skills/ck-chrome-devtools/scripts/aria-snapshot.js +362 -0
- package/skills/ck-chrome-devtools/scripts/click.js +83 -0
- package/skills/ck-chrome-devtools/scripts/console.js +79 -0
- package/skills/ck-chrome-devtools/scripts/evaluate.js +53 -0
- package/skills/ck-chrome-devtools/scripts/fill.js +76 -0
- package/skills/ck-chrome-devtools/scripts/inject-auth.js +229 -0
- package/skills/ck-chrome-devtools/scripts/install-deps.sh +181 -0
- package/skills/ck-chrome-devtools/scripts/install.sh +83 -0
- package/skills/ck-chrome-devtools/scripts/lib/browser.js +318 -0
- package/skills/ck-chrome-devtools/scripts/lib/selector.js +178 -0
- package/skills/ck-chrome-devtools/scripts/navigate.js +54 -0
- package/skills/ck-chrome-devtools/scripts/network.js +106 -0
- package/skills/ck-chrome-devtools/scripts/package-lock.json +1589 -0
- package/skills/ck-chrome-devtools/scripts/package.json +16 -0
- package/skills/ck-chrome-devtools/scripts/performance.js +149 -0
- package/skills/ck-chrome-devtools/scripts/screenshot.js +198 -0
- package/skills/ck-chrome-devtools/scripts/select-ref.js +131 -0
- package/skills/ck-chrome-devtools/scripts/snapshot.js +135 -0
- package/skills/ck-code-review/SKILL.md +143 -0
- package/skills/ck-code-review/references/code-review-reception.md +209 -0
- package/skills/ck-code-review/references/requesting-code-review.md +105 -0
- package/skills/ck-code-review/references/verification-before-completion.md +139 -0
- package/skills/ck-databases/SKILL.md +231 -0
- package/skills/ck-databases/references/mongodb-aggregation.md +447 -0
- package/skills/ck-databases/references/mongodb-atlas.md +465 -0
- package/skills/ck-databases/references/mongodb-crud.md +408 -0
- package/skills/ck-databases/references/mongodb-indexing.md +442 -0
- package/skills/ck-databases/references/postgresql-administration.md +594 -0
- package/skills/ck-databases/references/postgresql-performance.md +527 -0
- package/skills/ck-databases/references/postgresql-psql-cli.md +467 -0
- package/skills/ck-databases/references/postgresql-queries.md +475 -0
- package/skills/ck-databases/scripts/.coverage +0 -0
- package/skills/ck-databases/scripts/db_backup.py +502 -0
- package/skills/ck-databases/scripts/db_migrate.py +425 -0
- package/skills/ck-databases/scripts/db_performance_check.py +456 -0
- package/skills/ck-databases/scripts/requirements.txt +20 -0
- package/skills/ck-databases/scripts/tests/coverage-db.json +1 -0
- package/skills/ck-databases/scripts/tests/requirements.txt +4 -0
- package/skills/ck-databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/ck-databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/ck-databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/ck-debugging/SKILL.md +82 -0
- package/skills/ck-debugging/references/defense-in-depth.md +124 -0
- package/skills/ck-debugging/references/root-cause-tracing.md +122 -0
- package/skills/ck-debugging/references/systematic-debugging.md +102 -0
- package/skills/ck-debugging/references/verification.md +123 -0
- package/skills/ck-debugging/scripts/find-polluter.sh +63 -0
- package/skills/ck-debugging/scripts/find-polluter.test.md +102 -0
- package/skills/ck-devops/.env.example +76 -0
- package/skills/ck-devops/SKILL.md +283 -0
- package/skills/ck-devops/references/browser-rendering.md +305 -0
- package/skills/ck-devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/ck-devops/references/cloudflare-platform.md +271 -0
- package/skills/ck-devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/ck-devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/ck-devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/ck-devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/ck-devops/references/docker-basics.md +297 -0
- package/skills/ck-devops/references/docker-compose.md +292 -0
- package/skills/ck-devops/references/gcloud-platform.md +297 -0
- package/skills/ck-devops/references/gcloud-services.md +304 -0
- package/skills/ck-devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/ck-devops/scripts/docker_optimize.py +331 -0
- package/skills/ck-devops/scripts/requirements.txt +20 -0
- package/skills/ck-devops/scripts/tests/requirements.txt +3 -0
- package/skills/ck-devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/ck-devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/ck-docs-seeker/.env.example +15 -0
- package/skills/ck-docs-seeker/SKILL.md +96 -0
- package/skills/ck-docs-seeker/package.json +25 -0
- package/skills/ck-docs-seeker/references/advanced.md +79 -0
- package/skills/ck-docs-seeker/references/context7-patterns.md +68 -0
- package/skills/ck-docs-seeker/references/errors.md +68 -0
- package/skills/ck-docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/ck-docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/ck-docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/ck-docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/ck-docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/ck-docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/ck-docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/ck-docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/ck-docs-seeker/workflows/library-search.md +87 -0
- package/skills/ck-docs-seeker/workflows/repo-analysis.md +91 -0
- package/skills/ck-docs-seeker/workflows/topic-search.md +77 -0
- package/skills/ck-frontend-design/SKILL.md +79 -0
- package/skills/ck-frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/ck-frontend-design/references/analysis-prompts.md +141 -0
- package/skills/ck-frontend-design/references/analysis-techniques.md +118 -0
- package/skills/ck-frontend-design/references/animejs.md +396 -0
- package/skills/ck-frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/ck-frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/ck-frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/ck-frontend-design/references/extraction-prompts.md +127 -0
- package/skills/ck-frontend-design/references/technical-accessibility.md +119 -0
- package/skills/ck-frontend-design/references/technical-best-practices.md +97 -0
- package/skills/ck-frontend-design/references/technical-optimization.md +44 -0
- package/skills/ck-frontend-design/references/technical-overview.md +90 -0
- package/skills/ck-frontend-design/references/technical-workflows.md +150 -0
- package/skills/ck-frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/ck-frontend-development/SKILL.md +399 -0
- package/skills/ck-frontend-development/resources/common-patterns.md +331 -0
- package/skills/ck-frontend-development/resources/complete-examples.md +872 -0
- package/skills/ck-frontend-development/resources/component-patterns.md +502 -0
- package/skills/ck-frontend-development/resources/data-fetching.md +767 -0
- package/skills/ck-frontend-development/resources/file-organization.md +502 -0
- package/skills/ck-frontend-development/resources/loading-and-error-states.md +501 -0
- package/skills/ck-frontend-development/resources/performance.md +406 -0
- package/skills/ck-frontend-development/resources/routing-guide.md +364 -0
- package/skills/ck-frontend-development/resources/styling-guide.md +428 -0
- package/skills/ck-frontend-development/resources/typescript-standards.md +418 -0
- package/skills/ck-markdown-novel-viewer/SKILL.md +190 -0
- package/skills/ck-markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/skills/ck-markdown-novel-viewer/assets/favicon.png +0 -0
- package/skills/ck-markdown-novel-viewer/assets/novel-theme.css +818 -0
- package/skills/ck-markdown-novel-viewer/assets/reader.js +262 -0
- package/skills/ck-markdown-novel-viewer/assets/template.html +80 -0
- package/skills/ck-markdown-novel-viewer/package.json +15 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +272 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/port-finder.cjs +48 -0
- package/skills/ck-markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/skills/ck-markdown-novel-viewer/scripts/server.cjs +411 -0
- package/skills/ck-markdown-novel-viewer/scripts/tests/server.test.cjs +283 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-assets.test.cjs +340 -0
- package/skills/ck-markdown-novel-viewer/tests/dashboard-renderer.test.cjs +404 -0
- package/skills/ck-markdown-novel-viewer/tests/http-server.test.cjs +271 -0
- package/skills/ck-markdown-novel-viewer/tests/run-tests.cjs +51 -0
- package/skills/ck-markdown-novel-viewer/tests/test-framework.cjs +154 -0
- package/skills/ck-markdown-novel-viewer/tests/verify-xss.cjs +90 -0
- package/skills/ck-mcp-builder/LICENSE.txt +202 -0
- package/skills/ck-mcp-builder/SKILL.md +327 -0
- package/skills/ck-mcp-builder/reference/evaluation.md +602 -0
- package/skills/ck-mcp-builder/reference/mcp_best_practices.md +915 -0
- package/skills/ck-mcp-builder/reference/node_mcp_server.md +916 -0
- package/skills/ck-mcp-builder/reference/python_mcp_server.md +752 -0
- package/skills/ck-mcp-builder/scripts/connections.py +151 -0
- package/skills/ck-mcp-builder/scripts/evaluation.py +373 -0
- package/skills/ck-mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/ck-mcp-builder/scripts/requirements.txt +2 -0
- package/skills/ck-mcp-management/README.md +219 -0
- package/skills/ck-mcp-management/SKILL.md +209 -0
- package/skills/ck-mcp-management/assets/tools.json +3146 -0
- package/skills/ck-mcp-management/references/configuration.md +114 -0
- package/skills/ck-mcp-management/references/gemini-cli-integration.md +215 -0
- package/skills/ck-mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ck-mcp-management/scripts/.env.example +10 -0
- package/skills/ck-mcp-management/scripts/cli.ts +195 -0
- package/skills/ck-mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ck-mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ck-mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ck-mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ck-mcp-management/scripts/package.json +20 -0
- package/skills/ck-mcp-management/scripts/tsconfig.json +15 -0
- package/skills/ck-media-processing/SKILL.md +90 -0
- package/skills/ck-media-processing/references/common-workflows.md +132 -0
- package/skills/ck-media-processing/references/ffmpeg-encoding.md +358 -0
- package/skills/ck-media-processing/references/ffmpeg-filters.md +503 -0
- package/skills/ck-media-processing/references/ffmpeg-streaming.md +403 -0
- package/skills/ck-media-processing/references/format-compatibility.md +375 -0
- package/skills/ck-media-processing/references/imagemagick-batch.md +612 -0
- package/skills/ck-media-processing/references/imagemagick-editing.md +623 -0
- package/skills/ck-media-processing/references/rmbg-background-removal.md +66 -0
- package/skills/ck-media-processing/references/troubleshooting.md +109 -0
- package/skills/ck-media-processing/scripts/README.md +111 -0
- package/skills/ck-media-processing/scripts/batch-remove-background.sh +124 -0
- package/skills/ck-media-processing/scripts/batch_resize.py +342 -0
- package/skills/ck-media-processing/scripts/media_convert.py +311 -0
- package/skills/ck-media-processing/scripts/remove-background.sh +96 -0
- package/skills/ck-media-processing/scripts/remove-bg-node.js +158 -0
- package/skills/ck-media-processing/scripts/requirements.txt +24 -0
- package/skills/ck-media-processing/scripts/tests/.coverage +0 -0
- package/skills/ck-media-processing/scripts/tests/requirements.txt +2 -0
- package/skills/ck-media-processing/scripts/tests/test_batch_resize.py +372 -0
- package/skills/ck-media-processing/scripts/tests/test_media_convert.py +259 -0
- package/skills/ck-media-processing/scripts/tests/test_video_optimize.py +397 -0
- package/skills/ck-media-processing/scripts/video_optimize.py +414 -0
- package/skills/ck-mobile-development/SKILL.md +210 -0
- package/skills/ck-mobile-development/references/mobile-android.md +604 -0
- package/skills/ck-mobile-development/references/mobile-best-practices.md +545 -0
- package/skills/ck-mobile-development/references/mobile-debugging.md +1089 -0
- package/skills/ck-mobile-development/references/mobile-frameworks.md +465 -0
- package/skills/ck-mobile-development/references/mobile-ios.md +496 -0
- package/skills/ck-mobile-development/references/mobile-mindset.md +544 -0
- package/skills/ck-payment-integration/README.md +185 -0
- package/skills/ck-payment-integration/SKILL.md +116 -0
- package/skills/ck-payment-integration/references/polar/benefits.md +396 -0
- package/skills/ck-payment-integration/references/polar/best-practices.md +482 -0
- package/skills/ck-payment-integration/references/polar/checkouts.md +266 -0
- package/skills/ck-payment-integration/references/polar/overview.md +184 -0
- package/skills/ck-payment-integration/references/polar/products.md +244 -0
- package/skills/ck-payment-integration/references/polar/sdk.md +436 -0
- package/skills/ck-payment-integration/references/polar/subscriptions.md +340 -0
- package/skills/ck-payment-integration/references/polar/webhooks.md +405 -0
- package/skills/ck-payment-integration/references/sepay/api.md +140 -0
- package/skills/ck-payment-integration/references/sepay/best-practices.md +337 -0
- package/skills/ck-payment-integration/references/sepay/overview.md +138 -0
- package/skills/ck-payment-integration/references/sepay/qr-codes.md +228 -0
- package/skills/ck-payment-integration/references/sepay/sdk.md +213 -0
- package/skills/ck-payment-integration/references/sepay/webhooks.md +208 -0
- package/skills/ck-payment-integration/scripts/.env.example +20 -0
- package/skills/ck-payment-integration/scripts/checkout-helper.js +244 -0
- package/skills/ck-payment-integration/scripts/package.json +17 -0
- package/skills/ck-payment-integration/scripts/polar-webhook-verify.js +202 -0
- package/skills/ck-payment-integration/scripts/sepay-webhook-verify.js +193 -0
- package/skills/ck-payment-integration/scripts/test-scripts.js +237 -0
- package/skills/ck-planning/SKILL.md +112 -0
- package/skills/ck-planning/references/codebase-understanding.md +62 -0
- package/skills/ck-planning/references/output-standards.md +127 -0
- package/skills/ck-planning/references/plan-organization.md +150 -0
- package/skills/ck-planning/references/research-phase.md +49 -0
- package/skills/ck-planning/references/solution-design.md +63 -0
- package/skills/ck-problem-solving/SKILL.md +95 -0
- package/skills/ck-problem-solving/references/attribution.md +69 -0
- package/skills/ck-problem-solving/references/collision-zone-thinking.md +79 -0
- package/skills/ck-problem-solving/references/inversion-exercise.md +91 -0
- package/skills/ck-problem-solving/references/meta-pattern-recognition.md +87 -0
- package/skills/ck-problem-solving/references/scale-game.md +95 -0
- package/skills/ck-problem-solving/references/simplification-cascades.md +80 -0
- package/skills/ck-problem-solving/references/when-stuck.md +72 -0
- package/skills/ck-repomix/SKILL.md +247 -0
- package/skills/ck-repomix/references/configuration.md +211 -0
- package/skills/ck-repomix/references/usage-patterns.md +232 -0
- package/skills/ck-repomix/scripts/.coverage +0 -0
- package/skills/ck-repomix/scripts/README.md +179 -0
- package/skills/ck-repomix/scripts/repomix_batch.py +455 -0
- package/skills/ck-repomix/scripts/repos.example.json +15 -0
- package/skills/ck-repomix/scripts/requirements.txt +15 -0
- package/skills/ck-repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/ck-sequential-thinking/.env.example +8 -0
- package/skills/ck-sequential-thinking/README.md +183 -0
- package/skills/{sequential-thinking → ck-sequential-thinking}/SKILL.md +14 -2
- package/skills/ck-sequential-thinking/package.json +31 -0
- package/skills/ck-sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/{sequential-thinking → ck-sequential-thinking}/references/advanced-techniques.md +2 -14
- package/skills/{sequential-thinking → ck-sequential-thinking}/references/core-patterns.md +8 -0
- package/skills/ck-sequential-thinking/references/examples-api.md +88 -0
- package/skills/ck-sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/ck-sequential-thinking/references/examples-debug.md +90 -0
- package/skills/ck-sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/ck-sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/ck-sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/ck-sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/ck-shopify/README.md +66 -0
- package/skills/ck-shopify/SKILL.md +319 -0
- package/skills/ck-shopify/references/app-development.md +470 -0
- package/skills/ck-shopify/references/extensions.md +493 -0
- package/skills/ck-shopify/references/themes.md +498 -0
- package/skills/ck-shopify/scripts/.coverage +0 -0
- package/skills/ck-shopify/scripts/requirements.txt +19 -0
- package/skills/ck-shopify/scripts/shopify_init.py +423 -0
- package/skills/ck-shopify/scripts/tests/.coverage +0 -0
- package/skills/ck-shopify/scripts/tests/test_shopify_init.py +385 -0
- package/skills/ck-skill-creator/LICENSE.txt +202 -0
- package/skills/ck-skill-creator/SKILL.md +265 -0
- package/skills/ck-skill-creator/scripts/init_skill.py +303 -0
- package/skills/ck-skill-creator/scripts/package_skill.py +110 -0
- package/skills/ck-skill-creator/scripts/quick_validate.py +65 -0
- package/skills/ck-threejs/SKILL.md +87 -0
- package/skills/ck-threejs/references/01-getting-started.md +177 -0
- package/skills/ck-threejs/references/02-loaders.md +169 -0
- package/skills/ck-threejs/references/03-textures.md +170 -0
- package/skills/ck-threejs/references/04-cameras.md +195 -0
- package/skills/ck-threejs/references/05-lights.md +183 -0
- package/skills/ck-threejs/references/06-animations.md +214 -0
- package/skills/ck-threejs/references/07-math.md +260 -0
- package/skills/ck-threejs/references/08-interaction.md +267 -0
- package/skills/ck-threejs/references/09-postprocessing.md +240 -0
- package/skills/ck-threejs/references/10-controls.md +259 -0
- package/skills/ck-threejs/references/11-materials-advanced.md +270 -0
- package/skills/ck-threejs/references/12-performance.md +269 -0
- package/skills/ck-threejs/references/13-node-materials.md +298 -0
- package/skills/ck-threejs/references/14-physics-vr.md +304 -0
- package/skills/ck-threejs/references/15-specialized-loaders.md +333 -0
- package/skills/ck-threejs/references/16-webgpu.md +302 -0
- package/skills/ck-ui-styling/LICENSE.txt +202 -0
- package/skills/ck-ui-styling/SKILL.md +319 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/ck-ui-styling/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/ck-ui-styling/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/ck-ui-styling/references/canvas-design-system.md +320 -0
- package/skills/ck-ui-styling/references/shadcn-accessibility.md +471 -0
- package/skills/ck-ui-styling/references/shadcn-components.md +424 -0
- package/skills/ck-ui-styling/references/shadcn-theming.md +373 -0
- package/skills/ck-ui-styling/references/tailwind-customization.md +483 -0
- package/skills/ck-ui-styling/references/tailwind-responsive.md +382 -0
- package/skills/ck-ui-styling/references/tailwind-utilities.md +455 -0
- package/skills/ck-ui-styling/scripts/.coverage +0 -0
- package/skills/ck-ui-styling/scripts/requirements.txt +17 -0
- package/skills/ck-ui-styling/scripts/shadcn_add.py +292 -0
- package/skills/ck-ui-styling/scripts/tailwind_config_gen.py +456 -0
- package/skills/ck-ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/skills/ck-ui-styling/scripts/tests/requirements.txt +3 -0
- package/skills/ck-ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/skills/ck-ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/skills/ck-ui-ux-pro-max/SKILL.md +227 -0
- package/skills/ck-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ck-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ck-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ck-ui-ux-pro-max/data/prompts.csv +24 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/html-tailwind.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ck-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ck-ui-ux-pro-max/data/styles.csv +59 -0
- package/skills/ck-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ck-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ck-ui-ux-pro-max/scripts/core.py +236 -0
- package/skills/ck-ui-ux-pro-max/scripts/search.py +76 -0
- package/skills/ck-web-frameworks/SKILL.md +322 -0
- package/skills/ck-web-frameworks/references/nextjs-app-router.md +465 -0
- package/skills/ck-web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/skills/ck-web-frameworks/references/nextjs-optimization.md +511 -0
- package/skills/ck-web-frameworks/references/nextjs-server-components.md +495 -0
- package/skills/ck-web-frameworks/references/remix-icon-integration.md +603 -0
- package/skills/ck-web-frameworks/references/turborepo-caching.md +551 -0
- package/skills/ck-web-frameworks/references/turborepo-pipelines.md +517 -0
- package/skills/ck-web-frameworks/references/turborepo-setup.md +542 -0
- package/skills/ck-web-frameworks/scripts/.coverage +0 -0
- package/skills/ck-web-frameworks/scripts/__init__.py +0 -0
- package/skills/ck-web-frameworks/scripts/nextjs_init.py +547 -0
- package/skills/ck-web-frameworks/scripts/requirements.txt +16 -0
- package/skills/ck-web-frameworks/scripts/tests/coverage-web.json +1 -0
- package/skills/ck-web-frameworks/scripts/tests/requirements.txt +3 -0
- package/skills/ck-web-frameworks/scripts/tests/test_nextjs_init.py +319 -0
- package/skills/ck-web-frameworks/scripts/tests/test_turborepo_migrate.py +374 -0
- package/skills/ck-web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/src/commands/init.js +62 -31
- package/src/utils/paths.js +35 -4
- package/skills/code-review/SKILL.md +0 -86
- package/skills/code-review/references/code-review-reception.md +0 -76
- package/skills/code-review/references/verification-before-completion.md +0 -86
- package/skills/debugging/SKILL.md +0 -70
- package/skills/debugging/references/root-cause-tracing.md +0 -65
- package/skills/debugging/references/systematic-debugging.md +0 -74
- package/skills/debugging/references/verification.md +0 -74
- package/skills/docs-seeker/SKILL.md +0 -91
- package/skills/planning/SKILL.md +0 -82
- package/skills/planning/references/plan-organization.md +0 -88
- package/skills/planning/references/research-phase.md +0 -56
- package/skills/planning/references/solution-design.md +0 -65
- package/templates/repo/prompts/code.prompt.md +0 -40
- package/templates/repo/prompts/docs.prompt.md +0 -29
- package/templates/repo/prompts/fix.prompt.md +0 -35
- package/templates/repo/prompts/plan.prompt.md +0 -41
- package/templates/repo/prompts/review.prompt.md +0 -38
- package/templates/repo/prompts/test.prompt.md +0 -29
- /package/skills/{docs-seeker → ck-docs-seeker}/references/search-patterns.md +0 -0
- /package/skills/{docs-seeker → ck-docs-seeker}/references/source-evaluation.md +0 -0
- /package/templates/repo/.github/instructions/{backend.instructions.md → ck-backend.instructions.md} +0 -0
- /package/templates/repo/.github/instructions/{development.instructions.md → ck-development.instructions.md} +0 -0
- /package/templates/repo/.github/instructions/{frontend.instructions.md → ck-frontend.instructions.md} +0 -0
- /package/templates/repo/.github/instructions/{testing.instructions.md → ck-testing.instructions.md} +0 -0
- /package/templates/repo/.github/prompts/{code.prompt.md → ck-code.prompt.md} +0 -0
- /package/templates/repo/.github/prompts/{docs.prompt.md → ck-docs.prompt.md} +0 -0
- /package/templates/repo/.github/prompts/{fix.prompt.md → ck-fix.prompt.md} +0 -0
- /package/templates/repo/.github/prompts/{plan.prompt.md → ck-plan.prompt.md} +0 -0
- /package/templates/repo/.github/prompts/{review.prompt.md → ck-review.prompt.md} +0 -0
- /package/templates/repo/.github/prompts/{test.prompt.md → ck-test.prompt.md} +0 -0
- /package/templates/repo/.github/skills/{code-review → ck-code-review}/SKILL.md +0 -0
- /package/templates/repo/.github/skills/{debugging → ck-debugging}/SKILL.md +0 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# SePay Best Practices
|
|
2
|
+
|
|
3
|
+
Security, patterns, and monitoring for production SePay integrations.
|
|
4
|
+
|
|
5
|
+
## Security
|
|
6
|
+
|
|
7
|
+
### Credential Management
|
|
8
|
+
```javascript
|
|
9
|
+
// ✓ Good: Environment variables
|
|
10
|
+
const client = new SePayClient({
|
|
11
|
+
merchant_id: process.env.SEPAY_MERCHANT_ID,
|
|
12
|
+
secret_key: process.env.SEPAY_SECRET_KEY,
|
|
13
|
+
env: process.env.NODE_ENV === 'production' ? 'production' : 'sandbox'
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// ✗ Bad: Hardcoded credentials
|
|
17
|
+
const client = new SePayClient({
|
|
18
|
+
merchant_id: 'SP-TEST-12345',
|
|
19
|
+
secret_key: 'spsk_test_xxxxxxx'
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Webhook Security
|
|
24
|
+
1. **IP Whitelisting:** Restrict endpoint to SePay IPs
|
|
25
|
+
2. **API Key Verification:** Validate authorization header
|
|
26
|
+
3. **HTTPS Only:** Never accept HTTP webhooks
|
|
27
|
+
4. **Validate Payload:** Check all required fields exist
|
|
28
|
+
5. **Duplicate Detection:** Use transaction ID for deduplication
|
|
29
|
+
|
|
30
|
+
### Transaction Verification
|
|
31
|
+
```javascript
|
|
32
|
+
// Always verify payment status via API, don't trust only redirects
|
|
33
|
+
app.get('/payment/success', async (req, res) => {
|
|
34
|
+
const orderId = req.query.order_id;
|
|
35
|
+
|
|
36
|
+
// Verify via API call
|
|
37
|
+
const order = await sePayClient.order.retrieve(orderId);
|
|
38
|
+
|
|
39
|
+
if (order.status === 'completed') {
|
|
40
|
+
await updateOrderStatus(orderId, 'paid');
|
|
41
|
+
res.redirect(`/order/${orderId}/confirmation`);
|
|
42
|
+
} else {
|
|
43
|
+
res.redirect(`/order/${orderId}/pending`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Implementation Patterns
|
|
49
|
+
|
|
50
|
+
### Payment Flow Pattern
|
|
51
|
+
```javascript
|
|
52
|
+
class PaymentService {
|
|
53
|
+
async createPayment(order) {
|
|
54
|
+
// 1. Create order in your system
|
|
55
|
+
const paymentCode = `ORDER_${order.id}_${Date.now()}`;
|
|
56
|
+
await this.savePaymentCode(order.id, paymentCode);
|
|
57
|
+
|
|
58
|
+
// 2. Generate checkout form
|
|
59
|
+
const fields = this.client.checkout.initOneTimePaymentFields({
|
|
60
|
+
order_invoice_number: paymentCode,
|
|
61
|
+
order_amount: order.total,
|
|
62
|
+
currency: 'VND',
|
|
63
|
+
success_url: `${config.baseUrl}/payment/success?order=${order.id}`,
|
|
64
|
+
error_url: `${config.baseUrl}/payment/error?order=${order.id}`,
|
|
65
|
+
cancel_url: `${config.baseUrl}/payment/cancel?order=${order.id}`,
|
|
66
|
+
order_description: `Payment for Order #${order.id}`,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return fields;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async verifyPayment(orderId) {
|
|
73
|
+
const paymentCode = await this.getPaymentCode(orderId);
|
|
74
|
+
const payment = await this.client.order.retrieve(paymentCode);
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
isPaid: payment.status === 'completed',
|
|
78
|
+
amount: payment.amount,
|
|
79
|
+
paidAt: payment.completed_at,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Webhook Resilience Pattern
|
|
86
|
+
```javascript
|
|
87
|
+
async function handleWebhook(data) {
|
|
88
|
+
const maxRetries = 3;
|
|
89
|
+
let attempt = 0;
|
|
90
|
+
|
|
91
|
+
while (attempt < maxRetries) {
|
|
92
|
+
try {
|
|
93
|
+
await db.transaction(async (trx) => {
|
|
94
|
+
// Check duplicate
|
|
95
|
+
const exists = await trx('transactions')
|
|
96
|
+
.where('sepay_id', data.id)
|
|
97
|
+
.first();
|
|
98
|
+
|
|
99
|
+
if (exists) return;
|
|
100
|
+
|
|
101
|
+
// Save transaction
|
|
102
|
+
await trx('transactions').insert({
|
|
103
|
+
sepay_id: data.id,
|
|
104
|
+
amount: data.transferAmount,
|
|
105
|
+
content: data.content,
|
|
106
|
+
reference_code: data.referenceCode,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Process payment
|
|
110
|
+
const order = await findOrderByPaymentCode(data.content);
|
|
111
|
+
if (order) {
|
|
112
|
+
await markOrderAsPaid(order.id, trx);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
return { success: true };
|
|
117
|
+
} catch (error) {
|
|
118
|
+
attempt++;
|
|
119
|
+
if (attempt >= maxRetries) throw error;
|
|
120
|
+
await sleep(1000 * attempt); // Exponential backoff
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Reconciliation Pattern
|
|
127
|
+
```javascript
|
|
128
|
+
async function reconcilePayments(fromDate, toDate) {
|
|
129
|
+
// Get all pending orders
|
|
130
|
+
const pendingOrders = await Order.findPending();
|
|
131
|
+
|
|
132
|
+
// Fetch SePay transactions in batches
|
|
133
|
+
let sinceId = 0;
|
|
134
|
+
const batchSize = 1000;
|
|
135
|
+
|
|
136
|
+
while (true) {
|
|
137
|
+
const transactions = await sePayClient.transaction.list({
|
|
138
|
+
transaction_date_min: fromDate,
|
|
139
|
+
transaction_date_max: toDate,
|
|
140
|
+
transfer_type: 'in',
|
|
141
|
+
since_id: sinceId,
|
|
142
|
+
limit: batchSize,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
if (transactions.length === 0) break;
|
|
146
|
+
|
|
147
|
+
// Match and update
|
|
148
|
+
for (const transaction of transactions) {
|
|
149
|
+
const order = pendingOrders.find(o =>
|
|
150
|
+
transaction.content.includes(o.payment_code)
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
if (order) {
|
|
154
|
+
await order.markAsPaid(transaction);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
sinceId = transactions[transactions.length - 1].id;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Performance Optimization
|
|
164
|
+
|
|
165
|
+
### Caching
|
|
166
|
+
```javascript
|
|
167
|
+
// Cache bank list
|
|
168
|
+
const getBankList = memoize(
|
|
169
|
+
async () => {
|
|
170
|
+
const response = await fetch('https://qr.sepay.vn/banks.json');
|
|
171
|
+
return response.json();
|
|
172
|
+
},
|
|
173
|
+
{ maxAge: 86400000 } // 24 hours
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
// Cache QR codes for fixed amounts
|
|
177
|
+
const qrCache = new Map();
|
|
178
|
+
|
|
179
|
+
function getCachedQRUrl(account, bank, amount) {
|
|
180
|
+
const key = `${account}-${bank}-${amount}`;
|
|
181
|
+
if (!qrCache.has(key)) {
|
|
182
|
+
const url = generateQRUrl(account, bank, amount);
|
|
183
|
+
qrCache.set(key, url);
|
|
184
|
+
}
|
|
185
|
+
return qrCache.get(key);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Rate Limit Management
|
|
190
|
+
```javascript
|
|
191
|
+
const RateLimiter = require('bottleneck');
|
|
192
|
+
|
|
193
|
+
const limiter = new RateLimiter({
|
|
194
|
+
maxConcurrent: 1,
|
|
195
|
+
minTime: 500, // 2 requests per second
|
|
196
|
+
reservoir: 100,
|
|
197
|
+
reservoirRefreshAmount: 100,
|
|
198
|
+
reservoirRefreshInterval: 60000, // per minute
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Wrap API calls
|
|
202
|
+
const apiCall = limiter.wrap(async (endpoint, params) => {
|
|
203
|
+
return await sePayClient.api.call(endpoint, params);
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Async Processing
|
|
208
|
+
```javascript
|
|
209
|
+
// Queue webhook processing
|
|
210
|
+
app.post('/webhook/sepay', async (req, res) => {
|
|
211
|
+
// Respond immediately
|
|
212
|
+
res.json({ success: true });
|
|
213
|
+
|
|
214
|
+
// Queue for background processing
|
|
215
|
+
await webhookQueue.add('process-sepay-webhook', req.body, {
|
|
216
|
+
attempts: 3,
|
|
217
|
+
backoff: {
|
|
218
|
+
type: 'exponential',
|
|
219
|
+
delay: 2000,
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// Process in background worker
|
|
225
|
+
webhookQueue.process('process-sepay-webhook', async (job) => {
|
|
226
|
+
await handleWebhook(job.data);
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Monitoring & Logging
|
|
231
|
+
|
|
232
|
+
### Essential Metrics
|
|
233
|
+
```javascript
|
|
234
|
+
const metrics = {
|
|
235
|
+
payment_initiated: counter('sepay_payment_initiated_total'),
|
|
236
|
+
payment_success: counter('sepay_payment_success_total'),
|
|
237
|
+
payment_failed: counter('sepay_payment_failed_total'),
|
|
238
|
+
webhook_received: counter('sepay_webhook_received_total'),
|
|
239
|
+
webhook_processed: counter('sepay_webhook_processed_total'),
|
|
240
|
+
api_errors: counter('sepay_api_errors_total'),
|
|
241
|
+
processing_time: histogram('sepay_processing_duration_seconds'),
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// Track metrics
|
|
245
|
+
metrics.payment_initiated.inc();
|
|
246
|
+
const timer = metrics.processing_time.startTimer();
|
|
247
|
+
// ... process payment
|
|
248
|
+
timer();
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Structured Logging
|
|
252
|
+
```javascript
|
|
253
|
+
logger.info('Payment initiated', {
|
|
254
|
+
order_id: order.id,
|
|
255
|
+
amount: order.total,
|
|
256
|
+
payment_method: 'sepay',
|
|
257
|
+
customer_id: customer.id,
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
logger.info('Webhook received', {
|
|
261
|
+
transaction_id: webhook.id,
|
|
262
|
+
amount: webhook.transferAmount,
|
|
263
|
+
type: webhook.transferType,
|
|
264
|
+
reference: webhook.referenceCode,
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
logger.error('Payment failed', {
|
|
268
|
+
order_id: order.id,
|
|
269
|
+
error: error.message,
|
|
270
|
+
stack: error.stack,
|
|
271
|
+
sepay_response: response,
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Alerting
|
|
276
|
+
```javascript
|
|
277
|
+
// Alert on high failure rate
|
|
278
|
+
if (failureRate > 0.1) { // 10%
|
|
279
|
+
alert.send({
|
|
280
|
+
severity: 'high',
|
|
281
|
+
message: 'SePay payment failure rate exceeds 10%',
|
|
282
|
+
details: { failureRate, total, failed },
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Alert on webhook delivery failures
|
|
287
|
+
if (webhookFailures > 10) {
|
|
288
|
+
alert.send({
|
|
289
|
+
severity: 'medium',
|
|
290
|
+
message: 'SePay webhook delivery failures',
|
|
291
|
+
details: { failures: webhookFailures },
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Testing Strategy
|
|
297
|
+
|
|
298
|
+
### Sandbox Testing Checklist
|
|
299
|
+
- [ ] Successful payment flow
|
|
300
|
+
- [ ] Failed payment handling
|
|
301
|
+
- [ ] Canceled payment handling
|
|
302
|
+
- [ ] Webhook delivery and processing
|
|
303
|
+
- [ ] Duplicate webhook handling
|
|
304
|
+
- [ ] Rate limit handling
|
|
305
|
+
- [ ] Error scenarios (network, timeout, invalid data)
|
|
306
|
+
- [ ] Payment verification via API
|
|
307
|
+
- [ ] QR code generation
|
|
308
|
+
- [ ] Order reconciliation
|
|
309
|
+
|
|
310
|
+
### Load Testing
|
|
311
|
+
```javascript
|
|
312
|
+
// Simulate high volume
|
|
313
|
+
for (let i = 0; i < 1000; i++) {
|
|
314
|
+
await createPayment({
|
|
315
|
+
amount: 100000,
|
|
316
|
+
orderId: `LOAD_TEST_${i}`,
|
|
317
|
+
});
|
|
318
|
+
await sleep(100); // Respect rate limits
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## Production Checklist
|
|
323
|
+
|
|
324
|
+
- [ ] Environment variables configured
|
|
325
|
+
- [ ] Production credentials obtained
|
|
326
|
+
- [ ] HTTPS enabled for all endpoints
|
|
327
|
+
- [ ] Webhook endpoint publicly accessible
|
|
328
|
+
- [ ] IP whitelisting configured
|
|
329
|
+
- [ ] Error monitoring set up
|
|
330
|
+
- [ ] Logging infrastructure ready
|
|
331
|
+
- [ ] Alerting configured
|
|
332
|
+
- [ ] Rate limiting implemented
|
|
333
|
+
- [ ] Database indexes created
|
|
334
|
+
- [ ] Reconciliation job scheduled
|
|
335
|
+
- [ ] Backup strategy in place
|
|
336
|
+
- [ ] Documentation updated
|
|
337
|
+
- [ ] Team trained on operations
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# SePay Overview
|
|
2
|
+
|
|
3
|
+
Vietnamese payment automation platform serving as intermediary between applications and banks.
|
|
4
|
+
|
|
5
|
+
## Core Capabilities
|
|
6
|
+
|
|
7
|
+
**Payment Methods:**
|
|
8
|
+
- VietQR - QR code bank transfers (NAPAS standard)
|
|
9
|
+
- NAPAS QR - National payment gateway QR
|
|
10
|
+
- Bank Cards - Visa/Mastercard/JCB
|
|
11
|
+
- Bank Transfers - Direct bank-to-bank
|
|
12
|
+
- Virtual Accounts - Order-specific VAs with exact matching
|
|
13
|
+
|
|
14
|
+
**Supported Banks:** 44+ banks via NAPAS, 37+ with VietQR (Vietcombank, VPBank, BIDV, etc.)
|
|
15
|
+
|
|
16
|
+
**Use Cases:**
|
|
17
|
+
- Payment gateway for online payments
|
|
18
|
+
- Bank API direct connection
|
|
19
|
+
- Transaction verification automation
|
|
20
|
+
- Real-time balance monitoring
|
|
21
|
+
|
|
22
|
+
## Authentication
|
|
23
|
+
|
|
24
|
+
### API Token (Simple)
|
|
25
|
+
|
|
26
|
+
**Create:**
|
|
27
|
+
1. Company Configuration → API Access → "+ Add API"
|
|
28
|
+
2. Provide name, set status "Active"
|
|
29
|
+
3. Copy token from list
|
|
30
|
+
|
|
31
|
+
**Usage:**
|
|
32
|
+
```
|
|
33
|
+
Authorization: Bearer {API_TOKEN}
|
|
34
|
+
Content-Type: application/json
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Note:** All tokens have full access (no permission levels currently)
|
|
38
|
+
|
|
39
|
+
### OAuth2 (Advanced)
|
|
40
|
+
|
|
41
|
+
**Scopes:**
|
|
42
|
+
- `bank-account:read` - View accounts, balances
|
|
43
|
+
- `transaction:read` - Transaction history
|
|
44
|
+
- `webhook:read/write/delete` - Webhook management
|
|
45
|
+
- `profile` - User information
|
|
46
|
+
- `company` - Company details
|
|
47
|
+
|
|
48
|
+
**Authorization Code Flow:**
|
|
49
|
+
|
|
50
|
+
1. **Authorization Request:**
|
|
51
|
+
```
|
|
52
|
+
GET https://my.sepay.vn/oauth/authorize?
|
|
53
|
+
response_type=code&
|
|
54
|
+
client_id={CLIENT_ID}&
|
|
55
|
+
redirect_uri={REDIRECT_URI}&
|
|
56
|
+
scope={SCOPES}&
|
|
57
|
+
state={CSRF_TOKEN}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
2. **Token Exchange (server-side only):**
|
|
61
|
+
```
|
|
62
|
+
POST https://my.sepay.vn/oauth/token
|
|
63
|
+
{
|
|
64
|
+
"grant_type": "authorization_code",
|
|
65
|
+
"client_id": "{CLIENT_ID}",
|
|
66
|
+
"client_secret": "{CLIENT_SECRET}",
|
|
67
|
+
"code": "{AUTHORIZATION_CODE}"
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
3. **Token Refresh:**
|
|
72
|
+
```
|
|
73
|
+
POST https://my.sepay.vn/oauth/token
|
|
74
|
+
{
|
|
75
|
+
"grant_type": "refresh_token",
|
|
76
|
+
"refresh_token": "{REFRESH_TOKEN}",
|
|
77
|
+
"client_id": "{CLIENT_ID}",
|
|
78
|
+
"client_secret": "{CLIENT_SECRET}"
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Security:** Access tokens expire ~1 hour, never expose client_secret, use state for CSRF protection
|
|
83
|
+
|
|
84
|
+
## Payment Gateway Flow (13 Steps)
|
|
85
|
+
|
|
86
|
+
1. Customer selects products, initiates payment
|
|
87
|
+
2. Merchant creates order record
|
|
88
|
+
3. Generate checkout form with HMAC-SHA256 signature
|
|
89
|
+
4. Send request to `/v1/checkout/init`
|
|
90
|
+
5. SePay validates signature
|
|
91
|
+
6. Redirect customer to SePay gateway
|
|
92
|
+
7. Customer selects payment method
|
|
93
|
+
8. SePay communicates with banks/card networks
|
|
94
|
+
9. Financial institution returns result
|
|
95
|
+
10. Callback notification sent to merchant
|
|
96
|
+
11. IPN (Instant Payment Notification) transmitted
|
|
97
|
+
12. Customer redirected to merchant result page
|
|
98
|
+
13. Final outcome displayed
|
|
99
|
+
|
|
100
|
+
## Environments
|
|
101
|
+
|
|
102
|
+
**Sandbox:**
|
|
103
|
+
- Dashboard: https://my.sepay.vn (free tier)
|
|
104
|
+
- Endpoint: https://sandbox.pay.sepay.vn/v1/init
|
|
105
|
+
- Credentials: `SP-TEST-XXXXXXX`, `spsk_test_xxxxxxxxxxxxx`
|
|
106
|
+
|
|
107
|
+
**Production:**
|
|
108
|
+
- Endpoint: https://pay.sepay.vn/v1/init
|
|
109
|
+
- Requirements: Personal/business bank account, completed testing
|
|
110
|
+
- Approval: 3-7 days for NAPAS QR/cards (requires documentation)
|
|
111
|
+
|
|
112
|
+
## Rate Limits
|
|
113
|
+
|
|
114
|
+
**Limit:** 2 calls/second
|
|
115
|
+
**Response:** HTTP 429 with `x-sepay-userapi-retry-after` header (seconds to wait)
|
|
116
|
+
|
|
117
|
+
**Handling:**
|
|
118
|
+
```javascript
|
|
119
|
+
if (response.status === 429) {
|
|
120
|
+
const retryAfter = response.headers.get('x-sepay-userapi-retry-after');
|
|
121
|
+
await sleep(retryAfter * 1000);
|
|
122
|
+
return retry();
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Support
|
|
127
|
+
|
|
128
|
+
- Email: info@sepay.vn
|
|
129
|
+
- Hotline: 02873059589 (24/7)
|
|
130
|
+
- Docs: https://developer.sepay.vn/en
|
|
131
|
+
- GitHub: https://github.com/sepayvn
|
|
132
|
+
|
|
133
|
+
## Next Steps
|
|
134
|
+
|
|
135
|
+
- **For API integration:** Load `api.md`
|
|
136
|
+
- **For SDK integration:** Load `sdk.md`
|
|
137
|
+
- **For webhook setup:** Load `webhooks.md`
|
|
138
|
+
- **For QR generation:** Load `qr-codes.md`
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# SePay VietQR Generation
|
|
2
|
+
|
|
3
|
+
Dynamic QR code generation service compatible with VietQR standard (NAPAS).
|
|
4
|
+
|
|
5
|
+
## API Endpoint
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
https://qr.sepay.vn/img?acc={ACCOUNT}&bank={BANK}&amount={AMOUNT}&des={DESCRIPTION}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
**Required:**
|
|
14
|
+
- `acc` - Bank account number
|
|
15
|
+
- `bank` - Bank code or short name
|
|
16
|
+
|
|
17
|
+
**Optional:**
|
|
18
|
+
- `amount` - Transfer amount (omit for flexible amount)
|
|
19
|
+
- `des` - Transfer description/content (URL encoded)
|
|
20
|
+
- `template` - QR image template (empty/compact/qronly)
|
|
21
|
+
- `download` - Set to "true" to download image
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
|
|
25
|
+
### Complete QR (Fixed Amount)
|
|
26
|
+
```
|
|
27
|
+
https://qr.sepay.vn/img?
|
|
28
|
+
acc=0010000000355&
|
|
29
|
+
bank=Vietcombank&
|
|
30
|
+
amount=100000&
|
|
31
|
+
des=ung%20ho%20quy%20bao%20tro%20tre%20em
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Flexible QR (Customer Enters Amount)
|
|
35
|
+
```
|
|
36
|
+
https://qr.sepay.vn/img?acc=0010000000355&bank=Vietcombank
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### QR Only Template
|
|
40
|
+
```
|
|
41
|
+
https://qr.sepay.vn/img?
|
|
42
|
+
acc=0010000000355&
|
|
43
|
+
bank=Vietcombank&
|
|
44
|
+
amount=100000&
|
|
45
|
+
template=qronly
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Integration
|
|
49
|
+
|
|
50
|
+
### HTML
|
|
51
|
+
```html
|
|
52
|
+
<img src="https://qr.sepay.vn/img?acc=0010000000355&bank=Vietcombank&amount=100000"
|
|
53
|
+
alt="Payment QR Code" />
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### JavaScript (Dynamic)
|
|
57
|
+
```javascript
|
|
58
|
+
function generatePaymentQR(account, bank, amount, description) {
|
|
59
|
+
const params = new URLSearchParams({
|
|
60
|
+
acc: account,
|
|
61
|
+
bank: bank,
|
|
62
|
+
amount: amount,
|
|
63
|
+
des: description
|
|
64
|
+
});
|
|
65
|
+
return `https://qr.sepay.vn/img?${params}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Usage
|
|
69
|
+
const qrUrl = generatePaymentQR(
|
|
70
|
+
'0010000000355',
|
|
71
|
+
'Vietcombank',
|
|
72
|
+
100000,
|
|
73
|
+
'Order #12345'
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
document.getElementById('qr-code').src = qrUrl;
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### PHP (Dynamic)
|
|
80
|
+
```php
|
|
81
|
+
<?php
|
|
82
|
+
function generatePaymentQR($account, $bank, $amount, $description) {
|
|
83
|
+
return 'https://qr.sepay.vn/img?' . http_build_query([
|
|
84
|
+
'acc' => $account,
|
|
85
|
+
'bank' => $bank,
|
|
86
|
+
'amount' => $amount,
|
|
87
|
+
'des' => $description
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Usage
|
|
92
|
+
$qrUrl = generatePaymentQR(
|
|
93
|
+
'0010000000355',
|
|
94
|
+
'Vietcombank',
|
|
95
|
+
100000,
|
|
96
|
+
'Order #' . $orderId
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
echo "<img src='{$qrUrl}' alt='Payment QR' />";
|
|
100
|
+
?>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Node.js (Express)
|
|
104
|
+
```javascript
|
|
105
|
+
app.get('/payment/:orderId/qr', async (req, res) => {
|
|
106
|
+
const order = await Order.findById(req.params.orderId);
|
|
107
|
+
|
|
108
|
+
const qrUrl = new URL('https://qr.sepay.vn/img');
|
|
109
|
+
qrUrl.searchParams.set('acc', process.env.SEPAY_ACCOUNT);
|
|
110
|
+
qrUrl.searchParams.set('bank', process.env.SEPAY_BANK);
|
|
111
|
+
qrUrl.searchParams.set('amount', order.total);
|
|
112
|
+
qrUrl.searchParams.set('des', `Order ${order.id}`);
|
|
113
|
+
|
|
114
|
+
res.render('payment', { qrUrl: qrUrl.toString() });
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### React Component
|
|
119
|
+
```jsx
|
|
120
|
+
function PaymentQR({ account, bank, amount, description }) {
|
|
121
|
+
const qrUrl = useMemo(() => {
|
|
122
|
+
const params = new URLSearchParams({
|
|
123
|
+
acc: account,
|
|
124
|
+
bank: bank,
|
|
125
|
+
amount: amount,
|
|
126
|
+
des: description
|
|
127
|
+
});
|
|
128
|
+
return `https://qr.sepay.vn/img?${params}`;
|
|
129
|
+
}, [account, bank, amount, description]);
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
<div className="payment-qr">
|
|
133
|
+
<img src={qrUrl} alt="Payment QR Code" />
|
|
134
|
+
<p>Scan to pay {amount.toLocaleString('vi-VN')} VND</p>
|
|
135
|
+
</div>
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Templates
|
|
141
|
+
|
|
142
|
+
**Default:**
|
|
143
|
+
- Full QR with bank logo
|
|
144
|
+
- Account information displayed
|
|
145
|
+
- Branded with bank colors
|
|
146
|
+
|
|
147
|
+
**Compact:**
|
|
148
|
+
- Smaller version
|
|
149
|
+
- Minimal branding
|
|
150
|
+
- More space-efficient
|
|
151
|
+
|
|
152
|
+
**QR Only:**
|
|
153
|
+
- Pure QR code
|
|
154
|
+
- No decorations
|
|
155
|
+
- For custom layouts
|
|
156
|
+
|
|
157
|
+
## Bank Codes
|
|
158
|
+
|
|
159
|
+
**Get Bank List:**
|
|
160
|
+
```
|
|
161
|
+
GET https://qr.sepay.vn/banks.json
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Common Banks:**
|
|
165
|
+
- Vietcombank (VCB)
|
|
166
|
+
- VPBank
|
|
167
|
+
- BIDV
|
|
168
|
+
- Techcombank (TCB)
|
|
169
|
+
- ACB
|
|
170
|
+
- MB Bank
|
|
171
|
+
- Sacombank
|
|
172
|
+
- VietinBank
|
|
173
|
+
- And 40+ others
|
|
174
|
+
|
|
175
|
+
**Cache Bank List:**
|
|
176
|
+
```javascript
|
|
177
|
+
// Fetch once and cache
|
|
178
|
+
const banks = await fetch('https://qr.sepay.vn/banks.json')
|
|
179
|
+
.then(res => res.json());
|
|
180
|
+
|
|
181
|
+
// Store in memory or Redis
|
|
182
|
+
cache.set('sepay_banks', banks, 86400); // 24 hours
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Best Practices
|
|
186
|
+
|
|
187
|
+
1. **Cache Bank List:** Avoid repeated API calls
|
|
188
|
+
2. **URL Encode Descriptions:** Use `encodeURIComponent()` or `http_build_query()`
|
|
189
|
+
3. **Error Handling:** Provide fallback for QR generation failures
|
|
190
|
+
4. **Amount Validation:** Ensure amount is positive integer
|
|
191
|
+
5. **Flexible vs Fixed:** Use flexible QR for varying amounts
|
|
192
|
+
6. **Template Selection:** Choose based on UI design
|
|
193
|
+
7. **Responsive Design:** Scale QR code for mobile devices
|
|
194
|
+
8. **Alt Text:** Always provide descriptive alt text
|
|
195
|
+
9. **Loading State:** Show placeholder while QR loads
|
|
196
|
+
10. **Print Support:** Ensure QR codes are print-friendly
|
|
197
|
+
|
|
198
|
+
## Integration Patterns
|
|
199
|
+
|
|
200
|
+
### Checkout Page
|
|
201
|
+
```html
|
|
202
|
+
<div class="payment-methods">
|
|
203
|
+
<h3>Pay via Bank Transfer</h3>
|
|
204
|
+
<img src="[QR_URL]" alt="Payment QR Code" class="qr-code" />
|
|
205
|
+
<p>Scan this QR code with your banking app</p>
|
|
206
|
+
<div class="payment-details">
|
|
207
|
+
<p><strong>Account:</strong> 0010000000355</p>
|
|
208
|
+
<p><strong>Bank:</strong> Vietcombank</p>
|
|
209
|
+
<p><strong>Amount:</strong> 100,000 VND</p>
|
|
210
|
+
<p><strong>Content:</strong> Order #12345</p>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Email Receipt
|
|
216
|
+
```html
|
|
217
|
+
<table>
|
|
218
|
+
<tr>
|
|
219
|
+
<td align="center">
|
|
220
|
+
<img src="[QR_URL]" alt="Payment QR Code" width="200" />
|
|
221
|
+
<p>Scan to pay for your order</p>
|
|
222
|
+
</td>
|
|
223
|
+
</tr>
|
|
224
|
+
</table>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### PDF Invoice
|
|
228
|
+
Use QR URL in PDF generation libraries (wkhtmltopdf, Puppeteer, etc.)
|