import{af as l,k as n,m as e,a as t,g as a,x as i,O as u,z as o,A as r,t as s,b as d,U as c,V as p,y as m,d as y,R as _,e as h,ae as f,q as b}from"./element-plus.DUy1TWHM.js";import{a0 as g,y as v,_ as k}from"./index.B1CvNv-2.js";import{P as A,_ as C,a as S}from"./PageContent.v2drBSrF.js";import{P as w}from"./system.0GYJijcz.js";import{E as x}from"./xml.DHJV7eh_.js";import{M as P,bE as j,a_ as $,aL as I,u as T,I as K,bJ as D,bk as B,v as E,bL as z,s as V,t as O,bb as U,H as N,au as H,aU as q,aS as L}from"./@vue.DbmRtknU.js";import"./lodash-es.DaM9m3L-.js";import"./async-validator.j0i5Y79Y.js";import"./@popperjs.DxtSUbXb.js";import"./@ctrl.BEgk5vdO.js";import"./dayjs.DCWbrgJ0.js";import"./memoize-one.BAtLgO95.js";import"./normalize-wheel-es.TzhA1irr.js";import"./@floating-ui.8vigAAFV.js";import"./pinia.BlfmsheH.js";import"./@vueuse.Dnsd2JKX.js";import"./vue-i18n.DXLOBfKS.js";import"./@intlify.DPMNdUn_.js";import"./nprogress.BTjJXJ-u.js";import"./codemirror.CYSLATvI.js";import"./diff-match-patch.DkK4wJpa.js";import"./vue-web-terminal.D-rog7dz.js";import"./vue.MGxsMDTR.js";/* empty css */import"./axios.Da-QW0H8.js";import"./qs.BQjOrGHM.js";import"./side-channel.4q28KFJj.js";import"./es-errors.DTEWvbA_.js";import"./object-inspect.DvQZIv3_.js";import"./side-channel-list.Do0-XmF5.js";import"./side-channel-map.DNHQ53lO.js";import"./get-intrinsic.Bbe5x-9b.js";import"./es-object-atoms.CyiuHMUS.js";import"./math-intrinsics.pM-JTNwN.js";import"./gopd.BudZp56J.js";import"./es-define-property.F0aoeP8o.js";import"./has-symbols.BcO-SUVM.js";import"./get-proto.Cb_fpw-j.js";import"./dunder-proto.WEH3rgQR.js";import"./call-bind-apply-helpers.DJjIjCF_.js";import"./function-bind.DrnB-baK.js";import"./hasown.BXcyoiLU.js";import"./call-bound.22gFUC2Q.js";import"./side-channel-weakmap.DpSeWE6i.js";import"./vue-router.yxIMtaxH.js";import"./pinia-plugin-persistedstate.COWkwNh5.js";import"./exceljs.DLSZe_6I.js";const F=l=>g({url:"/payment/api-key",method:"POST",data:l}),R=l=>g({url:"/payment/api-key/list",method:"GET",params:l}),W=(l,n)=>g({url:`/payment/api-key/${l}`,method:"PUT",data:n}),G=l=>g({url:`/payment/api-key/${l}`,method:"DELETE"}),J=()=>g({url:"/payment/openapi/conf",method:"GET"}),Y=l=>g({url:"/payment/openapi/conf",method:"POST",data:l}),M={class:"app-container"},Q={class:"data-table__toolbar--right"},X={class:"data-table__content"},Z={class:"api-key-container"},ll={class:"dialog-footer"},nl={class:"api-key-detail"},el={class:"api-key-detail"},tl={class:"dialog-footer"},al={class:"config-layout"},il={class:"config-empty"},ul={class:"docs-layout"},ol={class:"docs-sidebar"},rl={class:"sidebar-section"},sl={class:"sidebar-section"},dl={class:"sidebar-section"},cl={class:"sidebar-section"},pl={class:"docs-content"},ml={class:"card-header"},yl={key:0,class:"section-content"},_l={key:1,class:"section-content"},hl={key:2,class:"section-content"},fl={key:3,class:"section-content"},bl={class:"api-table"},gl={class:"expandable-section"},vl={key:0,class:"expandable-content"},kl={class:"api-table nested-table"},Al={class:"expandable-section"},Cl={key:0,class:"expandable-content"},Sl={key:4,class:"section-content"},wl={key:5,class:"section-content"},xl={key:6,class:"section-content"},Pl={key:7,class:"section-content"},jl={key:8,class:"section-content"},$l=k(P({name:"ApiKey",inheritAttrs:!1,__name:"index",setup(g){const k=q("management"),P=q("auth"),{searchRef:$l,contentRef:Il,handleQueryClick:Tl,handleResetClick:Kl,refreshList:Dl}=v(),Bl=q(),El=q(!1),zl=q(!1),Vl=q(),Ol=q(!0),Ul=q({payee_info:!1,bankcard_ext_info:!1}),Nl=q(!1),Hl=L({app_id:"",gateway_url:"",notify_url:"",return_url:"",status:"ENABLED",description:""});async function ql(){Ol.value=!0;try{const l=await Y({notify_url:"",return_url:""});0===l.data.code&&l.data.data&&(Object.assign(Hl,l.data.data),Nl.value=!0,b.success("创建成功"))}catch(l){b.error("创建失败")}finally{Ol.value=!1}}async function Ll(){Ol.value=!0;try{const l=await Y({notify_url:Hl.notify_url,return_url:Hl.return_url});0===l.data.code&&l.data.data&&Object.assign(Hl,l.data.data)}catch(l){}finally{Ol.value=!1}}function Fl(l){Ul.value[l]=!Ul.value[l]}j(k,l=>{"config"===l&&async function(){var l,n,e;Ol.value=!0,Nl.value=!1;try{const l=await J();0===l.data.code&&l.data.data?(Object.assign(Hl,l.data.data),Nl.value=!0):Nl.value=!1}catch(t){(null==(e=null==(n=null==(l=null==t?void 0:t.response)?void 0:l.data)?void 0:n.msg)?void 0:e.includes("配置不存在"))&&(Nl.value=!1)}finally{Ol.value=!1}}()});const Rl=L({id:0,api_key:"",api_secret:"",status:"0",expired_at:"",created_time:"",return_url:""}),Wl=L({permPrefix:"module_system:tenant:api-key",colon:!0,isExpandable:!0,showNumber:2,form:{labelWidth:"auto"},formItems:[{prop:"status",label:"状态",type:"select",attrs:{placeholder:"请选择状态",clearable:!0,options:[{label:"正常",value:"0"},{label:"禁用",value:"1"}],style:{width:"167.5px"}}}]}),Gl=L([{prop:"selection",label:"选择框",show:!0},{prop:"id",label:"ID",show:!1},{prop:"api_key",label:"API Key",show:!0},{prop:"status",label:"状态",show:!0},{prop:"return_url",label:"回调地址",show:!0},{prop:"expired_at",label:"过期时间",show:!0},{prop:"last_used_at",label:"最后使用时间",show:!0},{prop:"description",label:"描述",show:!0},{prop:"created_time",label:"创建时间",show:!0},{prop:"operation",label:"操作",show:!0}]),Jl=L({permPrefix:"module_system:tenant:api-key",pk:"id",cols:Gl,hideColumnFilter:!1,toolbar:[],defaultToolbar:[{name:"refresh",perm:"refresh"},"filter"],pagination:{pageSize:10,pageSizes:[10,20,30,50]},request:{page_no:"page",page_size:"page_size"},indexAction:async l=>{const n=await R(l);return{total:n.data.data.total,list:n.data.data.items}},deleteAction:async l=>{const n=l.split(",").map(l=>Number(l.trim())).filter(l=>!Number.isNaN(l));for(const e of n)await G(e)},deleteConfirm:{title:"警告",message:"确认删除该项数据?",type:"warning"}}),Yl=L({tenant_id:void 0,expired_days:365,description:"",return_url:""}),Ml=L({title:"",visible:!1,type:"create"}),Ql=L({expired_days:[{required:!0,message:"请输入过期天数",trigger:"blur"}]}),Xl={tenant_id:void 0,expired_days:365,description:""};async function Zl(){Bl.value&&(Bl.value.resetFields(),Bl.value.clearValidate()),Object.assign(Yl,Xl)}async function ln(){Ml.visible=!1,await Zl()}async function nn(){Bl.value.validate(async l=>{if(l){El.value=!0;try{const l=await F(Yl);Object.assign(Rl,l.data.data),zl.value=!0,Ml.visible=!1,await Zl(),Dl()}catch(n){}finally{El.value=!1}}})}function en(l){navigator.clipboard.writeText(l).then(()=>{b.success("复制成功")}).catch(()=>{b.error("复制失败")})}function tn(){b.warning("请务必已保存API Key和Secret,关闭后将无法再次查看"),zl.value=!1}function an(){b.success("已确认保存"),zl.value=!1}function un(){const l=`API Key,API Secret,状态,过期时间,创建时间,描述\n"${Rl.api_key}","${Rl.api_secret}","${"0"===Rl.status?"正常":"禁用"}","${Rl.expired_at}","${Rl.created_time}","${Rl.description||""}"`,n=new Blob([l],{type:"text/csv;charset=utf-8;"}),e=document.createElement("a"),t=URL.createObjectURL(n);e.setAttribute("href",t),e.setAttribute("download",`api-key-${Rl.api_key||Date.now()}.csv`),e.style.visibility="hidden",document.body.appendChild(e),e.click(),document.body.removeChild(e),b.success("CSV已下载")}return(g,v)=>{const j=i,q=e,L=t,F=a,R=n,G=s,J=r,Y=o,Xl=d,Zl=p,on=c,rn=l,sn=m,dn=y,cn=h,pn=f,mn=$("hasPerm"),yn=u;return I(),T("div",M,[K(pn,{modelValue:k.value,"onUpdate:modelValue":v[24]||(v[24]=l=>k.value=l),type:"card"},{default:D(()=>[K(rn,{label:"API Key管理",name:"management"},{default:D(()=>[K(w,{ref_key:"searchRef",ref:$l,"search-config":Wl,onQueryClick:B(Tl),onResetClick:B(Kl)},null,8,["search-config","onQueryClick","onResetClick"]),K(A,{ref_key:"contentRef",ref:Il,"content-config":Jl},{toolbar:D(({toolbarRight:l,onToolbar:n,removeIds:e,cols:t})=>[K(C,{"remove-ids":e,"perm-create":["module_system:tenant:api-key:create"],"perm-delete":["module_system:tenant:api-key:delete"],onAdd:v[0]||(v[0]=l=>async function(l){Ml.type=l,Ml.title="创建API Key",Ml.visible=!0}("create")),onDelete:l=>n("delete")},null,8,["remove-ids","onDelete"]),E("div",Q,[K(S,{buttons:l,cols:t,"on-toolbar":n},null,8,["buttons","cols","on-toolbar"])])]),table:D(({data:l,loading:n,tableRef:e,onSelectionChange:t,pagination:a})=>[E("div",X,[z((I(),V(R,{ref:e,"row-key":"id",data:l,height:"100%",border:"",stripe:"",onSelectionChange:t},{empty:D(()=>[K(j,{"image-size":80,description:"暂无数据"})]),default:D(()=>{var l,n,e,t,a,i,u,o;return[(null==(l=Gl.find(l=>"selection"===l.prop))?void 0:l.show)?(I(),V(q,{key:0,type:"selection","min-width":"55",align:"center"})):O("",!0),(null==(n=Gl.find(l=>"api_key"===l.prop))?void 0:n.show)?(I(),V(q,{key:"api_key",label:"API Key",prop:"api_key","min-width":"300","show-overflow-tooltip":""},{default:D(l=>[E("div",Z,[E("span",null,U(l.row.api_key),1),K(L,{type:"text",size:"small",onClick:n=>en(l.row.api_key)},{default:D(()=>[...v[25]||(v[25]=[N(" 复制 ",-1)])]),_:1},8,["onClick"])])]),_:1})):O("",!0),(null==(e=Gl.find(l=>"status"===l.prop))?void 0:e.show)?(I(),V(q,{key:"status",label:"状态",prop:"status","min-width":"80",align:"center"},{default:D(l=>[K(F,{type:"0"===l.row.status?"success":"danger"},{default:D(()=>[N(U("0"===l.row.status?"正常":"禁用"),1)]),_:2},1032,["type"])]),_:1})):O("",!0),(null==(t=Gl.find(l=>"expired_at"===l.prop))?void 0:t.show)?(I(),V(q,{key:"expired_at",label:"过期时间",prop:"expired_at","min-width":"180","show-overflow-tooltip":""})):O("",!0),(null==(a=Gl.find(l=>"return_url"===l.prop))?void 0:a.show)?(I(),V(q,{key:"return_url",label:"回调地址",prop:"return_url","min-width":"200","show-overflow-tooltip":""})):O("",!0),(null==(i=Gl.find(l=>"description"===l.prop))?void 0:i.show)?(I(),V(q,{key:"description",label:"描述",prop:"description","min-width":"150","show-overflow-tooltip":""})):O("",!0),(null==(u=Gl.find(l=>"created_time"===l.prop))?void 0:u.show)?(I(),V(q,{key:"created_time",label:"创建时间",prop:"created_time","min-width":"180","show-overflow-tooltip":""})):O("",!0),(null==(o=Gl.find(l=>"operation"===l.prop))?void 0:o.show)?(I(),V(q,{key:7,fixed:"right",label:"操作",align:"center","min-width":"200"},{default:D(l=>[z((I(),V(L,{type:"primary",size:"small",link:"",onClick:n=>async function(l,n){try{await W(l,{status:n}),b.success("API Key已"+("0"===n?"启用":"禁用")),Dl()}catch(e){b.error("操作失败")}}(l.row.id,"0"===l.row.status?"1":"0")},{default:D(()=>[N(U("0"===l.row.status?"禁用":"启用"),1)]),_:2},1032,["onClick"])),[[mn,["module_system:tenant:api-key:update"]]]),z((I(),V(L,{type:"danger",size:"small",link:"",onClick:n=>async function(l){var n;null==(n=Il.value)||n.handleDelete(l)}(l.row.id)},{default:D(()=>[...v[26]||(v[26]=[N(" 删除 ",-1)])]),_:1},8,["onClick"])),[[mn,["module_system:tenant:api-key:delete"]]])]),_:1})):O("",!0)]}),_:1},8,["data","onSelectionChange"])),[[yn,n]])])]),_:1},8,["content-config"]),K(x,{modelValue:Ml.visible,"onUpdate:modelValue":v[4]||(v[4]=l=>Ml.visible=l),title:Ml.title,onClose:ln,width:"500"},{footer:D(()=>[E("div",ll,[K(L,{onClick:ln},{default:D(()=>[...v[27]||(v[27]=[N("取消",-1)])]),_:1}),z((I(),V(L,{type:"primary",loading:El.value,onClick:nn},{default:D(()=>[...v[28]||(v[28]=[N(" 确定 ",-1)])]),_:1},8,["loading"])),[[mn,["module_system:tenant:api-key:create"]]])])]),default:D(()=>[K(Y,{ref_key:"dataFormRef",ref:Bl,model:Yl,rules:Ql,"label-suffix":":","label-width":"auto","label-position":"right"},{default:D(()=>[K(J,{label:"过期天数",prop:"expired_days"},{default:D(()=>[K(G,{modelValue:Yl.expired_days,"onUpdate:modelValue":v[1]||(v[1]=l=>Yl.expired_days=l),modelModifiers:{number:!0},type:"number",placeholder:"请输入过期天数",min:"1",maxlength:4},null,8,["modelValue"])]),_:1}),K(J,{label:"描述",prop:"description"},{default:D(()=>[K(G,{modelValue:Yl.description,"onUpdate:modelValue":v[2]||(v[2]=l=>Yl.description=l),type:"textarea",rows:3,placeholder:"请输入描述(可选)",maxlength:255},null,8,["modelValue"])]),_:1}),K(J,{label:"回调地址",prop:"return_url"},{default:D(()=>[K(G,{modelValue:Yl.return_url,"onUpdate:modelValue":v[3]||(v[3]=l=>Yl.return_url=l),type:"textarea",rows:2,placeholder:"请输入回调地址(可选)",maxlength:255},null,8,["modelValue"])]),_:1})]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title"]),K(x,{modelValue:zl.value,"onUpdate:modelValue":v[7]||(v[7]=l=>zl.value=l),title:"API Key详情",width:"600","close-on-press-escape":!1,"close-on-click-modal":!1,onClose:tn},{footer:D(()=>[E("div",tl,[K(L,{onClick:un},{default:D(()=>[...v[31]||(v[31]=[N("下载CSV",-1)])]),_:1}),K(L,{type:"primary",onClick:an},{default:D(()=>[...v[32]||(v[32]=[N("确认已保存",-1)])]),_:1})])]),default:D(()=>[K(Xl,{title:"请及时保存API Key和Secret,关闭后无法再次查看",type:"warning",closable:!1,"show-icon":"",style:{"margin-bottom":"16px"}}),K(on,{column:1,border:""},{default:D(()=>[K(Zl,{label:"API Key"},{default:D(()=>[E("div",nl,[E("span",null,U(Rl.api_key),1),K(L,{type:"text",size:"small",onClick:v[5]||(v[5]=l=>en(Rl.api_key))},{default:D(()=>[...v[29]||(v[29]=[N(" 复制 ",-1)])]),_:1})])]),_:1}),K(Zl,{label:"API Secret"},{default:D(()=>[E("div",el,[E("span",null,U(Rl.api_secret),1),K(L,{type:"text",size:"small",onClick:v[6]||(v[6]=l=>en(Rl.api_secret||""))},{default:D(()=>[...v[30]||(v[30]=[N(" 复制 ",-1)])]),_:1})])]),_:1}),K(Zl,{label:"状态"},{default:D(()=>[K(F,{type:"0"===Rl.status?"success":"danger"},{default:D(()=>[N(U("0"===Rl.status?"正常":"禁用"),1)]),_:1},8,["type"])]),_:1}),K(Zl,{label:"过期时间"},{default:D(()=>[N(U(Rl.expired_at),1)]),_:1}),K(Zl,{label:"创建时间"},{default:D(()=>[N(U(Rl.created_time),1)]),_:1}),K(Zl,{label:"描述"},{default:D(()=>[N(U(Rl.description||"无"),1)]),_:1}),K(Zl,{label:"回调地址"},{default:D(()=>[N(U(Rl.return_url||"无"),1)]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1}),K(rn,{label:"应用配置",name:"config"},{default:D(()=>[E("div",al,[Ol.value?z((I(),V(sn,{key:0,class:"config-card"},{header:D(()=>[...v[33]||(v[33]=[E("div",{class:"card-header"},[E("span",null,"开放平台配置")],-1)])]),_:1})),[[yn,Ol.value]]):Nl.value?(I(),V(sn,{key:2,class:"config-card"},{header:D(()=>[...v[37]||(v[37]=[E("div",{class:"card-header"},[E("span",null,"开放平台配置")],-1)])]),default:D(()=>[K(Y,{ref_key:"configFormRef",ref:Vl,model:Hl,"label-width":"140px","label-position":"right",style:{"max-width":"600px"}},{default:D(()=>[K(J,{label:"应用ID"},{default:D(()=>[K(G,{modelValue:Hl.app_id,"onUpdate:modelValue":v[9]||(v[9]=l=>Hl.app_id=l),disabled:""},{append:D(()=>[K(L,{onClick:v[8]||(v[8]=l=>en(Hl.app_id))},{default:D(()=>[K(dn,null,{default:D(()=>[K(B(_))]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1}),K(J,{label:"网关地址"},{default:D(()=>[K(G,{modelValue:Hl.gateway_url,"onUpdate:modelValue":v[11]||(v[11]=l=>Hl.gateway_url=l),disabled:""},{append:D(()=>[K(L,{onClick:v[10]||(v[10]=l=>en(Hl.gateway_url))},{default:D(()=>[K(dn,null,{default:D(()=>[K(B(_))]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1}),K(J,{label:"回调地址"},{default:D(()=>[K(G,{modelValue:Hl.return_url,"onUpdate:modelValue":v[12]||(v[12]=l=>Hl.return_url=l),placeholder:"请输入回调地址",clearable:""},null,8,["modelValue"])]),_:1}),K(J,{label:"状态"},{default:D(()=>[K(F,{type:"ENABLED"===Hl.status?"success":"info"},{default:D(()=>[N(U("ENABLED"===Hl.status?"启用":"禁用"),1)]),_:1},8,["type"])]),_:1}),K(J,null,{default:D(()=>[K(L,{type:"primary",loading:Ol.value,onClick:Ll},{default:D(()=>[...v[38]||(v[38]=[N(" 保存配置 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),_:1})):(I(),V(sn,{key:1,class:"config-card"},{header:D(()=>[...v[34]||(v[34]=[E("div",{class:"card-header"},[E("span",null,"开放平台配置")],-1)])]),default:D(()=>[E("div",il,[K(j,{description:"暂无开放平台配置"}),v[36]||(v[36]=E("p",{style:{margin:"16px 0",color:"#606266"}}," 请先创建开放平台配置,才能收到平台回调通知。 ",-1)),K(L,{type:"primary",loading:Ol.value,onClick:ql},{default:D(()=>[...v[35]||(v[35]=[N(" 创建配置 ",-1)])]),_:1},8,["loading"])])]),_:1}))])]),_:1}),K(rn,{label:"接入文档",name:"docs"},{default:D(()=>[E("div",ul,[E("div",ol,[K(cn,null,{default:D(()=>[E("div",rl,[v[39]||(v[39]=E("h3",null,"认证",-1)),E("ul",null,[E("li",{onClick:v[13]||(v[13]=l=>P.value="auth"),class:H({active:"auth"===P.value})}," 认证方式 ",2),E("li",{onClick:v[14]||(v[14]=l=>P.value="signature"),class:H({active:"signature"===P.value})}," 签名验证 ",2),E("li",{onClick:v[15]||(v[15]=l=>P.value="notes"),class:H({active:"notes"===P.value})}," 注意事项 ",2)])]),E("div",sl,[v[40]||(v[40]=E("h3",null,"账户接口",-1)),E("ul",null,[E("li",{onClick:v[16]||(v[16]=l=>P.value="transfer"),class:H({active:"transfer"===P.value})}," 发起转账 ",2),E("li",{onClick:v[17]||(v[17]=l=>P.value="transfer_query"),class:H({active:"transfer_query"===P.value})}," 查询转账 ",2),E("li",{onClick:v[18]||(v[18]=l=>P.value="balance"),class:H({active:"balance"===P.value})}," 账户余额 ",2)])]),E("div",dl,[v[41]||(v[41]=E("h3",null,"回调通知",-1)),E("ul",null,[E("li",{onClick:v[19]||(v[19]=l=>P.value="callback"),class:H({active:"callback"===P.value})}," 通知接口 ",2)])]),E("div",cl,[v[42]||(v[42]=E("h3",null,"其他",-1)),E("ul",null,[E("li",{onClick:v[20]||(v[20]=l=>P.value="errors"),class:H({active:"errors"===P.value})}," 常见错误 ",2),E("li",{onClick:v[21]||(v[21]=l=>P.value="php"),class:H({active:"php"===P.value})}," PHP示例代码 ",2)]),v[43]||(v[43]=N(" identity_type ",-1))])]),_:1})]),E("div",pl,[K(sn,null,{header:D(()=>[E("div",ml,[E("span",null,U({auth:"认证方式",signature:"签名验证",notes:"注意事项",transfer:"发起转账",transfer_query:"查询转账",balance:"账户余额",callback:"回调通知",errors:"常见错误",php:"PHP示例代码"}[P.value]||"API文档"),1)])]),default:D(()=>["auth"===P.value?(I(),T("div",yl,[...v[44]||(v[44]=[E("h2",null,"1. 认证方式",-1),E("p",null,"使用API Key进行认证时,需要在请求头中添加以下信息:",-1),E("pre",null,[E("code",null,"Authorization: ApiKey {api_key}\nSignature: {signature}")],-1),E("p",null,"其中:",-1),E("ul",null,[E("li",null,[E("strong",null,"Authorization"),N(" :API Key认证头,格式为 "),E("code",null,"ApiKey {api_key}")]),E("li",null,[E("strong",null,"Signature"),N(" :请求签名(必填),用于验证请求数据的完整性 ")])],-1)])])):"signature"===P.value?(I(),T("div",_l,[...v[45]||(v[45]=[E("h2",null,"2. 签名验证",-1),E("p",null,"签名用于验证请求数据的完整性,防止数据被篡改。签名生成步骤:",-1),E("ol",null,[E("li",null,[N(" 过滤请求参数:排除 "),E("code",null,"sign"),N(" 参数、 "),E("code",null,"null"),N(" 值、空字符串、空数组、空对象 ")]),E("li",null,"将过滤后的参数按参数名ASCII码升序排序"),E("li",null,[N(" 对字典或列表类型的值进行JSON序列化( "),E("code",null,"sort_keys=true"),N(" , "),E("code",null,"separators=(',', ':')"),N(" ) ")]),E("li",null,[N(" 对每个参数值进行URL编码( "),E("code",null,"UTF-8"),N(" 编码) ")]),E("li",null,[N(" 将排序后的参数拼接为字符串: "),E("code",null,"key1=value1&key2=value2")]),E("li",null,"使用API Secret作为密钥,通过HMAC-SHA256算法生成签名"),E("li",null,[N(" 将签名添加到请求头 "),E("code",null,"Signature"),N(" 中 ")])],-1),E("h3",null,"2.1 签名计算示例",-1),E("pre",null,[E("code",null,'# 原始请求数据\n{\n "account_book_id": "123456",\n "amount": "100.00",\n "payee_info": {\n "identity_type": "ALIPAY_ACCOUNT",\n "name": "张三",\n "identity": "zhangsan@example.com"\n },\n "sign": "不需要参与签名",\n "empty_param": "",\n "null_param": null\n}\n\n# 1. 过滤后(排除sign、空字符串、null)\n{\n "account_book_id": "123456",\n "amount": "100.00",\n "payee_info": {\n "identity_type": "ALIPAY_ACCOUNT",\n "name": "张三",\n "identity": "zhangsan@example.com"\n }\n}\n\n# 2. 按参数名升序排序\naccount_book_id, amount, payee_info\n\n# 3. JSON序列化嵌套对象\npayee_info={"identity":"zhangsan@example.com","identity_type":"ALIPAY_ACCOUNT","name":"张三"}\n\n# 4. URL编码(处理中文)\nname=%E5%BC%A0%E4%B8%89\n\n# 5. 拼接字符串\naccount_book_id=123456&amount=100.0&payee_info=%7B%22identity%22%3A%22zhangsan%40example.com%22%2C%22identity_type%22%3A%22ALIPAY_ACCOUNT%22%2C%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%7D\n\n# 6. HMAC-SHA256签名(密钥为API Secret)\nsignature = HMAC-SHA256(api_secret, sign_str)\n\n# 7. 请求头中添加签名\nSignature: {signature}')],-1)])])):"notes"===P.value?(I(),T("div",hl,[...v[46]||(v[46]=[E("h2",null,"3. 注意事项",-1),E("ul",null,[E("li",null,"API Key和Secret请妥善保管,不要泄露给他人"),E("li",null,[N(" 签名验证是 "),E("strong",null,"必填"),N(" 的,未带签名或签名错误将返回401 ")]),E("li",null,"签名使用HMAC-SHA256算法,密钥为API Secret"),E("li",null,[N(" 签名计算前会自动过滤: "),E("code",null,"sign"),N(" 参数、 "),E("code",null,"null"),N(" 值、空字符串、空数组、空对象 ")]),E("li",null,[N(" 嵌套对象(如 "),E("code",null,"payee_info"),N(" )会先进行JSON序列化再参与签名 ")]),E("li",null,"参数值会进行URL编码(UTF-8),确保中文字符正确处理"),E("li",null,"定期更新API Key,建议每3-6个月更换一次"),E("li",null,"如发现API Key泄露,请立即禁用并重新生成"),E("li",null,"API Key有过期时间,请在过期前及时更新")],-1)])])):"transfer"===P.value?(I(),T("div",fl,[v[64]||(v[64]=E("h2",null,"4. 发起转账",-1)),v[65]||(v[65]=E("h3",null,"4.1 接口说明",-1)),v[66]||(v[66]=E("p",null,"从资金账户转账到支付宝账户/银行卡",-1)),v[67]||(v[67]=E("h4",null,"API接口地址",-1)),v[68]||(v[68]=E("p",null,[E("code",null,"POST https://api.qcsj88888.com/payment/openapi/account/transfer")],-1)),v[69]||(v[69]=E("h4",null,"请求参数",-1)),E("table",bl,[v[63]||(v[63]=E("thead",null,[E("tr",null,[E("th",null,"参数名"),E("th",null,"类型"),E("th",null,"是否必填"),E("th",null,"描述")])],-1)),E("tbody",null,[v[58]||(v[58]=E("tr",null,[E("td",null,"account_book_id"),E("td",null,"string"),E("td",null,"是"),E("td",null,"付款方资金账户号(资金专户转账页的账户号)")],-1)),v[59]||(v[59]=E("tr",null,[E("td",null,"amount"),E("td",null,"string"),E("td",null,"是"),E("td",null,"转账金额,单位为元,精确到小数点后两位,大于0.02元")],-1)),v[60]||(v[60]=E("tr",null,[E("td",null,"order_title"),E("td",null,"string"),E("td",null,"否"),E("td",null,"转账标题(若传参,支付宝要求必须大于四个字)")],-1)),v[61]||(v[61]=E("tr",null,[E("td",null,"remark"),E("td",null,"string"),E("td",null,"否"),E("td",null,"转账备注(若传参,支付宝要求必须大于四个字)")],-1)),v[62]||(v[62]=E("tr",null,[E("td",null,"third_biz_no"),E("td",null,"string"),E("td",null,"是"),E("td",null,"三方订单号(商户侧唯一标识,不可重复)")],-1)),E("tr",null,[v[55]||(v[55]=E("td",null,"payee_info",-1)),v[56]||(v[56]=E("td",null,"object",-1)),v[57]||(v[57]=E("td",null,"是",-1)),E("td",null,[E("div",gl,[E("span",{onClick:v[22]||(v[22]=l=>Fl("payee_info")),class:"expand-btn"},U(Ul.value.payee_info?"▼":"▶")+" 收款方信息 ",1),Ul.value.payee_info?(I(),T("div",vl,[E("table",kl,[v[54]||(v[54]=E("thead",null,[E("tr",null,[E("th",null,"参数名"),E("th",null,"类型"),E("th",null,"是否必填"),E("th",null,"描述")])],-1)),E("tbody",null,[v[51]||(v[51]=E("tr",null,[E("td",null,"identity_type"),E("td",null,"string"),E("td",null,"是"),E("td",null,"收款方类型:alipay(支付宝账户)/ bank(银行卡)")],-1)),v[52]||(v[52]=E("tr",null,[E("td",null,"name"),E("td",null,"string"),E("td",null,"是"),E("td",null,"收款方真实姓名")],-1)),v[53]||(v[53]=E("tr",null,[E("td",null,"identity"),E("td",null,"string"),E("td",null,"是"),E("td",null,"收款方唯一标识(支付宝账号/银行卡号)")],-1)),E("tr",null,[v[48]||(v[48]=E("td",null,"bankcard_ext_info",-1)),v[49]||(v[49]=E("td",null,"object",-1)),v[50]||(v[50]=E("td",null,"否",-1)),E("td",null,[E("div",Al,[E("span",{onClick:v[23]||(v[23]=l=>Fl("bankcard_ext_info")),class:"expand-btn"},U(Ul.value.bankcard_ext_info?"▼":"▶")+" 银行卡信息(当 identity_type 为 bank 时必填) ",1),Ul.value.bankcard_ext_info?(I(),T("div",Cl,[...v[47]||(v[47]=[E("table",{class:"api-table nested-table"},[E("thead",null,[E("tr",null,[E("th",null,"参数名"),E("th",null,"类型"),E("th",null,"是否必填"),E("th",null,"描述")])]),E("tbody",null,[E("tr",null,[E("td",null,"account_type"),E("td",null,"string"),E("td",null,"是"),E("td",null,"收款账户类型: 1/2。对公: 1,对私: 2")]),E("tr",null,[E("td",null,"inst_name"),E("td",null,"string"),E("td",null,"否"),E("td",null,"机构名称(当 account_type 是 1 时必填)")]),E("tr",null,[E("td",null,"inst_province"),E("td",null,"string"),E("td",null,"否"),E("td",null,"银行所在省份")]),E("tr",null,[E("td",null,"inst_city"),E("td",null,"string"),E("td",null,"否"),E("td",null,"收款银行所在市")]),E("tr",null,[E("td",null,"inst_branch_name"),E("td",null,"string"),E("td",null,"否"),E("td",null,"收款银行所属支行")]),E("tr",null,[E("td",null,"bank_code"),E("td",null,"string"),E("td",null,"否"),E("td",null,"银行支行联行号")])])],-1)])])):O("",!0)])])])])])])):O("",!0)])])])])]),v[70]||(v[70]=E("h4",null,"请求示例",-1)),v[71]||(v[71]=E("pre",null,[E("code",null,'curl -X POST \'https://api.qcsj88888.com/payment/openapi/account/transfer\' \\\n -H \'Authorization: ApiKey your_api_key\' \\\n -H \'Signature: your_signature\' \\\n -H \'Content-Type: application/json\' \\\n -d \'{\n "account_book_id": "资金账号",\n "amount": "100.00",\n "order_title": "转账标题",\n "third_biz_no": "商户订单号202604270001",\n "payee_info": {\n "identity_type": "ALIPAY_ACCOUNT",\n "name": "收款人姓名",\n "identity": "收款人支付宝账号"\n }\n }\'')],-1)),v[72]||(v[72]=E("h4",null,"响应示例",-1)),v[73]||(v[73]=E("pre",null,[E("code",null,'{"code": 200, "message": "转账申请已提交", "data": {"status": "DEALING", "order_no": "2026042711122334455", "third_biz_no": "商户订单号202604270001"}}')],-1))])):"transfer_query"===P.value?(I(),T("div",Sl,[...v[74]||(v[74]=[E("h2",null,"5. 查询转账",-1),E("h3",null,"5.1 接口说明",-1),E("p",null,"根据三方订单号查询转账状态和详情",-1),E("h4",null,"API接口地址",-1),E("p",null,[E("code",null,"POST https://api.qcsj88888.com/payment/openapi/account/transfer/query")],-1),E("h4",null,"请求参数",-1),E("table",{class:"api-table"},[E("thead",null,[E("tr",null,[E("th",null,"参数名"),E("th",null,"类型"),E("th",null,"是否必填"),E("th",null,"描述")])]),E("tbody",null,[E("tr",null,[E("td",null,"third_biz_no"),E("td",null,"string"),E("td",null,"是"),E("td",null,"三方订单号(发起转账时传入的商户侧唯一标识)")])])],-1),E("h4",null,"请求示例",-1),E("pre",null,[E("code",null,"curl -X POST 'https://api.qcsj88888.com/payment/openapi/account/transfer/query' \\\n -H 'Authorization: ApiKey your_api_key' \\\n -H 'Signature: your_signature' \\\n -H 'Content-Type: application/json' \\\n -d '{\n \"third_biz_no\": \"商户订单号202604270001\"\n }'")],-1),E("h4",null,"响应示例",-1),E("pre",null,[E("code",null,'{\n "code": 200,\n "message": "查询成功",\n "data": {\n "status": "SUCCESS",\n "order_no": "2026042711122334455",\n "amount": "100.00",\n "payee_info": {\n "identity_type": "ALIPAY_ACCOUNT",\n "name": "张*",\n "identity": "z****@example.com"\n },\n "created_time": "2026-04-27 11:22:33",\n "updated_time": "2026-04-27 11:25:45"\n }\n}')],-1),E("h4",null,"状态说明",-1),E("table",{class:"api-table"},[E("thead",null,[E("tr",null,[E("th",null,"状态码"),E("th",null,"描述")])]),E("tbody",null,[E("tr",null,[E("td",null,"DEALING"),E("td",null,"处理中")]),E("tr",null,[E("td",null,"SUCCESS"),E("td",null,"成功")]),E("tr",null,[E("td",null,"FAIL"),E("td",null,"失败")]),E("tr",null,[E("td",null,"REFUND"),E("td",null,"已退款")])])],-1)])])):"balance"===P.value?(I(),T("div",wl,[...v[75]||(v[75]=[E("h2",null,"6. 账户余额",-1),E("h3",null,"6.1 接口说明",-1),E("p",null,"查询指定企业资金专户的余额信息",-1),E("h4",null,"API接口地址",-1),E("p",null,[E("code",null,"POST https://api.qcsj88888.com/payment/openapi/account/balance/query")],-1),E("h4",null,"请求参数",-1),E("table",{class:"api-table"},[E("thead",null,[E("tr",null,[E("th",null,"参数名"),E("th",null,"类型"),E("th",null,"是否必填"),E("th",null,"描述")])]),E("tbody",null,[E("tr",null,[E("td",null,"enterprise_id"),E("td",null,"string"),E("td",null,"是"),E("td",null,"企业ID")])])],-1),E("h4",null,"请求示例",-1),E("pre",null,[E("code",null,"curl -X POST 'https://api.qcsj88888.com/payment/openapi/account/balance/query' \\\n -H 'Authorization: ApiKey your_api_key' \\\n -H 'Signature: your_signature' \\\n -H 'Content-Type: application/json' \\\n -d '{\n \"enterprise_id\": \"2088480777900000\"\n }'")],-1),E("h4",null,"响应示例",-1),E("pre",null,[E("code",null,'{\n "code": 200,\n "message": "查询成功",\n "data": [\n {\n "account_book_id": "2088480770900000",\n "available_amount": "50000.00",\n "enable_status": "ENABLE",\n "scene": "B2B_TRANS",\n "account_card_info": {\n "card_no": "xxxx",\n "bank_name": "招商银行"\n }\n }\n ]\n}')],-1),E("h4",null,"响应字段说明",-1),E("table",{class:"api-table"},[E("thead",null,[E("tr",null,[E("th",null,"字段名"),E("th",null,"类型"),E("th",null,"描述")])]),E("tbody",null,[E("tr",null,[E("td",null,"account_book_id"),E("td",null,"string"),E("td",null,"资金专户号")]),E("tr",null,[E("td",null,"available_amount"),E("td",null,"string"),E("td",null,"可用余额(单位:元,精确到小数点后两位)")]),E("tr",null,[E("td",null,"enable_status"),E("td",null,"string"),E("td",null,"启用状态:ENABLE(启用)/ DISABLE(禁用)")]),E("tr",null,[E("td",null,"scene"),E("td",null,"string"),E("td",null,"场景类型:B2B_TRANS(B2B转账)")]),E("tr",null,[E("td",null,"account_card_info"),E("td",null,"object"),E("td",null,"账户卡信息(银行卡号、银行名称等)")])])],-1),E("h4",null,"注意事项",-1),E("ul",null,[E("li",null,[N(" 返回结果为 "),E("strong",null,"数组"),N(" ,一个企业可能有多个资金专户 ")]),E("li",null,[N(" 余额单位为 "),E("strong",null,"元"),N(" ,精确到小数点后两位 ")]),E("li",null,[N(" 仅返回 "),E("code",null,"scene"),N(" 为 "),E("code",null,"B2B_TRANS"),N(" 的资金专户 ")])],-1)])])):"callback"===P.value?(I(),T("div",xl,[...v[76]||(v[76]=[E("h2",null,"7. 回调通知",-1),E("h3",null,"7.1 接口说明",-1),E("p",null,"当转账状态发生变化时,系统会主动向商户配置的回调地址发送通知。",-1),E("h4",null,"回调地址配置",-1),E("p",null,"系统按照以下优先级获取回调地址:",-1),E("ol",{style:{"margin-left":"20px"}},[E("li",null,[E("strong",null,"API Key 级别"),N(" :在创建/编辑 API Key 时配置回调地址(优先级最高) ")]),E("li",null,[E("strong",null,"开放平台配置"),N(" :在 "),E("strong",null,"应用配置"),N(" 页面设置默认回调地址 ")])],-1),E("p",{style:{color:"#909399","margin-top":"8px"}}," 说明:如果 API Key 已配置回调地址,则优先使用;否则使用开放平台配置中的回调地址。 ",-1),E("h4",null,"通知方式",-1),E("ul",null,[E("li",null,[E("strong",null,"POST 请求"),N(" :系统通过 HTTP POST 方式将通知数据发送到商户的回调地址 ")]),E("li",null,[E("strong",null,"表单形式"),N(" :通知参数以表单形式提交(Content-Type: multipart/form-data) ")]),E("li",null,[E("strong",null,"重试机制"),N(" :如果通知失败,系统会自动重试(最多2次,间隔1秒、2秒) ")])],-1),E("h4",null,"请求参数",-1),E("table",{class:"api-table"},[E("thead",null,[E("tr",null,[E("th",null,"参数名"),E("th",null,"类型"),E("th",null,"描述")])]),E("tbody",null,[E("tr",null,[E("td",null,"notify_id"),E("td",null,"string"),E("td",null,"通知ID,唯一标识")]),E("tr",null,[E("td",null,"timestamp"),E("td",null,"int"),E("td",null,"通知时间戳(毫秒)")]),E("tr",null,[E("td",null,"content"),E("td",null,"string"),E("td",null,"JSON格式的通知内容")])])],-1),E("h4",null,"content 字段说明",-1),E("table",{class:"api-table"},[E("thead",null,[E("tr",null,[E("th",null,"参数名"),E("th",null,"类型"),E("th",null,"描述")])]),E("tbody",null,[E("tr",null,[E("td",null,"status"),E("td",null,"string"),E("td",null,"转账状态:SUCCESS(成功)、FAIL(失败)")]),E("tr",null,[E("td",null,"order_no"),E("td",null,"string"),E("td",null,"平台订单号")]),E("tr",null,[E("td",null,"third_biz_no"),E("td",null,"string"),E("td",null,"商户订单号(发起转账时传入的三方订单号)")]),E("tr",null,[E("td",null,"amount"),E("td",null,"number"),E("td",null,"转账金额(元)")]),E("tr",null,[E("td",null,"created_time"),E("td",null,"string"),E("td",null,"创建时间")]),E("tr",null,[E("td",null,"updated_time"),E("td",null,"string"),E("td",null,"更新时间")])])],-1),E("h4",null,"通知示例",-1),N(" 成功示例 ",-1),E("pre",null,[E("code",null,'POST /your/callback/url HTTP/1.1\nContent-Type: multipart/form-data; boundary=----WebKitFormBoundary\n\n------WebKitFormBoundary\nContent-Disposition: form-data; name="notify_id"\n\nn1234567890123456789\n------WebKitFormBoundary\nContent-Disposition: form-data; name="timestamp"\n\n1715767200000\n------WebKitFormBoundary\nContent-Disposition: form-data; name="content"\n\n{\n "status": "SUCCESS",\n "order_no": "2026042711122334455",\n "third_biz_no": "商户订单号202604270001",\n "amount": "100.00",\n "created_time": "2026-04-27 11:22:33",\n "updated_time": "2026-04-27 11:25:45"\n}\n\n------WebKitFormBoundary--\n 转账成功示例\nPOST /商户回调地址 HTTP/1.1\nContent-Type: multipart/form-data; boundary=----WebKitFormBoundary\n\n------WebKitFormBoundary\nContent-Disposition: form-data; name="notify_id"\n\nn12535554089713704963\n------WebKitFormBoundary\nContent-Disposition: form-data; name="timestamp"\n\n1779037365774\n------WebKitFormBoundary\nContent-Disposition: form-data; name="content"\n\n{\n "status": "SUCCESS",\n "order_no": "2026042711122334455",\n "third_biz_no": "商户订单号202604270001",\n "amount": "100.00",\n "out_biz_no": "12535474352010076162",\n "enterprise_id": "2088480767913636",\n "account_book_id": "2088480770941200",\n "order_title": "转账标题",\n "created_time": "2026-04-27 11:22:33"\n}\n------WebKitFormBoundary--\n\n 转账失败示例\nPOST /your/callback/url HTTP/1.1\nContent-Type: multipart/form-data; boundary=----WebKitFormBoundary\n\n------WebKitFormBoundary\nContent-Disposition: form-data; name="notify_id"\n\nn12535554089713704963\n------WebKitFormBoundary\nContent-Disposition: form-data; name="timestamp"\n\n1779037365774\n------WebKitFormBoundary\nContent-Disposition: form-data; name="content"\n\n{\n "status": "FAIL",\n "third_biz_no": "商户订单号202604270001",\n "amount": "1.00",\n "error_msg": "收款账号不存在或姓名有误,建议核实账号和姓名是否准确"\n}\n------WebKitFormBoundary--\n------WebKitFormBoundary--\n')],-1),E("h4",null,"响应要求",-1),E("p",null," 商户服务端收到通知后,需要返回 HTTP 200 状态码表示成功接收。如果返回非 200 状态码或超时,系统会进行重试。 ",-1),E("h4",null,"注意事项",-1),E("ul",null,[E("li",null,[N(" 回调地址需要支持 "),E("strong",null,"HTTPS"),N(" 协议 ")]),E("li",null,[N(" 确保回调接口能够在 "),E("strong",null,"5秒内"),N(" 返回响应 ")]),E("li",null,[E("span",{style:{color:"#f56c6c"}},[E("strong",null,"重要"),N(" :回调通知不包含签名验证,收到通知后请主动调用查询接口确认订单状态,以确保数据真实性 ")])]),E("li",null,[N(" 通知可能会重复发送,请确保业务逻辑支持 "),E("strong",null,"幂等性")]),E("li",null,[N(" 系统最多重试 "),E("strong",null,"2次"),N(" ,重试间隔为 1 秒和 2 秒 ")])],-1)])])):"errors"===P.value?(I(),T("div",Pl,[...v[77]||(v[77]=[E("h2",null,"8. 常见错误",-1),E("ul",null,[E("li",null,[E("strong",null,"401 Invalid API Key"),N(" :API Key无效或已过期 ")]),E("li",null,[E("strong",null,"401 Signature header required"),N(" :未提供Signature请求头 ")]),E("li",null,[E("strong",null,"401 Invalid Signature"),N(" :签名验证失败,请检查签名计算方式 ")]),E("li",null,[E("strong",null,"400 Bad Request"),N(" :请求参数错误 ")]),E("li",null,[E("strong",null,"403 Forbidden"),N(" :无权限访问 ")]),E("li",null,[E("strong",null,"500 Internal Server Error"),N(" :服务器内部错误 ")])],-1)])])):"php"===P.value?(I(),T("div",jl,[...v[78]||(v[78]=[E("h2",null,"9. PHP 示例代码",-1),E("h3",null,"9.1 以下是签名生成的 PHP 示例代码:",-1),E("pre",{class:"code-block"},[E("code",{class:"language-php"},' $value) {\n if (in_array($key, $excludeParams, true)) {\n continue;\n }\n if ($value === null || $value === \'\') {\n continue;\n }\n if (is_array($value) && empty($value)) {\n continue;\n }\n $filteredData[$key] = $value;\n }\n\n self::ksortRecursive($filteredData);\n\n $collect = [];\n foreach ($filteredData as $key => $value) {\n if (is_array($value)) {\n $value = json_encode($value, JSON_UNESCAPED_SLASHES);\n }\n $encodedValue = rawurlencode((string)$value);\n $collect[] = "{$key}={$encodedValue}";\n }\n\n $signStr = implode(\'&\', $collect);\n return hash_hmac(\'sha256\', $signStr, $apiSecret);\n }\n\n public static function verifySignature(\n string $apiSecret,\n array $requestData,\n string $signature\n ): bool {\n $expectedSignature = self::generateSignature($apiSecret, $requestData);\n return hash_equals($expectedSignature, $signature);\n }\n}\n\n// ================= 测试调用 =================\n\n$apiSecret = \'your_api_secret_here\';\n$requestData = [\n "account_book_id" => "2088480770900000",\n "amount" => "1.00",\n "order_title" => "Apikey转账",\n "third_biz_no" => "1234242026042700111",\n "payee_info" => [\n "identity_type" => "ALIPAY_ACCOUNT",\n "name" => "钱先生",\n "identity" => "1xx9xx9xxxxx"\n ]\n];\n\n// 生成签名\n$signature = SignatureGenerator::generateSignature($apiSecret, $requestData);\necho "生成的签名: {$signature}\\n";\n\n// 验证签名\n$isValid = SignatureGenerator::verifySignature($apiSecret, $requestData, $signature);\necho "签名验证结果: " . ($isValid ? \'有效\' : \'无效\') . "\\n";\n?>')],-1)])])):O("",!0)]),_:1})])])]),_:1})]),_:1},8,["modelValue"])])}}}),[["__scopeId","data-v-ff5cd51c"]]);export{$l as default};