Panduan Pasukan Lucee MY

Semak sijil halal JAKIM dari Lucee tanpa API rasmi

JAKIM tiada API awam untuk semak sijil halal. Simpan data sijil dalam pangkalan data sendiri, semak dengan cfquery, dan rekod tarikh semakan di portal rasmi.

Semak sijil halal JAKIM dari Lucee tanpa API rasmi
0
Kandungan

Semak sijil halal JAKIM dari Lucee tanpa API rasmi

JAKIM tidak menyediakan API awam percuma untuk menyemak sijil halal. Tiada endpoint JSON, tiada kunci API, dan tiada dokumentasi web service yang boleh dipanggil daripada Lucee. Yang wujud ialah portal web yang membalas HTML, dan carian sijil dilakukan melalui borang POST untuk manusia, bukan mesin. Terlalu banyak panduan yang menyamar carian web JAKIM seolah-olah sebuah API, jadi artikel ini jujur tentang had itu. Yang sebenarnya boleh dibina: simpan data sijil dalam pangkalan data sendiri dan semak dengan cfquery, semak status di portal rasmi secara manual dan rekod tarikhnya, serta paut ke portal rasmi dan bukannya mengikisnya.

JAKIM tiada API awam untuk semakan sijil halal

Portal rasmi halal JAKIM di www.halal.gov.my ialah laman HTML biasa. cfhttp GET ke halaman utamanya dari rig Lucee membalas 200 OK dengan 32,018 bait HTML, bukan JSON. Di dalam HTML itu tiada endpoint mesin; yang ada ialah satu borang method="post" dengan medan input bernama cari yang menghantar carian ke skrip index.php, dan jawapannya HTML semula.

Ini berbeza daripada data.gov.my, yang memang membuka API tanpa kunci. JAKIM tidak mempunyai lapisan sedemikian untuk sijil halal. Sistem MYeHALAL pula ialah platform untuk syarikat memohon dan mengurus sijil, bukan saluran semakan awam. Anggapan "panggil API dan baca JSON" tidak terpakai di sini.

Apa yang sebenarnya wujud di portal rasmi

Tiga permukaan rasmi yang boleh anda rujuk, dan ketiga-tiganya untuk manusia:

  • Portal Halal Malaysia (www.halal.gov.my): halaman utama dengan borang carian sijil awam.
  • Sistem MYeHALAL (myehalal.halal.gov.my): permohonan dan pengurusan sijil oleh organisasi pemegang sijil, memerlukan log masuk.
  • Portal JAKIM (islam.gov.my): halaman "Semakan Status Halal" yang menerangkan saluran semakan rasmi.

Semuanya HTML. Ini bukan kelemahan yang perlu dilawan dengan mengikis; ini isyarat bahawa cara yang betul ialah menyimpan data sendiri dan memakai portal rasmi sebagai rujukan berkala, bukan panggilan masa nyata.

Jadual: sumber semakan dan tahap kepercayaannya

Tidak semua sumber sijil halal sama dari segi apa yang boleh anda percayai dan automatikkan. Jadual ini memisahkan empat sumber yang sering dicampurkan:

SumberApa yang boleh dipercayaiHadnya
Portal JAKIM (www.halal.gov.my)Status sijil yang sah pada saat semakan, diterbitkan oleh badan pengeluar sijilBorang carian HTML tanpa API; struktur halaman boleh berubah; carian manual dan perlahan
Sistem MYeHALAL (myehalal.halal.gov.my)Data permohonan dan status sijil milik syarikat pemegang sijilMemerlukan log masuk; bukan saluran semakan awam
Senarai produk dalam pangkalan data sendiriSalinan terkawal yang boleh disemak pantas dengan cfquery, penuh dengan tarikh luputHanya setepat data yang dimasukkan; perlu diselenggara dan dikemas kini
Pengesahan manual di portal rasmiKeputusan paling sahih pada masa ia dibuatTiada automasi; tarikh dan pelaku semakan mesti direkodkan sendiri

