cppay-sdk 0.0.2-beta.26 → 0.0.2-beta.28
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/index.js +1 -1
- package/dist/inject-style-CvrNZeWB.cjs +1 -0
- package/dist/inject-style-aMqJSA89.js +7 -0
- package/dist/react.cjs +1 -6
- package/dist/react.js +194 -374
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +49 -46
- package/package.json +38 -39
- package/dist/polygon-1pLQCNfb.js +0 -3952
- package/dist/polygon-zw79IkW8.cjs +0 -15
- /package/dist/{cppay-BcCDwXlg.js → cppay-Dhqe5Hz_.js} +0 -0
package/dist/vue.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./polygon-zw79IkW8.cjs`),t=require(`./cppay-DnxPUyM2.cjs`);let n=require(`vue`),r=require(`rxjs`),i=require(`viem`),ee=require(`@reown/appkit`),te=require(`@reown/appkit-adapter-ethers`);var ne=e.g(e.f(),1),re={class:`_cppay-dialog`},ie={class:`_cppay-header`},ae={class:`_cppay-title`},oe=[`disabled`],se={class:`_cppay-content`},ce={key:0,style:{"text-align":`center`,padding:`2rem 0`}},le={style:{"font-size":`1.5rem`,"font-weight":`600`,color:`#10b981`,margin:`0 0 0.5rem 0`}},ue={style:{color:`#6b7280`,margin:`0`}},de={key:1},fe={class:`_cppay-section`},pe={class:`_cppay-grid`},me=[`onClick`],he=[`src`,`alt`],ge={class:`_cppay-section`},_e={class:`_cppay-grid`},ve=[`onClick`],ye=[`src`,`alt`],be={class:`_cppay-section`},xe={class:`_cppay-price-box`},Se={class:`_cppay-price-row`},Ce={class:`_cppay-price-amount`},we={class:`_cppay-price-main`},Te={class:`_cppay-price-sub`},Ee={class:`_cppay-section`},De=[`disabled`],a={key:2},o={class:`_cppay-qr-container`},s={class:`_cppay-qr-code`},c=[`src`],l={class:`_cppay-section`},u={key:0,class:`_cppay-info-box`},d={class:`_cppay-info-label`},f={class:`_cppay-info-value`},p={class:`_cppay-info-box`},m={class:`_cppay-info-label`},h={class:`_cppay-address-row`},g={key:1,class:`_cppay-info-box`,style:{background:`#fff3cd`,"border-color":`#ffc107`}},_={key:0,class:`_cppay-section`},v=[`disabled`],y={key:1},b={class:`_cppay-btn-container`},x=[`disabled`],S=[`disabled`],C={style:{"text-align":`center`,"margin-top":`8px`,"font-size":`12px`,color:`#666`}},w={class:`_cppay-section`},T=[`disabled`],E={class:`_cppay-section`},Oe=[`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(D,{emit:O}){let k=D,A=O,j=new t.t(k.apikey),M=(0,n.ref)(`select`),N=(0,n.ref)(!1),P=(0,n.ref)(!1),F=(0,n.ref)([]),I=(0,n.ref)(),L=(0,n.ref)(),R=(0,n.ref)(null),z=(0,n.ref)(),B=(0,n.ref)(),V=(0,n.ref)(!1),H=(0,n.ref)(),U=(0,n.ref)(null),W,G=(0,n.computed)(()=>F.value.find(e=>e.chain===I.value)),K=(0,n.computed)(()=>G.value?.tokens||[]),q=(0,n.computed)(()=>K.value.find(e=>e.symbol===L.value)),ke=e=>[`USDT`,`USDC`,`BUSD`,`DAI`,`TUSD`,`USDD`,`FDUSD`].includes(e.toUpperCase())?2:6,J=(e,t)=>{let n=parseFloat(e);return isNaN(n)?`0`:n.toFixed(t).replace(/\.?0+$/,``)},Y=(0,n.computed)(()=>{if(!L.value||!q.value)return`0`;let e=parseFloat(q.value.price);if(isNaN(e)||e===0)return`0`;let t=ke(L.value);return J((parseFloat(k.amount)/e).toFixed(t),t)}),Ae=()=>{R.value&&(P.value=!0,k.plain===`one-time`?$(R.value.paymentId):k.plain===`subscription`&&$(R.value.subscriptionId))},X=()=>{N.value||P.value||(A(`update:modelValue`,!1),setTimeout(()=>{M.value=`select`,R.value=null},300))},je=async()=>{try{N.value=!0,F.value=await j.getSupportedChains(),F.value.length>0&&(I.value=F.value[0].chain)}catch(e){A(`error`,e)}finally{N.value=!1}};(0,n.onMounted)(()=>{typeof window<`u`&&!W&&(W=(0,ee.createAppKit)({debug:!1,enableNetworkSwitch:!1,adapters:[new te.EthersAdapter],projectId:`8d2e1854d3f1782e45aa15fbd8938894`,allowUnsupportedChain:!0,networks:[e.r,e.i,e.t,e.o,e.n,e.a],metadata:{name:`Cppay`,description:`Cppay Payment Gateway`,url:window.location.origin,icons:[`https://cppay.com/icon.png`]},features:{analytics:!1}}),H.value=W.getProvider(`eip155`),B.value=W.getAddress(),W.subscribeAccount(e=>{e.isConnected?B.value=e.address:(B.value=void 0,H.value=void 0)}),W.subscribeProviders(e=>{H.value=e?.eip155}))});let Z=async()=>{try{V.value=!0,W&&await W.open()}catch(e){console.error(`钱包连接失败:`,e),A(`error`,e)}finally{V.value=!1}},Q=async e=>{if(H.value)try{await H.value.request({method:`wallet_switchEthereumChain`,params:[{chainId:`0x${e.toString(16)}`}]})}catch(e){throw e.code===4902?Error(`请在钱包中添加该网络`):e}},Me=async()=>{if(!(!B.value||!H.value||!R.value||!q.value||!G.value))try{N.value=!0;let e=R.value;await Q(G.value.chainId);let t=(0,i.createWalletClient)({account:B.value,transport:(0,i.custom)(H.value)});if(q.value.address){let n=await t.writeContract({address:q.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,i.parseUnits)(e.paymentAmount,q.value.decimals)],chain:null});console.log(`转账交易哈希:`,n)}else{let n=await t.sendTransaction({to:e.receiveAddress,value:(0,i.parseUnits)(e.paymentAmount,q.value.decimals),chain:null});console.log(`转账交易哈希:`,n)}N.value=!1,P.value=!0,$(e.paymentId)}catch(e){console.error(`钱包支付失败:`,e),A(`error`,e),N.value=!1}},Ne=async()=>{if(!(!B.value||!H.value||!R.value||!q.value||!G.value))try{N.value=!0;let e=R.value;await Q(G.value.chainId);let t=(0,i.createWalletClient)({account:B.value,transport:(0,i.custom)(H.value)});if(!q.value.address)throw Error(`订阅支付不支持原生代币`);let n=await t.writeContract({address:q.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,i.parseUnits)(e.paymentAmount,q.value.decimals)],chain:null});console.log(`授权交易哈希:`,n),N.value=!1,P.value=!0,$(e.paymentId)}catch(e){console.error(`钱包授权失败:`,e),A(`error`,e),N.value=!1}},Pe=async()=>{if(!B.value){await Z();return}k.plain===`one-time`?await Me():k.plain===`subscription`&&await Ne()},Fe=async()=>{if(!(!I.value||!L.value))try{N.value=!0;let e;k.plain===`one-time`?e=await j.createPayment(`one-time`,{paymentChain:I.value,paymentToken:L.value,orderId:k.orderId,amount:Y.value}):k.plain===`subscription`&&(e=await j.createPayment(`subscription`,{paymentChain:I.value,paymentToken:L.value,orderId:k.orderId,amountOfUsd:Y.value,intervalDays:k.intervalDays||30})),R.value={paymentId:e.paymentId||e.subscriptionId,paymentAmount:e.paymentAmount||e.approveAmount,receiveAddress:e.receiveAddress||e.spenderAddress||``};let t=`${I.value.toLowerCase()}:${R.value.receiveAddress}?amount=${R.value.paymentAmount}`;z.value=await ne.toDataURL(t,{width:200,margin:2,errorCorrectionLevel:`H`}),M.value=`payment`}catch(e){A(`error`,e)}finally{N.value=!1}},$=t=>{let n=()=>(0,r.defer)(()=>k.plain===`subscription`?j.checkSubscriptionPaymentStatus({subscriptionId:t}):j.checkOnetimePaymentStatus({paymentId:t})).pipe(e.s(15e3),e.u({count:3,delay:2e3}));U.value?.unsubscribe(),U.value=n().pipe(e.d(t=>t.status===`pending`?(0,r.timer)(2e3).pipe(e.l(()=>n())):r.EMPTY),e.c(e=>{e.status===`expired`&&(P.value=!1),e.status===`paid`&&(P.value=!1,M.value=`success`,A(`success`,e)),e.status===`failed`&&(P.value=!1),e.status===`approved`&&(P.value=!1,M.value=`success`,A(`success`,e))})).subscribe({error:e=>{console.error(`支付状态检查错误:`,e),P.value=!1,A(`error`,e)}})},Ie=async()=>{R.value?.receiveAddress&&await navigator.clipboard.writeText(R.value.receiveAddress)};return(0,n.watch)(()=>k.modelValue,e=>{e&&F.value.length===0&&je()}),(0,n.watch)(I,()=>{K.value.length>0&&(L.value=K.value[0].symbol)}),(0,n.watch)(M,e=>{e===`payment`&&R.value&&$(R.value.paymentId)}),(0,n.onUnmounted)(()=>{U.value?.unsubscribe()}),(e,t)=>((0,n.openBlock)(),(0,n.createBlock)(n.Teleport,{to:`body`},[(0,n.createVNode)(n.Transition,{name:`_cppay-fade`},{default:(0,n.withCtx)(()=>[D.modelValue?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:0,class:`_cppay-overlay`,onClick:t[1]||=(0,n.withModifiers)(e=>!N.value&&!P.value&&X(),[`self`])},[(0,n.createElementVNode)(`div`,re,[(0,n.createElementVNode)(`div`,ie,[(0,n.createElementVNode)(`h2`,ae,(0,n.toDisplayString)(M.value===`select`?`选择支付方式`:M.value===`success`?`支付结果`:`完成支付`),1),(0,n.createElementVNode)(`button`,{onClick:X,class:`_cppay-close-btn`,disabled:N.value||P.value},[...t[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,oe)]),(0,n.createElementVNode)(`div`,se,[M.value===`success`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,ce,[t[3]||=(0,n.createElementVNode)(`div`,{style:{"font-size":`64px`,"margin-bottom":`1rem`}},`✅`,-1),(0,n.createElementVNode)(`h3`,le,(0,n.toDisplayString)(k.plain===`subscription`?`授权成功!`:`支付成功!`),1),(0,n.createElementVNode)(`p`,ue,(0,n.toDisplayString)(k.plain===`subscription`?`订阅已激活`:`交易已完成`),1)])):(0,n.createCommentVNode)(``,!0),M.value===`select`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,de,[(0,n.createElementVNode)(`div`,fe,[t[4]||=(0,n.createElementVNode)(`label`,{class:`_cppay-label`},`支付网络`,-1),(0,n.createElementVNode)(`div`,pe,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(F.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.chain,onClick:t=>I.value=e.chain,class:(0,n.normalizeClass)([`_cppay-select-btn`,I.value===e.chain?`_cppay-selected`:``])},[e.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:e.icon,alt:e.chain},null,8,he)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.chain),1)],10,me))),128))])]),(0,n.createElementVNode)(`div`,ge,[t[5]||=(0,n.createElementVNode)(`label`,{class:`_cppay-label`},`支付代币`,-1),(0,n.createElementVNode)(`div`,_e,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(K.value,e=>((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:e.symbol,onClick:t=>L.value=e.symbol,class:(0,n.normalizeClass)([`_cppay-select-btn`,L.value===e.symbol?`_cppay-selected`:``])},[e.icon?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:e.icon,alt:e.symbol},null,8,ye)):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(e.symbol),1)],10,ve))),128))])]),(0,n.createElementVNode)(`div`,be,[(0,n.createElementVNode)(`div`,xe,[(0,n.createElementVNode)(`div`,Se,[t[6]||=(0,n.createElementVNode)(`span`,{class:`_cppay-price-label`},`支付金额`,-1),(0,n.createElementVNode)(`div`,Ce,[(0,n.createElementVNode)(`div`,we,(0,n.toDisplayString)(Y.value??`-`)+` `+(0,n.toDisplayString)(L.value??``),1),(0,n.createElementVNode)(`div`,Te,`≈ $`+(0,n.toDisplayString)(D.amount),1)])])])]),(0,n.createElementVNode)(`div`,Ee,[(0,n.createElementVNode)(`button`,{onClick:Fe,disabled:!I.value||!L.value||N.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(N.value?`处理中...`:`继续支付`),9,De)])])):M.value===`payment`&&R.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,a,[(0,n.createElementVNode)(`div`,o,[(0,n.createElementVNode)(`div`,s,[z.value?((0,n.openBlock)(),(0,n.createElementBlock)(`img`,{key:0,src:z.value,alt:`QR Code`,style:{width:`160px`,height:`160px`,display:`block`}},null,8,c)):(0,n.createCommentVNode)(``,!0)])]),(0,n.createElementVNode)(`div`,l,[L.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,u,[(0,n.createElementVNode)(`div`,d,(0,n.toDisplayString)(k.plain===`subscription`?`授权金额`:`支付金额`),1),(0,n.createElementVNode)(`div`,f,(0,n.toDisplayString)(R.value.paymentAmount)+` `+(0,n.toDisplayString)(L.value),1)])):(0,n.createCommentVNode)(``,!0),(0,n.createElementVNode)(`div`,p,[(0,n.createElementVNode)(`div`,m,(0,n.toDisplayString)(k.plain===`subscription`?`授权合约地址`:`支付地址`),1),(0,n.createElementVNode)(`div`,h,[(0,n.createElementVNode)(`code`,null,(0,n.toDisplayString)(R.value.receiveAddress),1),(0,n.createElementVNode)(`button`,{onClick:Ie,class:`_cppay-copy-btn`,title:`复制地址`},[...t[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)]])])]),k.plain===`subscription`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,g,[...t[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)]),P.value?(0,n.createCommentVNode)(``,!0):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,_,[B.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,y,[(0,n.createElementVNode)(`div`,b,[(0,n.createElementVNode)(`button`,{onClick:Pe,disabled:N.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(N.value?D.plain===`subscription`?`授权中...`:`支付中...`:D.plain===`subscription`?`💳 钱包授权`:`💳 钱包支付`),9,x),(0,n.createElementVNode)(`button`,{onClick:Z,disabled:N.value,class:`_cppay-btn _cppay-btn-primary`},` 💰钱包状态 `,8,S)]),(0,n.createElementVNode)(`div`,C,` 已连接: `+(0,n.toDisplayString)(B.value.slice(0,6))+`...`+(0,n.toDisplayString)(B.value.slice(-4)),1)])):((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,onClick:Z,disabled:V.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)(V.value?`连接中...`:`💳 连接钱包`),1)],8,v))])),(0,n.createElementVNode)(`div`,w,[(0,n.createElementVNode)(`button`,{onClick:Ae,disabled:P.value,class:`_cppay-btn _cppay-btn-primary`},(0,n.toDisplayString)(P.value?`检查中...`:`我已完成支付`),9,T)]),(0,n.createElementVNode)(`div`,E,[(0,n.createElementVNode)(`button`,{onClick:t[0]||=e=>M.value=`select`,disabled:N.value||P.value,class:`_cppay-btn _cppay-btn-text`},` 更改支付方式 `,8,Oe)])])):(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-07ac5b3d`]]),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.p(e.m),exports.CppayPlugin=F,exports.PaymentDialog=k,exports.showPayment=j,exports.useCppayPayment=I;
|
|
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;
|
package/dist/vue.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
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";
|
|
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
|
+
import * as QRCode from "qrcode";
|
|
4
5
|
import { EMPTY, defer, timer } from "rxjs";
|
|
6
|
+
import { expand, retry, switchMap, tap, timeout } from "rxjs/operators";
|
|
5
7
|
import { createWalletClient, custom, parseUnits } from "viem";
|
|
8
|
+
import { arbitrum, base, bsc, mainnet, optimism, polygon } from "viem/chains";
|
|
6
9
|
import { createAppKit } from "@reown/appkit";
|
|
7
10
|
import { EthersAdapter } from "@reown/appkit-adapter-ethers";
|
|
8
|
-
var
|
|
11
|
+
var _hoisted_1 = { class: "_cppay-dialog" }, _hoisted_2 = { class: "_cppay-header" }, _hoisted_3 = { class: "_cppay-title" }, _hoisted_4 = ["disabled"], _hoisted_5 = { class: "_cppay-content" }, _hoisted_6 = {
|
|
9
12
|
key: 0,
|
|
10
13
|
style: {
|
|
11
14
|
"text-align": "center",
|
|
@@ -37,10 +40,10 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
37
40
|
"margin-top": "8px",
|
|
38
41
|
"font-size": "12px",
|
|
39
42
|
color: "#666"
|
|
40
|
-
} }, _hoisted_45 = { class: "_cppay-section" }, _hoisted_46 = ["disabled"], _hoisted_47 = { class: "_cppay-section" }, _hoisted_48 = ["disabled"], PaymentDialog_default = /* @__PURE__ */ ((e,
|
|
41
|
-
let
|
|
42
|
-
for (let [e,
|
|
43
|
-
return
|
|
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;
|
|
44
47
|
})(/* @__PURE__ */ defineComponent({
|
|
45
48
|
__name: "PaymentDialog",
|
|
46
49
|
props: {
|
|
@@ -56,8 +59,8 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
56
59
|
"success",
|
|
57
60
|
"error"
|
|
58
61
|
],
|
|
59
|
-
setup(
|
|
60
|
-
let x =
|
|
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) => [
|
|
61
64
|
"USDT",
|
|
62
65
|
"USDC",
|
|
63
66
|
"BUSD",
|
|
@@ -65,15 +68,15 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
65
68
|
"TUSD",
|
|
66
69
|
"USDD",
|
|
67
70
|
"FDUSD"
|
|
68
|
-
].includes(e.toUpperCase()) ? 2 : 6, V = (e,
|
|
69
|
-
let
|
|
70
|
-
return isNaN(
|
|
71
|
+
].includes(e.toUpperCase()) ? 2 : 6, V = (e, v) => {
|
|
72
|
+
let y = parseFloat(e);
|
|
73
|
+
return isNaN(y) ? "0" : y.toFixed(v).replace(/\.?0+$/, "");
|
|
71
74
|
}, H = computed(() => {
|
|
72
75
|
if (!k.value || !z.value) return "0";
|
|
73
76
|
let e = parseFloat(z.value.price);
|
|
74
77
|
if (isNaN(e) || e === 0) return "0";
|
|
75
|
-
let
|
|
76
|
-
return V((parseFloat(x.amount) / e).toFixed(
|
|
78
|
+
let v = B(k.value);
|
|
79
|
+
return V((parseFloat(x.amount) / e).toFixed(v), v);
|
|
77
80
|
}), U = () => {
|
|
78
81
|
A.value && (E.value = !0, x.plain === "one-time" ? Q(A.value.paymentId) : x.plain === "subscription" && Q(A.value.subscriptionId));
|
|
79
82
|
}, W = () => {
|
|
@@ -139,12 +142,12 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
139
142
|
T.value = !0;
|
|
140
143
|
let e = A.value;
|
|
141
144
|
await q(L.value.chainId);
|
|
142
|
-
let
|
|
145
|
+
let v = createWalletClient({
|
|
143
146
|
account: M.value,
|
|
144
147
|
transport: custom(P.value)
|
|
145
148
|
});
|
|
146
149
|
if (z.value.address) {
|
|
147
|
-
let
|
|
150
|
+
let y = await v.writeContract({
|
|
148
151
|
address: z.value.address,
|
|
149
152
|
abi: [{
|
|
150
153
|
name: "transfer",
|
|
@@ -163,14 +166,14 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
163
166
|
args: [e.receiveAddress, parseUnits(e.paymentAmount, z.value.decimals)],
|
|
164
167
|
chain: null
|
|
165
168
|
});
|
|
166
|
-
console.log("转账交易哈希:",
|
|
169
|
+
console.log("转账交易哈希:", y);
|
|
167
170
|
} else {
|
|
168
|
-
let
|
|
171
|
+
let y = await v.sendTransaction({
|
|
169
172
|
to: e.receiveAddress,
|
|
170
173
|
value: parseUnits(e.paymentAmount, z.value.decimals),
|
|
171
174
|
chain: null
|
|
172
175
|
});
|
|
173
|
-
console.log("转账交易哈希:",
|
|
176
|
+
console.log("转账交易哈希:", y);
|
|
174
177
|
}
|
|
175
178
|
T.value = !1, E.value = !0, Q(e.paymentId);
|
|
176
179
|
} catch (e) {
|
|
@@ -181,12 +184,12 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
181
184
|
T.value = !0;
|
|
182
185
|
let e = A.value;
|
|
183
186
|
await q(L.value.chainId);
|
|
184
|
-
let
|
|
187
|
+
let v = createWalletClient({
|
|
185
188
|
account: M.value,
|
|
186
189
|
transport: custom(P.value)
|
|
187
190
|
});
|
|
188
191
|
if (!z.value.address) throw Error("订阅支付不支持原生代币");
|
|
189
|
-
let
|
|
192
|
+
let y = await v.writeContract({
|
|
190
193
|
address: z.value.address,
|
|
191
194
|
abi: [{
|
|
192
195
|
name: "approve",
|
|
@@ -205,7 +208,7 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
205
208
|
args: [e.receiveAddress, parseUnits(e.paymentAmount, z.value.decimals)],
|
|
206
209
|
chain: null
|
|
207
210
|
});
|
|
208
|
-
console.log("授权交易哈希:",
|
|
211
|
+
console.log("授权交易哈希:", y), T.value = !1, E.value = !0, Q(e.paymentId);
|
|
209
212
|
} catch (e) {
|
|
210
213
|
console.error("钱包授权失败:", e), S("error", e), T.value = !1;
|
|
211
214
|
}
|
|
@@ -235,8 +238,8 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
235
238
|
paymentAmount: e.paymentAmount || e.approveAmount,
|
|
236
239
|
receiveAddress: e.receiveAddress || e.spenderAddress || ""
|
|
237
240
|
};
|
|
238
|
-
let
|
|
239
|
-
j.value = await
|
|
241
|
+
let v = `${O.value.toLowerCase()}:${A.value.receiveAddress}?amount=${A.value.paymentAmount}`;
|
|
242
|
+
j.value = await QRCode.toDataURL(v, {
|
|
240
243
|
width: 200,
|
|
241
244
|
margin: 2,
|
|
242
245
|
errorCorrectionLevel: "H"
|
|
@@ -247,11 +250,11 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
247
250
|
T.value = !1;
|
|
248
251
|
}
|
|
249
252
|
}, Q = (e) => {
|
|
250
|
-
let
|
|
253
|
+
let v = () => defer(() => x.plain === "subscription" ? C.checkSubscriptionPaymentStatus({ subscriptionId: e }) : C.checkOnetimePaymentStatus({ paymentId: e })).pipe(timeout(15e3), retry({
|
|
251
254
|
count: 3,
|
|
252
255
|
delay: 2e3
|
|
253
256
|
}));
|
|
254
|
-
F.value?.unsubscribe(), F.value =
|
|
257
|
+
F.value?.unsubscribe(), F.value = v().pipe(expand((e) => e.status === "pending" ? timer(2e3).pipe(switchMap(() => v())) : EMPTY), tap((e) => {
|
|
255
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));
|
|
256
259
|
})).subscribe({ error: (e) => {
|
|
257
260
|
console.error("支付状态检查错误:", e), E.value = !1, S("error", e);
|
|
@@ -267,16 +270,16 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
267
270
|
e === "payment" && A.value && Q(A.value.paymentId);
|
|
268
271
|
}), onUnmounted(() => {
|
|
269
272
|
F.value?.unsubscribe();
|
|
270
|
-
}), (
|
|
271
|
-
default: withCtx(() => [
|
|
273
|
+
}), (e, y) => (openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: "_cppay-fade" }, {
|
|
274
|
+
default: withCtx(() => [v.modelValue ? (openBlock(), createElementBlock("div", {
|
|
272
275
|
key: 0,
|
|
273
276
|
class: "_cppay-overlay",
|
|
274
|
-
onClick:
|
|
277
|
+
onClick: y[1] ||= withModifiers((e) => !T.value && !E.value && W(), ["self"])
|
|
275
278
|
}, [createElementVNode("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createElementVNode("h2", _hoisted_3, toDisplayString(w.value === "select" ? "选择支付方式" : w.value === "success" ? "支付结果" : "完成支付"), 1), createElementVNode("button", {
|
|
276
279
|
onClick: W,
|
|
277
280
|
class: "_cppay-close-btn",
|
|
278
281
|
disabled: T.value || E.value
|
|
279
|
-
}, [...
|
|
282
|
+
}, [...y[2] ||= [createElementVNode("svg", {
|
|
280
283
|
fill: "none",
|
|
281
284
|
stroke: "currentColor",
|
|
282
285
|
viewBox: "0 0 24 24"
|
|
@@ -286,32 +289,32 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
286
289
|
"stroke-width": "2",
|
|
287
290
|
d: "M6 18L18 6M6 6l12 12"
|
|
288
291
|
})], -1)]], 8, _hoisted_4)]), createElementVNode("div", _hoisted_5, [w.value === "success" ? (openBlock(), createElementBlock("div", _hoisted_6, [
|
|
289
|
-
|
|
292
|
+
y[3] ||= createElementVNode("div", { style: {
|
|
290
293
|
"font-size": "64px",
|
|
291
294
|
"margin-bottom": "1rem"
|
|
292
295
|
} }, "✅", -1),
|
|
293
296
|
createElementVNode("h3", _hoisted_7, toDisplayString(x.plain === "subscription" ? "授权成功!" : "支付成功!"), 1),
|
|
294
297
|
createElementVNode("p", _hoisted_8, toDisplayString(x.plain === "subscription" ? "订阅已激活" : "交易已完成"), 1)
|
|
295
298
|
])) : createCommentVNode("", !0), w.value === "select" ? (openBlock(), createElementBlock("div", _hoisted_9, [
|
|
296
|
-
createElementVNode("div", _hoisted_10, [
|
|
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", {
|
|
297
300
|
key: e.chain,
|
|
298
|
-
onClick: (
|
|
301
|
+
onClick: (v) => O.value = e.chain,
|
|
299
302
|
class: normalizeClass(["_cppay-select-btn", O.value === e.chain ? "_cppay-selected" : ""])
|
|
300
303
|
}, [e.icon ? (openBlock(), createElementBlock("img", {
|
|
301
304
|
key: 0,
|
|
302
305
|
src: e.icon,
|
|
303
306
|
alt: e.chain
|
|
304
307
|
}, null, 8, _hoisted_13)) : createCommentVNode("", !0), createElementVNode("span", null, toDisplayString(e.chain), 1)], 10, _hoisted_12))), 128))])]),
|
|
305
|
-
createElementVNode("div", _hoisted_14, [
|
|
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", {
|
|
306
309
|
key: e.symbol,
|
|
307
|
-
onClick: (
|
|
310
|
+
onClick: (v) => k.value = e.symbol,
|
|
308
311
|
class: normalizeClass(["_cppay-select-btn", k.value === e.symbol ? "_cppay-selected" : ""])
|
|
309
312
|
}, [e.icon ? (openBlock(), createElementBlock("img", {
|
|
310
313
|
key: 0,
|
|
311
314
|
src: e.icon,
|
|
312
315
|
alt: e.symbol
|
|
313
316
|
}, null, 8, _hoisted_17)) : createCommentVNode("", !0), createElementVNode("span", null, toDisplayString(e.symbol), 1)], 10, _hoisted_16))), 128))])]),
|
|
314
|
-
createElementVNode("div", _hoisted_18, [createElementVNode("div", _hoisted_19, [createElementVNode("div", _hoisted_20, [
|
|
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)])])])]),
|
|
315
318
|
createElementVNode("div", _hoisted_24, [createElementVNode("button", {
|
|
316
319
|
onClick: Z,
|
|
317
320
|
disabled: !O.value || !k.value || T.value,
|
|
@@ -334,7 +337,7 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
334
337
|
onClick: $,
|
|
335
338
|
class: "_cppay-copy-btn",
|
|
336
339
|
title: "复制地址"
|
|
337
|
-
}, [...
|
|
340
|
+
}, [...y[7] ||= [createElementVNode("svg", {
|
|
338
341
|
fill: "none",
|
|
339
342
|
stroke: "currentColor",
|
|
340
343
|
viewBox: "0 0 24 24"
|
|
@@ -344,7 +347,7 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
344
347
|
"stroke-width": "2",
|
|
345
348
|
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"
|
|
346
349
|
})], -1)]])])]),
|
|
347
|
-
x.plain === "subscription" ? (openBlock(), createElementBlock("div", _hoisted_37, [...
|
|
350
|
+
x.plain === "subscription" ? (openBlock(), createElementBlock("div", _hoisted_37, [...y[8] ||= [createElementVNode("div", {
|
|
348
351
|
class: "_cppay-info-label",
|
|
349
352
|
style: { color: "#856404" }
|
|
350
353
|
}, "📌 订阅说明", -1), createElementVNode("div", {
|
|
@@ -359,7 +362,7 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
359
362
|
onClick: X,
|
|
360
363
|
disabled: T.value,
|
|
361
364
|
class: "_cppay-btn _cppay-btn-primary"
|
|
362
|
-
}, toDisplayString(T.value ?
|
|
365
|
+
}, toDisplayString(T.value ? v.plain === "subscription" ? "授权中..." : "支付中..." : v.plain === "subscription" ? "💳 钱包授权" : "💳 钱包支付"), 9, _hoisted_42), createElementVNode("button", {
|
|
363
366
|
onClick: K,
|
|
364
367
|
disabled: T.value,
|
|
365
368
|
class: "_cppay-btn _cppay-btn-primary"
|
|
@@ -383,7 +386,7 @@ var import_browser = /* @__PURE__ */ __toESM(require_browser(), 1), _hoisted_1 =
|
|
|
383
386
|
class: "_cppay-btn _cppay-btn-primary"
|
|
384
387
|
}, toDisplayString(E.value ? "检查中..." : "我已完成支付"), 9, _hoisted_46)]),
|
|
385
388
|
createElementVNode("div", _hoisted_47, [createElementVNode("button", {
|
|
386
|
-
onClick:
|
|
389
|
+
onClick: y[0] ||= (e) => w.value = "select",
|
|
387
390
|
disabled: T.value || E.value,
|
|
388
391
|
class: "_cppay-btn _cppay-btn-text"
|
|
389
392
|
}, " 更改支付方式 ", 8, _hoisted_48)])
|
|
@@ -406,11 +409,11 @@ var handleClose = () => {
|
|
|
406
409
|
}, handleError = (e) => {
|
|
407
410
|
cppayState.value.options?.onError?.(e);
|
|
408
411
|
};
|
|
409
|
-
const CppayPlugin = { install(e,
|
|
410
|
-
if (!
|
|
411
|
-
cppayState.value.apikey =
|
|
412
|
-
let
|
|
413
|
-
document.body.appendChild(
|
|
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() {
|
|
414
417
|
return () => cppayState.value.options ? h(PaymentDialog_default, {
|
|
415
418
|
modelValue: cppayState.value.open,
|
|
416
419
|
"onUpdate:modelValue": (e) => {
|
|
@@ -424,7 +427,7 @@ const CppayPlugin = { install(e, _) {
|
|
|
424
427
|
onSuccess: handleSuccess,
|
|
425
428
|
onError: handleError
|
|
426
429
|
}) : null;
|
|
427
|
-
} }).mount(
|
|
430
|
+
} }).mount(y);
|
|
428
431
|
} }, useCppayPayment = () => {
|
|
429
432
|
if (!cppayState.value.apikey) throw Error("useCppayPayment must be used after installing CppayPlugin");
|
|
430
433
|
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.28",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "vite",
|
|
@@ -33,44 +33,13 @@
|
|
|
33
33
|
}
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@reown/appkit": "^1.8.16",
|
|
37
|
-
"@reown/appkit-adapter-ethers": "^1.8.16",
|
|
38
36
|
"qrcode": "^1.5.4",
|
|
39
37
|
"react": ">=16.8.0",
|
|
40
38
|
"react-dom": ">=16.8.0",
|
|
41
|
-
"rxjs": "^7.8.2",
|
|
42
39
|
"viem": "^2.0.0",
|
|
43
40
|
"vue": "^3.0.0"
|
|
44
41
|
},
|
|
45
|
-
"peerDependenciesMeta": {
|
|
46
|
-
"@reown/appkit": {
|
|
47
|
-
"optional": true
|
|
48
|
-
},
|
|
49
|
-
"@reown/appkit-adapter-ethers": {
|
|
50
|
-
"optional": true
|
|
51
|
-
},
|
|
52
|
-
"qrcode": {
|
|
53
|
-
"optional": true
|
|
54
|
-
},
|
|
55
|
-
"react": {
|
|
56
|
-
"optional": true
|
|
57
|
-
},
|
|
58
|
-
"react-dom": {
|
|
59
|
-
"optional": true
|
|
60
|
-
},
|
|
61
|
-
"rxjs": {
|
|
62
|
-
"optional": true
|
|
63
|
-
},
|
|
64
|
-
"viem": {
|
|
65
|
-
"optional": true
|
|
66
|
-
},
|
|
67
|
-
"vue": {
|
|
68
|
-
"optional": true
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
42
|
"devDependencies": {
|
|
72
|
-
"@reown/appkit": "^1.8.16",
|
|
73
|
-
"@reown/appkit-adapter-ethers": "^1.8.16",
|
|
74
43
|
"@types/node": "^25.0.8",
|
|
75
44
|
"@types/qrcode": "^1",
|
|
76
45
|
"@types/react": "^19",
|
|
@@ -78,24 +47,54 @@
|
|
|
78
47
|
"@vitejs/plugin-react": "^5.1.2",
|
|
79
48
|
"@vitejs/plugin-vue": "^6.0.3",
|
|
80
49
|
"ethers": "^6.16.0",
|
|
81
|
-
"qrcode": "^1.5.4",
|
|
82
50
|
"react": "^19.2.3",
|
|
83
51
|
"react-dom": "^19.2.3",
|
|
84
|
-
"rxjs": "^7.8.2",
|
|
85
52
|
"typescript": "~5.9.3",
|
|
86
|
-
"viem": "^2.
|
|
53
|
+
"viem": "^2.0.0",
|
|
87
54
|
"vite": "npm:rolldown-vite@7.2.5",
|
|
88
55
|
"vite-plugin-dts": "^4.5.4",
|
|
89
56
|
"vitest": "^4.0.17",
|
|
90
57
|
"vue": "^3.5.26"
|
|
91
58
|
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@reown/appkit": "^1.8.16",
|
|
61
|
+
"@reown/appkit-adapter-ethers": "^1.8.16",
|
|
62
|
+
"rxjs": "^7.8.2"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"react": {
|
|
66
|
+
"optional": true
|
|
67
|
+
},
|
|
68
|
+
"react-dom": {
|
|
69
|
+
"optional": true
|
|
70
|
+
},
|
|
71
|
+
"viem": {
|
|
72
|
+
"optional": false
|
|
73
|
+
},
|
|
74
|
+
"vue": {
|
|
75
|
+
"optional": true
|
|
76
|
+
}
|
|
77
|
+
},
|
|
92
78
|
"resolutions": {
|
|
93
79
|
"vite": "npm:rolldown-vite@7.2.5"
|
|
94
80
|
},
|
|
95
81
|
"packageManager": "yarn@4.12.0",
|
|
96
|
-
"description": "",
|
|
97
|
-
"author": "",
|
|
82
|
+
"description": "Cppay SDK for cryptocurrency payments - supports React and Vue",
|
|
83
|
+
"author": "Cppay Team",
|
|
98
84
|
"license": "MIT",
|
|
99
|
-
"repository":
|
|
100
|
-
|
|
85
|
+
"repository": {
|
|
86
|
+
"type": "git",
|
|
87
|
+
"url": "https://github.com/cppay/cppay-sdk"
|
|
88
|
+
},
|
|
89
|
+
"keywords": [
|
|
90
|
+
"cppay",
|
|
91
|
+
"crypto",
|
|
92
|
+
"payment",
|
|
93
|
+
"wallet",
|
|
94
|
+
"web3",
|
|
95
|
+
"blockchain",
|
|
96
|
+
"ethereum",
|
|
97
|
+
"react",
|
|
98
|
+
"vue"
|
|
99
|
+
]
|
|
101
100
|
}
|