用户创建或编辑企划(Project / Open Call)时,必须声明可使用的支付渠道。画师应征时,系统根据企划支付渠道、画师已绑定且生效的收款账户及应征币种进行匹配。
支持的支付渠道:
paypalstripealipay本次只修改后端接口和数据兼容逻辑。公开企划列表不会过滤支付方式不匹配的企划,而是返回匹配结果供前端展示或置灰。
| 画师收款账户 | 账户状态 | 可匹配企划渠道 | 可用应征币种 |
|---|---|---|---|
| Stripe | successed | stripe | Stripe 收款账户的 currency_id |
| AliPay | successed | paypal、stripe、alipay | AliPay 收款账户的 currency_id,当前为 CNY |
| 任意账户 | pending / failed / unbound | 不参与匹配 | 无 |
画师只要存在一个同时满足以下条件的账户,即可使用该账户币种应征:
successed。payment_channels 至少有一个交集。currency_id 等于该收款账户的 currency_id。payment_channels 与payment_match 的区别| 字段 | 含义 | 数据来源 | 是否持久化及快照 | 是否因访问者变化 |
|---|---|---|---|---|
payment_channels | 企划创建者声明该企划允许使用的支付渠道 | 创建、更新企划时提交 | 是 | 否 |
payment_match | 当前访问画师的有效收款账户能否匹配该企划 | 后端根据访问画师的收款账户实时计算 | 否 | 是 |
payment_match 的结构如下:
matched:当前画师是否至少存在一个兼容的收款币种。currency_ids:当前画师可用于应征该企划的收款币种 id,不是支付渠道名称。payment_match 返回 null。payment_match 只用于前端提示或置灰,不影响企划列表的返回、总数和排序。例如,企划允许 PayPal 和 AliPay,而当前画师只有 Stripe 收款账户时:
因此可以将两个字段理解为:
payment_match 由 POST /api/content/projects/list 和 GET /api/content/projects/info 返回。
Service 不新增数据库字段,接口根据 Service 币种动态返回 payment_channels:
| Service 币种 | payment_channels |
|---|---|
| CNY | ["paypal", "stripe", "alipay"] |
| 非 CNY | ["stripe"] |
前端可以使用 Service 返回的 payment_channels 完全替代原有的币种到支付渠道计算逻辑:
payment_channels 是后端根据当前业务规则生成的权威展示结果。Service 列表、详情及创建成功后的支付方式图标或标签,都应直接遍历该字段。currency.code 自行推导支付渠道,避免后端规则调整后出现展示不一致。payment_channels 表示该服务对外支持的支付方式,不针对当前访问者计算,因此 Service 不提供 Project 场景中的 payment_match。以下接口直接返回 Service 的 payment_channels:
POST /api/content/service/listGET /api/content/service/infoGET /api/artist_center/services/listGET /api/artist_center/services/infoPOST /api/artist_center/services/createPOST /api/artist_center/services/update 当前仅返回 {"ok": true}。如果更新了 Service 币种,前端应在更新成功后重新请求 /api/artist_center/services/info 获取最新的 payment_channels,不要在本地临时计算。
payment_channels 保存到 busable_snap。pay_channel 不在快照中时,返回 400 和错误码 21008。POST /api/content/projects/list
payment_channels 和当前画师的 payment_match;不按匹配结果过滤列表。GET /api/content/projects/info
payment_channels 和当前画师的 payment_match。POST /api/content/service/list
payment_channels。GET /api/content/service/info
payment_channels。POST /api/projects/list
payment_channels。POST /api/projects/create
payment_channels。POST /api/projects/update
payment_channels,传入时至少包含一个合法渠道。GET /api/projects/info
payment_channels。GET /api/projects/meta
payment_channels 枚举。POST /api/project_requests/requested_list
payment_compatible,不按兼容性过滤。POST /api/project_requests/choosed_list
payment_compatible,不按兼容性过滤。POST /api/project_requests/choose
POST /api/user/pay/work_task/pre_calc
pay_channel 必须包含在 busable_snap.payment_channels 中。POST /api/user/pay/work_task/create_checkout_session
pay_channel 必须包含在 busable_snap.payment_channels 中。POST /api/stripe/pre_calc
/api/user/pay/work_task/pre_calc 使用相同的 Project 渠道校验。POST /api/stripe/create_work_task_checkout_session
/api/user/pay/work_task/create_checkout_session 使用相同的 Project 渠道校验。POST /api/work_tasks/list
busable_snap 返回快照字段 payment_channels。GET /api/work_tasks/info
busable_snap 返回快照字段 payment_channels。POST /api/withdraw_accounts/unbind
POST /api/artist_center/project_request/create
POST /api/artist_center/project_request/update
POST /api/artist_center/project_request/list
payment_channels。POST /api/artist_center/project_request/list_by_chosen
payment_channels。GET /api/artist_center/services/list
payment_channels。GET /api/artist_center/services/info
payment_channels。POST /api/artist_center/services/create
payment_channels。POST /api/artist_center/work_tasks/list
busable_snap 返回快照字段 payment_channels。GET /api/artist_center/work_tasks/info
busable_snap 返回快照字段 payment_channels。POST /api/content/projects/listpayment_channels 和 payment_match。不匹配的企划仍保留在列表中,列表总数和排序不受支付匹配影响。| 字段 | 类型 | 说明 |
|---|---|---|
data[].payment_channels | string[] | 企划允许的支付渠道 |
data[].payment_match | object|null | 当前登录用户为有效画师时返回匹配结果,否则为 null |
data[].payment_match.matched | boolean | 是否至少存在一个可用应征币种 |
data[].payment_match.currency_ids | number[] | 当前画师可用于该企划的收款币种 id |
无新增,沿用原有错误语义。
GET /api/content/projects/infopayment_channels 和 payment_match,字段语义与公开列表一致。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | 企划 id |
未登录或当前用户不是有效画师时:
无新增,沿用原有 404 Project not found 等错误语义。
POST /api/content/service/listpayment_channels。沿用原接口,本次无新增请求参数。
无新增,沿用原有错误语义。
GET /api/content/service/infopayment_channels。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
service_id | number | 是 | Service id |
无新增,沿用原有 404 Service Not Found 等错误语义。
POST /api/projects/listpayment_channels: string[]。沿用原接口,本次无新增请求参数。
无新增,沿用原有错误语义。
POST /api/projects/createpayment_channels。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
payment_channels | string[] | 是 | 企划允许的支付渠道,至少一项 |
paypal、stripe、alipay。422:未传、传入空数组、包含重复值或非法渠道。
POST /api/projects/updatepayment_channels。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
payment_channels | string[] | 否 | 传入时覆盖原支付渠道;至少一项 |
更新接口仍支持局部更新。未传 payment_channels 时保留原值;传入时使用与创建接口相同的枚举、非空和去重校验。
422:传入空数组、重复值或非法渠道。
GET /api/projects/infopayment_channels: string[]。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | 企划 id |
无新增,沿用原有错误语义。
GET /api/projects/metapayment_channels 枚举。无。
无新增。
POST /api/project_requests/requested_listpayment_compatible。不兼容应征仍返回。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
project_id | number | 是 | 企划 id |
page | number | 否 | 页码 |
size | number | 否 | 每页数量 |
payment_compatible 根据当前企划渠道、画师当前有效收款账户和该应征的 currency_id 实时计算。
无新增,沿用原有错误语义。
POST /api/project_requests/choosed_listpayment_compatible。字段语义与 requested_list 相同。无新增,沿用原有错误语义。
POST /api/project_requests/choose沿用原接口,本次无新增请求字段。
400:画师当前有效收款账户、应征币种和企划渠道不兼容。
校验通过后,新建 WorkTask 的 busable_snap.payment_channels 保存选择当时的企划渠道。
POST /api/user/pay/work_task/pre_calcwork_task_id 对应 Project WorkTask 时,校验 pay_channel 是否在 busable_snap.payment_channels 中。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
work_task_id | number | 是 | WorkTask id |
type | string | 是 | stage_pay、full_pay 或 price_change |
pay_channel | string | 是 | stripe、alipay 或 paypal |
400:所选渠道不在 Project WorkTask 快照中。
POST /api/user/pay/work_task/create_checkout_session400:所选渠道不在 Project WorkTask 快照中,返回错误码 21008。
POST /api/stripe/pre_calcPOST /api/user/pay/work_task/pre_calc 一致。同 POST /api/user/pay/work_task/pre_calc。
Project WorkTask 渠道不匹配时返回 400 和错误码 21008。
POST /api/stripe/create_work_task_checkout_sessionPOST /api/user/pay/work_task/create_checkout_session 一致。同 POST /api/user/pay/work_task/create_checkout_session。
Project WorkTask 渠道不匹配时返回 400 和错误码 21008。
POST /api/work_tasks/listbusable_snap 新增 payment_channels。无新增,沿用原有错误语义。
GET /api/work_tasks/infobusable_snap.payment_channels 与列表接口一致。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | WorkTask id |
无新增,沿用原有错误语义。
POST /api/withdraw_accounts/unbindpending、wait_pay 或 working 的 Project WorkTask,则禁止解绑。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | 收款账户 id |
400:存在使用该币种的活跃 Project WorkTask。
POST /api/artist_center/project_request/createcurrency_id、画师有效收款账户和企划 payment_channels 强制校验兼容性。沿用原接口;本次重点校验已有字段 project_id 和 currency_id。
400:没有兼容的有效收款账户。
POST /api/artist_center/project_request/updatecurrency_id;未传 currency_id 时使用应征原币种校验。沿用原接口,本次无新增字段。
400:当前收款账户不再兼容企划渠道,返回错误码 21008。
POST /api/artist_center/project_request/listdata[].project.payment_channels 返回关联企划允许的支付渠道。无新增。
POST /api/artist_center/project_request/list_by_chosendata[].project.payment_channels 与普通应征列表一致。沿用原接口,本次无新增参数。
无新增。
GET /api/artist_center/services/listpayment_channels。无新增。
GET /api/artist_center/services/infopayment_channels。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | Service id |
无新增。
POST /api/artist_center/services/createpayment_channels。沿用原接口,本次无新增请求字段。
无新增,沿用原有错误语义。
POST /api/artist_center/work_tasks/listbusable_snap 新增 payment_channels。无新增。
GET /api/artist_center/work_tasks/infobusable_snap.payment_channels 与列表接口一致。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | WorkTask id |
无新增。
projects.payment_channels 最终为非空 JSON 字段。null 时按三种渠道全部支持解释。[] 不属于历史缺失,不会回退为全渠道;应征和支付校验均不通过。迁移同时处理:
project_snaps.data.payment_channelswork_tasks.busable_snap.payment_channels,仅限 busable_type = project历史快照缺失该字段时写入三种渠道。运行时读取旧快照时也使用相同回退逻辑。
新建 Project WorkTask 后,即使用户随后修改企划支付渠道,该 WorkTask 仍使用创建时快照,保证历史可追溯。
payment_match 或 payment_compatible 决定提示或置灰方式。