Baris ketiga dan keempat adalah tempat aplikasi Lucee anda benar-benar berfungsi, dan dua seksyen seterusnya membinanya.

Simpan sijil dalam pangkalan data sendiri

Cara paling boleh dipercayai untuk semakan automatik ialah memiliki salinan data sijil yang anda pedulikan. Anda tidak menyemak semua sijil halal di Malaysia; anda menyemak sijil pembekal dan produk yang berkaitan dengan perniagaan. Senarai itu kecil, dan anda boleh mendapatkannya daripada sijil fizikal atau fail PDF yang pembekal hantar, atau dengan menaip nombor sijil ke carian portal rasmi sekali.

Data itu masuk ke dalam jadual sijil_halal yang ringkas, dengan medan untuk nombor sijil, nama produk, syarikat, status, tarikh luput, dan tarikh semakan terakhir. Contoh memakai datasource kedai; asas mendaftarkan datasource dibincangkan dalam panduan konfigurasi datasource.

<cfquery datasource="kedai">
    CREATE TABLE IF NOT EXISTS sijil_halal (
        id INT PRIMARY KEY,
        no_sijil VARCHAR(40) NOT NULL,
        nama_produk VARCHAR(120),
        syarikat VARCHAR(120),
        status VARCHAR(20) NOT NULL,
        tarikh_luput DATE,
        tarikh_semak DATE
    )
</cfquery>

<cfquery datasource="kedai">
    INSERT INTO sijil_halal (id, no_sijil, nama_produk, syarikat, status, tarikh_luput)
    VALUES
        (1, 'JAKIM-1234-2026', 'Biskut Coklat Nona', 'Syarikat Nona Sdn Bhd', 'sah', '2027-03-15'),
        (2, 'JAKIM-0987-2025', 'Sos Cili Merah', 'Kilang Sos Merah Sdn Bhd', 'luput', '2025-06-30'),
        (3, 'JAKIM-5555-2024', 'Minyak Masak Tulen', 'Syarikat Tulen Sdn Bhd', 'ditarik', '2024-12-31')
</cfquery>

Tiga nilai status itu menutup kes sebenar: sijil berkuat kuasa, sijil tamat tempoh, dan sijil ditarik balik oleh JAKIM. Rekod ini data rekaan; dalam sistem sebenar anda menaipnya daripada sijil atau carian portal.

Fungsi semakan dengan cfquery

Setelah data wujud, semakan menjadi satu cfquery dengan parameter terikat. Fungsi di bawah menerima nombor sijil dan memulangkan struct yang mengandungi status dan tarikh luput, atau TIADA REKOD apabila nombor itu tidak wujud. Perhatikan cfqueryparam, yang mengikat nilai supaya input pengguna tidak boleh disuntik ke dalam SQL; sebab pentingnya dalam panduan cfquery dan cfqueryparam.

<cffunction name="semakSijil" access="public" returntype="struct" output="false">
    <cfargument name="noSijil" type="string" required="true">
    <cfset var hasil = { dijumpai: false, status: "TIADA REKOD", nama_produk: "", tarikh_luput: "" }>
    <cfquery name="local.qSijil" datasource="kedai">
        SELECT no_sijil, nama_produk, syarikat, status, tarikh_luput
        FROM sijil_halal
        WHERE no_sijil = <cfqueryparam value="#arguments.noSijil#" cfsqltype="cf_sql_varchar">
    </cfquery>
    <cfif qSijil.recordCount GT 0>
        <cfset hasil.dijumpai = true>
        <cfset hasil.status = qSijil.status>
        <cfset hasil.nama_produk = qSijil.nama_produk>
        <cfset hasil.tarikh_luput = dateFormat(qSijil.tarikh_luput, "yyyy-mm-dd")>
    </cfif>
    <cfreturn hasil>
