{"id":697,"date":"2020-03-05T19:47:48","date_gmt":"2020-03-05T19:47:48","guid":{"rendered":"https:\/\/ikit.org\/kbi\/?page_id=697"},"modified":"2026-01-12T17:24:15","modified_gmt":"2026-01-12T17:24:15","slug":"membership-and-registration","status":"publish","type":"page","link":"https:\/\/ikit.org\/kbi\/index.php\/membership-and-registration\/","title":{"rendered":"KBI Membership"},"content":{"rendered":"\n<p>Become a member of Knowledge Building International. <br><em><a href=\"https:\/\/ikit.org\/kbi\/index.php\/membership\/\">KBI membership benefi<\/a><\/em>t<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-align-center\"><strong>Membership Fees<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td><strong>1 Year Membership<\/strong><br><em>(Jan 1 to Dec 31, 2026)<\/em><\/td><td><strong>2 Year Membership<\/strong><br><em>(Jan 1, 2026 to Dec 31, 2027)<\/em><\/td><\/tr><tr><td><strong>Regular Member<\/strong><\/td><td>$125 CAD<\/td><td>$230 CAD<\/td><\/tr><tr><td><strong>K-13 Teacher Member<\/strong><\/td><td>$100 CAD<\/td><td>$175 CAD<\/td><\/tr><tr><td><strong>Student Member<\/strong><\/td><td>$75 CAD<\/td><td>$120 CAD<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div class=\"wpapp_widget\"><div id=\"elements_wrapper_wpapp_paypal_button_0\"><div class=\"wpapp_payment_subject\"><span class=\"payment_subject\"><strong>KBSI Membership Fees<\/strong><\/span><\/div><select id=\"select_wpapp_paypal_button_0\" name=\"select_wpapp_paypal_button_0\" class=\"\"><option value=\"regular-member-1-year\">Regular Member ( 1 Year)<\/option><option value=\"regular-member-2-years\">Regular Member ( 2 Years)<\/option><option value=\"k-13-teacher-member-1-year\">K-13 Teacher Member ( 1 Year)<\/option><option value=\"k-13-teacher-member-2-years\">K-13 Teacher Member ( 2 Years)<\/option><option value=\"student-member-1-year\">Student Member ( 1 Year)<\/option><option value=\"student-member-2-years\">Student Member ( 2 Years)<\/option><\/select><div class=\"wpapp_other_amount_label\"><strong>Other Amount<\/strong><\/div><div class=\"wpapp_other_amount_input\"><input type=\"number\" min=\"1\" step=\"any\" name=\"wpapp_other_amt\" title=\"Other Amount\" value=\"\" placeholder=\"\" class=\"wpapp_other_amt_input\" style=\"max-width:80px;\" \/><\/div><div class=\"wpapp_ref_title_label\"><strong>Place your Name, Title &amp; Affiliating Institution here:<\/strong><\/div><div class=\"wpapp_ref_value\"><input type=\"text\" name=\"wpapp_button_reference\" maxlength=\"60\" value=\"\" placeholder=\"\" class=\"wp_pp_button_reference\" \/><\/div><div style=\"margin-bottom:10px;\"><\/div><\/div>    <div class=\"wpapp-ppcp-button-wrapper\">\n\n    <!-- PayPal button container where the button will be rendered -->\n    <div id=\"wpapp_paypal_button_0\" style=\"width: 250px;\"><\/div>\n\n    <script type=\"text\/javascript\">\n        document.addEventListener( \"wpapp_paypal_sdk_loaded\", function() { \n            \/\/Anything that goes here will only be executed after the PayPal SDK is loaded.\n            console.log('PayPal JS SDK is loaded for WPAPP.');\n\n            \/**\n             * See documentation: https:\/\/developer.paypal.com\/sdk\/js\/reference\/\n             *\/\n            paypal.Buttons({\n                \/**\n                 * Optional styling for buttons.\n                 * \n                 * See documentation: https:\/\/developer.paypal.com\/sdk\/js\/reference\/#link-style\n                 *\/\n                style: {\n                    color: 'blue',\n                    shape: 'rect',\n                    height: 35,\n                    label: 'paypal',\n                    layout: 'vertical',\n                },\n\n                \/\/ Triggers when the button first renders.\n                onInit: onInitHandler,\n\n                \/\/ Triggers when the button is clicked.\n                onClick: onClickHandler,\n\n                \/\/ Setup the transaction.\n                createOrder: createOrderHandler,\n\n                \/\/ Handle the onApprove event.\n                onApprove: onApproveHandler,\n\n                \/\/ Handle unrecoverable errors.\n                onError: onErrorHandler,\n\n                \/\/ Handles onCancel event.\n                onCancel: onCancelHandler,\n\n            })\n            .render('#wpapp_paypal_button_0')\n            .catch((err) => {\n                console.error('PayPal Buttons failed to render');\n            });\n\n            function onInitHandler(data, actions) {\n                \/\/This function is called when the button first renders.\n            }\n\n            function onClickHandler(data, actions) {\n                \/\/This function is called when the button is clicked.\n            }\n\n            \n            \/**\n             * See documentation: https:\/\/developer.paypal.com\/sdk\/js\/reference\/#link-createorder\n             *\/\n            async function createOrderHandler() {\n                \/\/ Create the order in PayPal using the PayPal API.\n                \/\/ https:\/\/developer.paypal.com\/docs\/checkout\/standard\/integrate\/\n                \/\/ The server-side Create Order API is used to generate the Order. Then the Order-ID is returned.                    \n                console.log('Setting up the AJAX request for create-order call.');\n\n                \/\/ First, select the interacted button's wrapper div by its ID (so  we can target various elements within it)\n                const wrapper_div_interacted_button = document.getElementById('elements_wrapper_wpapp_paypal_button_0');\n                \/\/console.log(wrapper_div_interacted_button);\n\n                \/\/ Read the select element and get the selected option's value and text.\n                js_on_page_embed_button_id = 'wpapp_paypal_button_0';\n                var selectId = 'select_' + js_on_page_embed_button_id; \/\/ Construct the select ID\n                var selectElement = document.getElementById(selectId);\n                \/\/console.log(\"Select Element: \", selectElement);\n\n                \/\/Get the other amount field value.\n                var other_amount_input = wrapper_div_interacted_button.querySelector('.wpapp_other_amt_input');\n\n                \/\/Get the reference field value.\n                var pp_reference_field = wrapper_div_interacted_button.querySelector('.wp_pp_button_reference');\n\n                let pp_bn_data = {};\n                pp_bn_data.transient_name = '69e0f4bdc3cad_wpapp_paypal_button_0';\n                pp_bn_data.on_page_button_id = 'wpapp_paypal_button_0';\n                pp_bn_data.selected_val = selectElement.value;\/\/value of the selected option. (we can use it get the item name from the transient).\n                pp_bn_data.other_amount_val = other_amount_input ? other_amount_input.value : '';\n                pp_bn_data.pp_reference_field = pp_reference_field ? pp_reference_field.value : '';\n                console.log('WPAPP Button Data Below');\n                console.log(pp_bn_data);\n\n                \/\/Ajax action: <prefix>_pp_create_order \n                let post_data = 'action=wpapp_pp_create_order&data=' + JSON.stringify(pp_bn_data) + '&_wpnonce=510a4ee60d';\n                \/\/console.log('Post Data: ', post_data);\/\/Debugging purposes only.\n\n                try {\n                    \/\/ Using fetch for AJAX request. This is supported in all modern browsers.\n                    const response = await fetch(\"https:\/\/ikit.org\/kbi\/wp-admin\/admin-ajax.php\", {\n                        method: \"post\",\n                        headers: {\n                            'Content-Type': 'application\/x-www-form-urlencoded'\n                        },\n                        body: post_data\n                    });\n\n                    const response_data = await response.json();\n\n                    if (response_data.order_id) {\n                        console.log('Create-order API call to PayPal completed successfully.');\n                        \/\/If we need to see the order details, uncomment the following line.\n                        \/\/const order_data = response_data.order_data;\n                        \/\/console.log('Order data: ' + JSON.stringify(order_data));\n                        return response_data.order_id;\n                    } else {\n                        const error_message = JSON.stringify(response_data);\n                        console.error('Error occurred during create-order call to PayPal. ' + error_message);\n                        throw new Error(error_message);\n                    }\n                } catch (error) {\n                    console.error(error);\n                    alert('Could not initiate PayPal Checkout...\\n\\n' + JSON.stringify(error));\n                }\n            }\n\n            async function onApproveHandler(data, actions) {\n                console.log('Successfully created a transaction.');\n\n                \/\/ Show the spinner while we process this transaction.\n                \/\/ First, select the button container by its ID.\n                const pp_button_container = document.getElementById('wpapp_paypal_button_0');\n                \/\/ Then, navigate to the parent element of the PPCP button container.\n                const parent_wrapper = pp_button_container.parentElement;\n                \/\/ Finally, within the parent wrapper, select the spinner container\n                const pp_button_spinner_container = parent_wrapper.querySelector('.wpapp-pp-button-spinner-container');\n                \/\/console.log('Button spinner container: ', pp_button_spinner_container);\n\n                pp_button_container.style.display = 'none'; \/\/Hide the buttons\n                pp_button_spinner_container.style.display = 'inline-block'; \/\/Show the spinner.\n\n                \/\/ Capture the order in PayPal using the PayPal API.\n                \/\/ https:\/\/developer.paypal.com\/docs\/checkout\/standard\/integrate\/\n                \/\/ The server-side capture-order API is used. Then the Capture-ID is returned.\n                console.log('Setting up the AJAX request for capture-order call.');\n                let pp_bn_data = {};\n                pp_bn_data.order_id = data.orderID;\n                pp_bn_data.on_page_button_id = 'wpapp_paypal_button_0';\n                pp_bn_data.transient_name = '69e0f4bdc3cad_wpapp_paypal_button_0';\n                \/\/pp_bn_data.custom_field = encodeURIComponent(custom_data);\/\/If you have any custom data to send to the server (it needs to be URI encoded so special characters are not lost.)\n\n                \/\/Ajax action: <prefix>_pp_capture_order\n                let post_data = 'action=wpapp_pp_capture_order&data=' + JSON.stringify(pp_bn_data) + '&_wpnonce=510a4ee60d';\n                try {\n                    const response = await fetch(\"https:\/\/ikit.org\/kbi\/wp-admin\/admin-ajax.php\", {\n                        method: \"post\",\n                        headers: {\n                            'Content-Type': 'application\/x-www-form-urlencoded'\n                        },\n                        body: post_data\n                    });\n\n                    const response_data = await response.json();\n                    const txn_data = response_data.txn_data;\n                    const error_detail = txn_data?.details?.[0];\n                    const error_msg = response_data.error_msg;\/\/Our custom error message.\n                    \/\/ Three cases to handle:\n                    \/\/ (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()\n                    \/\/ (2) Other non-recoverable errors -> Show a failure message\n                    \/\/ (3) Successful transaction -> Show confirmation or thank you message\n\n                    if (response_data.capture_id) {\n                        \/\/ Successful transaction -> Show confirmation or thank you message\n                        console.log('Capture-order API call to PayPal completed successfully.');\n\n                        \/\/Redirect to the Thank you page URL if it is set.\n                        return_url = 'https:\/\/ikit.org\/kbi';\n                        if( return_url ){\n                            \/\/redirect to the Thank you page URL.\n                            console.log('Redirecting to the Thank you page URL: ' + return_url);\n                            window.location.href = return_url;\n                            return;\n                        } else {\n                            \/\/No return URL is set. Just show a success message.\n                            console.log('No return URL is set in the settings. Showing a success message.');\n\n                            \/\/We are going to show the success message in the wpapp-ppcp-button-wrapper's container.\n                            txn_success_msg = 'Transaction completed successfully! Feel free to browse our site for another checkout.';\n                            \/\/ Select all elements with the class 'wpapp-ppcp-button-wrapper'\n                            var button_divs = document.querySelectorAll('.wpapp-ppcp-button-wrapper');\n\n                            \/\/ Loop through the NodeList and update each element\n                            button_divs.forEach(function(div, index) {\n                                div.innerHTML = '<div id=\"wpapp-btn-txn-success-msg-' + index + '\" class=\"wpapp-btn-txn-success-msg\">' + txn_success_msg + '<\/div>';\n                            });\n\n                            \/\/ Scroll to the success message container of the button we are interacting with.\n                            const interacted_button_container_element = document.getElementById(elements_wrapper_wpapp_paypal_button_0);\n                            if (interacted_button_container_element) {\n                                interacted_button_container_element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                            }\n                            return;\n                        }\n\n                    } else if (error_detail?.issue === \"INSTRUMENT_DECLINED\") {\n                        \/\/ Recoverable INSTRUMENT_DECLINED -> call actions.restart()\n                        console.log('Recoverable INSTRUMENT_DECLINED error. Calling actions.restart()');\n                        return actions.restart();\n                    } else if ( error_msg && error_msg.trim() !== '' ) {\n                        \/\/Our custom error message from the server.\n                        console.error('Error occurred during PayPal checkout process.');\n                        console.error( error_msg );\n                        alert( error_msg );\n                    } else {\n                        \/\/ Other non-recoverable errors -> Show a failure message\n                        console.error('Non-recoverable error occurred during PayPal checkout process.');\n                        console.error( error_detail );\n                        \/\/alert('Unexpected error occurred with the transaction. Enable debug logging to get more details.\\n\\n' + JSON.stringify(error_detail));\n                    }\n\n                    \/\/Return the button and the spinner back to their orignal display state.\n                    pp_button_container.style.display = 'block'; \/\/ Show the buttons\n                    pp_button_spinner_container.style.display = 'none'; \/\/ Hide the spinner\n\n                } catch (error) {\n                    console.error(error);\n                    alert('PayPal returned an error! Transaction could not be processed. Enable the debug logging feature to get more details...\\n\\n' + JSON.stringify(error));\n                }\n            }\n\n            function onErrorHandler(err) {\n                console.error('An error prevented the user from checking out with PayPal. ' + JSON.stringify(err));\n                alert( 'Error occurred during PayPal checkout process.\\n\\n' + JSON.stringify(err) );\n            }\n            \n            function onCancelHandler (data) {\n                console.log('Checkout operation cancelled by the customer.');\n                \/\/Return to the parent page which the button does by default.\n            }            \n\n        });\n    <\/script>\n\n    <style>\n        @keyframes wpapp-pp-button-spinner {\n            to {transform: rotate(360deg);}\n        }\n        .wpapp-pp-button-spinner {\n            margin: 0 auto;\n            text-indent: -9999px;\n            vertical-align: middle;\n            box-sizing: border-box;\n            position: relative;\n            width: 60px;\n            height: 60px;\n            border-radius: 50%;\n            border: 5px solid #ccc;\n            border-top-color: #0070ba;\n            animation: wpapp-pp-button-spinner .6s linear infinite;\n        }\n        .wpapp-pp-button-spinner-container {\n            width: 100%;\n            text-align: center;\n            margin-top:10px;\n            display: none;\n        }\n    <\/style>\n    <div class=\"wpapp-pp-button-spinner-container\">\n        <div class=\"wpapp-pp-button-spinner\"><\/div>\n    <\/div>    \n    <\/div><!-- end of button-wrapper -->\n    <\/div>\n\n\n\n<p class=\"has-text-align-center\">Use the QR Code Below for a Quick Payment Method:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/ikit.org\/kbi\/wp-content\/uploads\/2024\/09\/qrcode-KBI.png\" alt=\"\" class=\"wp-image-6778\" srcset=\"https:\/\/ikit.org\/kbi\/wp-content\/uploads\/2024\/09\/qrcode-KBI.png 500w, https:\/\/ikit.org\/kbi\/wp-content\/uploads\/2024\/09\/qrcode-KBI-300x300.png 300w, https:\/\/ikit.org\/kbi\/wp-content\/uploads\/2024\/09\/qrcode-KBI-150x150.png 150w, https:\/\/ikit.org\/kbi\/wp-content\/uploads\/2024\/09\/qrcode-KBI-100x100.png 100w, https:\/\/ikit.org\/kbi\/wp-content\/uploads\/2024\/09\/qrcode-KBI-310x310.png 310w, https:\/\/ikit.org\/kbi\/wp-content\/uploads\/2024\/09\/qrcode-KBI-105x105.png 105w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-text-align-center\">Sunday, September 29th &#8211; Paypal is working again. Please choose the option above from the PayPal dropdown menu or use the QR code to initiate a quick payment! <\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Become a member of Knowledge Building International. KBI membership benefit Membership Fees 1 Year Membership(Jan 1 to Dec 31, 2026) 2 Year Membership(Jan 1, 2026 to Dec 31, 2027) Regular Member $125 CAD $230 CAD K-13 Teacher Member $100 CAD $175 CAD Student Member $75 CAD $120 CAD Use the QR Code Below for a &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/ikit.org\/kbi\/index.php\/membership-and-registration\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;KBI Membership&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-697","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/pages\/697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/comments?post=697"}],"version-history":[{"count":42,"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/pages\/697\/revisions"}],"predecessor-version":[{"id":6925,"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/pages\/697\/revisions\/6925"}],"wp:attachment":[{"href":"https:\/\/ikit.org\/kbi\/index.php\/wp-json\/wp\/v2\/media?parent=697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}