@alipay/alipay-aipay 0.1.1-beta.1

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 (114) hide show
  1. package/README.md +1 -0
  2. package/bin/alipay-aipay.js +6 -0
  3. package/dist/commands/install.d.ts +10 -0
  4. package/dist/commands/install.d.ts.map +1 -0
  5. package/dist/commands/install.js +92 -0
  6. package/dist/commands/install.js.map +1 -0
  7. package/dist/commands/uninstall.d.ts +10 -0
  8. package/dist/commands/uninstall.d.ts.map +1 -0
  9. package/dist/commands/uninstall.js +82 -0
  10. package/dist/commands/uninstall.js.map +1 -0
  11. package/dist/commands/update.d.ts +10 -0
  12. package/dist/commands/update.d.ts.map +1 -0
  13. package/dist/commands/update.js +125 -0
  14. package/dist/commands/update.js.map +1 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +51 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/types.d.ts +43 -0
  20. package/dist/types.d.ts.map +1 -0
  21. package/dist/types.js +2 -0
  22. package/dist/types.js.map +1 -0
  23. package/dist/utils/alipay-cli.d.ts +15 -0
  24. package/dist/utils/alipay-cli.d.ts.map +1 -0
  25. package/dist/utils/alipay-cli.js +228 -0
  26. package/dist/utils/alipay-cli.js.map +1 -0
  27. package/dist/utils/config.d.ts +48 -0
  28. package/dist/utils/config.d.ts.map +1 -0
  29. package/dist/utils/config.js +207 -0
  30. package/dist/utils/config.js.map +1 -0
  31. package/dist/utils/file.d.ts +55 -0
  32. package/dist/utils/file.d.ts.map +1 -0
  33. package/dist/utils/file.js +154 -0
  34. package/dist/utils/file.js.map +1 -0
  35. package/dist/utils/gpg.d.ts +14 -0
  36. package/dist/utils/gpg.d.ts.map +1 -0
  37. package/dist/utils/gpg.js +247 -0
  38. package/dist/utils/gpg.js.map +1 -0
  39. package/dist/utils/jq.d.ts +14 -0
  40. package/dist/utils/jq.d.ts.map +1 -0
  41. package/dist/utils/jq.js +221 -0
  42. package/dist/utils/jq.js.map +1 -0
  43. package/dist/utils/npm.d.ts +17 -0
  44. package/dist/utils/npm.d.ts.map +1 -0
  45. package/dist/utils/npm.js +42 -0
  46. package/dist/utils/npm.js.map +1 -0
  47. package/dist/utils/shell.d.ts +11 -0
  48. package/dist/utils/shell.d.ts.map +1 -0
  49. package/dist/utils/shell.js +54 -0
  50. package/dist/utils/shell.js.map +1 -0
  51. package/package.json +53 -0
  52. package/skill/SKILL.md +118 -0
  53. package/skill/references/integration/flow.md +487 -0
  54. package/skill/references/integration/modules/alipay-sdk-reminder.md +256 -0
  55. package/skill/references/integration/modules/checklist.md +122 -0
  56. 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
  57. 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
  58. 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
  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/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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  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/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
  67. 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
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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
  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/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
  74. 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
  75. 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
  76. 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
  77. 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
  78. 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
  79. 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
  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/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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  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/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
  88. 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
  89. 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
  90. 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
  91. package/skill/references/integration/modules/interface-guide.md +90 -0
  92. package/skill/references/integration/modules/product-decision.md +90 -0
  93. package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +270 -0
  94. package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +133 -0
  95. package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +218 -0
  96. package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +659 -0
  97. package/skill/references/normal/alipay-cli-env.md +211 -0
  98. package/skill/references/normal/rejection-guide.md +37 -0
  99. package/skill/references/normal/scripts/common.sh +32 -0
  100. package/skill/references/normal/scripts/detect_dev_tool.sh +46 -0
  101. package/skill/references/onboarding/flow.md +571 -0
  102. package/skill/references/onboarding/modules/app-release.md +411 -0
  103. package/skill/references/onboarding/modules/authorization.md +269 -0
  104. package/skill/references/onboarding/modules/error-handling.md +247 -0
  105. package/skill/references/onboarding/modules/mcc-reference.md +209 -0
  106. package/skill/references/onboarding/modules/product-sign.md +304 -0
  107. package/skill/references/onboarding/modules/scripts/app.sh +705 -0
  108. package/skill/references/onboarding/modules/scripts/ar_sign_apply.sh +248 -0
  109. package/skill/references/onboarding/modules/scripts/auth.sh +505 -0
  110. package/skill/references/onboarding/modules/scripts/error_handler.sh +312 -0
  111. package/skill/references/onboarding/modules/scripts/query_sign_status.sh +146 -0
  112. package/skill/references/onboarding/modules/scripts/service.sh +267 -0
  113. package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +152 -0
  114. 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\"]}"