paymeqr
Version:
Generate custom UPI QR codes and payment links without a backend. Perfect for creators, freelancers, and solo developers.
1 lines • 2.3 kB
JavaScript
const upiIdRegex=/^[a-zA-Z0-9.\-_]{2,256}@[a-zA-Z]{2,64}$/;class PayMeQR{constructor({upiId:e}){if(!e||"string"!=typeof e||!upiIdRegex.test(e.trim()))throw new Error("Invalid or missing UPI ID");this.params={pa:e.trim(),cu:"INR"}}setPayeeName(e){if("string"!=typeof e||e.trim().length<2)throw new Error("Invalid payee name");return this.params.pn=e.trim(),this}setAmount(e){const r=parseFloat(e);if(isNaN(r)||r<=0)throw new Error("Invalid amount");return this.params.am=r.toFixed(2),this}setNote(e){if("string"!=typeof e||e.length>80)throw new Error("Note must be a string up to 80 characters");return this.params.tn=e.trim(),this}#e(){const e=new URLSearchParams;for(const r in this.params){const t=this.params[r];void 0!==t&&""!==t&&e.append(r,t)}return`upi://pay?${e.toString()}`}async createQrCode(){const e=this.#e();if("undefined"!=typeof window)return await this.#r(e);if("function"==typeof require)return await this.#t(e);throw new Error("Unsupported environment for QR generation")}async#t(e){try{const r=require("qrcode");return await r.toDataURL(e)}catch(e){throw new Error("Failed to generate QR code: "+e.message)}}async#o(){return new Promise(((e,r)=>{if("undefined"!=typeof QRCode)return e();const t=document.querySelector('script[src*="qrcode.min.js"]');if(t)return t.addEventListener("load",e),void t.addEventListener("error",(()=>r(new Error("QRCode library failed to load."))));const o=document.createElement("script");o.src="https://cdnjs.cloudflare.com/ajax/libs/qrcode/1.5.1/qrcode.min.js",o.crossOrigin="anonymous",o.onload=e,o.onerror=()=>r(new Error("Failed to load QRCode library from CDN. Please check your connection.")),document.head.appendChild(o)}))}async#r(e){"undefined"==typeof QRCode&&await this.#o();try{const r=await QRCode.toDataURL(e),t=new Image;return t.src=r,t.alt="UPI QR Code",t.loading="lazy",t}catch(e){throw new Error(`Failed to generate QR code: ${e.message}`)}}async getQrCodeBuffer(){const e=this.#e();if("function"!=typeof require)throw new Error("getQrCodeBuffer() is only available in Node.js");try{const r=require("qrcode");return await r.toBuffer(e)}catch(e){throw new Error("Failed to generate QR code buffer: "+e.message)}}}"undefined"!=typeof module&&module.exports&&(module.exports=PayMeQR),"undefined"!=typeof window&&(window.PayMeQR=PayMeQR);