你好,
我想我可能找到了这个问题(或者至少是一个密切相关的 Patreon API v2 同步问题)的原因。
我运行着一个使用 Patreon 集成(API v2)的 Discourse 实例。现有的 Patreon 用户仍然被正确分配到 patrons 组,但一位新的付费成员没有被添加到该组中,即使我手动运行了 Update Patreon Data 也是如此。同步成功完成,并且 Patreon 中的电子邮件地址与用户的 Discourse 电子邮件地址完全匹配。
在启用 patreon_verbose_log 后,同步报告如下:
Patreon sync: found 4 rewards/tiers across 1 campaigns
Patreon sync complete: 1968 pledges, 0 users synced
随后,我检查了 ApiVersion::V2 使用的 API 响应。
对于前 1,000 名成员的第一页:
Members in data: 1000
Included total: 1004
Included users: 1000
Keys for first included user: ["full_name"]
Included users with email: 0
然而,member 对象本身却包含了电子邮件地址:
Members: 1000
Keys for first member:
["currently_entitled_amount_cents", "email", "full_name",
"last_charge_date", "last_charge_status", "patron_status"]
Members with email: 928
查看 plugins/discourse-patreon/lib/api_version/v2.rb,MEMBER_FIELDS 明确请求了 email,但 V2.extract 仅从 included 中的相关 user 对象填充 users 哈希:
(member_data["included"] || []).each do |entry|
if entry["type"] == "user" && entry["attributes"]["email"].present?
users[entry["id"]] = entry["attributes"]["email"].downcase
end
end
它似乎没有使用 member 对象中的 entry["attributes"]["email"],尽管在我的 API 响应中,Patreon 正是在那里返回电子邮件地址的。
这似乎解释了为什么同步能够成功获取所有 1,968 个订阅(pledges),却报告 0 users synced。
这也解释了为什么现有的 Patreon/Discourse 关联可以继续正常工作,而新成员却无法通过电子邮件进行匹配:现有用户可能已经在 user_custom_fields 中存储了他们的 patreon_id,而新成员则需要建立 Patreon ID 与电子邮件之间的关联。
V2.extract 在处理每个成员时直接填充 users 是否合理?例如:
patron_id = entry["relationships"]["user"]["data"]["id"]
attrs = entry["attributes"]
if attrs["email"].present?
users[patron_id] = attrs["email"].downcase
end
同时保留当前的 included 处理作为回退方案?