{"id":25872095,"url":"https://github.com/aktsk/nolmandy","last_synced_at":"2025-07-28T05:33:27.790Z","repository":{"id":57489035,"uuid":"122160910","full_name":"aktsk/nolmandy","owner":"aktsk","description":"Apple receipt processing server/library","archived":false,"fork":false,"pushed_at":"2024-08-15T03:49:51.000Z","size":81,"stargazers_count":20,"open_issues_count":0,"forks_count":2,"subscribers_count":34,"default_branch":"master","last_synced_at":"2025-04-04T22:41:47.788Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aktsk.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-02-20T05:56:28.000Z","updated_at":"2024-12-23T07:27:46.000Z","dependencies_parsed_at":"2025-03-02T07:37:56.898Z","dependency_job_id":"fd9265fa-9a51-4931-81a9-3d18b4cfbcc7","html_url":"https://github.com/aktsk/nolmandy","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/aktsk/nolmandy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aktsk%2Fnolmandy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aktsk%2Fnolmandy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aktsk%2Fnolmandy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aktsk%2Fnolmandy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aktsk","download_url":"https://codeload.github.com/aktsk/nolmandy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aktsk%2Fnolmandy/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267468393,"owners_count":24092334,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-02T07:37:48.666Z","updated_at":"2025-07-28T05:33:27.761Z","avatar_url":"https://github.com/aktsk.png","language":"Go","readme":"# Nolmandy [![Build Status](https://travis-ci.org/aktsk/nolmandy.svg?branch=master)](https://travis-ci.org/aktsk/nolmandy)\n\nNolmandy is an Apple receipt processing server. You can use nolmandy instead of https://sandbox.itunes.apple.com/verifyReceipt .\n\nAlso you can use nolmandy as a receipt processing library.\n\n**This product is at an early stage of development and not fully implemented.**\n\n----\n\n## Usage\n\n### As a receipt validation command line tool\n\nInstall `nolmandy` command.\n\n```\ngo get github.com/aktsk/nolmandy/cmd/nolmandy\n```\n\nRun nolmandy command to validate a receipt by Apple Root certificate.\n\n```\ncat receipt | nolmandy\n```\n\nYou can validate a certificate by your own certificate.\n\n```\ncat receipt | nolmandy -certFile cert.pem\n```\n\n\n### As a validation server\n\nInstall `nolmandy-server` command.\n\n```\ngo get github.com/aktsk/nolmandy/cmd/nolmandy-server\n```\n\nRun nolmandy server.\n\n```\nnolmandy-server -port 8000\n```\n\nPost base64 encoded receipt data to nolmandy server.\n\n```\ncurl -s -H 'Content-Type:application/json' -d '{ \"receipt-data\": \"MIIeWQYJK...\" }' \\\n  http://localhost:8000/\n```\n\nYou can use your own certificate instead of Apple certificate.\n\n```\nnolmandy-server -certFile cert.pem\n```\n\n### As a validation library\n\nYou can parse base64 encoded receipt data and validate it.\n\n```go\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/aktsk/nolmandy/receipt\"\n)\n\nfunc main() {\n\trcpt, err := receipt.ParseWithAppleRootCert(\"MIIT6QYJK...\")\n\tif err != nil {\n\t\tlog.Fatal(\"Parse error\")\n\t}\n\n\tresult, err := rcpt.Validate() // Validate() does nothing currently ...\n\tif err != nil {\n\t\tlog.Fatal(\"Validation error\")\n\t}\n\n\tif result.Status == 0 {\n\t\tlog.Println(\"Validation success\")\n\t}\n}\n```\n\nYou can use your own certificate instead of Apple root certificate like this.\n\n```go\nfunc main() {\n\tcertFile, _ := os.Open(\"cert.pem\")\n\tcertPEM, _ := ioutil.ReadAll(certFile)\n\tcertDER, _ := pem.Decode(certPEM)\n\tcert, _ = x509.ParseCertificate(certDER.Bytes)\n\n\trcpt, err := receipt.Parse(cert, \"MIIT6QYJK...\")\n\tif err != nil {\n\t\tlog.Fatal(\"Parse error\")\n\t}\n\n\tresult, err := rcpt.Validate() // Validate() does nothing currently ...\n\tif err != nil {\n\t\tlog.Fatal(\"Validation error\")\n\t}\n\n\tif result.Status == 0 {\n\t\tlog.Println(\"Validation success\")\n\t}\n}\n```\n\n### Deploy nolmandy server to Google App Engine\n\nYou can run nolmandy server on Google App Engine.\n\n```\ncd appengine/app\nmake deploy\n```\n\nIf you'd like to use your own certificate instead of Apple certificate, put a certificate file as `cert.pem` under appengine/app directory. Or you can set your certificate in app.yaml like this.\n\n```yaml\nenv_variables:\n  # It seems GAE/Go could not handle environment variables\n  # that has return code.So use \"\u003e-\" to replace return code\n  # with white space\n  CERTIFICATE: \u003e-\n    -----BEGIN CERTIFICATE-----\n    MIIB3TCCAUagAwIBAgIEcotswjANBgkqhkiG9w0BAQsFADAoMRAwDgYDVQQKEwdB\n    Y21lIENvMRQwEgYDVQQDEwtUZXN0IElzc3VlcjAgFw0xODA0MDIwNDA2MjlaGA8z\n    ODQzMDQwMjA0MDYyOVowKDEQMA4GA1UEChMHQWNtZSBDbzEUMBIGA1UEAxMLVGVz\n    dCBJc3N1ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMb89jkLRDjud2Xt\n    tYoXscWCGTKAr+TYv7dwk7YXqabv4bhH5X15sbg9cp5UWZzu7ygoX4+N/48Aa/AZ\n    Sh8ppQZYpa73ximUesF8W+ZDXeOsexoPuRyXKltjXX/eLklBldVBB8Weyip4WhmG\n    TCguTUW5eFPtseIEBHxto12jB6gnAgMBAAGjEjAQMA4GA1UdDwEB/wQEAwICpDAN\n    BgkqhkiG9w0BAQsFAAOBgQC+abUGkSNC5n6r4TjbCrAHZcFI0yCcK38fS2g9c7lb\n    VcvltNox2SWL9oyjybdzm1iZoVtsHXuQ8RKszdVKCh7N1RUOGDgtuwfP2XnKCKoP\n    W9VfLKZ+Y4YnouEZBUjsS39dgLC2EJ66e3kWfCrR6HNsSWwE0A3mVnfNUwLvgtH/\n    QQ==\n    -----END CERTIFICATE-----\n```\n\n----\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n----\n\n## License\n\nSee [LICENSE](LICENSE).\n\n----\n\n## See Also\n\n* [Receipt Validation Programming Guide](https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Introduction.html)\n* [aktsk/kalvados: Apple receipt generator for testing](https://github.com/aktsk/kalvados)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faktsk%2Fnolmandy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faktsk%2Fnolmandy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faktsk%2Fnolmandy/lists"}