{"id":24869634,"url":"https://github.com/alsatpardakht/alsatipgdesktopexample","last_synced_at":"2026-05-04T06:32:25.727Z","repository":{"id":174714381,"uuid":"469707386","full_name":"AlsatPardakht/AlsatIPGDesktopExample","owner":"AlsatPardakht","description":"Desktop kotlin \u0026 java example of AlsatIPGDesktop library","archived":false,"fork":false,"pushed_at":"2022-03-28T06:23:10.000Z","size":249,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-26T21:48:56.132Z","etag":null,"topics":["alsat","alsatpardakht","desktop","example","ipg","java","kotlin","payment"],"latest_commit_sha":null,"homepage":"https://alsatpardakht.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AlsatPardakht.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2022-03-14T11:40:44.000Z","updated_at":"2022-03-28T06:47:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"b2983296-3cdb-4ebd-961e-474fc0ec69c7","html_url":"https://github.com/AlsatPardakht/AlsatIPGDesktopExample","commit_stats":null,"previous_names":["alsatpardakht/alsatipgdesktopexample"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/AlsatPardakht/AlsatIPGDesktopExample","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlsatPardakht%2FAlsatIPGDesktopExample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlsatPardakht%2FAlsatIPGDesktopExample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlsatPardakht%2FAlsatIPGDesktopExample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlsatPardakht%2FAlsatIPGDesktopExample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AlsatPardakht","download_url":"https://codeload.github.com/AlsatPardakht/AlsatIPGDesktopExample/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AlsatPardakht%2FAlsatIPGDesktopExample/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32597374,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"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":["alsat","alsatpardakht","desktop","example","ipg","java","kotlin","payment"],"created_at":"2025-02-01T03:31:08.960Z","updated_at":"2026-05-04T06:32:25.688Z","avatar_url":"https://github.com/AlsatPardakht.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"\" rel=\"noopener\"\u003e\n \u003cimg width=200px height=200px src=\"./logo.png\" alt=\"Project logo\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003eAlsat IPG Desktop Example\u003c/h3\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Status](https://img.shields.io/badge/status-active-success.svg)]()\n[![GitHub Issues](https://img.shields.io/github/issues/AlsatPardakht/AlsatIPGDesktopExample.svg)](https://github.com/AlsatPardakht/AlsatIPGDesktopExample/issues)\n[![GitHub Pull Requests](https://img.shields.io/github/issues-pr/AlsatPardakht/AlsatIPGDesktopExample.svg)](https://github.com/AlsatPardakht/AlsatIPGDesktopExample/pulls)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](/LICENSE)\n\n\u003c/div\u003e\n\n---\n\n\u003cdiv dir=\"rtl\"\u003e\n\n\u003cp align=\"center\"\u003e\nیک مثال ساده از نحوه استفاده کردن کتابخانه \u003ca href=\"https://github.com/AlsatPardakht/AlsatIPGDesktop\"\u003eAlsatIPGDesktop\u003c/a\u003e در پروژه های Desktop\n    \u003cbr\u003e \n\u003c/p\u003e\n\n\n\n## 📝 فهرست\n\n- [درباره](#about)\n- [نحوه استفاده](#usage)\n- [ساخته شده با استفاده از](#built_using)\n\n## 🧐 درباره \u003ca name = \"about\"\u003e\u003c/a\u003e\n\u003cp dir=\"rtl\"\u003e\nدر این پروژه از کتابخانه \u003ca href=\"https://github.com/AlsatPardakht/AlsatIPGDesktop\"\u003eAlsatIPGDesktop\u003c/a\u003e برای پرداخت صورت حساب به صورت اینترنتی استفاده شده است .\n\u003cbr\u003e\nبرای مطالعه بیشتر در مورد api مستقیم IPG آلسات پرداخت می توانید به لینک زیر مراجعه کنید :\n\u003c/p\u003e\n\u003ca href=\"https://www.alsatpardakht.com/TechnicalDocumentation/191\"\u003e🌐 مستندات فنی IPG های مستقیم آلسات پرداخت\u003c/a\u003e\u003cbr\u003e\nاین پروژه با استفاده از زبان برنامه نویسی کاتلین و جاوا نوشته شده است که می توانید از سورس کد های آن استفاده کنید .\n\n## 🎈 نحوه استفاده \u003ca name=\"usage\"\u003e\u003c/a\u003e\nپس از این که مراحل \u003ca href=\"https://github.com/AlsatPardakht/AlsatIPGDesktop#-%D8%B4%D8%B1%D9%88%D8%B9-%D8%A8%D9%87-%DA%A9%D8%A7%D8%B1-\"\u003eشروع به کار\u003c/a\u003e کتابخانه\n\u003ca href=\"https://github.com/AlsatPardakht/AlsatIPGDesktop\"\u003eAlsatIPGDesktop\u003c/a\u003e\nرا انجام دادید می توانید مراحل استفاده از کتابخانه که در ادامه آورده شده را انجام بدهید .\n\u003cbr\u003e\n\n### مرحله اول : ساختن نمونه از کلاس AlsatIPG\n\nبا استفاده از دستور زیر می توانید یک نمونه از کلاس AlsatIPG بسازید و با کمک این نمونه کار های پرداخت را انجام دهید :\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```Kotlin\nprivate val alsatIPG = AlsatIPG.getInstance(httpLogging = false)\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nprivate AlsatIPG alsatIPG = AlsatIPG.getInstance(false);\n```\n\n\u003c/details\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nمقدار false ورودی تابع getInstance به این منظور است که اطلاعات درخواست های http در  Logcat چاپ نشود (در زمان انتشار پروژه باید این مقدار false باشد ولی در هنگام debug می تواند  true باشد) \n\n\u003cbr\u003e\n\n### مرحله دوم : پیاده سازی observer ها\nدر این مرحله کافی است از LiveData های PaymentSignStatus و PaymentValidationStatus را observe کنید :\n\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```kotlin\nalsatIPG.paymentSignStatus.observeForever { paymentSignResult -\u003e\n    \n}\n\nalsatIPG.paymentValidationStatus.observeForever { paymentValidationResult -\u003e\n    \n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nalsatIPG.getPaymentSignStatus().observeForever(new Observer\u003cPaymentSignResult\u003e() {\n    @Override\n    public void onChanged(PaymentSignResult paymentSignResult) {\n        \n    }\n});\n\nalsatIPG.getPaymentValidationStatus().observeForever(new Observer\u003cPaymentValidationResult\u003e() {\n    @Override\n    public void onChanged(PaymentValidationResult paymentValidationResult) {\n        \n    }\n});\n```\n\n\u003c/details\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\nاین دو LiveData نتیجه sign شدن پرداخت و validation پرداخت را به شما بر می گرداند .\n\nدقت کنید Observer ها به صورت خودکار حذف نمی شوند و باید به صورت دستی وقتی دیگر احتیاجی به آنها ندارید حذف شوند :\n\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```kotlin\nalsatIPG.paymentSignStatus.removeAllObservers()\nalsatIPG.paymentValidationStatus.removeAllObservers()\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nalsatIPG.getPaymentSignStatus().removeAllObservers();\nalsatIPG.getPaymentValidationStatus().removeAllObservers();\n```\n\n\u003c/details\u003e\n\u003cbr\u003e\u003cbr\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\n\n### مرحله سوم : sign کردن پرداخت\nبرای شروع sign پرداخت کافی است با کمک تابع های signMostaghim یا signVaset موجود در کتابخانه این کار  را انجام دهید :\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```Kotlin\nval paymentType = PaymentType.Mostaghim\nwhen (paymentType) {\n    PaymentType.Mostaghim -\u003e alsatIPG.signMostaghim(\n        Api = API,\n        Amount = 10_000,\n        InvoiceNumber = \"123456\",\n        RedirectAddress = \"http://www.example.com/some_path\"\n    )\n    PaymentType.Vaset -\u003e alsatIPG.signVaset(\n        Api = API,\n        Amount = 20_000,\n        RedirectAddress = \"http://www.example.com/some_path\",\n        Tashim = emptyList(),\n        InvoiceNumber = \"123456\"\n    )\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nPaymentType paymentType = Mostaghim;\nswitch (paymentType) {\n    case Mostaghim: {\n        alsatIPG.signMostaghim(\n                10_000,//Amount\n                API,//Api\n                \"123\",//InvoiceNumber\n                \"http://eample.com\"//RedirectAddress\n        );\n        break;\n    }\n    case Vaset: {\n        alsatIPG.signVaset(\n                20_000,//Amount\n                API,//Api\n                \"http://eample.com\",//RedirectAddress\n                \"123\",//InvoiceNumber\n                new ArrayList\u003cTashimModel\u003e()//Tashim\n        );\n        break;\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\n\n- مقدار paymentType می تواند با توجه به نیاز شما PaymentType.Mostaghim یا PaymentType.Vaset باشد .\n\n- دقت کنید که مثال بالا بصورت دستی نوع پرداخت را وارد کرده  (شما می توانید با توجه به نیاز خود از یکی یا  هر دو حالت پرداخت به صورت داینامیک استفاده کنید)\n\n- مقدار API همان کلید دریافتی شما در وب سایت آلسات پرداخت می باشد که برای دریافت آن ابتدا باید در وب سایت ثبت نام کنید و پس از مراحل احراز هویت این کلید به شما داده می شود .\n\n- مقدار Amount همان مبلغ قالب پرداخت به ریال است .\n\n- مقدار InvoiceNumber همان شماره سفارش شما است .\n\n- مقدار RedirectAddress همان آدرس دیپ لینک به اکتیویتی شماست که در فایل AndroidManifest.xml وارد کردید .\n\n- مقدار Tashim لیست کسانی است  که مبلغ پرداختی به حساب آنها واریز خواهد شد (پرداخت بصورت واسط)\n\nپس از فراخوانی تابع sign نتایج این فراخوانی از طریق paymentSignStatus که observe کرده بودید در دسترس است :\n\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```Kotlin\nalsatIPG.paymentSignStatus.observeForever { paymentSignResult -\u003e\n    when {\n        paymentSignResult.isSuccessful -\u003e {\n            println(\"successful\")\n            println(paymentSignResult)\n\n            try {\n                if (Desktop.isDesktopSupported() \u0026\u0026\n                    Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)\n                ) {\n                    Desktop.getDesktop().browse(URI(paymentSignResult.url!!))\n                }\n            } catch (e: Exception) {\n                e.printStackTrace()\n            }\n\n            println(\"\u003e\u003e validation \u003c\u003c\")\n            print(\"enter tref : \")\n            val tref = readln()\n            print(\"enter iN : \")\n            val iN = readln()\n            print(\"enter iD : \")\n            val iD = readln()\n            print(\"enter PayId : \")\n            val PayId = readln()\n\n            testValidation(tref = tref, iN = iN, iD = iD, PayId = PayId)\n            readln()\n        }\n        paymentSignResult.isLoading -\u003e {\n            println(\"loading\")\n        }\n        else -\u003e {\n            println(\"error : \" + paymentSignResult.error?.message)\n        }\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nalsatIPG.getPaymentSignStatus().observeForever(new Observer\u003cPaymentSignResult\u003e() {\n    @Override\n    public void onChanged(PaymentSignResult paymentSignResult) {\n        if (paymentSignResult.isLoading()) {\n            System.out.println(\"loading\");\n        } else if (paymentSignResult.isSuccessful()) {\n            System.out.println(\"successful\");\n            System.out.println(paymentSignResult);\n\n            try {\n                if (\n                    Desktop.isDesktopSupported() \u0026\u0026\n                    Desktop.getDesktop().isSupported(Desktop.Action.BROWSE) \u0026\u0026\n                    paymentSignResult.getUrl() != null\n                ) {\n                    Desktop.getDesktop().browse(new URI(paymentSignResult.getUrl()));\n                }\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n\n            System.out.println(\"\u003e\u003e validation \u003c\u003c\");\n            System.out.print(\"enter tref : \");\n            String tref = scanner.nextLine();\n            System.out.print(\"enter iN : \");\n            String iN = scanner.nextLine();\n            System.out.print(\"enter iD : \");\n            String iD = scanner.nextLine();\n            System.out.print(\"enter PayId : \");\n            String PayId = scanner.nextLine();\n\n            testValidation(tref, iN, iD, PayId);\n            scanner.nextLine();\n        } else {\n            if (paymentSignResult.getError() != null)\n                System.out.println(\"error : \" + paymentSignResult.getError().getMessage());\n        }\n    }\n});\n```\n\n\u003c/details\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\n\nاین observer وضعیت های موفق بودن یا لودینگ یا ارور تابع signMostaghim و یا signVaset را به شما تحویل می دهد .\n\nهمچنین می توانید از paymentSignStatusAsFlow بجای paymentSignStatus استفاده کنید که وضعیت sign را بصورت Flow به شما تحویل می دهد .(فقط برای Kotiln این امکان وجود دارد)\n\u003cbr\u003e\nدقت کنید در زمان موفق بودن sign پرداخت شما باید با استفاده از url موجود در نتیجه یک صفحه وب برای هدایت شدن کاربر به صفحه پرداخت شاپرک باز کنید ( کد داخل بخش try و catch برای باز کردن یک صفحه وب به منظور وارد کردن اطلاعات حساب و انجام پرداخت می باشد )\n\u003cbr\u003e\n\u003cbr\u003e\u003cbr\u003e\n\n### مرحله چهارم : validation کردن پرداخت\n\nبرای این که بتوانید برای پرداخت validation انجام بدهید کافی است تابع validationMostaghim یا validationVaset را فراخوانی کنید :\n\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```Kotlin\n//val data = URI(\"http://eample.com/?tref=637829347727645295\u0026iN=123\u0026iD=2022/03/15%2009:52:54\")\nwhen (paymentType) {\n    PaymentType.Mostaghim -\u003e alsatIPG.validationMostaghim(\n        Api = API,\n//      data = data\n        tref = tref,\n        iN = iN,\n        iD = iD,\n        PayId = PayId\n    )\n    PaymentType.Vaset -\u003e alsatIPG.validationVaset(\n        Api = API,\n//      data = data\n        tref = tref,\n        iN = iN,\n        iD = iD,\n        PayId = PayId\n    )\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\n//URI data = URI(\"http://eample.com/?tref=637829347727645295\u0026iN=123\u0026iD=2022/03/15%2009:52:54\")\nswitch (paymentType) {\n    case Mostaghim: {\n        alsatIPG.validationMostaghim(\n                API,//Api\n//              data//data\n                tref,//tref\n                iN,//iN\n                iD,//iD\n                PayId//PayId\n        );\n        break;\n    }\n    case Vaset: {\n        alsatIPG.validationVaset(\n                API,//Api\n//              data//data\n                tref,//tref\n                iN,//iN\n                iD,//iD\n                PayId//PayId\n        );\n        break;\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\n\n- مقدار paymentType می تواند با توجه به نیاز شما PaymentType.Mostaghim یا PaymentType.Vaset باشد .\n\n- دقت کنید که مثال بالا بصورت دستی نوع پرداخت را وارد کرده  (شما می توانید با توجه به نیاز خود از یکی یا  هر دو حالت پرداخت به صورت داینامیک استفاده کنید)\n\n- مقدار API همان کلید دریافتی شما در وب سایت آلسات پرداخت می باشد .\n\n- مقدار data همان URI هست که از سمت شاپرک به RedirectAddress شما بازگشت داده می شود و تابع validationMostaghim یا validationVaset با  استفاده از این اطلاعات معتبر بودن پرداخت را برسی می کند (در مثال بالا یک نمونه از این URI نمایش داده شده البته می توانید مستقیما مقدار های tref  و iN و iD و PayId را به جای data به تابع بدهید)\n\n\u003cbr\u003e\nپس از آن که کاربر پرداخت را به درستی انجام داد یا به هر دلیلی موفق به پرداخت نشد شاپرک کاربر را به آدرس RedirectAddress که در زمان sign پرداخت وارد کرده بودید هدایت می کند و سپس شما می توانید اطلاعات پرداخت را در RedirectAddress دریافت کنید و سپس به کاربر خود بفرستید و با تابع validationMostaghim یا validationVaset می توانید validation انجام بدهید .\n\u003cbr\u003e\nپس از فراخوانی تابع validation نتایج این فراخوانی از طریق paymentValidationStatus که observe کرده بودید در دسترس است :\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```Kotlin\nalsatIPG.paymentValidationStatus.observeForever { paymentValidationResult -\u003e\n    when {\n        paymentValidationResult.isSuccessful -\u003e {\n            println(\"successful\")\n            println(\"payment Validation Success data = ${paymentValidationResult.data}\")\n            if (\n                (paymentValidationResult.data?.PSP?.IsSuccess == true) \u0026\u0026\n                (paymentValidationResult.data?.VERIFY?.IsSuccess == true)\n            ) {\n                println(\"money transferred\")\n            } else {\n                println(\"money has not been transferred\")\n            }\n        }\n        paymentValidationResult.isLoading -\u003e {\n            println(\"loading\")\n        }\n        else -\u003e {\n            println(\"error : \" + paymentValidationResult.error?.message)\n        }\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nalsatIPG.getPaymentValidationStatus().observeForever(new Observer\u003cPaymentValidationResult\u003e() {\n    @Override\n    public void onChanged(PaymentValidationResult paymentValidationResult) {\n        if (paymentValidationResult.isSuccessful()) {\n            System.out.println(\"successful\");\n            System.out.println(\"payment Validation Success data = \" + paymentValidationResult.getData());\n            if (\n                (paymentValidationResult.getData() != null) \u0026\u0026\n                    (paymentValidationResult.getData().getPSP().getIsSuccess()) \u0026\u0026\n                    (paymentValidationResult.getData().getVERIFY().getIsSuccess())\n            ) {\n                System.out.println(\"money transferred\");\n            } else {\n                System.out.println(\"money has not been transferred\");\n            }\n        } else if (paymentValidationResult.isLoading()) {\n            System.out.println(\"loading\");\n        } else if (paymentValidationResult.getError() != null) {\n            System.out.println(\"error : \" + paymentValidationResult.getError().getMessage());\n        }\n    }\n});\n```\n\n\u003c/details\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\n\nاین observer وضعیت های موفق بودن یا لودینگ یا ارور تابع validationMostaghim یا validationVaset را به شما تحویل می دهد .\n\nهمچنین می توانید از paymentValidationStatusAsFlow بجای paymentValidationStatus برای گرفتن وضعیت valiadation استفاده کنید که وضعیت را بصورت Flow به شما تحویل می دهد(فقط برای Kotiln این امکان وجود دارد)\n\u003cbr\u003e\nهمچنین در زمانی که پرداخت موفق بوده فیلد data موجود در نتیجه اطلاعاتی در مورد پرداخت را به شما می دهد که می توانید از آن استفاده کنید .\n\n\u003cbr\u003e\n\n### ⚠️ توجه 1 :\nدقت کنید که موفق بودن نتیجه تابع validation به این معنی نیست که پول از حساب کاربر به حساب شما انتقال یافته ! برای کاملا مطمئن شدن از انتقال پول حتما از دستور زیر برای برسی استفاده کنید :\n\n\u003c/div\u003e\n\n\u003cdetails open\u003e\n    \u003csummary\u003eKotlin\u003c/summary\u003e\n\n```Kotlin\nif (\n    (paymentValidationResult.data?.PSP?.IsSuccess == true) \u0026\u0026\n    (paymentValidationResult.data?.VERIFY?.IsSuccess == true)\n) {\n    log(\"money transferred\")\n} else {\n    log(\"money has not been transferred\")\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eJava\u003c/summary\u003e\n\n```java\nif (\n    (paymentValidationResult.getData() != null) \u0026\u0026\n        (paymentValidationResult.getData().getPSP().getIsSuccess()) \u0026\u0026\n        (paymentValidationResult.getData().getVERIFY().getIsSuccess())\n) {\n    System.out.println(\"money transferred\");\n} else {\n    System.out.println(\"money has not been transferred\");\n}\n```\n\n\u003c/details\u003e\n\n\u003cdiv dir=\"rtl\"\u003e\n\nاطلاعات موجود در فیلد data شامل :\n- شماره فاکتور ( PayId )\n- مبلغ پرداختی به ریال ( PSP.Amount )\n- تاریخ فاکتور ( PSP.InvoiceDate )\n- شماره فاکتور ( PSP.InvoiceNumber )\n- موفقیت پرداخت در سمت بانک ( PSP.IsSuccess )\n- کد بازرگان ( PSP.MerchantCode )\n- پیام سمت بانک ( PSP.Message )\n- شماره مرجع ( PSP.ReferenceNumber )\n- کد ترمینال ( PSP.TerminalCode )\n- شماره ردیابی ( PSP.TraceNumber )\n- تاریخ معامله ( PSP.TransactionDate )\n- شناسه مرجع تراکنش ( PSP.TransactionReferenceID )\n- شماره کارت هش شده پرداخت کننده ( PSP.TrxHashedCardNumber )\n- شماره کارت ماسک پرداخت کننده ( PSP.TrxMaskedCardNumber )\n- شماره کارت هش شده پرداخت کننده ( VERIFY.HashedCardNumber )\n- موفقیت انجام عملیات پرداخت ( VERIFY.IsSuccess )\n- شماره کارت ماسک پرداخت کننده ( VERIFY.MaskedCardNumber )\n- پیام عملیات پرداخت ( VERIFY.Message )\n- شماره مرجع شاپرک ( VERIFY.ShaparakRefNumber )\n\n### ⚠️ توجه ۲ :\nدراین مثال برای سادگی کار فرایند  validation سمت پروژه صورت گرفته است .\nتوصیه ما این است که فرایند validation  را سمت سرور خود انجام بدهید و اطلاعات سمت بانک را به پروژه نفرستید که امنیت پروژه و پرداخت شما را خیلی بالا خواهد برد .\n\u003cbr\u003e\nبرای این کار کافی است در زمان sign کردن پرداخت در ارگیومنت RedirectAddress آدرس وب سایت خود برای validation را وارد کنید  . در این صورت شاپرک اطلاعات validation را به آدرس وارد شده خواهد فرستاد و شما می توانید با استفاده از\napi آلسات پرداخت در وب سایت خود اعتبار پرداخت را برسی کنید و بعد برسی اعتبار پرداخت خرید کاربر را تایید یا رد کنید و سپس با استفاده یک api در وبسایت خود این صحت اعتبار را در پروژه Desktop دریافت کنید .\n\u003cbr\u003e\nدر صورت استفاده از روش validation سمت سرور کاربر (هکر) نمی تواند ادعا کند پرداخت موفق  داشته (چون دسترسی به validation سمت سرور شما را ندارد) در حالی که در روش معمولی کاربر(هکر) ممکن است با ایجاد تغییراتی در پروژه شما یا با روش های دیگر موفق شود این کار را انجام دهد .\n\n\u003cbr\u003e\nسورس کد کامل  در فایل های زیر آورده شده است :\n\u003cbr\u003e\n\n- \u003ca href=\"https://github.com/AlsatPardakht/AlsatIPGDesktopExample/blob/master/src/main/kotlin/com/alsatpardakht/Main.kt\"\u003eMain.kt\u003c/a\u003e\n- \u003ca href=\"https://github.com/AlsatPardakht/AlsatIPGDesktopExample/blob/master/src/main/java/com/alsatpardakht/Main.java\"\u003eMain.java\u003c/a\u003e\n\n## ⛏️ ساخته شده با استفاده از  \u003ca name = \"built_using\"\u003e\u003c/a\u003e\n\n\u003c/div\u003e\n\n\n- [Kotlin](https://kotlinlang.org/) - programming language\n- [Java](https://www.java.com/en/) - programming language\n- [AlsatIPGDesktop](https://github.com/AlsatPardakht/AlsatIPGDesktop) - payment client library\n- [AlsatIPGCore](https://github.com/AlsatPardakht/AlsatIPGCore) - payment core library\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falsatpardakht%2Falsatipgdesktopexample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falsatpardakht%2Falsatipgdesktopexample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falsatpardakht%2Falsatipgdesktopexample/lists"}