Sample code for 30+ languages & platforms
Xbase++

MyInvois Malaysia Submit Document

See more Malaysia MyInvois Examples

Demonstrates how to submit a document to MyInvois.

Chilkat Xbase++ Downloads

Xbase++
LOCAL nSuccess
LOCAL oHttp
LOCAL oSbXmlDoc
LOCAL cSha256
LOCAL oSbEncoded
LOCAL oJson
LOCAL oResp

nSuccess := 0

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

oHttp := CreateObject("Chilkat.Http")

//  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.
oSbXmlDoc := CreateObject("Chilkat.StringBuilder")
nSuccess := oSbXmlDoc:LoadFile("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.
cSha256 := oSbXmlDoc:GetHash("sha256", "hex", "utf-8")

oSbEncoded := CreateObject("Chilkat.StringBuilder")
oSbEncoded:AppendSb(oSbXmlDoc)
oSbEncoded:Encode("base64", "utf-8")

oJson := CreateObject("Chilkat.JsonObject")
oJson:UpdateString("documents[0].format", "XML")
oJson:UpdateString("documents[0].documentHash", cSha256)
oJson:UpdateString("documents[0].codeNumber", "INV12345")
oJson:UpdateSb("documents[0].document", oSbEncoded)

//  Adds the "Authorization: Bearer <access_token>" header.
oHttp:AuthToken := "<access_token>"

oResp := CreateObject("Chilkat.HttpResponse")
nSuccess := oHttp:HttpJson("POST", "https://preprod-api.myinvois.hasil.gov.my/api/v1.0/documentsubmissions", oJson, "application/json", oResp)
IF (nSuccess == 0)
    ? oHttp:LastErrorText
    oHttp:destroy()
    oSbXmlDoc:destroy()
    oSbEncoded:destroy()
    oJson:destroy()
    oResp:destroy()
    RETURN
ENDIF

? "response status code = " + Str(oResp:StatusCode)
? oResp:BodyStr

oHttp:destroy()
oSbXmlDoc:destroy()
oSbEncoded:destroy()
oJson:destroy()
oResp:destroy()