syukranDev / e-invoice-sdk-nodejs

A Node.js SDK for e-invoicing Malaysia.
https://www.npmjs.com/package/einvoice-sdk-nodejs
3 stars 2 forks source link

Bug in signed invoice hash submission to LHDN #2

Closed ramkumarcv closed 4 weeks ago

ramkumarcv commented 4 weeks ago

We tried getCertificatesHashedParams function to generate the invoice document hash and submitted to LHDN invoice submission API, Got below response Resoponse: { "status": "success", "data": { "submissionUid": null, "acceptedDocuments": [

],
"rejectedDocuments": [
  {
    "invoiceCodeNumber": "705725225958",
    "error": {
      "code": null,
      "message": "Validation Error",
      "target": "705725225958",
      "propertyPath": null,
      "details": [
        {
          "code": null,
          "message": "Document hash is not valid.",
          "target": "documentHash",
          "pre": "Validation Error",
          "target": "705725225958",
          "propertyPath": null,
          "details": [
            {
              "code": null,
              "message": "Document hash is not valid.",
              "target": "documentHash",
              "propertyPath": null,
              "details": null
            }
          ]
        }
      }
    ]
  }
}
Thanks in advance for any solution
syukranDev commented 4 weeks ago

ensure raw JSON of documentHash is hashed with sha256 as per LHDN guides, normally documentHash value is shorter than document value.

Sample below:

{
  "documents": [
    {
      "format": "JSON",
      "documentHash": "299aded8a62ad565abdb695d0a8b9e526777c4bbffa498aa15327f52f64fa0a1",
      "codeNumber": "I280014XV00124066",
      "document": "eyJfRCI6InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkludm9pY2UtMiIsIl9BIjoidXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQWdncmVnYXRlQ29tcG9uZW50cy0yIiwiX0IiOiJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25CYXNpY0NvbXBvbmVudHMtMiIsIl9FIjoidXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uRXh0ZW5zaW9uQ29tcG9uZW50cy0yIiwiSW52b2ljZSI6W3siSUQiOlt7Il8iOiJJMjgwMDE0WFYwMDEyNDA2In1dLCJJc3N1ZURhdGUiOlt7Il8iOiIyMDI0LTA3LTI3In1dLCJJc3N1ZVRpbWUiOlt7Il8iOiIxNjo0Njo1N1oifV0sIkludm9pY2VUeXBlQ29kZSI6W3siXyI6IjAxIiwibGlzdFZlcnNpb25JRCI6IjEuMCJ9XSwiRG9jdW1lbnRDdXJyZW5jeUNvZGUiOlt7Il8iOiJNWVIifV0sIkJpbGxpbmdSZWZlcmVuY2UiOlt7IkFkZGl0aW9uYWxEb2N1bWVudFJlZmVyZW5jZSI6W3siSUQiOlt7Il8iOiJJMjgwMDE0WFYwMDEyNDA2In1dfV19XSwiQWNjb3VudGluZ1N1cHBsaWVyUGFydHkiOlt7IkFkZGl0aW9uYWxBY2NvdW50SUQiOlt7Il8iOiI0WCIsInNjaGVtZUFnZW5jeU5hbWUiOiIgTklOSkEgTUFSVCBTRE4gQkhEIn1dLCJQYXJ0eSI6W3siSW5kdXN0cnlDbGFzc2lmaWNhdGlvbkNvZGUiOlt7Il8iOiI0NjMyOSIsIm5hbWUiOiJUaGlzIGNvZGUgY292ZXJzIHRoZSB3aG9sZXNhbGUgdHJhZGUgb2YgZm9vZCBwcm9kdWN0cywgYmV2ZXJhZ2VzLCBhbmQgdG9iYWNjby4gSXQgaW5jbHVkZXMgYWN0aXZpdGllcyBzdWNoIGFzIGRpc3RyaWJ1dGluZyBmb29kIGl0ZW1zLCBiZXZlcmFnZXMsIGFuZCByZWxhdGVkIHByb2R1Y3RzIHRvIHJldGFpbGVycywgcmVzdGF1cmFudHMsIGFuZCBvdGhlciBidXNpbmVzc2VzLiJ9XSwiUGFydHlJZGVudGlmaWNhdGlvbiI6W3siSUQiOlt7Il8iOiJDMjQzODEwOTEwMTAiLCJzY2hlbWVJRCI6IlRJTiJ9XX0seyJJRCI6W3siXyI6IjIwMTYwMTAwNjEwNCIsInNjaGVtZUlEIjoiQlJOIn1dfSx7IklEIjpbeyJfIjoiTkEiLCJzY2hlbWVJRCI6IlNTVCJ9XX0seyJJRCI6W3siXyI6Ik5BIiwic2NoZW1lSUQiOiJUVFgifV19XSwiUG9zdGFsQWRkcmVzcyI6W3siQ2l0eU5hbWUiOlt7Il8iOiJCYWhhdSJ9XSwiQ291bnRyeVN1YmVudGl0eUNvZGUiOlt7Il8iOiIwNSJ9XSwiQWRkcmVzc0xpbmUiOlt7IkxpbmUiOlt7Il8iOiJOby41MCJ9XX0seyJMaW5lIjpbeyJfIjoiIFB1c2F0IFBlcm5pYWdhYW4gQWxhbWFuZGEifV19LHsiTGluZSI6W3siXyI6IiwgSmFsYW4gQmFoYXUgLSBNYWhzYW4sIDcyMTAwIEJhaGF1LCBOZWdlcmkgU2VtYmlsYW4ifV19XSwiQ291bnRyeSI6W3siSWRlbnRpZmljYXRpb25Db2RlIjpbeyJfIjoiTVlTIiwibGlzdElEIjoiSVNPMzE2Ni0xIiwibGlzdEFnZW5jeUlEIjoiNiJ9XX1dfV0sIlBhcnR5TGVnYWxFbnRpdHkiOlt7IlJlZ2lzdHJhdGlvbk5hbWUiOlt7Il8iOiJOSU5KQSBMT0dJU1RJQ1MgU0ROIEJIRCAoQkFIQVUpIn1dfV0sIkNvbnRhY3QiOlt7IlRlbGVwaG9uZSI6W3siXyI6Iis2MC0xNDg5NjA1ODAifV19XX1dfV0sIkFjY291bnRpbmdDdXN0b21lclBhcnR5IjpbeyJQYXJ0eSI6W3siUG9zdGFsQWRkcmVzcyI6W3siQ2l0eU5hbWUiOlt7Il8iOiJLVUFMQSBQSUxBSCJ9XSwiUG9zdGFsWm9uZSI6W3siXyI6IjcyMDAwIn1dLCJDb3VudHJ5U3ViZW50aXR5Q29kZSI6W3siXyI6IjA1In1dLCJBZGRyZXNzTGluZSI6W3siTGluZSI6W3siXyI6IjM2OSBHRiBKQUxBTiBSQUpBIE1FTEVXQVIifV19LHsiTGluZSI6W3siXyI6IiJ9XX0seyJMaW5lIjpbeyJfIjoiIn1dfV0sIkNvdW50cnkiOlt7IklkZW50aWZpY2F0aW9uQ29kZSI6W3siXyI6Ik1ZUyIsImxpc3RJRCI6IklTTzMxNjYtMSIsImxpc3RBZ2VuY3lJRCI6IjYifV19XX1dLCJQYXJ0eUxlZ2FsRW50aXR5IjpbeyJSZWdpc3RyYXRpb25OYW1lIjpbeyJfIjoiTUlOSSBNQVJLRVQgU0lOIENIVUFOIEJFRSJ9XX1dLCJQYXJ0eUlkZW50aWZpY2F0aW9uIjpbeyJJRCI6W3siXyI6IklHMjY3NTIzNzYwOTAiLCJzY2hlbWVJRCI6IlRJTiJ9XX0seyJJRCI6W3siXyI6Ijk3MTIxMTM4NTE3NyIsInNjaGVtZUlEIjoiTlJJQyJ9XX0seyJJRCI6W3siXyI6Ik5BIiwic2NoZW1lSUQiOiJTU1QifV19XSwiQ29udGFjdCI6W3siVGVsZXBob25lIjpbeyJfIjoiKzYwMTIyNzM4OTczIn1dfV19XX1dLCJUYXhUb3RhbCI6W3siVGF4QW1vdW50IjpbeyJfIjowLCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJUYXhTdWJ0b3RhbCI6W3siVGF4YWJsZUFtb3VudCI6W3siXyI6OTksImN1cnJlbmN5SUQiOiJNWVIifV0sIlRheEFtb3VudCI6W3siXyI6MCwiY3VycmVuY3lJRCI6Ik1ZUiJ9XSwiVGF4Q2F0ZWdvcnkiOlt7IklEIjpbeyJfIjoiRSJ9XSwiVGF4U2NoZW1lIjpbeyJJRCI6W3siXyI6Ik9USCIsInNjaGVtZUlEIjoiVU4vRUNFIDUxNTMiLCJzY2hlbWVBZ2VuY3lJRCI6IjYifV19XX1dfV19XSwiTGVnYWxNb25ldGFyeVRvdGFsIjpbeyJUYXhFeGNsdXNpdmVBbW91bnQiOlt7Il8iOjk5LCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJUYXhJbmNsdXNpdmVBbW91bnQiOlt7Il8iOjk5LCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJQYXlhYmxlQW1vdW50IjpbeyJfIjo5OSwiY3VycmVuY3lJRCI6Ik1ZUiJ9XSwiTGluZUV4dGVuc2lvbkFtb3VudCI6W3siXyI6OTksImN1cnJlbmN5SUQiOiJNWVIifV0sIkFsbG93YW5jZVRvdGFsQW1vdW50IjpbeyJfIjowLCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJQYXlhYmxlUm91bmRpbmdBbW91bnQiOlt7Il8iOjAsImN1cnJlbmN5SUQiOiJNWVIifV19XSwiSW52b2ljZUxpbmUiOlt7IklEIjpbeyJfIjoiMSJ9XSwiSXRlbSI6W3siQ29tbW9kaXR5Q2xhc3NpZmljYXRpb24iOlt7Ikl0ZW1DbGFzc2lmaWNhdGlvbkNvZGUiOlt7Il8iOiIwMjIiLCJsaXN0SUQiOiJDTEFTUyJ9XX1dLCJEZXNjcmlwdGlvbiI6W3siXyI6IkZpa2EgQ2hvY29sYXRlIFBpZSAxMmcgeCAzMHBjcyB4IDEwYmFncyAoTkpNMTE4ODU3NCkifV19XSwiSW52b2ljZWRRdWFudGl0eSI6W3siXyI6NTB9XSwiUHJpY2UiOlt7IlByaWNlQW1vdW50IjpbeyJfIjoyLCJjdXJyZW5jeUlEIjoiTVlSIn1dfV0sIkl0ZW1QcmljZUV4dGVuc2lvbiI6W3siQW1vdW50IjpbeyJfIjoxMDAsImN1cnJlbmN5SUQiOiJNWVIifV19XSwiTGluZUV4dGVuc2lvbkFtb3VudCI6W3siXyI6MTAwLCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJBbGxvd2FuY2VDaGFyZ2UiOlt7IkNoYXJnZUluZGljYXRvciI6W3siXyI6ZmFsc2V9XSwiTXVsdGlwbGllckZhY3Rvck51bWVyaWMiOlt7Il8iOjB9XSwiQW1vdW50IjpbeyJfIjowLCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJBbGxvd2FuY2VDaGFyZ2VSZWFzb24iOlt7Il8iOiJOQSJ9XX1dLCJUYXhUb3RhbCI6W3siVGF4QW1vdW50IjpbeyJfIjowLCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJUYXhTdWJ0b3RhbCI6W3siVGF4YWJsZUFtb3VudCI6W3siXyI6MTAwLCJjdXJyZW5jeUlEIjoiTVlSIn1dLCJUYXhBbW91bnQiOlt7Il8iOjAsImN1cnJlbmN5SUQiOiJNWVIifV0sIlRheENhdGVnb3J5IjpbeyJJRCI6W3siXyI6IkUifV0sIlBlcmNlbnQiOlt7Il8iOjZ9XSwiVGF4U2NoZW1lIjpbeyJJRCI6W3siXyI6Ik9USCIsInNjaGVtZUlEIjoiVU4vRUNFIDUxNTMiLCJzY2hlbWVBZ2VuY3lJRCI6IjYifV19XSwiVGF4RXhlbXB0aW9uUmVhc29uIjpbeyJfIjoiTm90IEFwcGxpY2FibGUifV19XX1dfV19XX1dfQ=="
    }
  ]
}
ramkumarcv commented 4 weeks ago

The above sample is based on version 1.0 and without signature, Its working as expected, but when i tried with version 1.1 with signature hash, it was failed with "Document hash is not valid." response.

syukranDev commented 4 weeks ago

I just checked mine still working. Somewhere in your JSON structure is invalid, kindly check thoroughly. Closing this issue as it no longer relates to the original subject.

image