@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,465 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ A2M 智能收产品接入示例 - Python 版本
5
+
6
+ 本文件演示完整的智能收产品接入流程:
7
+ 1. 返回 402 Payment-Needed Header
8
+ 2. 验证 Payment-Proof 支付凭证
9
+ 3. 发送履约回执确认
10
+ 4. 返回资源内容
11
+
12
+ 依赖安装:
13
+ pip install flask alipay-sdk-python
14
+
15
+ 注意:Python SDK 3.7+ 版本必须使用 Model 类(如 AlipayAipayAgentPaymentVerifyModel),
16
+ 不能直接使用 dict 赋值给 biz_model,因为 SDK 会调用 to_alipay_dict() 方法。
17
+ """
18
+
19
+ import json
20
+ import time
21
+ import base64
22
+ from datetime import datetime, timedelta, timezone
23
+ from urllib.parse import quote, unquote
24
+ from Crypto.Signature import pkcs1_15
25
+ from Crypto.Hash import SHA256
26
+ from Crypto.PublicKey import RSA
27
+ from flask import Flask, request, Response
28
+ from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
29
+ from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
30
+ from alipay.aop.api.request.AlipayAipayAgentPaymentVerifyRequest import AlipayAipayAgentPaymentVerifyRequest
31
+ from alipay.aop.api.request.AlipayAipayAgentFulfillmentConfirmRequest import AlipayAipayAgentFulfillmentConfirmRequest
32
+ from alipay.aop.api.domain.AlipayAipayAgentPaymentVerifyModel import AlipayAipayAgentPaymentVerifyModel
33
+ from alipay.aop.api.domain.AlipayAipayAgentFulfillmentConfirmModel import AlipayAipayAgentFulfillmentConfirmModel
34
+
35
+ app = Flask(__name__)
36
+
37
+ # ==================== 配置信息(实际使用时请从配置中心读取)====================
38
+ ALIPAY_CONFIG = {
39
+ 'appId': '<APP_ID>',
40
+ 'privateKey': '<APP_PRIVATE_KEY>', # 请填写您的应用私钥(PKCS#1 格式)
41
+ 'alipayPublicKey': '<ALIPAY_PUBLIC_KEY>', # 请填写您的支付宝公钥
42
+ 'gateway': 'https://openapi.alipay.com/gateway.do',
43
+ 'sellerId': '<SELLER_ID_2088>', # 商户 ID(2088 格式)
44
+ 'serviceId': '<SERVICE_ID>', # 商户服务 ID
45
+ 'merchantPrivateKey': '<APP_PRIVATE_KEY>' # 请填写您的应用私钥(用于商家签名)
46
+ }
47
+
48
+ RESOURCE_CONFIG = {
49
+ 'path': '/demo/a2m/resource',
50
+ 'goodsName': 'AI 生成内容服务'
51
+ }
52
+
53
+ # 初始化支付宝客户端
54
+ def init_alipay_client():
55
+ """初始化支付宝 SDK 客户端"""
56
+ config = AlipayClientConfig()
57
+ config.server_url = ALIPAY_CONFIG['gateway']
58
+ config.app_id = ALIPAY_CONFIG['appId']
59
+ config.app_private_key = ALIPAY_CONFIG['privateKey']
60
+ config.alipay_public_key = ALIPAY_CONFIG['alipayPublicKey']
61
+ config.charset = 'utf-8'
62
+ config.sign_type = 'RSA2'
63
+
64
+ return DefaultAlipayClient(alipay_client_config=config)
65
+
66
+
67
+ # ==================== 工具方法 ====================
68
+
69
+ def format_alipay_timestamp(dt=None):
70
+ """格式化支付宝时间戳:yyyy-MM-dd HH:mm:ss"""
71
+ if dt is None:
72
+ dt = datetime.now()
73
+ return dt.strftime('%Y-%m-%d %H:%M:%S')
74
+
75
+
76
+ def generate_seller_signature(params, private_key):
77
+ """
78
+ 生成商家签名(seller_signature)
79
+
80
+ Args:
81
+ params: 待签名参数字典
82
+ private_key: 商户私钥字符串
83
+
84
+ Returns:
85
+ Base64 编码的签名
86
+ """
87
+ # 1. 按 key 字典序排序
88
+ sorted_keys = sorted(params.keys())
89
+
90
+ # 2. 拼接签名内容
91
+ sign_content = []
92
+ for key in sorted_keys:
93
+ value = params[key]
94
+ if value is not None and value != '':
95
+ sign_content.append(f"{key}={value}")
96
+
97
+ sign_string = '&'.join(sign_content)
98
+
99
+ # 3. RSA2 签名
100
+ key = RSA.import_key(private_key)
101
+ h = SHA256.new(sign_string.encode('utf-8'))
102
+ signature = pkcs1_15.new(key).sign(h)
103
+
104
+ return base64.b64encode(signature).decode('utf-8')
105
+
106
+
107
+ def base64url_encode(data):
108
+ """Base64URL 编码"""
109
+ if isinstance(data, str):
110
+ data = data.encode('utf-8')
111
+ return base64.urlsafe_b64encode(data).rstrip(b'=').decode('utf-8')
112
+
113
+
114
+ def base64url_decode(data):
115
+ """Base64URL 解码"""
116
+ # 补充 padding
117
+ padding = 4 - len(data) % 4
118
+ if padding != 4:
119
+ data += '=' * padding
120
+
121
+ return base64.urlsafe_b64decode(data).decode('utf-8')
122
+
123
+
124
+ def json_response(data, status_code=200, headers=None):
125
+ """发送 JSON 响应"""
126
+ response = Response(
127
+ json.dumps(data, ensure_ascii=False),
128
+ status=status_code,
129
+ mimetype='application/json; charset=utf-8'
130
+ )
131
+
132
+ if headers:
133
+ for key, value in headers.items():
134
+ response.headers[key] = value
135
+
136
+ return response
137
+
138
+
139
+ # ==================== 智能收产品接入示例接口 ====================
140
+
141
+ @app.route(RESOURCE_CONFIG['path'], methods=['GET'])
142
+ def handle_resource():
143
+ """
144
+ 智能收产品统一接口
145
+
146
+ 完整流程演示:
147
+ 1. 不带 Payment-Proof Header:返回 HTTP 402 + Payment-Needed Header
148
+ 2. 带 Payment-Proof Header:验证支付 → 自动履约 → 返回资源
149
+ """
150
+ # 获取 Payment-Proof Header
151
+ payment_proof = request.headers.get('Payment-Proof')
152
+
153
+ # 场景 1:用户未支付,返回 402 + Payment-Needed Header
154
+ if not payment_proof or not payment_proof.strip():
155
+ return create_payment_required_response()
156
+
157
+ # 场景 2:用户已支付,验证 Payment-Proof 并返回资源
158
+ return verify_payment_and_deliver_resource(payment_proof)
159
+
160
+
161
+ def create_payment_required_response():
162
+ """创建 402 支付请求响应"""
163
+ try:
164
+ # 1. 构造订单信息
165
+ out_trade_no = f"ORDER_{int(time.time() * 1000)}"
166
+ amount = '0.01' # 单位:元
167
+ currency = 'CNY'
168
+ resource_id = RESOURCE_CONFIG['path']
169
+ goods_name = RESOURCE_CONFIG['goodsName']
170
+
171
+ # 2. 计算支付截止时间(30 分钟后),使用带时区的 ISO 8601 格式
172
+ pay_before = (datetime.now(timezone.utc).astimezone() + timedelta(minutes=30)).isoformat()
173
+
174
+ # 3. 生成商家签名
175
+ seller_signature = generate_seller_signature({
176
+ 'amount': amount,
177
+ 'currency': currency,
178
+ 'goods_name': goods_name,
179
+ 'out_trade_no': out_trade_no,
180
+ 'pay_before': pay_before,
181
+ 'resource_id': resource_id,
182
+ 'seller_id': ALIPAY_CONFIG['sellerId'],
183
+ 'service_id': ALIPAY_CONFIG['serviceId']
184
+ }, ALIPAY_CONFIG['merchantPrivateKey'])
185
+
186
+ # 4. 构造 Payment-Needed Header 内容
187
+ payment_needed = {
188
+ 'protocol': {
189
+ 'out_trade_no': out_trade_no,
190
+ 'amount': amount,
191
+ 'currency': currency,
192
+ 'resource_id': resource_id,
193
+ 'pay_before': pay_before,
194
+ 'seller_signature': seller_signature,
195
+ 'seller_sign_type': 'RSA2',
196
+ 'seller_unique_id': ALIPAY_CONFIG['sellerId']
197
+ },
198
+ 'method': {
199
+ 'seller_name': '测试商户',
200
+ 'seller_id': ALIPAY_CONFIG['sellerId'],
201
+ 'seller_app_id': ALIPAY_CONFIG['appId'],
202
+ 'goods_name': goods_name,
203
+ 'seller_unique_id_key': 'seller_id',
204
+ 'service_id': ALIPAY_CONFIG['serviceId']
205
+ }
206
+ }
207
+
208
+ # 5. Base64URL 编码
209
+ payment_needed_encoded = base64url_encode(json.dumps(payment_needed, ensure_ascii=False))
210
+
211
+ # 6. 构造 402 响应
212
+ response_data = {
213
+ 'code': 'Payment-Needed',
214
+ 'message': '需要支付',
215
+ 'out_trade_no': out_trade_no,
216
+ 'amount': amount,
217
+ 'currency': currency,
218
+ 'goods_name': goods_name
219
+ }
220
+
221
+ print(f"创建支付订单成功:outTradeNo={out_trade_no}, amount={amount}")
222
+
223
+ return json_response(
224
+ response_data,
225
+ status_code=402,
226
+ headers={'Payment-Needed': payment_needed_encoded}
227
+ )
228
+
229
+ except Exception as e:
230
+ print(f'创建订单失败:{str(e)}')
231
+ return json_response({
232
+ 'code': 'CREATE_ORDER_ERROR',
233
+ 'message': f'创建订单失败:{str(e)}'
234
+ }, status_code=500)
235
+
236
+
237
+ def verify_payment_and_deliver_resource(payment_proof):
238
+ """验证支付凭证并交付资源"""
239
+ try:
240
+ # 1. 从 Payment-Proof 中解析订单信息
241
+ try:
242
+ decoded_proof = base64url_decode(payment_proof)
243
+ proof_json = json.loads(decoded_proof)
244
+
245
+ # 从 protocol 层获取 payment_proof 和 trade_no
246
+ protocol = proof_json.get('protocol', {})
247
+ payment_proof_value = protocol.get('payment_proof')
248
+ trade_no = protocol.get('trade_no')
249
+
250
+ # 从 method 层获取 client_session
251
+ method = proof_json.get('method', {})
252
+ client_session = method.get('client_session')
253
+
254
+ # 校验必要字段
255
+ if not payment_proof_value or not payment_proof_value.strip():
256
+ return json_response({
257
+ 'code': 'INVALID_PAYMENT_PROOF_FORMAT',
258
+ 'message': 'Payment-Proof 格式错误:缺少 payment_proof'
259
+ }, status_code=400)
260
+
261
+ if not trade_no or not trade_no.strip():
262
+ return json_response({
263
+ 'code': 'INVALID_PAYMENT_PROOF_FORMAT',
264
+ 'message': 'Payment-Proof 格式错误:缺少 trade_no'
265
+ }, status_code=400)
266
+
267
+ except Exception as e:
268
+ print(f'Payment-Proof 解析失败:{str(e)}')
269
+ return json_response({
270
+ 'code': 'INVALID_PAYMENT_PROOF_FORMAT',
271
+ 'message': f'Payment-Proof 格式错误:{str(e)}'
272
+ }, status_code=400)
273
+
274
+ # 2. 调用支付宝 API 验证支付凭证
275
+ # 注意:必须使用 Model 类,不能使用 dict
276
+ # SDK 的 get_params() 方法会调用 biz_model.to_alipay_dict()
277
+ alipay_client = init_alipay_client()
278
+ verify_request = AlipayAipayAgentPaymentVerifyRequest()
279
+
280
+ # 使用 Model 类(正确方式)
281
+ model = AlipayAipayAgentPaymentVerifyModel()
282
+ model.payment_proof = payment_proof_value
283
+ model.trade_no = trade_no
284
+ model.client_session = client_session
285
+ verify_request.biz_model = model
286
+
287
+ # 如果 SDK 版本支持直接使用 dict,也可以用 biz_content(备选方案)
288
+ # verify_request.biz_content = json.dumps({
289
+ # 'payment_proof': payment_proof_value,
290
+ # 'trade_no': trade_no,
291
+ # 'client_session': client_session
292
+ # }, ensure_ascii=False)
293
+
294
+ verify_response_content = alipay_client.execute(verify_request)
295
+ verify_response = json.loads(verify_response_content)
296
+
297
+ # 3. 验证失败,返回错误
298
+ # 注意:SDK execute() 返回的 JSON 可能是扁平结构(直接包含 code/trade_no 等字段),
299
+ # 也可能嵌套在 alipay_aipay_agent_payment_verify_response 键下,需兼容两种情况
300
+ response_data = verify_response.get('alipay_aipay_agent_payment_verify_response', verify_response)
301
+ if response_data.get('code') != '10000':
302
+ print(f'支付凭证验证失败:{response_data.get("sub_msg")}')
303
+ return json_response({
304
+ 'code': response_data.get('sub_code', 'VERIFY_FAILED'),
305
+ 'message': response_data.get('sub_msg', '支付凭证验证失败')
306
+ }, status_code=400)
307
+
308
+ # 4. 验证成功,获取订单信息
309
+ verify_trade_no = response_data.get('trade_no')
310
+ verify_out_trade_no = response_data.get('out_trade_no')
311
+ resource_id = response_data.get('resource_id')
312
+ active = response_data.get('active')
313
+
314
+ print(f"支付凭证验证成功:tradeNo={verify_trade_no}, outTradeNo={verify_out_trade_no}")
315
+
316
+ # 5. 校验凭证有效性(active=true 表示凭证有效)
317
+ if active is not True:
318
+ print(f"支付凭证无效或已过期:outTradeNo={verify_out_trade_no}")
319
+ return json_response({
320
+ 'code': 'INVALID_PAYMENT_PROOF',
321
+ 'message': '支付凭证无效或已过期'
322
+ }, status_code=400)
323
+
324
+ # 6. 【TODO】查询订单是否存在(以数据库为准)
325
+ # order = order_repository.find_by_out_trade_no(verify_out_trade_no)
326
+ # if not order:
327
+ # return json_response({
328
+ # 'code': 'ORDER_NOT_FOUND',
329
+ # 'message': '订单不存在'
330
+ # }, status_code=404)
331
+
332
+ # 7. 【TODO】资源防串校验
333
+ # if resource_id != order.resource_id:
334
+ # return json_response({
335
+ # 'code': 'RESOURCE_ID_MISMATCH',
336
+ # 'message': '资源 ID 不匹配,可能存在资源串改风险'
337
+ # }, status_code=403)
338
+
339
+ # 8. 【TODO】履约防重放校验(数据库幂等控制)
340
+ # if order.fulfill_status == 'FULFILLED':
341
+ # return json_response({
342
+ # 'code': 'ALREADY_FULFILLED',
343
+ # 'message': '订单已履约,不重复提供',
344
+ # 'already_fulfilled': True
345
+ # }, status_code=200)
346
+
347
+ # 9. 生成资源内容
348
+ service_result = generate_service_resource(resource_id)
349
+
350
+ # 10. 【TODO】履约记录落库
351
+ # fulfillment_record_repository.save({...})
352
+
353
+ # 11. 【TODO】保存待确认履约状态
354
+ # 实际生产中建议先保存 service_result 和 PENDING_CONFIRM 状态。
355
+ # fulfillment.confirm 成功后再标记 FULFILLED;如果确认失败,
356
+ # 允许同一笔 Payment-Proof 重试确认,避免误返回成功。
357
+ # order_repository.update(verify_out_trade_no, {
358
+ # 'order_status': 'PAID',
359
+ # 'fulfill_status': 'PENDING_CONFIRM',
360
+ # 'trade_no': verify_trade_no,
361
+ # 'service_result': service_result
362
+ # })
363
+
364
+ print(f"资源已生成,准备发送履约确认:outTradeNo={verify_out_trade_no}, tradeNo={verify_trade_no}")
365
+
366
+ # 12. 发送履约确认到支付宝,确认成功后才返回成功交付
367
+ # 注意:同样需要使用 Model 类
368
+ if not send_fulfillment_confirm(verify_trade_no):
369
+ return json_response({
370
+ 'code': 'FULFILLMENT_CONFIRM_FAILED',
371
+ 'message': '资源已生成但履约确认失败,请稍后使用同一 Payment-Proof 重试'
372
+ }, status_code=502)
373
+
374
+ # 12.1 【TODO】履约确认成功后,再标记订单已履约
375
+ # order_repository.update(verify_out_trade_no, {
376
+ # 'fulfill_status': 'FULFILLED',
377
+ # 'fulfilled_at': datetime.now(timezone.utc).astimezone().isoformat()
378
+ # })
379
+
380
+ print(f"履约确认成功:outTradeNo={verify_out_trade_no}, tradeNo={verify_trade_no}")
381
+
382
+ # 13. 构造 Payment-Validation Header
383
+ payment_validation = {
384
+ 'trade_no': verify_trade_no,
385
+ 'out_trade_no': verify_out_trade_no,
386
+ 'validated': True,
387
+ 'resource_id': resource_id
388
+ }
389
+
390
+ payment_validation_encoded = base64url_encode(json.dumps(payment_validation, ensure_ascii=False))
391
+
392
+ # 14. 返回资源内容
393
+ return json_response({
394
+ 'resource_id': resource_id,
395
+ 'content': service_result,
396
+ 'trade_no': verify_trade_no,
397
+ 'out_trade_no': verify_out_trade_no,
398
+ 'already_fulfilled': False,
399
+ 'fulfillment_confirmed': True
400
+ }, headers={'Payment-Validation': payment_validation_encoded})
401
+
402
+ except Exception as e:
403
+ print(f'支付凭证验证异常:{str(e)}')
404
+ return json_response({
405
+ 'code': 'VERIFY_FAILED',
406
+ 'message': f'支付凭证验证失败:{str(e)}'
407
+ }, status_code=500)
408
+
409
+
410
+ def generate_service_resource(resource_id):
411
+ """生成服务资源内容"""
412
+ return json.dumps({
413
+ 'status': 'success',
414
+ 'service_type': 'AI_CONTENT_GENERATION',
415
+ 'resource_id': resource_id,
416
+ 'content': '这是 AI 生成的内容示例,可根据实际业务替换为任意数字服务内容',
417
+ 'generated_at': datetime.now(timezone.utc).astimezone().isoformat()
418
+ }, ensure_ascii=False)
419
+
420
+
421
+ def send_fulfillment_confirm(trade_no):
422
+ """发送履约确认"""
423
+ try:
424
+ print(f"开始发送履约确认:tradeNo={trade_no}")
425
+
426
+ alipay_client = init_alipay_client()
427
+ confirm_request = AlipayAipayAgentFulfillmentConfirmRequest()
428
+
429
+ # 使用 Model 类(正确方式)
430
+ model = AlipayAipayAgentFulfillmentConfirmModel()
431
+ model.trade_no = trade_no
432
+ confirm_request.biz_model = model
433
+
434
+ # 备选方案:使用 biz_content
435
+ # confirm_request.biz_content = json.dumps({
436
+ # 'trade_no': trade_no
437
+ # }, ensure_ascii=False)
438
+
439
+ response_content = alipay_client.execute(confirm_request)
440
+ response = json.loads(response_content)
441
+
442
+ # 注意:SDK execute() 返回的 JSON 可能是扁平结构,也可能嵌套在响应键下,需兼容两种情况
443
+ response_data = response.get('alipay_aipay_agent_fulfillment_confirm_response', response)
444
+ if response_data.get('code') == '10000':
445
+ print(f"履约确认成功:tradeNo={trade_no}")
446
+ return True
447
+ else:
448
+ print(f"履约确认失败:tradeNo={trade_no}, errorCode={response_data.get('sub_code')}, "
449
+ f"errorMsg={response_data.get('sub_msg')}")
450
+ return False
451
+
452
+ except Exception as e:
453
+ print(f"履约确认异常:tradeNo={trade_no}, error={str(e)}")
454
+ return False
455
+
456
+
457
+ # ==================== 启动服务 ====================
458
+
459
+ if __name__ == '__main__':
460
+ print(f"A2M 智能收服务已启动:http://localhost:5000{RESOURCE_CONFIG['path']}")
461
+ print('测试步骤:')
462
+ print(f'1. 无 Payment-Proof Header: curl http://localhost:5000{RESOURCE_CONFIG["path"]}')
463
+ print(f'2. 有 Payment-Proof Header: curl -H "Payment-Proof: <value>" http://localhost:5000{RESOURCE_CONFIG["path"]}')
464
+
465
+ app.run(host='0.0.0.0', port=5000, debug=True)
@@ -0,0 +1,90 @@
1
+ # 接口说明与代码示例索引
2
+
3
+ 本文件汇总了支付宝支付产品的通用接口和产品专用接口的参考文档及代码示例索引,供主 Skill 集成参考。**本 Skill 仅支持按量付费、网站支付、APP支付三种产品**。
4
+
5
+ ---
6
+
7
+ ## 一、通用接口
8
+
9
+ 下表所列接口适用于网站支付和APP支付产品,请结合用户集成诉求按需查阅。**按量付费产品不使用这些通用接口**。
10
+
11
+ ### 通用接口文档索引
12
+
13
+ | 接口名称 | 文档链接 |
14
+ | --- | --- |
15
+ | 统一收单交易查询接口 | <https://ideservice.alipay.com/cms/site/0izblf> |
16
+ | 统一收单交易退款接口 | <https://ideservice.alipay.com/cms/site/0izam4> |
17
+ | 统一收单交易退款查询接口 | <https://ideservice.alipay.com/cms/site/0izl48> |
18
+ | 统一收单交易关闭接口 | <https://ideservice.alipay.com/cms/site/0izcu8> |
19
+ | 异步通知说明 | <https://ideservice.alipay.com/cms/site/0izal6> |
20
+
21
+ ### 通用接口代码示例索引
22
+
23
+ 各接口的代码示例按编程语言拆分,存放于各语言目录的 `1-通用接口/` 子目录下。请根据用户实际使用的编程语言查找所需接口的示例代码,**不要混用不同语言**。
24
+
25
+ > **⚠️ 按量付费产品不涉及这些通用接口**,按量付费使用专属的 A2M 接口进行支付。
26
+
27
+ 表格中某语言列为空,表示该语言暂无对应接口的示例文档。此时请依据上述通用接口文档中的**公共请求参数**、**业务请求参数**及**响应参数**,获取字段名、类型、是否必填及取值规则,按照当前编程语言规范自行完成实现。
28
+
29
+ | 接口名称 | Java | Python | Node.js | PHP | C# |
30
+ | --- | --- | --- | --- | --- | --- |
31
+ | 统一收单交易查询接口 | [示例](./code-examples/java/1-通用接口/统一收单交易查询接口代码示例.md) | [示例](./code-examples/python/1-通用接口/统一收单交易查询接口代码示例.md) | [示例](./code-examples/nodejs/1-通用接口/统一收单交易查询接口代码示例.md) | [示例](./code-examples/php/1-通用接口/统一收单交易查询接口代码示例.md) | [示例](./code-examples/csharp/1-通用接口/统一收单交易查询接口代码示例.md) |
32
+ | 统一收单交易退款接口 | [示例](./code-examples/java/1-通用接口/统一收单交易退款接口代码示例.md) | [示例](./code-examples/python/1-通用接口/统一收单交易退款接口代码示例.md) | [示例](./code-examples/nodejs/1-通用接口/统一收单交易退款接口代码示例.md) | [示例](./code-examples/php/1-通用接口/统一收单交易退款接口代码示例.md) | [示例](./code-examples/csharp/1-通用接口/统一收单交易退款接口代码示例.md) |
33
+ | 统一收单交易退款查询接口 | [示例](./code-examples/java/1-通用接口/统一收单交易退款查询接口代码示例.md) | [示例](./code-examples/python/1-通用接口/统一收单交易退款查询接口代码示例.md) | [示例](./code-examples/nodejs/1-通用接口/统一收单交易退款查询接口代码示例.md) | [示例](./code-examples/php/1-通用接口/统一收单交易退款查询接口代码示例.md) | [示例](./code-examples/csharp/1-通用接口/统一收单交易退款查询接口代码示例.md) |
34
+ | 统一收单交易关闭接口 | [示例](./code-examples/java/1-通用接口/统一收单交易关闭接口代码示例.md) | [示例](./code-examples/python/1-通用接口/统一收单交易关闭接口代码示例.md) | [示例](./code-examples/nodejs/1-通用接口/统一收单交易关闭接口代码示例.md) | [示例](./code-examples/php/1-通用接口/统一收单交易关闭接口代码示例.md) | [示例](./code-examples/csharp/1-通用接口/统一收单交易关闭接口代码示例.md) |
35
+
36
+ ---
37
+
38
+ ## 二、产品专用接口
39
+
40
+ 本 Skill 支持的三种产品的专用接口说明。代码示例存放于各语言目录的对应产品子目录下。
41
+
42
+ ### 按量付费 API
43
+
44
+ > ⚠️ 按量付费使用专属的 A2M(Agent to Machine Payment)接口,不使用统一收单接口。
45
+
46
+ | 接口名称 | 文档链接 | 说明 |
47
+ | --- | --- | --- |
48
+ | 支付凭证验证 `alipay.aipay.agent.payment.verify` | [文档](https://ideservice.alipay.com/cms/site/0jaqax) | 验证 AI 智能体支付凭证 |
49
+ | 商家履约回执确认 `alipay.aipay.agent.fulfillment.confirm` | [文档](https://ideservice.alipay.com/cms/site/0jaqax) | 确认商家已完成服务交付 |
50
+
51
+ > **说明**:以上两个接口的在线文档同属按量付费聚合文档(0jaqax),并非两个独立文档,查阅时请在同一文档内定位对应接口。
52
+
53
+ **按量付费代码示例**(A2M 接口,位于各语言 `4-按量付费/` 子目录):
54
+
55
+ | 语言 | 代码示例 |
56
+ | --- | --- |
57
+ | Java | [示例](./code-examples/java/4-按量付费/A2MPaymentDemoController.java) |
58
+ | Python | [示例](./code-examples/python/4-按量付费/A2MPaymentDemo.py) |
59
+ | Node.js | [示例](./code-examples/nodejs/4-按量付费/A2MPaymentDemo.js) |
60
+ | PHP | [示例](./code-examples/php/4-按量付费/A2MPaymentDemo.php) |
61
+ | C# | [示例](./code-examples/csharp/4-按量付费/A2MPaymentDemo.cs) |
62
+
63
+ ### 网站支付 API
64
+
65
+ | 接口名称 | 文档链接 | Java | Python | Node.js | PHP | C# |
66
+ | --- | --- | --- | --- | --- | --- | --- |
67
+ | 统一收单下单并支付页面接口 | [文档](https://ideservice.alipay.com/cms/site/0iztfv) | [示例](./code-examples/java/2-网站支付/统一收单下单并支付页面接口代码示例.md) | [示例](./code-examples/python/2-网站支付/统一收单下单并支付页面接口代码示例.md) | [示例](./code-examples/nodejs/2-网站支付/统一收单下单并支付页面接口代码示例.md) | [示例](./code-examples/php/2-网站支付/统一收单下单并支付页面接口代码示例.md) | [示例](./code-examples/csharp/2-网站支付/统一收单下单并支付页面接口代码示例.md) |
68
+
69
+ > **说明**:网站支付使用统一收单下单并支付页面接口 `alipay.trade.page.pay`,适用于电脑网页与手机网页场景。
70
+
71
+ ### APP支付 API
72
+
73
+ | 接口名称 | 文档链接 | Java | Python | Node.js | PHP | C# |
74
+ | --- | --- | --- | --- | --- | --- | --- |
75
+ | APP支付接口 | [文档](https://ideservice.alipay.com/cms/site/0izsn4) | [示例](./code-examples/java/3-APP支付/APP支付接口代码示例.md) | [示例](./code-examples/python/3-APP支付/APP支付接口代码示例.md) | [示例](./code-examples/nodejs/3-APP支付/APP支付接口代码示例.md) | [示例](./code-examples/php/3-APP支付/APP支付接口代码示例.md) | [示例](./code-examples/csharp/3-APP支付/APP支付接口代码示例.md) |
76
+
77
+ ---
78
+
79
+ ## 三、代码示例使用说明
80
+
81
+ ### 按量付费
82
+ - 使用 `4-按量付费/` 目录下的代码示例
83
+ - 按量付费**不需要**参考通用接口
84
+ - 示例中的 `sellerId`、`serviceId`、`appId`、`alipayPublicKey` 只能作为占位说明。正式集成时必须替换为签约入驻产物:`sellerId` 来自商户 PID/2088,`serviceId` 来自服务市场注册或复用结果,`appId/alipayPublicKey` 来自应用发布或复用结果。
85
+ - 生成按量付费代码时必须补齐订单持久化、本地订单匹配、资源防串、幂等履约和履约确认失败可重试逻辑;不要把示例中的内存/占位实现当作生产实现。
86
+
87
+ ### 网站支付 / APP支付
88
+ - 必须同时参考:
89
+ 1. 对应产品的专用接口(如 `2-网站支付/` 或 `3-APP支付/`)
90
+ 2. 通用接口 `1-通用接口/`(交易查询、退款、退款查询、关闭交易等)
@@ -0,0 +1,90 @@
1
+ # 产品决策
2
+
3
+ 用于用户集成支付宝支付产品时的产品决策。**本 Skill 仅支持按量付费、网站支付、APP支付三种产品**。
4
+
5
+ ---
6
+
7
+ ## 支持的产品
8
+
9
+ > 术语说明:本 Skill 中“网站支付”是唯一的网页支付产品概念,覆盖电脑网页和手机浏览器网页/H5 场景;“电脑网站支付”“PC网站支付”“手机网站支付”“H5支付”均路由到网站支付。集成侧网站支付底层接口固定使用 `alipay.trade.page.pay`,即使是手机浏览器/H5 场景,也不得改用或推荐其他网页支付接口。
10
+
11
+ | 产品 | 定义 | 适用场景 |
12
+ |------|------|----------|
13
+ | **按量付费** | 面向 AI 智能体的机器支付收款产品 | API、数字内容、算力资源、智能体按调用付费、402 协议收款 |
14
+ | **网站支付** | 用户在电脑网页或手机网页发起支付 | PC 官网、电商网站、在线教育、政务缴费网站、手机 H5 页面 |
15
+ | **APP支付** | 原生 App 内调起支付宝支付 | iOS/Android/鸿蒙原生 App 内支付 |
16
+
17
+ ---
18
+
19
+ ## 产品决策树
20
+
21
+ ```
22
+ 用户咨询支付宝接入
23
+ |
24
+ +-- 面向 AI 智能体收款?402 协议?
25
+ | +-- 按量付费
26
+ |
27
+ +-- 线上网页支付?
28
+ | +-- 电脑浏览器网页 --> 网站支付
29
+ | +-- 手机浏览器 H5 --> 网站支付
30
+ |
31
+ +-- 原生 APP支付?
32
+ +-- iOS/Android/鸿蒙 --> APP支付
33
+ ```
34
+
35
+ ---
36
+
37
+ ## 场景关键词匹配
38
+
39
+ 根据用户输入的关键词快速路由到对应产品:
40
+
41
+ | 关键词 | 路由产品 |
42
+ | --- | --- |
43
+ | 402协议、Agent收款、A2A、ACT协议、A2M、AI支付、Agent支付、智能体、API收费、按调用付费、机器支付 | **按量付费** |
44
+ | PC支付、电脑网站、网页支付、电脑端支付、PC网页、电脑浏览器、网站支付、传统网页支付、网页收银台、H5支付、手机网页 | **网站支付** |
45
+ | APP支付、移动应用支付、iOS支付、Android支付、鸿蒙支付、App内支付、原生APP支付、手机APP支付、移动端App、SDK支付、客户端支付 | **APP支付** |
46
+
47
+ ---
48
+
49
+ ## ❌ 不支持的产品
50
+
51
+ > ⚠️ 以下产品**不在本 Skill 支持范围内**。拒绝引导话术见 `../../normal/rejection-guide.md`
52
+
53
+ | 不支持的产品 | 处理方式 |
54
+ |-------------|----------|
55
+ | 当面付 | 使用 rejection-guide.md 中的标准引导 |
56
+ | 订单码支付 | 使用 rejection-guide.md 中的标准引导 |
57
+ | JSAPI支付 | 使用 rejection-guide.md 中的标准引导 |
58
+ | 预授权支付 | 使用 rejection-guide.md 中的标准引导 |
59
+ | 商家扣款 | 使用 rejection-guide.md 中的标准引导 |
60
+
61
+ ---
62
+
63
+ ## 澄清话术
64
+
65
+ 当用户描述模糊或关键词匹配不明确时,使用以下模板进行产品决策:
66
+
67
+ ### 标准澄清模板
68
+
69
+ ```
70
+ 请确认您的业务场景:
71
+
72
+ 1. 按量付费
73
+ - 面向 AI 智能体的机器支付,基于 402 protocol 实现
74
+ - 适用:API、数字内容、算力资源、智能体按调用付费
75
+
76
+ 2. 网站支付
77
+ - 用户在电脑网页或手机 H5 页面发起支付,跳转支付宝完成付款
78
+ - 适用:PC 官网、手机 H5 页面、电商网站、在线教育、政务缴费网站
79
+ - 底层接口:`alipay.trade.page.pay`
80
+
81
+ 3. APP支付
82
+ - 原生 iOS/Android/鸿蒙 App 内调起支付宝付款
83
+ - 适用:移动端原生应用内支付
84
+
85
+ 请描述您的具体业务需求?
86
+ ```
87
+
88
+ ### 不支持场景回复模板
89
+
90
+ > 使用标准拒绝引导话术,详见 `../../normal/rejection-guide.md`