feat(forum): P1 topic coupons, P2 plate follow gateway, cash creator revenue

- Topic_Pay: soft/hard coupon validate, payable amount, free-after-discount, paid burn
- Creator_Revenue: settle content/topic/plate_follow cash (type=order), keep shop path
- Plate VIP1/VIP2 meta + resolve_plate_follow_pay_price via aksrt_get_user_vip_level
- New AKSRT_Plate_Follow_Pay REST multi-gateway; remove Credits×100 money bypass
- Frontend: cms-download plate_follow apiKind + forum-governance money cashier bridge
This commit is contained in:
kate522 committed 2026-07-15 13:04:04 +08:00
1 parent 1a15ae7cea
commit 78d3189f8f
14 files changed
+1189 -169

No files matched your search

+27 -5
View File
@@ -690,10 +690,27 @@
}
function purchasePlateFollow(plateId, button, payHint) {
payHint = payHint || {};
var modo = String(payHint.modo || 'money');
// Cash: multi-gateway cashier (no Credits×100 bypass).
if (modo === 'money' && !payHint.is_free) {
button.disabled = false;
if (typeof window.aksrtOpenCashier === 'function') {
window.aksrtOpenCashier(plateId, button, '', '', 'plate_follow');
return;
}
var msgCashier = '收银台未加载,请刷新页面后重试';
if (typeof window.aksrtToast === 'function') { window.aksrtToast(msgCashier, 'error'); }
else { window.alert(msgCashier); }
return;
}
// Points / VIP free: keep AJAX purchase path.
var confirmMsg = '确认付费关注该版块?';
if (payHint && payHint.is_free) {
if (payHint.is_free) {
confirmMsg = '确认使用 VIP 免费关注该版块?';
} else if (payHint) {
} else {
confirmMsg = '确认支付 ' + formatFollowPayLabel(payHint) + ' 关注该版块?';
}
if (!window.confirm(confirmMsg)) {
@@ -712,14 +729,19 @@
credentials: 'same-origin',
}).then(function (r) { return r.json(); }).then(function (payload) {
if (!payload.success) {
throw new Error((payload.data && payload.data.message) || '支付失败');
var errData = payload.data || {};
// Server may redirect money path to cashier.
if (errData.require_cashier && typeof window.aksrtOpenCashier === 'function') {
button.disabled = false;
window.aksrtOpenCashier(plateId, button, '', '', 'plate_follow');
return;
}
throw new Error(errData.message || '支付失败');
}
var res = payload.data || {};
button.setAttribute('data-followed', '1');
button.classList.add('is-followed');
var label = button.querySelector('span') || button;
if (button.querySelector('i') && button.childNodes.length) {
// keep icon, replace trailing text via last text-ish content
button.innerHTML = '<i class="fas fa-heart"></i> 已关注';
} else {
button.textContent = '已关注';