</cffunction>

<cfset uji = ["JAKIM-1234-2026", "JAKIM-0987-2025", "JAKIM-9999-9999"]>
<cfloop array="#uji#" index="no">
    <cfset r = semakSijil(no)>
    <cfoutput>#no# -> dijumpai: #r.dijumpai# | status: #r.status# | tarikh_luput: #r.tarikh_luput#</cfoutput><br>
</cfloop>

Status dan tarikh luput itulah dua maklumat yang keputusan perniagaan anda perlukan: adakah produk ini boleh dipakai, dan sehingga bila. Dalam sistem sebenar anda bandingkan tarikh_luput dengan tarikh hari ini dan menyekat produk yang luput atau ditarik.

Semak status di portal rasmi dan rekod tarikh semakan

Salinan pangkalan data anda bukan sumber kebenaran; portal JAKIM yang menjadi sumbernya, dan jadual sijil_halal membawa medan tarikh_semak untuk merekodkannya. Aliran kerja berkala ialah: buka carian sijil di www.halal.gov.my, taip nombor sijil, baca status, kemudian kemas kini baris jadual dan isi tarikh_semak dengan tarikh hari ini.

Fungsi kemas kini di bawah menutup gelung itu. Ia menerima nombor sijil dan status baharu hasil semakan manual, menyimpan kedua-duanya bersama tarikh hari ini, supaya tiga bulan kemudian anda boleh lihat rekod itu sudah basi dan perlu disemak semula:

<cffunction name="rekodSemakan" access="public" returntype="void" output="false">
    <cfargument name="noSijil" type="string" required="true">
    <cfargument name="statusBaru" type="string" required="true">
    <cfquery datasource="kedai">
        UPDATE sijil_halal
        SET status = <cfqueryparam value="#arguments.statusBaru#" cfsqltype="cf_sql_varchar">,
            tarikh_semak = <cfqueryparam value="#now()#" cfsqltype="cf_sql_date">
        WHERE no_sijil = <cfqueryparam value="#arguments.noSijil#" cfsqltype="cf_sql_varchar">
    </cfquery>
</cffunction>

<cfset rekodSemakan("JAKIM-1234-2026", "sah")>

<cfquery name="qSemak" datasource="kedai">
    SELECT no_sijil, status, tarikh_semak FROM sijil_halal WHERE no_sijil = 'JAKIM-1234-2026'
</cfquery>
<cfoutput>#qSemak.no_sijil# -> status: #qSemak.status# | tarikh_semak: #dateFormat(qSemak.tarikh_semak, "yyyy-mm-dd")#</cfoutput>

Medan tarikh_semak inilah yang membezakan sistem yang tahu data sendiri sudah lapuk daripada sistem yang menganggap salinan lama masih benar.

Paut ke portal rasmi, bukan tiru borangnya

Cara paling murah untuk memberi pengguna akses kepada semakan penuh ialah pautan. Daripada membina semula borang carian, letakkan pautan ke portal rasmi dan biarkan JAKIM menghidangkan hasilnya sendiri. Ini menghormati terma penggunaan dan memastikan pengguna sentiasa melihat versi terkini tanpa kod penyelenggaraan.

Pautan ini boleh diletakkan bersebelahan hasil cfquery, misalnya teks "semak semula di portal rasmi" yang menuju ke https://www.halal.gov.my/. Prinsipnya sama seperti panduan REST API dalam Lucee: sediakan laluan yang jelas, tetapi kali ini laluan itu memaut keluar dan bukannya membalas JSON.

Jangan kikis portal kerajaan

Godaan selepas mengetahui tiada API ialah mengikis: hantar cfhttp POST ke borang carian, hurai HTML, dan simpan hasilnya secara automatik. Jangan lakukannya, atas dua sebab.

