cppay-sdk 0.0.2-beta.28 → 0.0.2-beta.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/vue.cjs CHANGED
@@ -1 +1 @@
1
- const e=require(`./inject-style-CvrNZeWB.cjs`),t=require(`./cppay-DnxPUyM2.cjs`);let n=require(`vue`),r=require(`qrcode`);r=e.r(r);let i=require(`rxjs`),a=require(`rxjs/operators`),o=require(`viem`),s=require(`viem/chains`),ee=require(`@reown/appkit`),te=require(`@reown/appkit-adapter-ethers`);var ne={class:`_cppay-dialog`},re={class:`_cppay-header`},ie={class:`_cppay-title`},c=[`disabled`],ae={class:`_cppay-content`},oe={key:0,style:{"text-align":`center`,padding:`2rem 0`}},se={style:{"font-size":`1.5rem`,"font-weight":`600`,color:`#10b981`,margin:`0 0 0.5rem 0`}},ce={style:{color:`#6b7280`,margin:`0`}},le={key:1},ue={class:`_cppay-section`},de={class:`_cppay-grid`},fe=[`onClick`],pe=[`src`,`alt`],me={class:`_cppay-section`},he={class:`_cppay-grid`},ge=[`onClick`],_e=[`src`,`alt`],ve={class:`_cppay-section`},ye={class:`_cppay-price-box`},be={class:`_cppay-price-row`},xe={class:`_cppay-price-amount`},Se={class:`_cppay-price-main`},Ce={class:`_cppay-price-sub`},we={class:`_cppay-section`},Te=[`disabled`],l={key:2},u={class:`_cppay-qr-container`},d={class:`_cppay-qr-code`},f=[`src`],p={class:`_cppay-section`},m={key:0,class:`_cppay-info-box`},h={class:`_cppay-info-label`},g={class:`_cppay-info-value`},_={class:`_cppay-info-box`},v={class:`_cppay-info-label`},y={class:`_cppay-address-row`},b={key:1,class:`_cppay-info-box`,style:{background:`#fff3cd`,"border-color":`#ffc107`}},x={key:0,class:`_cppay-section`},S=[`disabled`],C={key:1},w={class:`_cppay-btn-container`},T=[`disabled`],E=[`disabled`],D={style:{"text-align":`center`,"margin-top":`8px`,"font-size":`12px`,color:`#666`}},O={class:`_cppay-section`},Ee=[`disabled`],De={class:`_cppay-section`},Oe=[`disabled`],k=(0,n.defineComponent)({__name:`PaymentDialog`,props:{modelValue:{type:Boolean},apikey:{},orderId:{},amount:{},plain:{default:`one-time`},intervalDays:{default:30}},emits:[`update:modelValue`,`success`,`error`],setup(e,{emit:k}){let A=e,j=k,M=new t.t(A.apikey),N=(0,n.ref)(`select`),P=(0,n.ref)(!1),F=(0,n.ref)(!1),I=(0,n.ref)([]),L=(0,n.ref)(),R=(0,n.ref)(),z=(0,n.ref)(null),B=(0,n.ref)(),V=(0,n.ref)(),H=(0,n.ref)(!1),U=(0,n.ref)(),W=(0,n.ref)(null),G,K=(0,n.computed)(()=>I.value.find(e=>e.chain===L.value)),q=(0,n.computed)(()=>K.value?.tokens||[]),J=(0,n.computed)(()=>q.value.find(e=>e.symbol===R.value)),ke=e=>[`USDT`,`USDC`,`BUSD`,`DAI`,`TUSD`,`USDD`,`FDUSD`].includes(e.toUpperCase())?2:6,Ae=(e,t)=>{let n=parseFloat(e);return isNaN(n)?`0`:n.toFixed(t).replace(/\.?0+$/,``)},Y=(0,n.computed)(()=>{if(!R.value||!J.value)return`0`;let e=parseFloat(J.value.price);if(isNaN(e)||e===0)return`0`;let t=ke(R.value);return Ae((parseFloat(A.amount)/e).toFixed(t),t)}),je=()=>{z.value&&(F.value=!0,A.plain===`one-time`?$(z.value.paymentId):A.plain===`subscription`&&$(z.value.subscriptionId))},X=()=>{P.value||F.value||(j(`update:modelValue`,!1),setTimeout(()=>{N.value=`select`,z.value=null},300))},Me=async()=>{try{P.value=!0,I.value=await M.getSupportedChains(),I.value.length>0&&(L.value=I.value[0].chain)}catch(e){j(`error`,e)}finally{P.value=!1}};(0,n.onMounted)(()=>{typeof window<`u`&&!G&&(G=(0,ee.createAppKit)({debug:!1,enableNetworkSwitch:!1,adapters:[new te.EthersAdapter],projectId:`8d2e1854d3f1782e45aa15fbd8938894`,allowUnsupportedChain:!0,networks:[s.mainnet,s.bsc,s.polygon,s.arbitrum,s.optimism,s.base],metadata:{name:`Cppay`,description:`Cppay Payment Gateway`,url:window.location.origin,icons:[`https://cppay.com/icon.png`]},features:{analytics:!1}}),U.value=G.getProvider(`eip155`),V.value=G.getAddress(),G.subscribeAccount(e=>{e.isConnected?V.value=e.address:(V.value=void 0,U.value=void 0)}),G.subscribeProviders(e=>{U.value=e?.eip155}))});let Z=async()=>{try{H.value=!0,G&&await G.open()}catch(e){console.error(`钱包连接失败:`,e),j(`error`,e)}finally{H.value=!1}},Q=async e=>{if(U.value)try{await U.value.request({method:`wallet_switchEthereumChain`,params:[{chainId:`0x${e.toString(16)}`}]})}catch(e){throw e.code===4902?Error(`请在钱包中添加该网络`):e}},Ne=async()=>{if(!(!V.value||!U.value||!z.value||!J.value||!K.value))try{P.value=!0;let e=z.value;await Q(K.value.chainId);let t=(0,o.createWalletClient)({account:V.value,transport:(0,o.custom)(U.value)});if(J.value.address){let n=await t.writeContract({address:J.value.address,abi:[{name:`transfer`,type:`function`,stateMutability:`nonpayable`,inputs:[{name:`to`,type:`address`},{name:`amount`,type:`uint256`}],outputs:[{type:`bool`}]}],functionName:`transfer`,args:[e.receiveAddress,(0,o.parseUnits)(e.paymentAmount,J.value.decimals)],chain:null});console.log(`转账交易哈希:`,n)}else{let n=await t.sendTransaction({to:e.receiveAddress,value:(0,o.parseUnits)(e.paymentAmount,J.value.decimals),chain:null});console.log(`转账交易哈希:`,n)}P.value=!1,F.value=!0,$(e.paymentId)}catch(e){console.error(`钱包支付失败:`,e),j(`error`,e),P.value=!1}},Pe=async()=>{if(!(!V.value||!U.value||!z.value||!J.value||!K.value))try{P.value=!0;let e=z.value;await Q(K.value.chainId);let t=(0,o.createWalletClient)({account:V.value,transport:(0,o.custom)(U.value)});if(!J.value.address)throw Error(`订阅支付不支持原生代币`);let n=await t.writeContract({address:J.value.address,abi:[{name:`approve`,type:`function`,stateMutability:`nonpayable`,inputs:[{name:`spender`,type:`address`},{name:`amount`,type:`uint256`}],outputs:[{type:`bool`}]}],functionName:`approve`,args:[e.receiveAddress,(0,o.parseUnits)(e.paymentAmount,J.value.decimals)],chain:null});console.log(`授权交易哈希:`,n),P.value=!1,F.value=!0,$(e.paymentId)}catch(e){console.error(`钱包授权失败:`,e),j(`error`,e),P.value=!1}},Fe=async()=>{if(!V.value){await Z();return}A.plain===`one-time`?await Ne():A.plain===`subscription`&&await Pe()},Ie=async()=>{if(!(!L.value||!R.value))try{P.value=!0;let e;A.plain===`one-time`?e=await M.createPayment(`one-time`,{paymentChain:L.value,paymentToken:R.value,orderId:A.orderId,amount:Y.value}):A.plain===`subscription`&&(e=await M.createPayment(`subscription`,{paymentChain:L.value,paymentToken:R.value,orderId:A.orderId,amountOfUsd:Y.value,intervalDays:A.intervalDays||30})),z.value={paymentId:e.paymentId||e.subscriptionId,paymentAmount:e.paymentAmount||e.approveAmount,receiveAddress:e.receiveAddress||e.spenderAddress||``};let t=`${L.value.toLowerCase()}:${z.value.receiveAddress}?amount=${z.value.paymentAmount}`;B.value=await r.toDataURL(t,{width:200,margin:2,errorCorrectionLevel:`H`}),N.value=`payment`}catch(e){j(`error`,e)}finally{P.value=!1}},$=e=>{let t=()=>(0,i.defer)(()=>A.plain===`subscription`?M.checkSubscriptionPaymentStatus({subscriptionId:e}):M.checkOnetimePaymentStatus({paymentId:e})).pipe((0,a.timeout)(15e3),(0,a.retry)({count:3,delay:2e3}));W.value?.unsubscribe(),W.value=t().pipe((0,a.expand)(e=>e.status===`pending`?(0,i.timer)(2e3).pipe((0,a.switchMap)(()=>t())):i.EMPTY),(0,a.tap)(e=>{e.status===`expired`&&(F.value=!1),e.status===`paid`&&(F.value=!1,N.value=`success`,j(`success`,e)),e.status===`failed`&&(F.value=!1),e.status===`approved`&&(F.value=!1,N.value=`success`,j(`success`,e))})).subscribe({error:e=>{console.error(`支付状态检查错误:`,e),F.value=!1,j(`error`,e)}})},Le=async()=>{z.value?.receiveAddress&&await navigator.clipboard.writeText(z.value.receiveAddress)};return(0,n.watch)(()=>A.modelValue,e=>{e&&I.value.length===0&&Me()}),(0,n.watch)(L,()=>{q.value.length>0&&(R.value=q.value[0].symbol)}),(0,n.watch)(N,e=>{e===`payment`&&z.value&&$(z.value.paymentId)}),(0,n.onUnmounted)(()=>{W.value?.unsubscribe()}),(t,r)=>((0,n.openBlock)(),(0,n.createBlock)(n.Teleport,{to:`body`},[(0,n.createVNode)(n.Transition,{name:`_cppay-fade`},{default:(0,n.withCtx)(()=>[e.modelValue?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:0,class:`_cppay-overlay`,onClick:r[1]||=(0,n.withModifiers)(e=>!P.value&&!F.value&&X(),[`self`])},[(0,n.createElementVNode)(`div`,ne,[(0,n.createElementVNode)(`div`,re,[(0,n.createElementVNode)(`h2`,ie,(0,n.toDisplayString)(N.value===`select`?`选择支付方式`:N.value===`success`?`支付结果`:`完成支付`),1),(0,n.createElementVNode)(`button`,{onClick:X,class:`_cppay-close-btn`,disabled:P.value||F.value},[...r[2]||=[(0,n.createElementVNode)(`svg`,{fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[(0,n.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]],8,c)]),(0,n.createElementVNode)(`div`,ae,[N.value===`success`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,oe,[r[3]||=(0,n.createElementVNode)(`div`,{style:{"font-size":`64px`,"margin-bottom":`1rem`}},`✅`,-1),(0,n.createElementVNode)(`h3`,se,(0,n.toDisplayString)(A.plain===`subscription`?`授权成功!`:`支付成功!`),1),(0,n.createElementVNode)(`p`,ce,(0,n.toDisplayString)(A.plain===`subscription`?`订阅已激活`:`交易已完成`),1)])):(0,n.createCommentVNode)(``,!0),N.value===`select`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,le,[(0,n.createElementVNode)(`div`,ue,[r[4]||=(0,n.createElementVNode)(`label`,{class:`_cppay-label`},`支付网络`,-1),(0,n.createElementVNode)(`div`,de,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(I.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.chain,onClick:t=>L.value=e.chain,class:(0,n.normalizeClass)([`_cppay-select-btn`,L.value===e.chain?`_cppay-selected`:``])},[e.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:e.icon,alt:e.chain},null,8,pe)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.chain),1)],10,fe))),128))])]),(0,n.createElementVNode)(`div`,me,[r[5]||=(0,n.createElementVNode)(`label`,{class:`_cppay-label`},`支付代币`,-1),(0,n.createElementVNode)(`div`,he,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(q.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.symbol,onClick:t=>R.value=e.symbol,class:(0,n.normalizeClass)([`_cppay-select-btn`,R.value===e.symbol?`_cppay-selected`:``])},[e.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:e.icon,alt:e.symbol},null,8,_e)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.symbol),1)],10,ge))),128))])]),(0,n.createElementVNode)(`div`,ve,[(0,n.createElementVNode)(`div`,ye,[(0,n.createElementVNode)(`div`,be,[r[6]||=(0,n.createElementVNode)(`span`,{class:`_cppay-price-label`},`支付金额`,-1),(0,n.createElementVNode)(`div`,xe,[(0,n.createElementVNode)(`div`,Se,(0,n.toDisplayString)(Y.value??`-`)+` `+(0,n.toDisplayString)(R.value??``),1),(0,n.createElementVNode)(`div`,Ce,`≈ $`+(0,n.toDisplayString)(e.amount),1)])])])]),(0,n.createElementVNode)(`div`,we,[(0,n.createElementVNode)(`button`,{onClick:Ie,disabled:!L.value||!R.value||P.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(P.value?`处理中...`:`继续支付`),9,Te)])])):N.value===`payment`&&z.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,l,[(0,n.createElementVNode)(`div`,u,[(0,n.createElementVNode)(`div`,d,[B.value?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:B.value,alt:`QR Code`,style:{width:`160px`,height:`160px`,display:`block`}},null,8,f)):(0,n.createCommentVNode)(``,!0)])]),(0,n.createElementVNode)(`div`,p,[R.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,m,[(0,n.createElementVNode)(`div`,h,(0,n.toDisplayString)(A.plain===`subscription`?`授权金额`:`支付金额`),1),(0,n.createElementVNode)(`div`,g,(0,n.toDisplayString)(z.value.paymentAmount)+` `+(0,n.toDisplayString)(R.value),1)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`div`,_,[(0,n.createElementVNode)(`div`,v,(0,n.toDisplayString)(A.plain===`subscription`?`授权合约地址`:`支付地址`),1),(0,n.createElementVNode)(`div`,y,[(0,n.createElementVNode)(`code`,null,(0,n.toDisplayString)(z.value.receiveAddress),1),(0,n.createElementVNode)(`button`,{onClick:Le,class:`_cppay-copy-btn`,title:`复制地址`},[...r[7]||=[(0,n.createElementVNode)(`svg`,{fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[(0,n.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1)]])])]),A.plain===`subscription`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,b,[...r[8]||=[(0,n.createElementVNode)(`div`,{class:`_cppay-info-label`,style:{color:`#856404`}},`📌 订阅说明`,-1),(0,n.createElementVNode)(`div`,{class:`_cppay-info-value`,style:{"font-size":`12px`,color:`#856404`}},` 订阅支付需要授权代币给合约地址,系统将按周期自动扣款。授权后无需每次手动支付。 `,-1)]])):(0,n.createCommentVNode)(``,!0)]),F.value?(0,n.createCommentVNode)(``,!0):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,x,[V.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,C,[(0,n.createElementVNode)(`div`,w,[(0,n.createElementVNode)(`button`,{onClick:Fe,disabled:P.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(P.value?e.plain===`subscription`?`授权中...`:`支付中...`:e.plain===`subscription`?`💳 钱包授权`:`💳 钱包支付`),9,T),(0,n.createElementVNode)(`button`,{onClick:Z,disabled:P.value,class:`_cppay-btn _cppay-btn-primary`},` 💰钱包状态 `,8,E)]),(0,n.createElementVNode)(`div`,D,` 已连接: `+(0,n.toDisplayString)(V.value.slice(0,6))+`...`+(0,n.toDisplayString)(V.value.slice(-4)),1)])):((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,onClick:Z,disabled:H.value,class:`_cppay-btn _cppay-btn-secondary`,style:{display:`flex`,"align-items":`center`,"justify-content":`center`,gap:`0.5rem`,padding:`0.75rem 1rem`,width:`100%`}},[(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(H.value?`连接中...`:`💳 连接钱包`),1)],8,S))])),(0,n.createElementVNode)(`div`,O,[(0,n.createElementVNode)(`button`,{onClick:je,disabled:F.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(F.value?`检查中...`:`我已完成支付`),9,Ee)]),(0,n.createElementVNode)(`div`,De,[(0,n.createElementVNode)(`button`,{onClick:r[0]||=e=>N.value=`select`,disabled:P.value||F.value,class:`_cppay-btn _cppay-btn-text`},` 更改支付方式 `,8,Oe)])])):(0,n.createCommentVNode)(``,!0)])])])):(0,n.createCommentVNode)(``,!0)]),_:1})]))}}),A=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},j=A(k,[[`__scopeId`,`data-v-07ac5b3d`]]),M=(0,n.ref)({apikey:``,open:!1,options:null});const N=e=>{M.value.options=e,M.value.open=!0};var P=()=>{M.value.open=!1},F=e=>{M.value.options?.onSuccess?.(e),M.value.open=!1},I=e=>{M.value.options?.onError?.(e)};const L={install(e,t){if(!t?.apikey)throw Error(`Cppay plugin requires an apikey`);M.value.apikey=t.apikey,e.config.globalProperties.$showPayment=N;let r=document.createElement(`div`);document.body.appendChild(r),(0,n.createApp)({setup(){return()=>M.value.options?(0,n.h)(j,{modelValue:M.value.open,"onUpdate:modelValue":e=>{M.value.open=e,e||P()},apikey:M.value.apikey,plain:M.value.options.plain,orderId:M.value.options.orderId,amount:M.value.options.amount,intervalDays:M.value.options.intervalDays,onSuccess:F,onError:I}):null}}).mount(r)}},R=()=>{if(!M.value.apikey)throw Error(`useCppayPayment must be used after installing CppayPlugin`);return{showPayment:N}};e.t(e.n),exports.CppayPlugin=L,exports.PaymentDialog=j,exports.showPayment=N,exports.useCppayPayment=R;
1
+ const e=require(`./inject-style-Boo8CMsU.cjs`),t=require(`./cppay-D2T3pCwj.cjs`);let n=require(`vue`),r=require(`qrcode`);r=e.r(r);let i=require(`rxjs`),a=require(`rxjs/operators`),o=require(`viem`),s=require(`viem/chains`),ee=require(`@reown/appkit`),te=require(`@reown/appkit-adapter-ethers`);var ne={class:`_cppay-dialog`},re={class:`_cppay-header`},ie={class:`_cppay-title`},ae=[`disabled`],c={class:`_cppay-content`},oe={key:0,style:{"text-align":`center`,padding:`2rem 0`}},se={style:{"font-size":`1.5rem`,"font-weight":`600`,color:`#10b981`,margin:`0 0 0.5rem 0`}},ce={style:{color:`#6b7280`,margin:`0`}},le={key:1},ue={class:`_cppay-section`},de={class:`_cppay-grid`},fe=[`onClick`],pe=[`src`,`alt`],me={class:`_cppay-section`},he={class:`_cppay-grid`},ge=[`onClick`],_e=[`src`,`alt`],ve={class:`_cppay-section`},ye={class:`_cppay-price-box`},be={class:`_cppay-price-row`},xe={class:`_cppay-price-amount`},Se={class:`_cppay-price-main`},Ce={class:`_cppay-price-sub`},we={class:`_cppay-section`},Te={class:`_cppay-error-tooltip`},Ee={key:0,class:`_cppay-error-tooltip-full`},De=[`disabled`],l={key:2},u={class:`_cppay-qr-container`},d={class:`_cppay-qr-code`},f=[`src`],p={class:`_cppay-section`},m={key:0,class:`_cppay-info-box`},h={class:`_cppay-info-label`},g={class:`_cppay-info-value`},_={class:`_cppay-info-box`},v={class:`_cppay-info-label`},y={class:`_cppay-address-row`},b={key:1,class:`_cppay-info-box`,style:{background:`#fff3cd`,"border-color":`#ffc107`}},x={class:`_cppay-error-tooltip`},S={key:0,class:`_cppay-error-tooltip-full`},C={key:1,class:`_cppay-section`},w=[`disabled`],T={key:1},E={class:`_cppay-btn-container`},Oe=[`disabled`],ke=[`disabled`],Ae={style:{"text-align":`center`,"margin-top":`8px`,"font-size":`12px`,color:`#666`}},je={class:`_cppay-section`},Me=[`disabled`],Ne={class:`_cppay-section`},Pe=[`disabled`],D=(0,n.defineComponent)({__name:`PaymentDialog`,props:{modelValue:{type:Boolean},apikey:{},orderId:{},amount:{},plain:{default:`one-time`},intervalDays:{default:30}},emits:[`update:modelValue`,`success`,`error`],setup(e,{emit:D}){let O=e,k=D,A=new t.t(O.apikey),j=(0,n.ref)(`select`),M=(0,n.ref)(!1),N=(0,n.ref)(!1),P=(0,n.ref)(),F=(0,n.ref)(!1),I=(0,n.ref)([]),L=(0,n.ref)(),R=(0,n.ref)(),z=(0,n.ref)(null),B=(0,n.ref)(),V=(0,n.ref)(),H=(0,n.ref)(!1),U=(0,n.ref)(),W=(0,n.ref)(null),G,K=(0,n.computed)(()=>I.value.find(e=>e.chain===L.value)),q=(0,n.computed)(()=>K.value?.tokens||[]),J=(0,n.computed)(()=>q.value.find(e=>e.symbol===R.value)),Fe=e=>[`USDT`,`USDC`,`BUSD`,`DAI`,`TUSD`,`USDD`,`FDUSD`].includes(e.toUpperCase())?2:6,Ie=(e,t)=>{let n=parseFloat(e);return isNaN(n)?`0`:n.toFixed(t).replace(/\.?0+$/,``)},Y=(0,n.computed)(()=>{if(!R.value||!J.value)return`0`;let e=parseFloat(J.value.price);if(isNaN(e)||e===0)return`0`;let t=Fe(R.value);return Ie((parseFloat(O.amount)/e).toFixed(t),t)}),Le=()=>{z.value&&(P.value=void 0,N.value=!0,O.plain===`one-time`?$(z.value.paymentId):O.plain===`subscription`&&$(z.value.subscriptionId))},X=()=>{M.value||N.value||(k(`update:modelValue`,!1),setTimeout(()=>{j.value=`select`,P.value=void 0,z.value=null},300))},Re=async()=>{try{M.value=!0,P.value=void 0,I.value=await A.getSupportedChains(),I.value.length>0&&(L.value=I.value[0].chain)}catch(e){P.value=e instanceof Error?e.message:`加载支付网络失败`,k(`error`,e)}finally{M.value=!1}};(0,n.onMounted)(()=>{typeof window<`u`&&!G&&(G=(0,ee.createAppKit)({debug:!1,enableNetworkSwitch:!1,adapters:[new te.EthersAdapter],projectId:`8d2e1854d3f1782e45aa15fbd8938894`,allowUnsupportedChain:!0,networks:[s.mainnet,s.bsc,s.polygon,s.arbitrum,s.optimism,s.base],metadata:{name:`Cppay`,description:`Cppay Payment Gateway`,url:window.location.origin,icons:[`https://cppay.com/icon.png`]},features:{analytics:!1}}),U.value=G.getProvider(`eip155`),V.value=G.getAddress(),G.subscribeAccount(e=>{e.isConnected?V.value=e.address:(V.value=void 0,U.value=void 0)}),G.subscribeProviders(e=>{U.value=e?.eip155}))});let Z=async()=>{try{H.value=!0,P.value=void 0,G&&await G.open()}catch(e){console.error(`钱包连接失败:`,e),P.value=e instanceof Error?e.message:`钱包连接失败`,k(`error`,e)}finally{H.value=!1}},Q=async e=>{if(U.value)try{await U.value.request({method:`wallet_switchEthereumChain`,params:[{chainId:`0x${e.toString(16)}`}]})}catch(e){throw e.code===4902?Error(`请在钱包中添加该网络`):e}},ze=async()=>{if(!(!V.value||!U.value||!z.value||!J.value||!K.value))try{M.value=!0;let e=z.value;await Q(K.value.chainId);let t=(0,o.createWalletClient)({account:V.value,transport:(0,o.custom)(U.value)});if(J.value.address){let n=await t.writeContract({address:J.value.address,abi:[{name:`transfer`,type:`function`,stateMutability:`nonpayable`,inputs:[{name:`to`,type:`address`},{name:`amount`,type:`uint256`}],outputs:[{type:`bool`}]}],functionName:`transfer`,args:[e.receiveAddress,(0,o.parseUnits)(e.paymentAmount,J.value.decimals)],chain:null});console.log(`转账交易哈希:`,n)}else{let n=await t.sendTransaction({to:e.receiveAddress,value:(0,o.parseUnits)(e.paymentAmount,J.value.decimals),chain:null});console.log(`转账交易哈希:`,n)}M.value=!1,N.value=!0,$(e.paymentId)}catch(e){console.error(`钱包支付失败:`,e),P.value=e instanceof Error?e.message:`钱包支付失败`,k(`error`,e),M.value=!1}},Be=async()=>{if(!(!V.value||!U.value||!z.value||!J.value||!K.value))try{M.value=!0;let e=z.value;await Q(K.value.chainId);let t=(0,o.createWalletClient)({account:V.value,transport:(0,o.custom)(U.value)});if(!J.value.address)throw Error(`订阅支付不支持原生代币`);let n=await t.writeContract({address:J.value.address,abi:[{name:`approve`,type:`function`,stateMutability:`nonpayable`,inputs:[{name:`spender`,type:`address`},{name:`amount`,type:`uint256`}],outputs:[{type:`bool`}]}],functionName:`approve`,args:[e.receiveAddress,(0,o.parseUnits)(e.paymentAmount,J.value.decimals)],chain:null});console.log(`授权交易哈希:`,n),M.value=!1,N.value=!0,$(e.paymentId)}catch(e){console.error(`钱包授权失败:`,e),P.value=e instanceof Error?e.message:`钱包授权失败`,k(`error`,e),M.value=!1}},Ve=async()=>{if(!V.value){await Z();return}O.plain===`one-time`?await ze():O.plain===`subscription`&&await Be()},He=async()=>{if(!(!L.value||!R.value))try{M.value=!0,P.value=void 0;let e;O.plain===`one-time`?e=await A.createPayment(`one-time`,{paymentChain:L.value,paymentToken:R.value,orderId:O.orderId,amount:Y.value}):O.plain===`subscription`&&(e=await A.createPayment(`subscription`,{paymentChain:L.value,paymentToken:R.value,orderId:O.orderId,amountOfUsd:Y.value,intervalDays:O.intervalDays||30})),z.value={paymentId:e.paymentId||e.subscriptionId,paymentAmount:e.paymentAmount||e.approveAmount,receiveAddress:e.receiveAddress||e.spenderAddress||``};let t=`${L.value.toLowerCase()}:${z.value.receiveAddress}?amount=${z.value.paymentAmount}`;B.value=await r.toDataURL(t,{width:200,margin:2,errorCorrectionLevel:`H`}),j.value=`payment`}catch(e){P.value=e instanceof Error?e.message:`创建支付失败`,k(`error`,e)}finally{M.value=!1}},$=e=>{let t=()=>(0,i.defer)(()=>O.plain===`subscription`?A.checkSubscriptionPaymentStatus({subscriptionId:e}):A.checkOnetimePaymentStatus({paymentId:e})).pipe((0,a.timeout)(15e3),(0,a.retry)({count:3,delay:2e3}));W.value?.unsubscribe(),W.value=t().pipe((0,a.expand)(e=>e.status===`pending`?(0,i.timer)(2e3).pipe((0,a.switchMap)(()=>t())):i.EMPTY),(0,a.tap)(e=>{e.status===`expired`&&(N.value=!1),e.status===`paid`&&(N.value=!1,j.value=`success`,k(`success`,e)),e.status===`failed`&&(N.value=!1),e.status===`approved`&&(N.value=!1,j.value=`success`,k(`success`,e))})).subscribe({error:e=>{console.error(`支付状态检查错误:`,e),P.value=e instanceof Error?e.message:`检查支付状态失败`,N.value=!1,k(`error`,e)}})},Ue=async()=>{z.value?.receiveAddress&&await navigator.clipboard.writeText(z.value.receiveAddress)};return(0,n.watch)(()=>O.modelValue,e=>{e&&I.value.length===0&&Re()}),(0,n.watch)(L,()=>{q.value.length>0&&(R.value=q.value[0].symbol)}),(0,n.watch)(j,e=>{e===`payment`&&z.value&&$(z.value.paymentId)}),(0,n.onUnmounted)(()=>{W.value?.unsubscribe()}),(t,r)=>((0,n.openBlock)(),(0,n.createBlock)(n.Teleport,{to:`body`},[(0,n.createVNode)(n.Transition,{name:`_cppay-fade`},{default:(0,n.withCtx)(()=>[e.modelValue?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:0,class:`_cppay-overlay`,onClick:r[5]||=(0,n.withModifiers)(e=>!M.value&&!N.value&&X(),[`self`])},[(0,n.createElementVNode)(`div`,ne,[(0,n.createElementVNode)(`div`,re,[(0,n.createElementVNode)(`h2`,ie,(0,n.toDisplayString)(j.value===`select`?`选择支付方式`:j.value===`success`?`支付结果`:`完成支付`),1),(0,n.createElementVNode)(`button`,{onClick:X,class:`_cppay-close-btn`,disabled:M.value||N.value},[...r[6]||=[(0,n.createElementVNode)(`svg`,{fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[(0,n.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M6 18L18 6M6 6l12 12`})],-1)]],8,ae)]),(0,n.createElementVNode)(`div`,c,[j.value===`success`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,oe,[r[7]||=(0,n.createElementVNode)(`div`,{style:{"font-size":`64px`,"margin-bottom":`1rem`}},`✅`,-1),(0,n.createElementVNode)(`h3`,se,(0,n.toDisplayString)(O.plain===`subscription`?`授权成功!`:`支付成功!`),1),(0,n.createElementVNode)(`p`,ce,(0,n.toDisplayString)(O.plain===`subscription`?`订阅已激活`:`交易已完成`),1)])):(0,n.createCommentVNode)(``,!0),j.value===`select`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,le,[(0,n.createElementVNode)(`div`,ue,[r[8]||=(0,n.createElementVNode)(`label`,{class:`_cppay-label`},`支付网络`,-1),(0,n.createElementVNode)(`div`,de,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(I.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.chain,onClick:t=>L.value=e.chain,class:(0,n.normalizeClass)([`_cppay-select-btn`,L.value===e.chain?`_cppay-selected`:``])},[e.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:e.icon,alt:e.chain},null,8,pe)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.chain),1)],10,fe))),128))])]),(0,n.createElementVNode)(`div`,me,[r[9]||=(0,n.createElementVNode)(`label`,{class:`_cppay-label`},`支付代币`,-1),(0,n.createElementVNode)(`div`,he,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(q.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.symbol,onClick:t=>R.value=e.symbol,class:(0,n.normalizeClass)([`_cppay-select-btn`,R.value===e.symbol?`_cppay-selected`:``])},[e.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:e.icon,alt:e.symbol},null,8,_e)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.symbol),1)],10,ge))),128))])]),(0,n.createElementVNode)(`div`,ve,[(0,n.createElementVNode)(`div`,ye,[(0,n.createElementVNode)(`div`,be,[r[10]||=(0,n.createElementVNode)(`span`,{class:`_cppay-price-label`},`支付金额`,-1),(0,n.createElementVNode)(`div`,xe,[(0,n.createElementVNode)(`div`,Se,(0,n.toDisplayString)(Y.value??`-`)+` `+(0,n.toDisplayString)(R.value??``),1),(0,n.createElementVNode)(`div`,Ce,`≈ $`+(0,n.toDisplayString)(e.amount),1)])])])]),(0,n.createElementVNode)(`div`,we,[P.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:0,class:`_cppay-error-tooltip-wrapper`,onMouseenter:r[0]||=e=>F.value=!0,onMouseleave:r[1]||=e=>F.value=!1},[(0,n.createElementVNode)(`div`,Te,[r[11]||=(0,n.createElementVNode)(`svg`,{viewBox:`0 0 20 20`,fill:`currentColor`},[(0,n.createElementVNode)(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z`,"clip-rule":`evenodd`})],-1),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(P.value),1)]),F.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,Ee,(0,n.toDisplayString)(P.value),1)):(0,n.createCommentVNode)(``,!0)],32)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`button`,{onClick:He,disabled:!L.value||!R.value||M.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(M.value?`处理中...`:`继续支付`),9,De)])])):j.value===`payment`&&z.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,l,[(0,n.createElementVNode)(`div`,u,[(0,n.createElementVNode)(`div`,d,[B.value?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:B.value,alt:`QR Code`,style:{width:`160px`,height:`160px`,display:`block`}},null,8,f)):(0,n.createCommentVNode)(``,!0)])]),(0,n.createElementVNode)(`div`,p,[R.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,m,[(0,n.createElementVNode)(`div`,h,(0,n.toDisplayString)(O.plain===`subscription`?`授权金额`:`支付金额`),1),(0,n.createElementVNode)(`div`,g,(0,n.toDisplayString)(z.value.paymentAmount)+` `+(0,n.toDisplayString)(R.value),1)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`div`,_,[(0,n.createElementVNode)(`div`,v,(0,n.toDisplayString)(O.plain===`subscription`?`授权合约地址`:`支付地址`),1),(0,n.createElementVNode)(`div`,y,[(0,n.createElementVNode)(`code`,null,(0,n.toDisplayString)(z.value.receiveAddress),1),(0,n.createElementVNode)(`button`,{onClick:Ue,class:`_cppay-copy-btn`,title:`复制地址`},[...r[12]||=[(0,n.createElementVNode)(`svg`,{fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[(0,n.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z`})],-1)]])])]),O.plain===`subscription`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,b,[...r[13]||=[(0,n.createElementVNode)(`div`,{class:`_cppay-info-label`,style:{color:`#856404`}},`📌 订阅说明`,-1),(0,n.createElementVNode)(`div`,{class:`_cppay-info-value`,style:{"font-size":`12px`,color:`#856404`}},` 订阅支付需要授权代币给合约地址,系统将按周期自动扣款。授权后无需每次手动支付。 `,-1)]])):(0,n.createCommentVNode)(``,!0)]),P.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:0,class:`_cppay-error-tooltip-wrapper`,onMouseenter:r[2]||=e=>F.value=!0,onMouseleave:r[3]||=e=>F.value=!1},[(0,n.createElementVNode)(`div`,x,[r[14]||=(0,n.createElementVNode)(`svg`,{viewBox:`0 0 20 20`,fill:`currentColor`},[(0,n.createElementVNode)(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z`,"clip-rule":`evenodd`})],-1),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(P.value),1)]),F.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,S,(0,n.toDisplayString)(P.value),1)):(0,n.createCommentVNode)(``,!0)],32)):(0,n.createCommentVNode)(``,!0),N.value?(0,n.createCommentVNode)(``,!0):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,C,[V.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,T,[(0,n.createElementVNode)(`div`,E,[(0,n.createElementVNode)(`button`,{onClick:Ve,disabled:M.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(M.value?e.plain===`subscription`?`授权中...`:`支付中...`:e.plain===`subscription`?`💳 钱包授权`:`💳 钱包支付`),9,Oe),(0,n.createElementVNode)(`button`,{onClick:Z,disabled:M.value,class:`_cppay-btn _cppay-btn-primary`},` 💰钱包状态 `,8,ke)]),(0,n.createElementVNode)(`div`,Ae,` 已连接: `+(0,n.toDisplayString)(V.value.slice(0,6))+`...`+(0,n.toDisplayString)(V.value.slice(-4)),1)])):((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,onClick:Z,disabled:H.value,class:`_cppay-btn _cppay-btn-secondary`,style:{display:`flex`,"align-items":`center`,"justify-content":`center`,gap:`0.5rem`,padding:`0.75rem 1rem`,width:`100%`}},[(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(H.value?`连接中...`:`💳 连接钱包`),1)],8,w))])),(0,n.createElementVNode)(`div`,je,[(0,n.createElementVNode)(`button`,{onClick:Le,disabled:N.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(N.value?`检查中...`:`我已完成支付`),9,Me)]),(0,n.createElementVNode)(`div`,Ne,[(0,n.createElementVNode)(`button`,{onClick:r[4]||=e=>j.value=`select`,disabled:M.value||N.value,class:`_cppay-btn _cppay-btn-text`},` 更改支付方式 `,8,Pe)])])):(0,n.createCommentVNode)(``,!0)])])])):(0,n.createCommentVNode)(``,!0)]),_:1})]))}}),O=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},k=O(D,[[`__scopeId`,`data-v-9361860d`]]),A=(0,n.ref)({apikey:``,open:!1,options:null});const j=e=>{A.value.options=e,A.value.open=!0};var M=()=>{A.value.open=!1},N=e=>{A.value.options?.onSuccess?.(e),A.value.open=!1},P=e=>{A.value.options?.onError?.(e)};const F={install(e,t){if(!t?.apikey)throw Error(`Cppay plugin requires an apikey`);A.value.apikey=t.apikey,e.config.globalProperties.$showPayment=j;let r=document.createElement(`div`);document.body.appendChild(r),(0,n.createApp)({setup(){return()=>A.value.options?(0,n.h)(k,{modelValue:A.value.open,"onUpdate:modelValue":e=>{A.value.open=e,e||M()},apikey:A.value.apikey,plain:A.value.options.plain,orderId:A.value.options.orderId,amount:A.value.options.amount,intervalDays:A.value.options.intervalDays,onSuccess:N,onError:P}):null}}).mount(r)}},I=()=>{if(!A.value.apikey)throw Error(`useCppayPayment must be used after installing CppayPlugin`);return{showPayment:j}};e.t(e.n),exports.CppayPlugin=F,exports.PaymentDialog=k,exports.showPayment=j,exports.useCppayPayment=I;
package/dist/vue.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as cppay_default } from "./cppay-Dhqe5Hz_.js";
2
- import { n as payment_dialog_default, t as injectStyle } from "./inject-style-aMqJSA89.js";
1
+ import { t as cppay_default } from "./cppay-CCxKnEWz.js";
2
+ import { n as payment_dialog_default, t as injectStyle } from "./inject-style-CWza6SKp.js";
3
3
  import { Fragment, Teleport, Transition, computed, createApp, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, h, normalizeClass, onMounted, onUnmounted, openBlock, ref, renderList, toDisplayString, watch, withCtx, withModifiers } from "vue";
4
4
  import * as QRCode from "qrcode";
5
5
  import { EMPTY, defer, timer } from "rxjs";
@@ -22,28 +22,34 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
22
22
  } }, _hoisted_8 = { style: {
23
23
  color: "#6b7280",
24
24
  margin: "0"
25
- } }, _hoisted_9 = { key: 1 }, _hoisted_10 = { class: "_cppay-section" }, _hoisted_11 = { class: "_cppay-grid" }, _hoisted_12 = ["onClick"], _hoisted_13 = ["src", "alt"], _hoisted_14 = { class: "_cppay-section" }, _hoisted_15 = { class: "_cppay-grid" }, _hoisted_16 = ["onClick"], _hoisted_17 = ["src", "alt"], _hoisted_18 = { class: "_cppay-section" }, _hoisted_19 = { class: "_cppay-price-box" }, _hoisted_20 = { class: "_cppay-price-row" }, _hoisted_21 = { class: "_cppay-price-amount" }, _hoisted_22 = { class: "_cppay-price-main" }, _hoisted_23 = { class: "_cppay-price-sub" }, _hoisted_24 = { class: "_cppay-section" }, _hoisted_25 = ["disabled"], _hoisted_26 = { key: 2 }, _hoisted_27 = { class: "_cppay-qr-container" }, _hoisted_28 = { class: "_cppay-qr-code" }, _hoisted_29 = ["src"], _hoisted_30 = { class: "_cppay-section" }, _hoisted_31 = {
25
+ } }, _hoisted_9 = { key: 1 }, _hoisted_10 = { class: "_cppay-section" }, _hoisted_11 = { class: "_cppay-grid" }, _hoisted_12 = ["onClick"], _hoisted_13 = ["src", "alt"], _hoisted_14 = { class: "_cppay-section" }, _hoisted_15 = { class: "_cppay-grid" }, _hoisted_16 = ["onClick"], _hoisted_17 = ["src", "alt"], _hoisted_18 = { class: "_cppay-section" }, _hoisted_19 = { class: "_cppay-price-box" }, _hoisted_20 = { class: "_cppay-price-row" }, _hoisted_21 = { class: "_cppay-price-amount" }, _hoisted_22 = { class: "_cppay-price-main" }, _hoisted_23 = { class: "_cppay-price-sub" }, _hoisted_24 = { class: "_cppay-section" }, _hoisted_25 = { class: "_cppay-error-tooltip" }, _hoisted_26 = {
26
+ key: 0,
27
+ class: "_cppay-error-tooltip-full"
28
+ }, _hoisted_27 = ["disabled"], _hoisted_28 = { key: 2 }, _hoisted_29 = { class: "_cppay-qr-container" }, _hoisted_30 = { class: "_cppay-qr-code" }, _hoisted_31 = ["src"], _hoisted_32 = { class: "_cppay-section" }, _hoisted_33 = {
26
29
  key: 0,
27
30
  class: "_cppay-info-box"
28
- }, _hoisted_32 = { class: "_cppay-info-label" }, _hoisted_33 = { class: "_cppay-info-value" }, _hoisted_34 = { class: "_cppay-info-box" }, _hoisted_35 = { class: "_cppay-info-label" }, _hoisted_36 = { class: "_cppay-address-row" }, _hoisted_37 = {
31
+ }, _hoisted_34 = { class: "_cppay-info-label" }, _hoisted_35 = { class: "_cppay-info-value" }, _hoisted_36 = { class: "_cppay-info-box" }, _hoisted_37 = { class: "_cppay-info-label" }, _hoisted_38 = { class: "_cppay-address-row" }, _hoisted_39 = {
29
32
  key: 1,
30
33
  class: "_cppay-info-box",
31
34
  style: {
32
35
  background: "#fff3cd",
33
36
  "border-color": "#ffc107"
34
37
  }
35
- }, _hoisted_38 = {
38
+ }, _hoisted_40 = { class: "_cppay-error-tooltip" }, _hoisted_41 = {
36
39
  key: 0,
40
+ class: "_cppay-error-tooltip-full"
41
+ }, _hoisted_42 = {
42
+ key: 1,
37
43
  class: "_cppay-section"
38
- }, _hoisted_39 = ["disabled"], _hoisted_40 = { key: 1 }, _hoisted_41 = { class: "_cppay-btn-container" }, _hoisted_42 = ["disabled"], _hoisted_43 = ["disabled"], _hoisted_44 = { style: {
44
+ }, _hoisted_43 = ["disabled"], _hoisted_44 = { key: 1 }, _hoisted_45 = { class: "_cppay-btn-container" }, _hoisted_46 = ["disabled"], _hoisted_47 = ["disabled"], _hoisted_48 = { style: {
39
45
  "text-align": "center",
40
46
  "margin-top": "8px",
41
47
  "font-size": "12px",
42
48
  color: "#666"
43
- } }, _hoisted_45 = { class: "_cppay-section" }, _hoisted_46 = ["disabled"], _hoisted_47 = { class: "_cppay-section" }, _hoisted_48 = ["disabled"], PaymentDialog_default = /* @__PURE__ */ ((e, v) => {
44
- let y = e.__vccOpts || e;
45
- for (let [e, b] of v) y[e] = b;
46
- return y;
49
+ } }, _hoisted_49 = { class: "_cppay-section" }, _hoisted_50 = ["disabled"], _hoisted_51 = { class: "_cppay-section" }, _hoisted_52 = ["disabled"], PaymentDialog_default = /* @__PURE__ */ ((e, g) => {
50
+ let _ = e.__vccOpts || e;
51
+ for (let [e, v] of g) _[e] = v;
52
+ return _;
47
53
  })(/* @__PURE__ */ defineComponent({
48
54
  __name: "PaymentDialog",
49
55
  props: {
@@ -59,8 +65,8 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
59
65
  "success",
60
66
  "error"
61
67
  ],
62
- setup(v, { emit: y }) {
63
- let x = v, S = y, C = new cppay_default(x.apikey), w = ref("select"), T = ref(!1), E = ref(!1), D = ref([]), O = ref(), k = ref(), A = ref(null), j = ref(), M = ref(), N = ref(!1), P = ref(), F = ref(null), I, L = computed(() => D.value.find((e) => e.chain === O.value)), R = computed(() => L.value?.tokens || []), z = computed(() => R.value.find((e) => e.symbol === k.value)), B = (e) => [
68
+ setup(g, { emit: _ }) {
69
+ let y = g, b = _, x = new cppay_default(y.apikey), S = ref("select"), C = ref(!1), w = ref(!1), T = ref(), E = ref(!1), D = ref([]), O = ref(), k = ref(), A = ref(null), j = ref(), M = ref(), N = ref(!1), P = ref(), F = ref(null), I, L = computed(() => D.value.find((e) => e.chain === O.value)), R = computed(() => L.value?.tokens || []), z = computed(() => R.value.find((e) => e.symbol === k.value)), B = (e) => [
64
70
  "USDT",
65
71
  "USDC",
66
72
  "BUSD",
@@ -68,28 +74,28 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
68
74
  "TUSD",
69
75
  "USDD",
70
76
  "FDUSD"
71
- ].includes(e.toUpperCase()) ? 2 : 6, V = (e, v) => {
72
- let y = parseFloat(e);
73
- return isNaN(y) ? "0" : y.toFixed(v).replace(/\.?0+$/, "");
77
+ ].includes(e.toUpperCase()) ? 2 : 6, V = (e, g) => {
78
+ let _ = parseFloat(e);
79
+ return isNaN(_) ? "0" : _.toFixed(g).replace(/\.?0+$/, "");
74
80
  }, H = computed(() => {
75
81
  if (!k.value || !z.value) return "0";
76
82
  let e = parseFloat(z.value.price);
77
83
  if (isNaN(e) || e === 0) return "0";
78
- let v = B(k.value);
79
- return V((parseFloat(x.amount) / e).toFixed(v), v);
84
+ let g = B(k.value);
85
+ return V((parseFloat(y.amount) / e).toFixed(g), g);
80
86
  }), U = () => {
81
- A.value && (E.value = !0, x.plain === "one-time" ? Q(A.value.paymentId) : x.plain === "subscription" && Q(A.value.subscriptionId));
87
+ A.value && (T.value = void 0, w.value = !0, y.plain === "one-time" ? Q(A.value.paymentId) : y.plain === "subscription" && Q(A.value.subscriptionId));
82
88
  }, W = () => {
83
- T.value || E.value || (S("update:modelValue", !1), setTimeout(() => {
84
- w.value = "select", A.value = null;
89
+ C.value || w.value || (b("update:modelValue", !1), setTimeout(() => {
90
+ S.value = "select", T.value = void 0, A.value = null;
85
91
  }, 300));
86
92
  }, G = async () => {
87
93
  try {
88
- T.value = !0, D.value = await C.getSupportedChains(), D.value.length > 0 && (O.value = D.value[0].chain);
94
+ C.value = !0, T.value = void 0, D.value = await x.getSupportedChains(), D.value.length > 0 && (O.value = D.value[0].chain);
89
95
  } catch (e) {
90
- S("error", e);
96
+ T.value = e instanceof Error ? e.message : "加载支付网络失败", b("error", e);
91
97
  } finally {
92
- T.value = !1;
98
+ C.value = !1;
93
99
  }
94
100
  };
95
101
  onMounted(() => {
@@ -122,9 +128,9 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
122
128
  });
123
129
  let K = async () => {
124
130
  try {
125
- N.value = !0, I && await I.open();
131
+ N.value = !0, T.value = void 0, I && await I.open();
126
132
  } catch (e) {
127
- console.error("钱包连接失败:", e), S("error", e);
133
+ console.error("钱包连接失败:", e), T.value = e instanceof Error ? e.message : "钱包连接失败", b("error", e);
128
134
  } finally {
129
135
  N.value = !1;
130
136
  }
@@ -139,15 +145,15 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
139
145
  }
140
146
  }, J = async () => {
141
147
  if (!(!M.value || !P.value || !A.value || !z.value || !L.value)) try {
142
- T.value = !0;
148
+ C.value = !0;
143
149
  let e = A.value;
144
150
  await q(L.value.chainId);
145
- let v = createWalletClient({
151
+ let g = createWalletClient({
146
152
  account: M.value,
147
153
  transport: custom(P.value)
148
154
  });
149
155
  if (z.value.address) {
150
- let y = await v.writeContract({
156
+ let _ = await g.writeContract({
151
157
  address: z.value.address,
152
158
  abi: [{
153
159
  name: "transfer",
@@ -166,30 +172,30 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
166
172
  args: [e.receiveAddress, parseUnits(e.paymentAmount, z.value.decimals)],
167
173
  chain: null
168
174
  });
169
- console.log("转账交易哈希:", y);
175
+ console.log("转账交易哈希:", _);
170
176
  } else {
171
- let y = await v.sendTransaction({
177
+ let _ = await g.sendTransaction({
172
178
  to: e.receiveAddress,
173
179
  value: parseUnits(e.paymentAmount, z.value.decimals),
174
180
  chain: null
175
181
  });
176
- console.log("转账交易哈希:", y);
182
+ console.log("转账交易哈希:", _);
177
183
  }
178
- T.value = !1, E.value = !0, Q(e.paymentId);
184
+ C.value = !1, w.value = !0, Q(e.paymentId);
179
185
  } catch (e) {
180
- console.error("钱包支付失败:", e), S("error", e), T.value = !1;
186
+ console.error("钱包支付失败:", e), T.value = e instanceof Error ? e.message : "钱包支付失败", b("error", e), C.value = !1;
181
187
  }
182
188
  }, Y = async () => {
183
189
  if (!(!M.value || !P.value || !A.value || !z.value || !L.value)) try {
184
- T.value = !0;
190
+ C.value = !0;
185
191
  let e = A.value;
186
192
  await q(L.value.chainId);
187
- let v = createWalletClient({
193
+ let g = createWalletClient({
188
194
  account: M.value,
189
195
  transport: custom(P.value)
190
196
  });
191
197
  if (!z.value.address) throw Error("订阅支付不支持原生代币");
192
- let y = await v.writeContract({
198
+ let _ = await g.writeContract({
193
199
  address: z.value.address,
194
200
  abi: [{
195
201
  name: "approve",
@@ -208,78 +214,78 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
208
214
  args: [e.receiveAddress, parseUnits(e.paymentAmount, z.value.decimals)],
209
215
  chain: null
210
216
  });
211
- console.log("授权交易哈希:", y), T.value = !1, E.value = !0, Q(e.paymentId);
217
+ console.log("授权交易哈希:", _), C.value = !1, w.value = !0, Q(e.paymentId);
212
218
  } catch (e) {
213
- console.error("钱包授权失败:", e), S("error", e), T.value = !1;
219
+ console.error("钱包授权失败:", e), T.value = e instanceof Error ? e.message : "钱包授权失败", b("error", e), C.value = !1;
214
220
  }
215
221
  }, X = async () => {
216
222
  if (!M.value) {
217
223
  await K();
218
224
  return;
219
225
  }
220
- x.plain === "one-time" ? await J() : x.plain === "subscription" && await Y();
226
+ y.plain === "one-time" ? await J() : y.plain === "subscription" && await Y();
221
227
  }, Z = async () => {
222
228
  if (!(!O.value || !k.value)) try {
223
- T.value = !0;
229
+ C.value = !0, T.value = void 0;
224
230
  let e;
225
- x.plain === "one-time" ? e = await C.createPayment("one-time", {
231
+ y.plain === "one-time" ? e = await x.createPayment("one-time", {
226
232
  paymentChain: O.value,
227
233
  paymentToken: k.value,
228
- orderId: x.orderId,
234
+ orderId: y.orderId,
229
235
  amount: H.value
230
- }) : x.plain === "subscription" && (e = await C.createPayment("subscription", {
236
+ }) : y.plain === "subscription" && (e = await x.createPayment("subscription", {
231
237
  paymentChain: O.value,
232
238
  paymentToken: k.value,
233
- orderId: x.orderId,
239
+ orderId: y.orderId,
234
240
  amountOfUsd: H.value,
235
- intervalDays: x.intervalDays || 30
241
+ intervalDays: y.intervalDays || 30
236
242
  })), A.value = {
237
243
  paymentId: e.paymentId || e.subscriptionId,
238
244
  paymentAmount: e.paymentAmount || e.approveAmount,
239
245
  receiveAddress: e.receiveAddress || e.spenderAddress || ""
240
246
  };
241
- let v = `${O.value.toLowerCase()}:${A.value.receiveAddress}?amount=${A.value.paymentAmount}`;
242
- j.value = await QRCode.toDataURL(v, {
247
+ let g = `${O.value.toLowerCase()}:${A.value.receiveAddress}?amount=${A.value.paymentAmount}`;
248
+ j.value = await QRCode.toDataURL(g, {
243
249
  width: 200,
244
250
  margin: 2,
245
251
  errorCorrectionLevel: "H"
246
- }), w.value = "payment";
252
+ }), S.value = "payment";
247
253
  } catch (e) {
248
- S("error", e);
254
+ T.value = e instanceof Error ? e.message : "创建支付失败", b("error", e);
249
255
  } finally {
250
- T.value = !1;
256
+ C.value = !1;
251
257
  }
252
258
  }, Q = (e) => {
253
- let v = () => defer(() => x.plain === "subscription" ? C.checkSubscriptionPaymentStatus({ subscriptionId: e }) : C.checkOnetimePaymentStatus({ paymentId: e })).pipe(timeout(15e3), retry({
259
+ let g = () => defer(() => y.plain === "subscription" ? x.checkSubscriptionPaymentStatus({ subscriptionId: e }) : x.checkOnetimePaymentStatus({ paymentId: e })).pipe(timeout(15e3), retry({
254
260
  count: 3,
255
261
  delay: 2e3
256
262
  }));
257
- F.value?.unsubscribe(), F.value = v().pipe(expand((e) => e.status === "pending" ? timer(2e3).pipe(switchMap(() => v())) : EMPTY), tap((e) => {
258
- e.status === "expired" && (E.value = !1), e.status === "paid" && (E.value = !1, w.value = "success", S("success", e)), e.status === "failed" && (E.value = !1), e.status === "approved" && (E.value = !1, w.value = "success", S("success", e));
263
+ F.value?.unsubscribe(), F.value = g().pipe(expand((e) => e.status === "pending" ? timer(2e3).pipe(switchMap(() => g())) : EMPTY), tap((e) => {
264
+ e.status === "expired" && (w.value = !1), e.status === "paid" && (w.value = !1, S.value = "success", b("success", e)), e.status === "failed" && (w.value = !1), e.status === "approved" && (w.value = !1, S.value = "success", b("success", e));
259
265
  })).subscribe({ error: (e) => {
260
- console.error("支付状态检查错误:", e), E.value = !1, S("error", e);
266
+ console.error("支付状态检查错误:", e), T.value = e instanceof Error ? e.message : "检查支付状态失败", w.value = !1, b("error", e);
261
267
  } });
262
268
  }, $ = async () => {
263
269
  A.value?.receiveAddress && await navigator.clipboard.writeText(A.value.receiveAddress);
264
270
  };
265
- return watch(() => x.modelValue, (e) => {
271
+ return watch(() => y.modelValue, (e) => {
266
272
  e && D.value.length === 0 && G();
267
273
  }), watch(O, () => {
268
274
  R.value.length > 0 && (k.value = R.value[0].symbol);
269
- }), watch(w, (e) => {
275
+ }), watch(S, (e) => {
270
276
  e === "payment" && A.value && Q(A.value.paymentId);
271
277
  }), onUnmounted(() => {
272
278
  F.value?.unsubscribe();
273
- }), (e, y) => (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: "_cppay-fade" }, {
274
- default: withCtx(() => [v.modelValue ? (openBlock(), createElementBlock("div", {
279
+ }), (e, _) => (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: "_cppay-fade" }, {
280
+ default: withCtx(() => [g.modelValue ? (openBlock(), createElementBlock("div", {
275
281
  key: 0,
276
282
  class: "_cppay-overlay",
277
- onClick: y[1] ||= withModifiers((e) => !T.value && !E.value && W(), ["self"])
278
- }, [createElementVNode("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createElementVNode("h2", _hoisted_3, toDisplayString(w.value === "select" ? "选择支付方式" : w.value === "success" ? "支付结果" : "完成支付"), 1), createElementVNode("button", {
283
+ onClick: _[5] ||= withModifiers((e) => !C.value && !w.value && W(), ["self"])
284
+ }, [createElementVNode("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createElementVNode("h2", _hoisted_3, toDisplayString(S.value === "select" ? "选择支付方式" : S.value === "success" ? "支付结果" : "完成支付"), 1), createElementVNode("button", {
279
285
  onClick: W,
280
286
  class: "_cppay-close-btn",
281
- disabled: T.value || E.value
282
- }, [...y[2] ||= [createElementVNode("svg", {
287
+ disabled: C.value || w.value
288
+ }, [..._[6] ||= [createElementVNode("svg", {
283
289
  fill: "none",
284
290
  stroke: "currentColor",
285
291
  viewBox: "0 0 24 24"
@@ -288,40 +294,52 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
288
294
  "stroke-linejoin": "round",
289
295
  "stroke-width": "2",
290
296
  d: "M6 18L18 6M6 6l12 12"
291
- })], -1)]], 8, _hoisted_4)]), createElementVNode("div", _hoisted_5, [w.value === "success" ? (openBlock(), createElementBlock("div", _hoisted_6, [
292
- y[3] ||= createElementVNode("div", { style: {
297
+ })], -1)]], 8, _hoisted_4)]), createElementVNode("div", _hoisted_5, [S.value === "success" ? (openBlock(), createElementBlock("div", _hoisted_6, [
298
+ _[7] ||= createElementVNode("div", { style: {
293
299
  "font-size": "64px",
294
300
  "margin-bottom": "1rem"
295
301
  } }, "✅", -1),
296
- createElementVNode("h3", _hoisted_7, toDisplayString(x.plain === "subscription" ? "授权成功!" : "支付成功!"), 1),
297
- createElementVNode("p", _hoisted_8, toDisplayString(x.plain === "subscription" ? "订阅已激活" : "交易已完成"), 1)
298
- ])) : createCommentVNode("", !0), w.value === "select" ? (openBlock(), createElementBlock("div", _hoisted_9, [
299
- createElementVNode("div", _hoisted_10, [y[4] ||= createElementVNode("label", { class: "_cppay-label" }, "支付网络", -1), createElementVNode("div", _hoisted_11, [(openBlock(!0), createElementBlock(Fragment, null, renderList(D.value, (e) => (openBlock(), createElementBlock("button", {
302
+ createElementVNode("h3", _hoisted_7, toDisplayString(y.plain === "subscription" ? "授权成功!" : "支付成功!"), 1),
303
+ createElementVNode("p", _hoisted_8, toDisplayString(y.plain === "subscription" ? "订阅已激活" : "交易已完成"), 1)
304
+ ])) : createCommentVNode("", !0), S.value === "select" ? (openBlock(), createElementBlock("div", _hoisted_9, [
305
+ createElementVNode("div", _hoisted_10, [_[8] ||= createElementVNode("label", { class: "_cppay-label" }, "支付网络", -1), createElementVNode("div", _hoisted_11, [(openBlock(!0), createElementBlock(Fragment, null, renderList(D.value, (e) => (openBlock(), createElementBlock("button", {
300
306
  key: e.chain,
301
- onClick: (v) => O.value = e.chain,
307
+ onClick: (g) => O.value = e.chain,
302
308
  class: normalizeClass(["_cppay-select-btn", O.value === e.chain ? "_cppay-selected" : ""])
303
309
  }, [e.icon ? (openBlock(), createElementBlock("img", {
304
310
  key: 0,
305
311
  src: e.icon,
306
312
  alt: e.chain
307
313
  }, null, 8, _hoisted_13)) : createCommentVNode("", !0), createElementVNode("span", null, toDisplayString(e.chain), 1)], 10, _hoisted_12))), 128))])]),
308
- createElementVNode("div", _hoisted_14, [y[5] ||= createElementVNode("label", { class: "_cppay-label" }, "支付代币", -1), createElementVNode("div", _hoisted_15, [(openBlock(!0), createElementBlock(Fragment, null, renderList(R.value, (e) => (openBlock(), createElementBlock("button", {
314
+ createElementVNode("div", _hoisted_14, [_[9] ||= createElementVNode("label", { class: "_cppay-label" }, "支付代币", -1), createElementVNode("div", _hoisted_15, [(openBlock(!0), createElementBlock(Fragment, null, renderList(R.value, (e) => (openBlock(), createElementBlock("button", {
309
315
  key: e.symbol,
310
- onClick: (v) => k.value = e.symbol,
316
+ onClick: (g) => k.value = e.symbol,
311
317
  class: normalizeClass(["_cppay-select-btn", k.value === e.symbol ? "_cppay-selected" : ""])
312
318
  }, [e.icon ? (openBlock(), createElementBlock("img", {
313
319
  key: 0,
314
320
  src: e.icon,
315
321
  alt: e.symbol
316
322
  }, null, 8, _hoisted_17)) : createCommentVNode("", !0), createElementVNode("span", null, toDisplayString(e.symbol), 1)], 10, _hoisted_16))), 128))])]),
317
- createElementVNode("div", _hoisted_18, [createElementVNode("div", _hoisted_19, [createElementVNode("div", _hoisted_20, [y[6] ||= createElementVNode("span", { class: "_cppay-price-label" }, "支付金额", -1), createElementVNode("div", _hoisted_21, [createElementVNode("div", _hoisted_22, toDisplayString(H.value ?? "-") + " " + toDisplayString(k.value ?? ""), 1), createElementVNode("div", _hoisted_23, "≈ $" + toDisplayString(v.amount), 1)])])])]),
318
- createElementVNode("div", _hoisted_24, [createElementVNode("button", {
323
+ createElementVNode("div", _hoisted_18, [createElementVNode("div", _hoisted_19, [createElementVNode("div", _hoisted_20, [_[10] ||= createElementVNode("span", { class: "_cppay-price-label" }, "支付金额", -1), createElementVNode("div", _hoisted_21, [createElementVNode("div", _hoisted_22, toDisplayString(H.value ?? "-") + " " + toDisplayString(k.value ?? ""), 1), createElementVNode("div", _hoisted_23, "≈ $" + toDisplayString(g.amount), 1)])])])]),
324
+ createElementVNode("div", _hoisted_24, [T.value ? (openBlock(), createElementBlock("div", {
325
+ key: 0,
326
+ class: "_cppay-error-tooltip-wrapper",
327
+ onMouseenter: _[0] ||= (e) => E.value = !0,
328
+ onMouseleave: _[1] ||= (e) => E.value = !1
329
+ }, [createElementVNode("div", _hoisted_25, [_[11] ||= createElementVNode("svg", {
330
+ viewBox: "0 0 20 20",
331
+ fill: "currentColor"
332
+ }, [createElementVNode("path", {
333
+ "fill-rule": "evenodd",
334
+ d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",
335
+ "clip-rule": "evenodd"
336
+ })], -1), createElementVNode("span", null, toDisplayString(T.value), 1)]), E.value ? (openBlock(), createElementBlock("div", _hoisted_26, toDisplayString(T.value), 1)) : createCommentVNode("", !0)], 32)) : createCommentVNode("", !0), createElementVNode("button", {
319
337
  onClick: Z,
320
- disabled: !O.value || !k.value || T.value,
338
+ disabled: !O.value || !k.value || C.value,
321
339
  class: "_cppay-btn _cppay-btn-primary"
322
- }, toDisplayString(T.value ? "处理中..." : "继续支付"), 9, _hoisted_25)])
323
- ])) : w.value === "payment" && A.value ? (openBlock(), createElementBlock("div", _hoisted_26, [
324
- createElementVNode("div", _hoisted_27, [createElementVNode("div", _hoisted_28, [j.value ? (openBlock(), createElementBlock("img", {
340
+ }, toDisplayString(C.value ? "处理中..." : "继续支付"), 9, _hoisted_27)])
341
+ ])) : S.value === "payment" && A.value ? (openBlock(), createElementBlock("div", _hoisted_28, [
342
+ createElementVNode("div", _hoisted_29, [createElementVNode("div", _hoisted_30, [j.value ? (openBlock(), createElementBlock("img", {
325
343
  key: 0,
326
344
  src: j.value,
327
345
  alt: "QR Code",
@@ -330,14 +348,14 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
330
348
  height: "160px",
331
349
  display: "block"
332
350
  }
333
- }, null, 8, _hoisted_29)) : createCommentVNode("", !0)])]),
334
- createElementVNode("div", _hoisted_30, [
335
- k.value ? (openBlock(), createElementBlock("div", _hoisted_31, [createElementVNode("div", _hoisted_32, toDisplayString(x.plain === "subscription" ? "授权金额" : "支付金额"), 1), createElementVNode("div", _hoisted_33, toDisplayString(A.value.paymentAmount) + " " + toDisplayString(k.value), 1)])) : createCommentVNode("", !0),
336
- createElementVNode("div", _hoisted_34, [createElementVNode("div", _hoisted_35, toDisplayString(x.plain === "subscription" ? "授权合约地址" : "支付地址"), 1), createElementVNode("div", _hoisted_36, [createElementVNode("code", null, toDisplayString(A.value.receiveAddress), 1), createElementVNode("button", {
351
+ }, null, 8, _hoisted_31)) : createCommentVNode("", !0)])]),
352
+ createElementVNode("div", _hoisted_32, [
353
+ k.value ? (openBlock(), createElementBlock("div", _hoisted_33, [createElementVNode("div", _hoisted_34, toDisplayString(y.plain === "subscription" ? "授权金额" : "支付金额"), 1), createElementVNode("div", _hoisted_35, toDisplayString(A.value.paymentAmount) + " " + toDisplayString(k.value), 1)])) : createCommentVNode("", !0),
354
+ createElementVNode("div", _hoisted_36, [createElementVNode("div", _hoisted_37, toDisplayString(y.plain === "subscription" ? "授权合约地址" : "支付地址"), 1), createElementVNode("div", _hoisted_38, [createElementVNode("code", null, toDisplayString(A.value.receiveAddress), 1), createElementVNode("button", {
337
355
  onClick: $,
338
356
  class: "_cppay-copy-btn",
339
357
  title: "复制地址"
340
- }, [...y[7] ||= [createElementVNode("svg", {
358
+ }, [..._[12] ||= [createElementVNode("svg", {
341
359
  fill: "none",
342
360
  stroke: "currentColor",
343
361
  viewBox: "0 0 24 24"
@@ -347,7 +365,7 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
347
365
  "stroke-width": "2",
348
366
  d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
349
367
  })], -1)]])])]),
350
- x.plain === "subscription" ? (openBlock(), createElementBlock("div", _hoisted_37, [...y[8] ||= [createElementVNode("div", {
368
+ y.plain === "subscription" ? (openBlock(), createElementBlock("div", _hoisted_39, [..._[13] ||= [createElementVNode("div", {
351
369
  class: "_cppay-info-label",
352
370
  style: { color: "#856404" }
353
371
  }, "📌 订阅说明", -1), createElementVNode("div", {
@@ -358,15 +376,28 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
358
376
  }
359
377
  }, " 订阅支付需要授权代币给合约地址,系统将按周期自动扣款。授权后无需每次手动支付。 ", -1)]])) : createCommentVNode("", !0)
360
378
  ]),
361
- E.value ? createCommentVNode("", !0) : (openBlock(), createElementBlock("div", _hoisted_38, [M.value ? (openBlock(), createElementBlock("div", _hoisted_40, [createElementVNode("div", _hoisted_41, [createElementVNode("button", {
379
+ T.value ? (openBlock(), createElementBlock("div", {
380
+ key: 0,
381
+ class: "_cppay-error-tooltip-wrapper",
382
+ onMouseenter: _[2] ||= (e) => E.value = !0,
383
+ onMouseleave: _[3] ||= (e) => E.value = !1
384
+ }, [createElementVNode("div", _hoisted_40, [_[14] ||= createElementVNode("svg", {
385
+ viewBox: "0 0 20 20",
386
+ fill: "currentColor"
387
+ }, [createElementVNode("path", {
388
+ "fill-rule": "evenodd",
389
+ d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",
390
+ "clip-rule": "evenodd"
391
+ })], -1), createElementVNode("span", null, toDisplayString(T.value), 1)]), E.value ? (openBlock(), createElementBlock("div", _hoisted_41, toDisplayString(T.value), 1)) : createCommentVNode("", !0)], 32)) : createCommentVNode("", !0),
392
+ w.value ? createCommentVNode("", !0) : (openBlock(), createElementBlock("div", _hoisted_42, [M.value ? (openBlock(), createElementBlock("div", _hoisted_44, [createElementVNode("div", _hoisted_45, [createElementVNode("button", {
362
393
  onClick: X,
363
- disabled: T.value,
394
+ disabled: C.value,
364
395
  class: "_cppay-btn _cppay-btn-primary"
365
- }, toDisplayString(T.value ? v.plain === "subscription" ? "授权中..." : "支付中..." : v.plain === "subscription" ? "💳 钱包授权" : "💳 钱包支付"), 9, _hoisted_42), createElementVNode("button", {
396
+ }, toDisplayString(C.value ? g.plain === "subscription" ? "授权中..." : "支付中..." : g.plain === "subscription" ? "💳 钱包授权" : "💳 钱包支付"), 9, _hoisted_46), createElementVNode("button", {
366
397
  onClick: K,
367
- disabled: T.value,
398
+ disabled: C.value,
368
399
  class: "_cppay-btn _cppay-btn-primary"
369
- }, " 💰钱包状态 ", 8, _hoisted_43)]), createElementVNode("div", _hoisted_44, " 已连接: " + toDisplayString(M.value.slice(0, 6)) + "..." + toDisplayString(M.value.slice(-4)), 1)])) : (openBlock(), createElementBlock("button", {
400
+ }, " 💰钱包状态 ", 8, _hoisted_47)]), createElementVNode("div", _hoisted_48, " 已连接: " + toDisplayString(M.value.slice(0, 6)) + "..." + toDisplayString(M.value.slice(-4)), 1)])) : (openBlock(), createElementBlock("button", {
370
401
  key: 0,
371
402
  onClick: K,
372
403
  disabled: N.value,
@@ -379,22 +410,22 @@ var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-heade
379
410
  padding: "0.75rem 1rem",
380
411
  width: "100%"
381
412
  }
382
- }, [createElementVNode("span", null, toDisplayString(N.value ? "连接中..." : "💳 连接钱包"), 1)], 8, _hoisted_39))])),
383
- createElementVNode("div", _hoisted_45, [createElementVNode("button", {
413
+ }, [createElementVNode("span", null, toDisplayString(N.value ? "连接中..." : "💳 连接钱包"), 1)], 8, _hoisted_43))])),
414
+ createElementVNode("div", _hoisted_49, [createElementVNode("button", {
384
415
  onClick: U,
385
- disabled: E.value,
416
+ disabled: w.value,
386
417
  class: "_cppay-btn _cppay-btn-primary"
387
- }, toDisplayString(E.value ? "检查中..." : "我已完成支付"), 9, _hoisted_46)]),
388
- createElementVNode("div", _hoisted_47, [createElementVNode("button", {
389
- onClick: y[0] ||= (e) => w.value = "select",
390
- disabled: T.value || E.value,
418
+ }, toDisplayString(w.value ? "检查中..." : "我已完成支付"), 9, _hoisted_50)]),
419
+ createElementVNode("div", _hoisted_51, [createElementVNode("button", {
420
+ onClick: _[4] ||= (e) => S.value = "select",
421
+ disabled: C.value || w.value,
391
422
  class: "_cppay-btn _cppay-btn-text"
392
- }, " 更改支付方式 ", 8, _hoisted_48)])
423
+ }, " 更改支付方式 ", 8, _hoisted_52)])
393
424
  ])) : createCommentVNode("", !0)])])])) : createCommentVNode("", !0)]),
394
425
  _: 1
395
426
  })]));
396
427
  }
397
- }), [["__scopeId", "data-v-07ac5b3d"]]), cppayState = ref({
428
+ }), [["__scopeId", "data-v-9361860d"]]), cppayState = ref({
398
429
  apikey: "",
399
430
  open: !1,
400
431
  options: null
@@ -409,11 +440,11 @@ var handleClose = () => {
409
440
  }, handleError = (e) => {
410
441
  cppayState.value.options?.onError?.(e);
411
442
  };
412
- const CppayPlugin = { install(e, v) {
413
- if (!v?.apikey) throw Error("Cppay plugin requires an apikey");
414
- cppayState.value.apikey = v.apikey, e.config.globalProperties.$showPayment = showPayment;
415
- let y = document.createElement("div");
416
- document.body.appendChild(y), createApp({ setup() {
443
+ const CppayPlugin = { install(e, g) {
444
+ if (!g?.apikey) throw Error("Cppay plugin requires an apikey");
445
+ cppayState.value.apikey = g.apikey, e.config.globalProperties.$showPayment = showPayment;
446
+ let _ = document.createElement("div");
447
+ document.body.appendChild(_), createApp({ setup() {
417
448
  return () => cppayState.value.options ? h(PaymentDialog_default, {
418
449
  modelValue: cppayState.value.open,
419
450
  "onUpdate:modelValue": (e) => {
@@ -427,7 +458,7 @@ const CppayPlugin = { install(e, v) {
427
458
  onSuccess: handleSuccess,
428
459
  onError: handleError
429
460
  }) : null;
430
- } }).mount(y);
461
+ } }).mount(_);
431
462
  } }, useCppayPayment = () => {
432
463
  if (!cppayState.value.apikey) throw Error("useCppayPayment must be used after installing CppayPlugin");
433
464
  return { showPayment };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cppay-sdk",
3
- "version": "0.0.2-beta.28",
3
+ "version": "0.0.2-beta.29",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite",
@@ -47,6 +47,7 @@
47
47
  "@vitejs/plugin-react": "^5.1.2",
48
48
  "@vitejs/plugin-vue": "^6.0.3",
49
49
  "ethers": "^6.16.0",
50
+ "qrcode": "^1.5.4",
50
51
  "react": "^19.2.3",
51
52
  "react-dom": "^19.2.3",
52
53
  "typescript": "~5.9.3",
@@ -59,6 +60,7 @@
59
60
  "dependencies": {
60
61
  "@reown/appkit": "^1.8.16",
61
62
  "@reown/appkit-adapter-ethers": "^1.8.16",
63
+ "cppay-sdk": "0.0.2-beta.28",
62
64
  "rxjs": "^7.8.2"
63
65
  },
64
66
  "peerDependenciesMeta": {
@@ -1 +0,0 @@
1
- const e={Ethereum:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/info/logo.png`,BSC:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/binance/info/logo.png`,"bsc-testnet":`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/binance/info/logo.png`,Tron:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/tron/info/logo.png`,Polygon:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/polygon/info/logo.png`,Solana:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/solana/info/logo.png`},t={USDT:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png`,USDC:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png`,ETH:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/info/logo.png`,BNB:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/binance/info/logo.png`,tBNB:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/binance/info/logo.png`,TRX:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/tron/info/logo.png`,SOL:`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/solana/info/logo.png`};var n=`http://192.168.0.162:8000`,r=async(e,t,r)=>{let i=Object.assign({timeout:15e3},r),a=new AbortController,o=setTimeout(()=>a.abort(),i.timeout);try{let r=await fetch(new URL(e,n),{signal:a.signal,...t});clearTimeout(o);let i=r.headers.get(`Content-Type`)??``;if(i.includes(`json`))return await r.json();try{return await r.json()}catch{throw Error(`URL: ${e}, Unsupport Content Type: ${i}`)}}catch(t){throw clearTimeout(o),t instanceof DOMException&&t.name===`AbortError`?Error(`URL: ${e}, Request timeout after ${i.timeout}ms`):t}},i=0,a=async(e,t)=>{let n=new URLSearchParams(t.params),a=await r(`${t.url}${n.size?`?${n.toString()}`:``}`,{method:t.method??`get`,headers:{Authorization:e,...t.headers},body:t.data?JSON.stringify(t.data):void 0});if(a.code!==i)throw Error(`Request ${t.url} Failed. ${a.message}`);return a.data},o=class{apikey;constructor(e){this.apikey=e}async getSupportedChains(){return(await a(this.apikey,{url:`/api/payment/token`})).map(e=>({chain:e.chain,chainId:e.chain_id,tokenSymbol:e.token_symbol,tokenDecimals:e.token_decimals,tokenAddress:e.token_address,tokenPrice:e.token_price}))}async createOnetimePayment(e,t,n,r){let i={chain:e,token:t,order_no:n,amount:r},o=await a(this.apikey,{url:`/api/payment/create`,method:`post`,data:i});return{paymentId:o.payment_id,paymentAmount:o.pay_amount,receiveAddress:o.receive_address,expireAt:o.expire_at}}async createSubscriptionPayment(e,t,n,r,i){let o={chain:e,token:t,order_no:n,amount_usd:r,renewal_days:i},s=await a(this.apikey,{url:`/api/subscription/create`,method:`post`,data:o});return{subscriptionId:s.subscription_id,approveAmount:s.approved_amount,spenderAddress:s.contract_address,expireAt:s.expire_at}}async createX402Payment(){throw Error(`Unsupported payment mode`)}async checkOnetimePaymentStatus(e){let t={payment_id:e},n=await a(this.apikey,{url:`/api/payment/query`,params:t});return{orderId:n.order_no,paymentId:n.payment_id,chain:n.chain,token:n.token,baseAmount:n.base_amount,payAmount:n.pay_amount,receiveAddress:n.receive_address,expireAt:n.expire_at,status:n.status}}async checkSubcriptionPaymentStatus(e){let t={subscription_id:e},n=await a(this.apikey,{url:`/api/subscription/query`,params:t});return{orderId:n.order_no,subscriptionId:n.subscription_id,chain:n.chain,token:n.token,approvedAddress:n.approved_contract_address,txHash:n.approved_tx_hash,approveAmount:n.approved_amount,amountOfUsd:n.amount_usd,expireAt:n.expire_at,status:n.subscription_status}}async getSubcriptionPayments(e){let t={subscription_id:e},n=await a(this.apikey,{url:`/api/subscription/payments`,params:t});return{total:n.total,payments:(n.payments??[]).map(e=>({orderId:e.order_no,subscriptionId:e.subscription_id,chain:e.chain,token:e.token,txHash:e.tx_hash,payAmount:e.pay_amount,receiveAddress:e.receive_address,status:e.status,errorMessage:e.error_message}))}}async checkX402PaymentStatus(){throw Error(`Unsupported payment mode`)}},s=class{api;constructor(e){this.api=new o(e)}async getSupportedChains(){let n=(await this.api.getSupportedChains()).reduce((n,r)=>{let i=n[r.chain]??{chain:r.chain,chainId:r.chainId,tokens:[],icon:e[r.chain]};return i.tokens.push({symbol:r.tokenSymbol,decimals:r.tokenDecimals,address:r.tokenAddress,icon:t[r.tokenSymbol],price:r.tokenPrice}),n[r.chain]=i,n},{});return Object.values(n)}async createPayment(e,t){switch(e){case`one-time`:return this.createOnetimePayment(t);case`subscription`:return this.createSubscriptionPayment(t)}}async checkPaymentStatus(e,t){switch(e){case`one-time`:return this.checkOnetimePaymentStatus(t);case`subscription`:return this.checkSubscriptionPaymentStatus(t)}}async createOnetimePayment(e){let t=await this.api.createOnetimePayment(e.paymentChain,e.paymentToken,e.orderId,e.amount);return{...e,...t}}async createSubscriptionPayment(e){let t=await this.api.createSubscriptionPayment(e.paymentChain,e.paymentToken,e.orderId,e.amountOfUsd,e.intervalDays);return{...e,...t}}async checkOnetimePaymentStatus(e){return{...await this.api.checkOnetimePaymentStatus(e.paymentId)}}async checkSubscriptionPaymentStatus(e){return{...await this.api.checkSubcriptionPaymentStatus(e.subscriptionId)}}async getSubcriptionPayments(e){return{...await this.api.getSubcriptionPayments(e.subscriptionId)}}},c=s;Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return c}});
@@ -1 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),c=`._cppay-overlay{z-index:999;background-color:#00000080;justify-content:center;align-items:center;padding:1rem;display:flex;position:fixed;inset:0}._cppay-dialog{background-color:#fff;border-radius:1.5rem;flex-direction:column;width:100%;max-width:28rem;max-height:90vh;display:flex;overflow:hidden;box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a}._cppay-header{border-bottom:1px solid #e5e7eb;justify-content:space-between;align-items:center;padding:1rem 1.25rem;display:flex}._cppay-title{color:#111827;margin:0;font-size:1.25rem;font-weight:600}._cppay-close-btn{color:#9ca3af;cursor:pointer;background:0 0;border:none;padding:.25rem;transition:color .2s}._cppay-close-btn:hover:not(:disabled){color:#4b5563}._cppay-close-btn:disabled{opacity:.5;cursor:not-allowed}._cppay-close-btn svg{width:1.5rem;height:1.5rem}._cppay-content{flex:1;padding:1.25rem;overflow-y:auto}._cppay-section{margin-bottom:1rem}._cppay-section:last-child{margin-bottom:0}._cppay-label{color:#374151;margin-bottom:.5rem;font-size:.875rem;font-weight:500;display:block}._cppay-grid{grid-template-columns:repeat(2,1fr);gap:.75rem;display:grid}._cppay-select-btn{cursor:pointer;background:#fff;border:2px solid #e5e7eb;border-radius:.75rem;align-items:center;gap:.5rem;padding:.75rem;font-family:inherit;font-size:.875rem;transition:all .2s;display:flex}._cppay-select-btn:hover{border-color:#d1d5db}._cppay-select-btn._cppay-selected{background-color:#eff6ff;border-color:#2563eb}._cppay-select-btn img{border-radius:9999px;width:1.5rem;height:1.5rem}._cppay-select-btn span{font-weight:500}._cppay-price-box{background-color:#f9fafb;border-radius:1rem;padding:1rem}._cppay-price-row{justify-content:space-between;align-items:center;display:flex}._cppay-price-label{color:#4b5563;font-size:.875rem}._cppay-price-amount{text-align:right}._cppay-price-main{color:#111827;margin:0;font-size:1.25rem;font-weight:700}._cppay-price-sub{color:#6b7280;margin-top:.25rem;font-size:.875rem}._cppay-btn{cursor:pointer;border:none;border-radius:.75rem;width:100%;padding:.75rem;font-family:inherit;font-size:1rem;font-weight:500;transition:all .2s}._cppay-btn-primary{color:#fff;background-color:#2563eb}._cppay-btn-primary:hover:not(:disabled){background-color:#1d4ed8}._cppay-btn-primary:disabled{opacity:.5;cursor:not-allowed}._cppay-btn-secondary{color:#374151;background-color:#fff;border:1px solid #d1d5db}._cppay-btn-secondary:hover:not(:disabled){background-color:#f9fafb}._cppay-btn-secondary:disabled{opacity:.5;cursor:not-allowed}._cppay-btn-text{color:#6b7280;text-align:center;background:0 0;border:none;padding:.5rem;font-size:.875rem}._cppay-btn-text:hover:not(:disabled){color:#2563eb;background:0 0}._cppay-btn-text:disabled{opacity:.5;cursor:not-allowed}._cppay-btn-container{align-items:center;gap:.5rem;display:flex}._cppay-qr-container{justify-content:center;margin-bottom:1rem;display:flex}._cppay-qr-code{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);border-radius:1rem;padding:.75rem;box-shadow:0 4px 12px #667eea26}._cppay-qr-placeholder{background-color:#f3f4f6;border-radius:.75rem;justify-content:center;align-items:center;width:10rem;height:10rem;display:flex}._cppay-qr-placeholder span{color:#9ca3af;font-size:.875rem}._cppay-info-box{background-color:#f9fafb;border-radius:.75rem;margin-bottom:.625rem;padding:.875rem}._cppay-info-box:last-child{margin-bottom:0}._cppay-info-label{color:#4b5563;margin-bottom:.25rem;font-size:.875rem}._cppay-info-value{color:#111827;font-size:1.25rem;font-weight:700}._cppay-address-row{align-items:center;gap:.5rem;display:flex}._cppay-address-row code{text-overflow:ellipsis;white-space:nowrap;color:#111827;background:0 0;flex:1;font-family:monospace;font-size:.75rem;overflow:hidden}._cppay-copy-btn{color:#2563eb;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:.25rem;transition:color .2s;display:flex}._cppay-copy-btn:hover{color:#1d4ed8}._cppay-copy-btn svg{width:1.25rem;height:1.25rem}@keyframes _cppay-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes _cppay-slideUp{0%{opacity:0;transform:translateY(1.25rem)}to{opacity:1;transform:translateY(0)}}._cppay-overlay{animation:.3s _cppay-fadeIn}._cppay-dialog{animation:.3s _cppay-slideUp}@media (max-width:640px){._cppay-dialog{margin:.5rem}._cppay-header,._cppay-content{padding:1rem}}`;function l(e){if(typeof document>`u`||document.getElementById(`_cppay-payment-dialog-style`))return;let t=document.createElement(`style`);t.id=`_cppay-payment-dialog-style`,t.textContent=e,document.head.appendChild(t)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return l}});