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/{cppay-Dhqe5Hz_.js → cppay-CCxKnEWz.js} +9 -9
- package/dist/cppay-D2T3pCwj.cjs +1 -0
- package/dist/cppay-sdk.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/inject-style-Boo8CMsU.cjs +1 -0
- package/dist/{inject-style-aMqJSA89.js → inject-style-CWza6SKp.js} +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.js +193 -153
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +134 -103
- package/package.json +3 -1
- package/dist/cppay-DnxPUyM2.cjs +0 -1
- package/dist/inject-style-CvrNZeWB.cjs +0 -1
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-
|
|
2
|
-
import { n as payment_dialog_default, t as injectStyle } from "./inject-style-
|
|
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 =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
} },
|
|
44
|
-
let
|
|
45
|
-
for (let [e,
|
|
46
|
-
return
|
|
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(
|
|
63
|
-
let
|
|
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,
|
|
72
|
-
let
|
|
73
|
-
return isNaN(
|
|
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
|
|
79
|
-
return V((parseFloat(
|
|
84
|
+
let g = B(k.value);
|
|
85
|
+
return V((parseFloat(y.amount) / e).toFixed(g), g);
|
|
80
86
|
}), U = () => {
|
|
81
|
-
A.value && (
|
|
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
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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
|
-
|
|
96
|
+
T.value = e instanceof Error ? e.message : "加载支付网络失败", b("error", e);
|
|
91
97
|
} finally {
|
|
92
|
-
|
|
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),
|
|
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
|
-
|
|
148
|
+
C.value = !0;
|
|
143
149
|
let e = A.value;
|
|
144
150
|
await q(L.value.chainId);
|
|
145
|
-
let
|
|
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
|
|
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("转账交易哈希:",
|
|
175
|
+
console.log("转账交易哈希:", _);
|
|
170
176
|
} else {
|
|
171
|
-
let
|
|
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("转账交易哈希:",
|
|
182
|
+
console.log("转账交易哈希:", _);
|
|
177
183
|
}
|
|
178
|
-
|
|
184
|
+
C.value = !1, w.value = !0, Q(e.paymentId);
|
|
179
185
|
} catch (e) {
|
|
180
|
-
console.error("钱包支付失败:", e),
|
|
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
|
-
|
|
190
|
+
C.value = !0;
|
|
185
191
|
let e = A.value;
|
|
186
192
|
await q(L.value.chainId);
|
|
187
|
-
let
|
|
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
|
|
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("授权交易哈希:",
|
|
217
|
+
console.log("授权交易哈希:", _), C.value = !1, w.value = !0, Q(e.paymentId);
|
|
212
218
|
} catch (e) {
|
|
213
|
-
console.error("钱包授权失败:", e),
|
|
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
|
-
|
|
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
|
-
|
|
229
|
+
C.value = !0, T.value = void 0;
|
|
224
230
|
let e;
|
|
225
|
-
|
|
231
|
+
y.plain === "one-time" ? e = await x.createPayment("one-time", {
|
|
226
232
|
paymentChain: O.value,
|
|
227
233
|
paymentToken: k.value,
|
|
228
|
-
orderId:
|
|
234
|
+
orderId: y.orderId,
|
|
229
235
|
amount: H.value
|
|
230
|
-
}) :
|
|
236
|
+
}) : y.plain === "subscription" && (e = await x.createPayment("subscription", {
|
|
231
237
|
paymentChain: O.value,
|
|
232
238
|
paymentToken: k.value,
|
|
233
|
-
orderId:
|
|
239
|
+
orderId: y.orderId,
|
|
234
240
|
amountOfUsd: H.value,
|
|
235
|
-
intervalDays:
|
|
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
|
|
242
|
-
j.value = await QRCode.toDataURL(
|
|
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
|
-
}),
|
|
252
|
+
}), S.value = "payment";
|
|
247
253
|
} catch (e) {
|
|
248
|
-
|
|
254
|
+
T.value = e instanceof Error ? e.message : "创建支付失败", b("error", e);
|
|
249
255
|
} finally {
|
|
250
|
-
|
|
256
|
+
C.value = !1;
|
|
251
257
|
}
|
|
252
258
|
}, Q = (e) => {
|
|
253
|
-
let
|
|
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 =
|
|
258
|
-
e.status === "expired" && (
|
|
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),
|
|
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(() =>
|
|
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(
|
|
275
|
+
}), watch(S, (e) => {
|
|
270
276
|
e === "payment" && A.value && Q(A.value.paymentId);
|
|
271
277
|
}), onUnmounted(() => {
|
|
272
278
|
F.value?.unsubscribe();
|
|
273
|
-
}), (e,
|
|
274
|
-
default: withCtx(() => [
|
|
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:
|
|
278
|
-
}, [createElementVNode("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createElementVNode("h2", _hoisted_3, toDisplayString(
|
|
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:
|
|
282
|
-
}, [...
|
|
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, [
|
|
292
|
-
|
|
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(
|
|
297
|
-
createElementVNode("p", _hoisted_8, toDisplayString(
|
|
298
|
-
])) : createCommentVNode("", !0),
|
|
299
|
-
createElementVNode("div", _hoisted_10, [
|
|
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: (
|
|
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, [
|
|
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: (
|
|
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, [
|
|
318
|
-
createElementVNode("div", _hoisted_24, [
|
|
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 ||
|
|
338
|
+
disabled: !O.value || !k.value || C.value,
|
|
321
339
|
class: "_cppay-btn _cppay-btn-primary"
|
|
322
|
-
}, toDisplayString(
|
|
323
|
-
])) :
|
|
324
|
-
createElementVNode("div",
|
|
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,
|
|
334
|
-
createElementVNode("div",
|
|
335
|
-
k.value ? (openBlock(), createElementBlock("div",
|
|
336
|
-
createElementVNode("div",
|
|
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
|
-
}, [...
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
394
|
+
disabled: C.value,
|
|
364
395
|
class: "_cppay-btn _cppay-btn-primary"
|
|
365
|
-
}, toDisplayString(
|
|
396
|
+
}, toDisplayString(C.value ? g.plain === "subscription" ? "授权中..." : "支付中..." : g.plain === "subscription" ? "💳 钱包授权" : "💳 钱包支付"), 9, _hoisted_46), createElementVNode("button", {
|
|
366
397
|
onClick: K,
|
|
367
|
-
disabled:
|
|
398
|
+
disabled: C.value,
|
|
368
399
|
class: "_cppay-btn _cppay-btn-primary"
|
|
369
|
-
}, " 💰钱包状态 ", 8,
|
|
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,
|
|
383
|
-
createElementVNode("div",
|
|
413
|
+
}, [createElementVNode("span", null, toDisplayString(N.value ? "连接中..." : "💳 连接钱包"), 1)], 8, _hoisted_43))])),
|
|
414
|
+
createElementVNode("div", _hoisted_49, [createElementVNode("button", {
|
|
384
415
|
onClick: U,
|
|
385
|
-
disabled:
|
|
416
|
+
disabled: w.value,
|
|
386
417
|
class: "_cppay-btn _cppay-btn-primary"
|
|
387
|
-
}, toDisplayString(
|
|
388
|
-
createElementVNode("div",
|
|
389
|
-
onClick:
|
|
390
|
-
disabled:
|
|
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,
|
|
423
|
+
}, " 更改支付方式 ", 8, _hoisted_52)])
|
|
393
424
|
])) : createCommentVNode("", !0)])])])) : createCommentVNode("", !0)]),
|
|
394
425
|
_: 1
|
|
395
426
|
})]));
|
|
396
427
|
}
|
|
397
|
-
}), [["__scopeId", "data-v-
|
|
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,
|
|
413
|
-
if (!
|
|
414
|
-
cppayState.value.apikey =
|
|
415
|
-
let
|
|
416
|
-
document.body.appendChild(
|
|
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(
|
|
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.
|
|
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": {
|
package/dist/cppay-DnxPUyM2.cjs
DELETED
|
@@ -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}});
|