index.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>ZPAY - Instant UPI Links</title>
  7. <!-- Tailwind CSS -->
  8. <script src="https://cdn.tailwindcss.com"></script>
  9. <!-- QR Code Library -->
  10. <script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
  11. <style>
  12. @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;600;700&display=swap');
  13. body { font-family: 'Plus Jakarta Sans', sans-serif; }
  14. .fade-in { animation: fadeIn 0.5s ease-in; }
  15. @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
  16. /* Custom Scrollbar for cleaner look */
  17. ::-webkit-scrollbar { width: 8px; }
  18. ::-webkit-scrollbar-track { background: #f1f5f9; }
  19. ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }
  20. ::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
  21. </style>
  22. </head>
  23. <body class="bg-slate-50 text-slate-800 min-h-screen flex flex-col">
  24. <!-- Navbar -->
  25. <nav class="bg-white border-b border-slate-200 sticky top-0 z-50 backdrop-blur-md bg-white/90">
  26. <div class="max-w-5xl mx-auto px-4 py-4 flex items-center justify-between">
  27. <div class="flex items-center space-x-2 cursor-pointer" onclick="window.location.href=window.location.pathname">
  28. <div class="bg-indigo-600 text-white p-1 rounded-lg">
  29. <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
  30. </div>
  31. <span class="text-2xl font-bold tracking-tight text-slate-900">ZPAY</span>
  32. </div>
  33. <button onclick="resetApp()" class="text-sm font-medium text-slate-500 hover:text-indigo-600 transition">
  34. New QR
  35. </button>
  36. </div>
  37. </nav>
  38. <!-- Main Content -->
  39. <main class="max-w-5xl mx-auto px-4 py-10 flex-grow">
  40. <!-- Header -->
  41. <div class="text-center mb-10" id="mainHeader">
  42. <h1 class="text-3xl md:text-5xl font-bold mb-4 text-slate-900">Payments made simple.</h1>
  43. <p class="text-slate-500 text-lg">Generate shareable smart links for your UPI ID.</p>
  44. </div>
  45. <div class="grid md:grid-cols-2 gap-8 items-start">
  46. <!-- Left Column: Input Form -->
  47. <div class="bg-white p-6 md:p-8 rounded-3xl shadow-xl shadow-slate-200/50 border border-slate-100 relative overflow-hidden">
  48. <div class="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500"></div>
  49. <h2 class="text-xl font-bold mb-6 text-slate-800">Payment Details</h2>
  50. <div class="space-y-5">
  51. <!-- Payee Name -->
  52. <div>
  53. <label class="block text-xs font-semibold text-slate-500 uppercase tracking-wider mb-1">Payee Name <span class="text-indigo-500">*</span></label>
  54. <input type="text" id="upiName" placeholder="e.g. Rahul Sharma"
  55. class="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 outline-none transition font-medium">
  56. </div>
  57. <!-- UPI ID -->
  58. <div>
  59. <label class="block text-xs font-semibold text-slate-500 uppercase tracking-wider mb-1">UPI ID / VPA <span class="text-indigo-500">*</span></label>
  60. <input type="text" id="upiId" placeholder="e.g. rahul@oksbi"
  61. class="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 outline-none transition font-medium">
  62. <p class="text-xs text-red-500 mt-1 hidden font-medium" id="upiError">Invalid UPI ID format.</p>
  63. </div>
  64. <!-- Amount & Note Group -->
  65. <div class="grid grid-cols-2 gap-4">
  66. <div>
  67. <label class="block text-xs font-semibold text-slate-500 uppercase tracking-wider mb-1">Amount (₹)</label>
  68. <input type="number" id="upiAmount" placeholder="0.00"
  69. class="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 outline-none transition font-medium">
  70. </div>
  71. <div>
  72. <label class="block text-xs font-semibold text-slate-500 uppercase tracking-wider mb-1">Note</label>
  73. <input type="text" id="upiNote" placeholder="Bill / Gift"
  74. class="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 outline-none transition font-medium">
  75. </div>
  76. </div>
  77. <button onclick="generateZPayLink()"
  78. class="w-full bg-slate-900 hover:bg-indigo-600 text-white font-bold py-4 rounded-xl transition-all duration-300 shadow-lg hover:shadow-indigo-500/30 transform hover:-translate-y-1">
  79. Generate ZPAY Link
  80. </button>
  81. </div>
  82. </div>
  83. <!-- Right Column: Results -->
  84. <div class="bg-white p-6 md:p-8 rounded-3xl shadow-xl shadow-slate-200/50 border border-slate-100 relative overflow-hidden min-h-[400px] flex flex-col justify-center">
  85. <!-- Placeholder State -->
  86. <div id="placeholder-state" class="flex flex-col items-center justify-center text-center">
  87. <div class="w-20 h-20 bg-slate-50 rounded-full flex items-center justify-center mb-4">
  88. <svg class="w-10 h-10 text-slate-300" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M16 20h4M4 12h4m12 0h.01M5 8h2a1 1 0 001-1V5a1 1 0 00-1-1H5a1 1 0 00-1 1v2a1 1 0 001 1zm12 0h2a1 1 0 001-1V5a1 1 0 00-1-1h-2a1 1 0 00-1 1v2a1 1 0 001 1zM5 20h2a1 1 0 001-1v-2a1 1 0 00-1-1H5a1 1 0 00-1 1v2a1 1 0 001 1z"></path></svg>
  89. </div>
  90. <h3 class="text-lg font-semibold text-slate-800">No Link Generated Yet</h3>
  91. <p class="text-slate-500 text-sm mt-1 max-w-xs">Enter your payment details on the left to create a unique QR and smart link.</p>
  92. </div>
  93. <!-- Result State -->
  94. <div id="result-state" class="hidden fade-in w-full">
  95. <div class="text-center mb-6">
  96. <span class="inline-block px-3 py-1 bg-green-100 text-green-700 text-xs font-bold uppercase rounded-full tracking-wide">Ready to Pay</span>
  97. <h2 class="text-2xl font-bold mt-2 text-slate-900" id="displayPayee">Payee Name</h2>
  98. <p class="text-2xl font-light text-slate-500" id="displayAmount">₹0</p>
  99. </div>
  100. <!-- QR Container -->
  101. <div class="flex justify-center mb-8">
  102. <div class="p-4 bg-white rounded-2xl border-2 border-dashed border-indigo-200 shadow-sm relative group">
  103. <div id="qrcode"></div>
  104. <!-- Logo Overlay on QR (Optional visual flair) -->
  105. <div class="absolute inset-0 flex items-center justify-center pointer-events-none opacity-10">
  106. <svg class="w-12 h-12" fill="currentColor" viewBox="0 0 24 24"><path d="M13 10V3L4 14h7v7l9-11h-7z"/></svg>
  107. </div>
  108. </div>
  109. </div>
  110. <!-- Shareable Link -->
  111. <div class="bg-slate-50 rounded-xl p-4 border border-slate-200">
  112. <label class="block text-xs font-semibold text-slate-500 uppercase tracking-wider mb-2">Unique Smart Link</label>
  113. <div class="flex items-center gap-2">
  114. <input type="text" id="shareableLink" readonly
  115. class="w-full bg-white border border-slate-200 text-slate-600 text-sm rounded-lg px-3 py-2 focus:outline-none select-all">
  116. <button onclick="copyLink()"
  117. class="bg-indigo-600 hover:bg-indigo-700 text-white px-4 py-2 rounded-lg text-sm font-medium transition whitespace-nowrap">
  118. Copy
  119. </button>
  120. </div>
  121. <p id="copyFeedback" class="text-center text-green-600 text-xs font-bold mt-2 opacity-0 transition-opacity">Copied to clipboard!</p>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. <div class="mt-12 text-center">
  127. <p class="text-slate-400 text-sm">Build by Parv Ashwani. ZPAY runs 100% in your browser. No data is stored.</p>
  128. </div>
  129. </main>
  130. <!-- Application Logic -->
  131. <script>
  132. const _0x35e779=_0x34b2;function _0x34b2(_0x2cbe00,_0x180056){_0x2cbe00=_0x2cbe00-0xb6;const _0x77a8d9=_0x77a8();let _0x34b2b5=_0x77a8d9[_0x2cbe00];return _0x34b2b5;}function _0x77a8(){const _0x170da6=['pathname','731353oUpHGT','then','opacity','select','includes','smooth','innerText','40XsDCXY','11PZJbDF','trim','shareableLink','addEventListener','hidden','remove','ring-2','load','64550kXrUOB','upiAmount','displayPayee','&tn=','copyFeedback','location','clipboard','upiName','title','placeholder-state','Enter\x20Amount','stringify','Invalid\x20Link\x20Data','classList','hash','ring-red-500','scrollIntoView','29886130bWbfbr','4880745iEAIcZ','45bZkvOX','getElementById','pushState','114JAFtrb','upiNote','&am=','3889734LSwYvE','12357954WNdkCv','add','value','103712Uzzfec','result-state','CorrectLevel','setSelectionRange','style','innerWidth','upiId','#ffffff'];_0x77a8=function(){return _0x170da6;};return _0x77a8();}(function(_0x3619f4,_0x54717d){const _0x3d445e=_0x34b2,_0x5e34cd=_0x3619f4();while(!![]){try{const _0x102785=-parseInt(_0x3d445e(0xca))/0x1*(-parseInt(_0x3d445e(0xb7))/0x2)+parseInt(_0x3d445e(0xcd))/0x3*(-parseInt(_0x3d445e(0xd4))/0x4)+-parseInt(_0x3d445e(0xc9))/0x5+-parseInt(_0x3d445e(0xd0))/0x6+parseInt(_0x3d445e(0xdd))/0x7*(parseInt(_0x3d445e(0xe4))/0x8)+-parseInt(_0x3d445e(0xd1))/0x9+-parseInt(_0x3d445e(0xc8))/0xa*(-parseInt(_0x3d445e(0xe5))/0xb);if(_0x102785===_0x54717d)break;else _0x5e34cd['push'](_0x5e34cd['shift']());}catch(_0x5651d5){_0x5e34cd['push'](_0x5e34cd['shift']());}}}(_0x77a8,0xef65f),window[_0x35e779(0xe8)](_0x35e779(0xb6),()=>{const _0x4ae6da=_0x35e779;if(window['location'][_0x4ae6da(0xc5)])try{const _0x55ad2d=window[_0x4ae6da(0xbc)][_0x4ae6da(0xc5)]['substring'](0x1),_0x1d773a=JSON['parse'](decodeURIComponent(escape(atob(_0x55ad2d))));document[_0x4ae6da(0xcb)](_0x4ae6da(0xbe))[_0x4ae6da(0xd3)]=_0x1d773a['pn']||'',document[_0x4ae6da(0xcb)](_0x4ae6da(0xda))[_0x4ae6da(0xd3)]=_0x1d773a['pa']||'',document[_0x4ae6da(0xcb)](_0x4ae6da(0xb8))[_0x4ae6da(0xd3)]=_0x1d773a['am']||'',document[_0x4ae6da(0xcb)]('upiNote')[_0x4ae6da(0xd3)]=_0x1d773a['tn']||'',generateZPayLink(!![]);}catch(_0x596a20){console['error'](_0x4ae6da(0xc3),_0x596a20),history[_0x4ae6da(0xcc)]('',document['title'],window['location'][_0x4ae6da(0xdc)]);}}));function generateZPayLink(_0x4e6b65=![]){const _0x6d2e0b=_0x35e779,_0x3fa0e4=document['getElementById']('upiName')[_0x6d2e0b(0xd3)][_0x6d2e0b(0xe6)](),_0x4a3dba=document[_0x6d2e0b(0xcb)](_0x6d2e0b(0xda))[_0x6d2e0b(0xd3)][_0x6d2e0b(0xe6)](),_0x310d11=document['getElementById'](_0x6d2e0b(0xb8))[_0x6d2e0b(0xd3)][_0x6d2e0b(0xe6)](),_0x927945=document['getElementById'](_0x6d2e0b(0xce))[_0x6d2e0b(0xd3)][_0x6d2e0b(0xe6)](),_0x2dfa97=document[_0x6d2e0b(0xcb)]('upiError');if(!_0x4a3dba||!_0x4a3dba[_0x6d2e0b(0xe1)]('@')){_0x2dfa97['classList']['remove'](_0x6d2e0b(0xe9)),document[_0x6d2e0b(0xcb)]('upiId')['classList'][_0x6d2e0b(0xd2)](_0x6d2e0b(0xeb),_0x6d2e0b(0xc6)),setTimeout(()=>document[_0x6d2e0b(0xcb)](_0x6d2e0b(0xda))[_0x6d2e0b(0xc4)][_0x6d2e0b(0xea)](_0x6d2e0b(0xeb),_0x6d2e0b(0xc6)),0x1f4);return;}if(!_0x3fa0e4){alert('Please\x20enter\x20a\x20Payee\x20Name');return;}_0x2dfa97[_0x6d2e0b(0xc4)][_0x6d2e0b(0xd2)](_0x6d2e0b(0xe9));let _0x3a3e05='upi://pay?pa='+_0x4a3dba+'&pn='+encodeURIComponent(_0x3fa0e4)+'&cu=INR';if(_0x310d11)_0x3a3e05+=_0x6d2e0b(0xcf)+_0x310d11;if(_0x927945)_0x3a3e05+=_0x6d2e0b(0xba)+encodeURIComponent(_0x927945);const _0x53a1d4={'pa':_0x4a3dba,'pn':_0x3fa0e4,'am':_0x310d11,'tn':_0x927945},_0x5cb30d=btoa(unescape(encodeURIComponent(JSON[_0x6d2e0b(0xc2)](_0x53a1d4)))),_0x4dcbb1=''+window[_0x6d2e0b(0xbc)]['origin']+window[_0x6d2e0b(0xbc)][_0x6d2e0b(0xdc)]+'#'+_0x5cb30d;document[_0x6d2e0b(0xcb)](_0x6d2e0b(0xb9))[_0x6d2e0b(0xe3)]=_0x3fa0e4,document[_0x6d2e0b(0xcb)]('displayAmount')[_0x6d2e0b(0xe3)]=_0x310d11?'₹'+_0x310d11:_0x6d2e0b(0xc1),document[_0x6d2e0b(0xcb)](_0x6d2e0b(0xe7))[_0x6d2e0b(0xd3)]=_0x4dcbb1,document[_0x6d2e0b(0xcb)](_0x6d2e0b(0xc0))['classList'][_0x6d2e0b(0xd2)]('hidden'),document[_0x6d2e0b(0xcb)](_0x6d2e0b(0xd5))[_0x6d2e0b(0xc4)]['remove'](_0x6d2e0b(0xe9));const _0x582a2a=document[_0x6d2e0b(0xcb)]('qrcode');_0x582a2a['innerHTML']='',new QRCode(_0x582a2a,{'text':_0x3a3e05,'width':0xb4,'height':0xb4,'colorDark':'#1e293b','colorLight':_0x6d2e0b(0xdb),'correctLevel':QRCode[_0x6d2e0b(0xd6)]['M']}),!_0x4e6b65&&window[_0x6d2e0b(0xd9)]<0x300&&document[_0x6d2e0b(0xcb)](_0x6d2e0b(0xd5))[_0x6d2e0b(0xc7)]({'behavior':_0x6d2e0b(0xe2)});}function copyLink(){const _0x2bfc6f=_0x35e779,_0x331053=document[_0x2bfc6f(0xcb)](_0x2bfc6f(0xe7));_0x331053[_0x2bfc6f(0xe0)](),_0x331053[_0x2bfc6f(0xd7)](0x0,0x1869f),navigator[_0x2bfc6f(0xbd)]['writeText'](_0x331053['value'])[_0x2bfc6f(0xde)](()=>{const _0x58da79=_0x2bfc6f,_0x5990e2=document['getElementById'](_0x58da79(0xbb));_0x5990e2['style'][_0x58da79(0xdf)]='1',setTimeout(()=>_0x5990e2[_0x58da79(0xd8)][_0x58da79(0xdf)]='0',0x7d0);});}function resetApp(){const _0x56f0cb=_0x35e779;document['getElementById'](_0x56f0cb(0xbe))[_0x56f0cb(0xd3)]='',document[_0x56f0cb(0xcb)](_0x56f0cb(0xda))[_0x56f0cb(0xd3)]='',document[_0x56f0cb(0xcb)]('upiAmount')[_0x56f0cb(0xd3)]='',document[_0x56f0cb(0xcb)](_0x56f0cb(0xce))[_0x56f0cb(0xd3)]='',history[_0x56f0cb(0xcc)]('',document[_0x56f0cb(0xbf)],window['location']['pathname']),document[_0x56f0cb(0xcb)](_0x56f0cb(0xd5))[_0x56f0cb(0xc4)][_0x56f0cb(0xd2)](_0x56f0cb(0xe9)),document['getElementById'](_0x56f0cb(0xc0))[_0x56f0cb(0xc4)][_0x56f0cb(0xea)](_0x56f0cb(0xe9));}
  133. </script>
  134. </body>
  135. </html>