Sample code for 30+ languages & platforms
PureBasic

MyInvois Malaysia Submit Document

See more Malaysia MyInvois Examples

Demonstrates how to submit a document to MyInvois.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkJsonObject.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example assumes the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    http.i = CkHttp::ckCreate()
    If http.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; The following JSON is sent in the request body.

    ; {
    ;   "documents": [
    ;     {
    ;       "format": "XML",
    ;       "documentHash": "<SHA256_hash_of_document>",
    ;       "codeNumber": "INV12345",
    ;       "document": "<Document_encoded_in_Base64>"
    ;     }
    ;   ]
    ; }

    ; Load the document to be sent.
    sbXmlDoc.i = CkStringBuilder::ckCreate()
    If sbXmlDoc.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkStringBuilder::ckLoadFile(sbXmlDoc,"c:/invoices/invoice1.xml","utf-8")

    ; The MyInvois online documentation neglects to tell us the encoding of the documentHash.
    ; Should it be base64?  Or hex?  We can only guess.  MyInvois provides no samples,
    ; and omits these crucial details which are needed for actual implementation.
    ; 
    ; *** Note: It was confirmed that "hex" is the encoding that is needed.
    sha256.s = CkStringBuilder::ckGetHash(sbXmlDoc,"sha256","hex","utf-8")

    sbEncoded.i = CkStringBuilder::ckCreate()
    If sbEncoded.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkStringBuilder::ckAppendSb(sbEncoded,sbXmlDoc)
    CkStringBuilder::ckEncode(sbEncoded,"base64","utf-8")

    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckUpdateString(json,"documents[0].format","XML")
    CkJsonObject::ckUpdateString(json,"documents[0].documentHash",sha256)
    CkJsonObject::ckUpdateString(json,"documents[0].codeNumber","INV12345")
    CkJsonObject::ckUpdateSb(json,"documents[0].document",sbEncoded)

    ; Adds the "Authorization: Bearer <access_token>" header.
    CkHttp::setCkAuthToken(http, "<access_token>")

    resp.i = CkHttpResponse::ckCreate()
    If resp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkHttp::ckHttpJson(http,"POST","https://preprod-api.myinvois.hasil.gov.my/api/v1.0/documentsubmissions",json,"application/json",resp)
    If success = 0
        Debug CkHttp::ckLastErrorText(http)
        CkHttp::ckDispose(http)
        CkStringBuilder::ckDispose(sbXmlDoc)
        CkStringBuilder::ckDispose(sbEncoded)
        CkJsonObject::ckDispose(json)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    Debug "response status code = " + Str(CkHttpResponse::ckStatusCode(resp))
    Debug CkHttpResponse::ckBodyStr(resp)


    CkHttp::ckDispose(http)
    CkStringBuilder::ckDispose(sbXmlDoc)
    CkStringBuilder::ckDispose(sbEncoded)
    CkJsonObject::ckDispose(json)
    CkHttpResponse::ckDispose(resp)


    ProcedureReturn
EndProcedure