{{terminalErrorHeading}}

An error has occurred

{{terminalError}}

Step 3 of 3
Step 2 of 2
Payment Information
Plan Information
{{selectedTerm.name.split('|')[0]}}
You are about to be charged {{selectedTerm.billingPlanTable[0].tax ? selectedTerm.billingPlanTable[0].priceChargedStr: selectedTerm.billingPlanTable[0].price}}.
You are about to get this trial.
You are about to sign up for this promo offer.
Starting
Duration
1 month {{selectedTerm.billingPlanTable[0].duration}}
Price
{{selectedTerm.billingPlanTable[0].price}}
Tax
{{selectedTerm.billingPlanTable[0].price}}
{{selectedTerm.billingPlanTable[0].tax}}
Billing
FREE {{selectedTerm.billingPlanTable[0].totalBilling}}
You will be billed {{custom.renewTerm ? custom.renewTerm.originalPrice : custom.checkoutTerm.originalPrice}} plus tax (if applicable) starting on {{custom.renewTerm ? custom.renewTerm.nextPaymentDate : custom.checkoutTerm.nextPaymentDate}}
You will be billed {{custom.renewTerm ? custom.renewTerm.originalPrice : custom.checkoutTerm.originalPrice}} starting on {{custom.renewTerm ? custom.renewTerm.nextPaymentDate : custom.checkoutTerm.nextPaymentDate}}
The 1st month of this monthly digital subscription is free. Your billing cycle will begin 1-month from today. All fees will be charged to your credit card, unless you cancel 48 hours prior to the billing cycle.
Contact support@scmp.com to cancel your subscription.
A valid credit card is required to activate any digital subscription. A test transaction of US$1 / HK$8 will be charged and immediately refunded to your credit card to activate this free trial.
You are about to redeem a complimentary 1-year digital subscription. Your next billing cycle will begin 1 year from today, and all fees will be charged to your credit card, unless you cancel 48 hours prior to the renewal date.
A valid credit card is required to activate any digital subscription. A test transaction of US$1 / HK$8 will be charged and immediately refunded to your credit card to activate this subscription.
{{selectedTerm.name.split('|')[0]}}(Renewal)
You are about to be charged
You are purchasing
Starting
On the expiration date of your current plan
Price
Tax
Billing
{{custom.renewTerm.nextPaymentText}}
Your subscription includes a FREE copy of Add Ink: Cartoon Chronicles of Life in Hong Kong by Harry Harrison. Book will be delivered within 4-6 weeks.
var observeDOM = (function(){ var MutationObserver = window.MutationObserver || window.WebKitMutationObserver; return function( obj, callback ){ if( !obj || obj.nodeType !== 1 ) return; if( MutationObserver ){ // define a new observer var mutationObserver = new MutationObserver(callback) // have the observer observe foo for changes in children mutationObserver.observe( obj, { childList:true, subtree:true, attributes: true }) return mutationObserver } // browser support fallback else if( window.addEventListener ){ obj.addEventListener('DOMNodeInserted', callback, false) obj.addEventListener('DOMNodeRemoved', callback, false) } } })() const isRenewTermReady = function (renewTerm) { return renewTerm !== '{{custom.renewTerm}}' }; const isRenewFlow = function (ele) { const renewTerm = ele.getAttribute('data-renew-term'); if(!isRenewTermReady(renewTerm)) { return null; } return !!renewTerm; } const getRenewTerm = function (ele) { const renewTerm = JSON.parse(ele.getAttribute('data-renew-term')); return renewTerm; } const getSelectedTerm = function (ele) { const selectedTerm = JSON.parse(ele.getAttribute('data-selected-term')); return selectedTerm; } const getInputJson = function (ele) { const inputJson = JSON.parse(ele.getAttribute('data-input')); return inputJson; } const getHasTax = function () { const ele = document.querySelector('#checkout--renew-term'); const value = ele.getAttribute('data-has-tax'); return value === 'true'; } const hideRevertButton = function () { const ele = document.querySelector('.previous-button-wrapper'); ele.setAttribute('style', 'display:none;'); } const fillRenewSubTitle = function ({ plusTaxAmount }) { const ele = document.querySelector('#renew--total-plus-tax'); ele.innerHTML = plusTaxAmount; } const fillPurchasing = function ({ planPeriodText }) { const ele = document.querySelector('#renew--purchasing'); ele.innerHTML = `${planPeriodText} renewal`; } const fillPrice = function ({ price, hasTax }) { if (hasTax) { const ele = document.querySelector('#renew--price'); ele.innerHTML = price; } } const fillTax = function ({tax, hasTax}) { if (hasTax) { const ele = document.querySelector('#renew--tax'); ele.innerHTML = tax; } } const fillTotalBilling = function ({ totalBilling }) { const ele = document.querySelector('#renew--totalbilling'); ele.innerHTML = totalBilling; } const getPlusTaxAmount = function ({ billingPlan, hasTax }) { return hasTax ? billingPlan.priceChargedStr : billingPlan.price; } /** This part is hardcoded special for renewal cancel flow **/ const getTotalBillingForSpecialRenewal = function ({billingPeriod, price, totalBilling}) { if(!totalBilling.includes('3 payments of') || billingPeriod !== '1 month') { return totalBilling } return `${price}/month for 3 months` } const updateRenewData = function () { const ele = document.querySelector('#checkout--renew-term'); const renewTerm = getRenewTerm(ele); const selectedTerm = getSelectedTerm(ele); const inputJson = getInputJson(ele); const hasTax = getHasTax(); const isPromo = !!inputJson.promoCodeId; const currency = selectedTerm.chargeCurrency ?? ''; const billingPlan = isPromo ? selectedTerm.billingPlanTable[selectedTerm.billingPlanTable.length - 2] : selectedTerm.billingPlanTable[selectedTerm.billingPlanTable.length - 1]; const plusTaxAmount = getPlusTaxAmount({ billingPlan, hasTax }); const planPeriodText = billingPlan.billingPeriod.replace('1 month', '1-month').replace('1 year', '1-year'); const price = billingPlan.price; const tax = hasTax ? billingPlan.tax : 0; const totalBilling = getTotalBillingForSpecialRenewal({billingPeriod:billingPlan.billingPeriod, price: plusTaxAmount, totalBilling: billingPlan.totalBilling}); fillRenewSubTitle({ plusTaxAmount }); fillPurchasing({ planPeriodText }); fillPrice({ price, hasTax }); fillTax({tax, hasTax}); fillTotalBilling({ totalBilling }); } // hide revert button for renew flow const repeatCheckRenew = setInterval(function () { const ele = document.querySelector('#checkout--renew-term'); const isRenew = isRenewFlow(ele); if (isRenew === null) { return false; } if(isRenew) { const renewTerm = getRenewTerm(ele); const selectedTerm = getSelectedTerm(ele); hideRevertButton(); updateRenewData(); observeDOM(ele, updateRenewData); } clearInterval(repeatCheckRenew); return true; }, 500);
/* */