MediaWiki:CommonPayPal.js
Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.
- Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
- Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
- Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5.
/* MediaWiki:CommonPayPal.js */
(function () {
'use strict';
// === CONFIG ===
// Client ID PUBLIC (ok metterlo qui)
var PAYPAL_CLIENT_ID = 'Abm0N3btfDpPMXhhmfWJYVdOhNbfRBiCBp5x5FUEWUdvXUI6yKAtuEjodfPjQfvxNl0Ax0e3ukzzNBXT';
// Carica PayPal SDK UNA SOLA VOLTA
var sdkPromise = null;
function loadPayPalSdk() {
if (sdkPromise) return sdkPromise;
sdkPromise = new Promise(function (resolve, reject) {
// Se già presente, fine
if (window.paypal && window.paypal.Buttons) {
resolve();
return;
}
// Evita doppioni
var existing = document.querySelector('script[data-mp-paypal-sdk="1"]');
if (existing) {
existing.addEventListener('load', function () { resolve(); });
existing.addEventListener('error', function () { reject(new Error('PayPal SDK load error')); });
return;
}
var s = document.createElement('script');
s.setAttribute('data-mp-paypal-sdk', '1');
s.src =
'https://www.paypal.com/sdk/js' +
'?client-id=' + encodeURIComponent(PAYPAL_CLIENT_ID) +
'&vault=true&intent=subscription';
s.async = true;
s.onload = function () { resolve(); };
s.onerror = function () { reject(new Error('PayPal SDK load error')); };
document.head.appendChild(s);
});
return sdkPromise;
}
// API pubblica: renderPayPalSubscription(selector, planId)
window.renderPayPalSubscription = function (selector, planId, options) {
options = options || {};
var el = document.querySelector(selector);
if (!el) return;
// Evita doppio render sullo stesso contenitore
if (el.getAttribute('data-paypal-rendered') === '1') return;
el.setAttribute('data-paypal-rendered', '1');
// Stile default (puoi cambiare dopo)
var style = options.style || {
shape: 'pill',
color: 'gold',
layout: 'vertical',
label: 'subscribe'
};
loadPayPalSdk()
.then(function () {
if (!window.paypal || !window.paypal.Buttons) {
throw new Error('PayPal Buttons not available');
}
window.paypal.Buttons({
style: style,
createSubscription: function (data, actions) {
return actions.subscription.create({
plan_id: planId
});
},
onApprove: function (data) {
// Niente alert (più pulito): messaggio sotto al bottone
var msg = document.createElement('div');
msg.style.marginTop = '8px';
msg.style.fontSize = '12px';
msg.style.textAlign = 'center';
msg.textContent = 'Subscription activated. Thank you!';
el.appendChild(msg);
// Se vuoi in futuro: invio a pagina "grazie" o log server.
// window.location.href = '/wiki/Thank_you';
},
onError: function (err) {
console.error('PayPal error:', err);
el.innerHTML = '<div style="font-size:12px;text-align:center;color:#b00020;">PayPal button error. Check console.</div>';
}
}).render(selector);
})
.catch(function (e) {
console.error('PayPal SDK error:', e);
el.innerHTML = '<div style="font-size:12px;text-align:center;color:#b00020;">PayPal SDK failed to load.</div>';
});
};
// Auto-render: se trovi div con data-paypal-plan, lo renderizzi senza script inline
function autoRenderAll() {
var nodes = document.querySelectorAll('[data-paypal-plan]');
nodes.forEach(function (node) {
var plan = node.getAttribute('data-paypal-plan');
if (!plan) return;
// Se non ha id, glielo diamo
if (!node.id) {
node.id = 'paypal_' + Math.random().toString(36).slice(2);
}
window.renderPayPalSubscription('#' + node.id, plan);
});
}
// Quando la pagina è pronta
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', autoRenderAll);
} else {
autoRenderAll();
}
})();