Pertama, terma penggunaan: laman kerajaan lazimnya melarang pengekstrakan automatik data. Kedua, beban pelayan: carian sijil ialah perkhidmatan awam yang perlu kekal pantas, dan skrip yang menembak ratusan permintaan seminit menambah beban yang tidak perlu pada pelayan kerajaan.

Mengikis juga rapuh: struktur HTML boleh berubah tanpa amaran dan skrip anda senyap memulangkan data salah. Jadual pangkalan data dengan semakan manual berkala lebih murah diselenggara dan lebih sukar rosak. Asas permintaan HTTP terkawal dalam panduan cfhttp dan API luar.

Bukti dalam rig: jadual, semakan, dan kod status cfhttp

Semua kod di atas dijalankan dalam rig Lucee 7.1.2.54 pada Java 25 di http://127.0.0.1:8904, dengan datasource kedai menunjuk ke pangkalan H2 dalam memori. Jadual sijil_halal dicipta dan tiga rekod disemai, kemudian semakSijil dipanggil untuk tiga nombor: satu sah, satu luput, dan satu yang tiada. Ini keluaran sebenar:

Jadual sijil_halal dicipta, 3 rekod disemai.

JAKIM-1234-2026 -> dijumpai: true | status: sah | tarikh_luput: 2027-03-15
JAKIM-0987-2025 -> dijumpai: true | status: luput | tarikh_luput: 2025-06-30
JAKIM-9999-9999 -> dijumpai: false | status: TIADA REKOD | tarikh_luput:

rekodSemakan("JAKIM-1234-2026", "sah") ->
JAKIM-1234-2026 -> status: sah | tarikh_semak: 2026-10-17

Kod status cfhttp sebenar daripada portal JAKIM juga direkodkan, mengukuhkan fakta di awal artikel. GET ke https://www.halal.gov.my/ membalas 200 OK dengan 32,018 bait HTML; GET terus ke laluan modul sijil yang dipautkan dari halaman utama membalas 404 Not Found. Tiada jawapan JSON di mana-mana, bukti jujur bahawa tiada API untuk dipanggil.

Soalan Lazim

Adakah JAKIM menyediakan API untuk semakan sijil halal?

Tidak. JAKIM tidak menyediakan API awam percuma untuk semakan sijil halal. Carian awam dilakukan melalui borang HTML di portal, dan jawapannya ialah HTML, bukan JSON. Tiada kunci API dan tiada dokumentasi web service rasmi untuk tujuan ini.

Bolehkah saya menyemak sijil halal secara automatik dari CFML?

Boleh, tetapi bukan dengan memanggil API JAKIM. Simpan data sijil yang anda pedulikan dalam jadual sendiri, semak dengan cfquery, dan segarkan salinan itu secara manual dari portal rasmi secara berkala sambil merekodkan tarikh semakan.

Apakah beza portal halal JAKIM dengan MYeHALAL?

Portal Halal Malaysia di www.halal.gov.my menyediakan carian sijil awam, manakala MYeHALAL ialah sistem permohonan dan pengurusan sijil untuk organisasi pemegang sijil yang memerlukan log masuk. MYeHALAL bukan saluran semakan awam untuk pembeli.

Kenapa saya tidak boleh mengikis carian sijil dari portal JAKIM?

Kerana terma penggunaan laman kerajaan lazimnya melarang pengekstrakan automatik, dan kerana permintaan berlebihan menambah beban pada pelayan awam yang perlu kekal pantas untuk semua orang. Struktur HTML juga boleh berubah tanpa amaran, menjadikan pengikis rapuh dan mudah memulangkan data salah.

Bagaimana saya tahu salinan sijil dalam pangkalan data saya masih betul?

Gunakan medan tarikh semakan. Setiap kali anda mengesahkan status di portal rasmi secara manual, kemas kini baris jadual dan isi tarikh semakan. Rekod yang tarikh semakannya sudah lama menandakan data itu basi dan perlu disemak semula sebelum dipercayai.

Sumber

0 komen

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk