@alipay/alipay-aipay 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.
Files changed (117) hide show
  1. package/bin/alipay-aipay.js +6 -0
  2. package/dist/commands/install.d.ts +11 -0
  3. package/dist/commands/install.d.ts.map +1 -0
  4. package/dist/commands/install.js +182 -0
  5. package/dist/commands/install.js.map +1 -0
  6. package/dist/commands/prepare-tools.d.ts +5 -0
  7. package/dist/commands/prepare-tools.d.ts.map +1 -0
  8. package/dist/commands/prepare-tools.js +29 -0
  9. package/dist/commands/prepare-tools.js.map +1 -0
  10. package/dist/commands/uninstall.d.ts +10 -0
  11. package/dist/commands/uninstall.d.ts.map +1 -0
  12. package/dist/commands/uninstall.js +82 -0
  13. package/dist/commands/uninstall.js.map +1 -0
  14. package/dist/commands/update.d.ts +10 -0
  15. package/dist/commands/update.d.ts.map +1 -0
  16. package/dist/commands/update.js +155 -0
  17. package/dist/commands/update.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +65 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/types.d.ts +43 -0
  23. package/dist/types.d.ts.map +1 -0
  24. package/dist/types.js +2 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist/utils/alipay-cli.d.ts +15 -0
  27. package/dist/utils/alipay-cli.d.ts.map +1 -0
  28. package/dist/utils/alipay-cli.js +221 -0
  29. package/dist/utils/alipay-cli.js.map +1 -0
  30. package/dist/utils/config.d.ts +48 -0
  31. package/dist/utils/config.d.ts.map +1 -0
  32. package/dist/utils/config.js +207 -0
  33. package/dist/utils/config.js.map +1 -0
  34. package/dist/utils/file.d.ts +55 -0
  35. package/dist/utils/file.d.ts.map +1 -0
  36. package/dist/utils/file.js +154 -0
  37. package/dist/utils/file.js.map +1 -0
  38. package/dist/utils/gpg.d.ts +14 -0
  39. package/dist/utils/gpg.d.ts.map +1 -0
  40. package/dist/utils/gpg.js +247 -0
  41. package/dist/utils/gpg.js.map +1 -0
  42. package/dist/utils/jq.d.ts +14 -0
  43. package/dist/utils/jq.d.ts.map +1 -0
  44. package/dist/utils/jq.js +221 -0
  45. package/dist/utils/jq.js.map +1 -0
  46. package/dist/utils/npm.d.ts +17 -0
  47. package/dist/utils/npm.d.ts.map +1 -0
  48. package/dist/utils/npm.js +42 -0
  49. package/dist/utils/npm.js.map +1 -0
  50. package/dist/utils/shell.d.ts +11 -0
  51. package/dist/utils/shell.d.ts.map +1 -0
  52. package/dist/utils/shell.js +54 -0
  53. package/dist/utils/shell.js.map +1 -0
  54. package/package.json +48 -7
  55. package/skill/SKILL.md +118 -0
  56. package/skill/references/integration/flow.md +487 -0
  57. package/skill/references/integration/modules/alipay-sdk-reminder.md +256 -0
  58. package/skill/references/integration/modules/checklist.md +122 -0
  59. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +68 -0
  60. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +77 -0
  61. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +74 -0
  62. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +73 -0
  63. package/skill/references/integration/modules/code-examples/csharp/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +58 -0
  64. package/skill/references/integration/modules/code-examples/csharp/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +128 -0
  65. package/skill/references/integration/modules/code-examples/csharp/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.cs +500 -0
  66. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +72 -0
  67. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +80 -0
  68. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +78 -0
  69. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +77 -0
  70. package/skill/references/integration/modules/code-examples/java/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +66 -0
  71. package/skill/references/integration/modules/code-examples/java/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +135 -0
  72. package/skill/references/integration/modules/code-examples/java/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemoController.java +610 -0
  73. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +51 -0
  74. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +57 -0
  75. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +55 -0
  76. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +54 -0
  77. package/skill/references/integration/modules/code-examples/nodejs/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +77 -0
  78. package/skill/references/integration/modules/code-examples/nodejs/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +65 -0
  79. package/skill/references/integration/modules/code-examples/nodejs/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.js +461 -0
  80. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +59 -0
  81. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +67 -0
  82. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +66 -0
  83. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +65 -0
  84. package/skill/references/integration/modules/code-examples/php/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +56 -0
  85. package/skill/references/integration/modules/code-examples/php/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +107 -0
  86. package/skill/references/integration/modules/code-examples/php/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.php +444 -0
  87. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +57 -0
  88. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +65 -0
  89. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +63 -0
  90. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +62 -0
  91. package/skill/references/integration/modules/code-examples/python/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +48 -0
  92. package/skill/references/integration/modules/code-examples/python/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +43 -0
  93. package/skill/references/integration/modules/code-examples/python/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.py +465 -0
  94. package/skill/references/integration/modules/interface-guide.md +90 -0
  95. package/skill/references/integration/modules/product-decision.md +90 -0
  96. package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +270 -0
  97. package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +133 -0
  98. package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +218 -0
  99. package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +659 -0
  100. package/skill/references/normal/alipay-cli-env.md +214 -0
  101. package/skill/references/normal/rejection-guide.md +37 -0
  102. package/skill/references/normal/scripts/common.sh +32 -0
  103. package/skill/references/normal/scripts/detect_dev_tool.sh +46 -0
  104. package/skill/references/onboarding/flow.md +573 -0
  105. package/skill/references/onboarding/modules/app-release.md +415 -0
  106. package/skill/references/onboarding/modules/authorization.md +269 -0
  107. package/skill/references/onboarding/modules/error-handling.md +251 -0
  108. package/skill/references/onboarding/modules/mcc-reference.md +209 -0
  109. package/skill/references/onboarding/modules/product-sign.md +304 -0
  110. package/skill/references/onboarding/modules/scripts/app.sh +705 -0
  111. package/skill/references/onboarding/modules/scripts/ar_sign_apply.sh +248 -0
  112. package/skill/references/onboarding/modules/scripts/auth.sh +505 -0
  113. package/skill/references/onboarding/modules/scripts/error_handler.sh +452 -0
  114. package/skill/references/onboarding/modules/scripts/query_sign_status.sh +146 -0
  115. package/skill/references/onboarding/modules/scripts/service.sh +267 -0
  116. package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +152 -0
  117. package/skill/references/onboarding/modules/service-registration.md +294 -0
@@ -0,0 +1,267 @@
1
+ #!/bin/bash
2
+ #=============================================================================
3
+ # 脚本名称: service.sh
4
+ # 功能描述: 服务市场注册 - 查询已有服务 + 创建/修改服务
5
+ # 调用位置: Step 5.2 服务市场注册
6
+ # 调用前置: 脚本通过 error_handler.sh 间接初始化 DEV_TOOL_NAME;必要时可用 DEV_TOOL_NAME 环境变量覆盖
7
+ # 用法:
8
+ # service list - 查询已有服务列表
9
+ # service save --name <n> --desc <d> --url <u> --pricing <p> --schema <json> [--service-id <id>]
10
+ # service validate --name <n> --desc <d> --url <u> --pricing <p> --schema <json>
11
+ # 返回值:
12
+ # list: 输出服务列表表格 + FLOW:CREATE_NEW | FLOW:SELECT
13
+ # save: 输出 ✅/❌ + serviceId(无 FLOW 标记,由 Agent 根据退出码判断)
14
+ # validate: 输出 ✅/❌ + 校验详情(退出码 0=通过, 1=失败)
15
+ #=============================================================================
16
+
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+
19
+ # 一次性 source error_handler(含 unwrap_mcp)
20
+ if [ -f "${SCRIPT_DIR}/error_handler.sh" ]; then
21
+ source "${SCRIPT_DIR}/error_handler.sh"
22
+ else
23
+ echo "❌ 缺少错误处理脚本: ${SCRIPT_DIR}/error_handler.sh"
24
+ exit 1
25
+ fi
26
+
27
+ require_command jq || exit 1
28
+ require_command alipay-cli || exit 1
29
+ require_command awk || exit 1
30
+
31
+ # ─── service list: 查询已有服务 ──────────────────────────────────────────────
32
+ fetch_service_list() {
33
+ RESULT=$(export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call a2a-pay-service.discoverBazaarServicesForMcp \
34
+ -d '{"request":{"serviceStatus":"ACTIVE"}}' \
35
+ --json 2>/dev/null)
36
+
37
+ if ! handle_error "$RESULT"; then
38
+ return 1
39
+ fi
40
+
41
+ BUSINESS=$(unwrap_mcp "$RESULT")
42
+ SERVICE_LIST=$(echo "$BUSINESS" | jq -c '.resultObj.serviceList // []' 2>/dev/null)
43
+ if [ -z "$SERVICE_LIST" ] || ! echo "$SERVICE_LIST" | jq -e 'type == "array"' >/dev/null 2>&1; then
44
+ echo "❌ 服务列表返回结构异常,无法解析 serviceList"
45
+ return 1
46
+ fi
47
+
48
+ SERVICE_COUNT=$(echo "$SERVICE_LIST" | jq 'length')
49
+ }
50
+
51
+ service_list() {
52
+ if ! fetch_service_list; then
53
+ exit 1
54
+ fi
55
+
56
+ if [ "$SERVICE_COUNT" -eq 0 ] || [ "$SERVICE_LIST" = "[]" ] || [ -z "$SERVICE_LIST" ]; then
57
+ echo "📋 暂无服务上架,需要创建新服务"
58
+ echo "FLOW:CREATE_NEW"
59
+ else
60
+ # 输出服务列表
61
+ echo "📋 发现您已有以下服务:"
62
+ echo ""
63
+ echo "| 序号 | 服务ID | 服务名称 | 描述 | 价格 | 状态 | 服务地址 |"
64
+ echo "|------|--------|----------|------|------|------|----------|"
65
+
66
+ for i in $(seq 0 $((SERVICE_COUNT-1))); do
67
+ SERVICE=$(echo "$SERVICE_LIST" | jq ".[$i]")
68
+ SERVICE_ID=$(echo "$SERVICE" | jq -r '.serviceId // "未知"')
69
+ SERVICE_NAME=$(echo "$SERVICE" | jq -r '.serviceName // "未知"')
70
+ SERVICE_DESC=$(echo "$SERVICE" | jq -r '.serviceDesc // "无描述"')
71
+ PRICING=$(echo "$SERVICE" | jq -r '.pricing // "未知"')
72
+ SERVICE_STATUS=$(echo "$SERVICE" | jq -r '.status // "未知"')
73
+ RESOURCE_URL=$(echo "$SERVICE" | jq -r '.resourceUrl // "未知"')
74
+
75
+ case "$SERVICE_STATUS" in
76
+ "ONLINE") STATUS_CN="已上架" ;;
77
+ "PENDING") STATUS_CN="审核中" ;;
78
+ "REJECTED") STATUS_CN="审核拒绝" ;;
79
+ *) STATUS_CN="$SERVICE_STATUS" ;;
80
+ esac
81
+
82
+ echo "| $((i+1)) | $SERVICE_ID | $SERVICE_NAME | $SERVICE_DESC | ${PRICING}元/次 | $STATUS_CN | $RESOURCE_URL |"
83
+ done
84
+
85
+ echo ""
86
+ echo "请选择:"
87
+ echo " • 输入序号(1-$SERVICE_COUNT)复用对应服务"
88
+ echo " • 输入\"新建\"创建新服务"
89
+ echo " • 输入\"修改\"修改已有服务"
90
+ echo "FLOW:SELECT"
91
+ fi
92
+ }
93
+
94
+ # ─── service save: 创建新服务 或 修改已有服务 ────────────────────────────────
95
+ service_save() {
96
+ SERVICE_ID=""
97
+ SERVICE_NAME=""
98
+ SERVICE_DESC=""
99
+ RESOURCE_URL=""
100
+ PRICING=""
101
+ SCHEMA_URL=""
102
+
103
+ while [[ $# -gt 0 ]]; do
104
+ case $1 in
105
+ --service-id) SERVICE_ID="$2"; shift 2 ;;
106
+ --name) SERVICE_NAME="$2"; shift 2 ;;
107
+ --desc) SERVICE_DESC="$2"; shift 2 ;;
108
+ --url) RESOURCE_URL="$2"; shift 2 ;;
109
+ --pricing) PRICING="$2"; shift 2 ;;
110
+ --schema) SCHEMA_URL="$2"; shift 2 ;;
111
+ *) echo "❌ 未知参数: $1"; exit 1 ;;
112
+ esac
113
+ done
114
+
115
+ if [ -z "$SERVICE_NAME" ] || [ -z "$SERVICE_DESC" ] || [ -z "$RESOURCE_URL" ] || [ -z "$PRICING" ] || [ -z "$SCHEMA_URL" ]; then
116
+ echo "❌ 缺少必填参数"
117
+ echo "用法(创建): bash service.sh save --name <name> --desc <desc> --url <url> --pricing <pricing> --schema <json>"
118
+ echo "用法(修改): bash service.sh save --service-id <id> --name <name> --desc <desc> --url <url> --pricing <pricing> --schema <json>"
119
+ exit 1
120
+ fi
121
+
122
+ if [ -z "$SERVICE_ID" ]; then
123
+ # 创建新服务(不传 serviceId)
124
+ if ! fetch_service_list; then
125
+ exit 1
126
+ fi
127
+ if [ "$SERVICE_COUNT" -ge 20 ]; then
128
+ echo "❌ 已达到服务数量上限(20个),无法创建新服务"
129
+ echo "📋 您当前已有 $SERVICE_COUNT 个服务,请选择复用已有服务或修改已有服务"
130
+ exit 1
131
+ fi
132
+
133
+ REQUEST_JSON=$(jq -n \
134
+ --arg serviceName "$SERVICE_NAME" \
135
+ --arg serviceDesc "$SERVICE_DESC" \
136
+ --arg resourceUrl "$RESOURCE_URL" \
137
+ --arg pricing "$PRICING" \
138
+ --arg schemaUrl "$SCHEMA_URL" \
139
+ '{request:{serviceName:$serviceName,serviceDesc:$serviceDesc,resourceUrl:$resourceUrl,pricing:$pricing,schemaUrl:$schemaUrl}}')
140
+
141
+ RESULT=$(export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call a2a-pay-service.saveBazaarServiceForMcp \
142
+ -d "$REQUEST_JSON" \
143
+ --json 2>/dev/null)
144
+ else
145
+ # 修改已有服务(必须传入 serviceId + 所有字段)
146
+ REQUEST_JSON=$(jq -n \
147
+ --arg serviceId "$SERVICE_ID" \
148
+ --arg serviceName "$SERVICE_NAME" \
149
+ --arg serviceDesc "$SERVICE_DESC" \
150
+ --arg resourceUrl "$RESOURCE_URL" \
151
+ --arg pricing "$PRICING" \
152
+ --arg schemaUrl "$SCHEMA_URL" \
153
+ '{request:{serviceId:$serviceId,serviceName:$serviceName,serviceDesc:$serviceDesc,resourceUrl:$resourceUrl,pricing:$pricing,schemaUrl:$schemaUrl}}')
154
+
155
+ RESULT=$(export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call a2a-pay-service.saveBazaarServiceForMcp \
156
+ -d "$REQUEST_JSON" \
157
+ --json 2>/dev/null)
158
+ fi
159
+
160
+ # 错误检测
161
+ if ! handle_error "$RESULT"; then
162
+ exit 1
163
+ fi
164
+
165
+ # 解包 MCP 信封后解析业务字段
166
+ BUSINESS=$(unwrap_mcp "$RESULT")
167
+ SUCCESS=$(echo "$BUSINESS" | jq -r '.success // false')
168
+
169
+ if [ "$SUCCESS" = "true" ]; then
170
+ OPERATION="上架"
171
+ if [ -n "$SERVICE_ID" ]; then
172
+ OPERATION="修改"
173
+ fi
174
+ # 使用 --arg 安全拼接回退值
175
+ NEW_SERVICE_ID=$(echo "$BUSINESS" | jq -r --arg fallback "${SERVICE_ID}" '.resultObj.serviceId // $fallback')
176
+ echo "✅ 服务${OPERATION}成功"
177
+ echo "📋 服务ID: $NEW_SERVICE_ID"
178
+ else
179
+ ERROR_MSG=$(echo "$BUSINESS" | jq -r '.error.message // .errorMessage // "未知错误"')
180
+ OPERATION="上架"
181
+ if [ -n "$SERVICE_ID" ]; then
182
+ OPERATION="修改"
183
+ fi
184
+ echo "❌ 服务${OPERATION}失败: $ERROR_MSG"
185
+ exit 1
186
+ fi
187
+ }
188
+
189
+ # ─── service validate: 入参校验 ──────────────────────────────────────────────
190
+ service_validate() {
191
+ SERVICE_NAME=""
192
+ SERVICE_DESC=""
193
+ RESOURCE_URL=""
194
+ PRICING=""
195
+ SCHEMA_URL=""
196
+
197
+ while [[ $# -gt 0 ]]; do
198
+ case $1 in
199
+ --name) SERVICE_NAME="$2"; shift 2 ;;
200
+ --desc) SERVICE_DESC="$2"; shift 2 ;;
201
+ --url) RESOURCE_URL="$2"; shift 2 ;;
202
+ --pricing) PRICING="$2"; shift 2 ;;
203
+ --schema) SCHEMA_URL="$2"; shift 2 ;;
204
+ *) echo "❌ 未知参数: $1"; exit 1 ;;
205
+ esac
206
+ done
207
+
208
+ # 1. 服务名称:长度 1-50 字符
209
+ if [ -z "$SERVICE_NAME" ] || [ ${#SERVICE_NAME} -gt 50 ]; then
210
+ echo "❌ 服务名称长度需在 1-50 字符之间(当前长度: ${#SERVICE_NAME})"
211
+ exit 1
212
+ fi
213
+
214
+ # 2. 服务描述:长度 1-500 字符
215
+ if [ -z "$SERVICE_DESC" ] || [ ${#SERVICE_DESC} -gt 500 ]; then
216
+ echo "❌ 服务描述长度需在 1-500 字符之间(当前长度: ${#SERVICE_DESC})"
217
+ exit 1
218
+ fi
219
+
220
+ # 3. 服务地址:有效 URL
221
+ if [ -z "$RESOURCE_URL" ] || ! [[ "$RESOURCE_URL" =~ ^https?:// ]]; then
222
+ echo "❌ 请提供有效的 URL 地址(以 http:// 或 https:// 开头)"
223
+ exit 1
224
+ fi
225
+
226
+ # 4. 服务单价:数字格式,>= 0.01
227
+ if [ -z "$PRICING" ] || ! [[ "$PRICING" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
228
+ echo "❌ 服务单价格式不正确,请输入数字(如 0.01、1.00)"
229
+ exit 1
230
+ fi
231
+ PRICING_VALID=$(awk -v p="$PRICING" 'BEGIN { if (p + 0 >= 0.01) print "true"; else print "false" }')
232
+ if [ "$PRICING_VALID" = "false" ]; then
233
+ echo "❌ 服务单价最低为 0.01 元"
234
+ exit 1
235
+ fi
236
+
237
+ # 5. 请求示例:有效 JSON(改用 jq 代替 python3,与脚本其他部分保持一致)
238
+ if [ -z "$SCHEMA_URL" ] || ! echo "$SCHEMA_URL" | jq . >/dev/null 2>&1; then
239
+ echo "❌ 请提供有效的 JSON 格式请求示例"
240
+ exit 1
241
+ fi
242
+
243
+ echo "✅ 服务信息校验通过"
244
+ }
245
+
246
+ # ─── 入口分发 ────────────────────────────────────────────────────────────────
247
+ case "${1:-}" in
248
+ list)
249
+ service_list
250
+ ;;
251
+ save)
252
+ shift
253
+ service_save "$@"
254
+ ;;
255
+ validate)
256
+ shift
257
+ service_validate "$@"
258
+ ;;
259
+ *)
260
+ echo "用法: bash service.sh <list|save|validate> [参数...]"
261
+ echo ""
262
+ echo " service list"
263
+ echo " service save --name <n> --desc <d> --url <u> --pricing <p> --schema <json> [--service-id <id>]"
264
+ echo " service validate --name <n> --desc <d> --url <u> --pricing <p> --schema <json>"
265
+ exit 1
266
+ ;;
267
+ esac
@@ -0,0 +1,152 @@
1
+ #!/bin/bash
2
+ #=============================================================================
3
+ # 脚本名称: upload_screenshots.sh
4
+ # 功能描述: 并行上传截图文件并解析可用于签约的图片引用值
5
+ # 调用位置: Step 4 资料采集
6
+ # 调用前置: 脚本通过 error_handler.sh 间接初始化 DEV_TOOL_NAME;需传入3个文件路径
7
+ # 用法: bash upload_screenshots.sh "$HOME_IMG" "$SHOP_IMG" "$PAY_IMG"
8
+ # 返回值: 输出上传结果和图片引用值
9
+ #=============================================================================
10
+
11
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
+
13
+ # 一次性 source error_handler(含 unwrap_mcp)
14
+ if [ -f "${SCRIPT_DIR}/error_handler.sh" ]; then
15
+ source "${SCRIPT_DIR}/error_handler.sh"
16
+ else
17
+ echo "❌ 缺少错误处理脚本: ${SCRIPT_DIR}/error_handler.sh"
18
+ exit 1
19
+ fi
20
+
21
+ require_command jq || exit 1
22
+ require_command alipay-cli || exit 1
23
+ require_command mktemp || exit 1
24
+
25
+ HOME_IMG="$1"
26
+ SHOP_IMG="$2"
27
+ PAY_IMG="$3"
28
+
29
+ # 校验参数
30
+ if [ -z "$HOME_IMG" ] || [ -z "$SHOP_IMG" ] || [ -z "$PAY_IMG" ]; then
31
+ echo "❌ 请提供 3 个截图文件路径"
32
+ echo "用法: bash upload_screenshots.sh <首页截图> <商品页截图> <支付页截图>"
33
+ echo " 网站支付:传入网站首页、商品页、支付页截图"
34
+ echo " APP支付:传入APP首页、商品页、支付页截图"
35
+ exit 1
36
+ fi
37
+
38
+ # 校验文件存在性
39
+ if [ ! -f "$HOME_IMG" ]; then
40
+ echo "❌ 首页截图文件不存在: $HOME_IMG"
41
+ exit 1
42
+ fi
43
+ if [ ! -f "$SHOP_IMG" ]; then
44
+ echo "❌ 商品页截图文件不存在: $SHOP_IMG"
45
+ exit 1
46
+ fi
47
+ if [ ! -f "$PAY_IMG" ]; then
48
+ echo "❌ 支付页截图文件不存在: $PAY_IMG"
49
+ exit 1
50
+ fi
51
+
52
+ # 使用 mktemp 创建并发安全的临时文件。模板需以 XXXXXX 结尾以兼容 macOS/BSD mktemp。
53
+ TMP_BASE="${TMPDIR:-/tmp}"
54
+ TMP_BASE="${TMP_BASE%/}"
55
+ TMP_HOME=$(mktemp "${TMP_BASE}/upload_home.XXXXXX") || { echo "❌ 创建临时文件失败"; exit 1; }
56
+ TMP_SHOP=$(mktemp "${TMP_BASE}/upload_shop.XXXXXX") || { echo "❌ 创建临时文件失败"; exit 1; }
57
+ TMP_PAY=$(mktemp "${TMP_BASE}/upload_pay.XXXXXX") || { echo "❌ 创建临时文件失败"; exit 1; }
58
+
59
+ # 清理临时文件
60
+ cleanup_upload_tmp() {
61
+ rm -f "$TMP_HOME" "$TMP_SHOP" "$TMP_PAY"
62
+ }
63
+ trap cleanup_upload_tmp EXIT
64
+
65
+ # 并行上传 3 张截图
66
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli file upload "$HOME_IMG" -s payMerchantcodeSkill --json 2>/dev/null > "$TMP_HOME" &
67
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli file upload "$SHOP_IMG" -s payMerchantcodeSkill --json 2>/dev/null > "$TMP_SHOP" &
68
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli file upload "$PAY_IMG" -s payMerchantcodeSkill --json 2>/dev/null > "$TMP_PAY" &
69
+ wait
70
+
71
+ # 解析图片引用值(兼容 file upload 返回 fileKey 或 URL 字段)
72
+ parse_image_ref() {
73
+ local RAW=$(cat "$1")
74
+ if ! handle_error "$RAW" >/dev/null; then
75
+ return 1
76
+ fi
77
+ # alipay-cli file upload 可能返回 MCP 信封,先解包
78
+ local UNWRAPPED=$(unwrap_mcp "$RAW")
79
+ echo "$UNWRAPPED" | jq -r '
80
+ .data.fileKey //
81
+ .data.picUrl //
82
+ .data.url //
83
+ .data.fileUrl //
84
+ .data.downloadUrl //
85
+ .data.data.fileKey //
86
+ .data.data.picUrl //
87
+ .data.data.url //
88
+ .data.data.fileUrl //
89
+ .data.data.downloadUrl //
90
+ .fileKey //
91
+ .picUrl //
92
+ .url //
93
+ .fileUrl //
94
+ .downloadUrl //
95
+ .result.fileKey //
96
+ .result.picUrl //
97
+ .result.url //
98
+ .result.fileUrl //
99
+ .result.downloadUrl //
100
+ empty
101
+ ' 2>/dev/null
102
+ }
103
+
104
+ HOME_REF=$(parse_image_ref "$TMP_HOME")
105
+ SHOP_REF=$(parse_image_ref "$TMP_SHOP")
106
+ PAY_REF=$(parse_image_ref "$TMP_PAY")
107
+
108
+ # 校验上传结果(含认证错误检测)
109
+ check_upload_error() {
110
+ local RAW=$(cat "$1")
111
+ if ! handle_error "$RAW"; then
112
+ return 1
113
+ fi
114
+ return 0
115
+ }
116
+
117
+ ERRORS=""
118
+ if [ -z "$HOME_REF" ]; then
119
+ if ! check_upload_error "$TMP_HOME"; then
120
+ ERRORS="$ERRORS - 首页截图上传失败(认证或服务异常)"$'\n'
121
+ else
122
+ ERRORS="$ERRORS - 首页截图上传后未返回可用于签约的图片引用值"$'\n'
123
+ fi
124
+ fi
125
+ if [ -z "$SHOP_REF" ]; then
126
+ if ! check_upload_error "$TMP_SHOP"; then
127
+ ERRORS="$ERRORS - 商品页截图上传失败(认证或服务异常)"$'\n'
128
+ else
129
+ ERRORS="$ERRORS - 商品页截图上传后未返回可用于签约的图片引用值"$'\n'
130
+ fi
131
+ fi
132
+ if [ -z "$PAY_REF" ]; then
133
+ if ! check_upload_error "$TMP_PAY"; then
134
+ ERRORS="$ERRORS - 支付页截图上传失败(认证或服务异常)"$'\n'
135
+ else
136
+ ERRORS="$ERRORS - 支付页截图上传后未返回可用于签约的图片引用值"$'\n'
137
+ fi
138
+ fi
139
+
140
+ if [ -n "$ERRORS" ]; then
141
+ echo "❌ 截图上传失败:"
142
+ printf "%s" "$ERRORS"
143
+ exit 1
144
+ fi
145
+
146
+ echo "✅ 截图上传成功"
147
+ echo " - 首页截图: $HOME_REF"
148
+ echo " - 商品页截图: $SHOP_REF"
149
+ echo " - 支付页截图: $PAY_REF"
150
+ echo ""
151
+ echo "# 更新对话上下文状态:"
152
+ echo "# collect_information = {\"screenshot\":[\"$HOME_REF\",\"$SHOP_REF\",\"$PAY_REF\"]}"