From 682aabfdf5dc65ef325fc610d1c438144ccae844 Mon Sep 17 00:00:00 2001 From: VK <370725567@qq.com> Date: Mon, 11 Jan 2021 14:11:12 +0800 Subject: [PATCH] 1.6.3 --- README.md | 2 +- README/1.6/1.6.3.md | 23 ++++++++++++++++ manifest.json | 3 ++- package-lock.json | 6 ++--- package.json | 2 +- template.h5.html | 26 +++++++++++++++++++ .../common/vk-unicloud/index.js | 2 +- .../common/vk-unicloud/package.json | 2 +- .../router/service/user/kh/bindAlipay.js | 6 ++--- .../router/service/user/kh/bindWeixin.js | 6 ++--- .../service/user/pub/code2SessionAlipay.js | 8 ++---- .../service/user/pub/code2SessionWeixin.js | 8 ++---- .../router/service/user/pub/loginByAlipay.js | 6 ++--- .../router/service/user/pub/loginByWeixin.js | 6 ++--- 14 files changed, 70 insertions(+), 36 deletions(-) create mode 100644 README/1.6/1.6.3.md create mode 100644 template.h5.html diff --git a/README.md b/README.md index 9fb1951..92082ca 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ### uniCloud云函数路由框架研究Q群:22466457 如有问题或建议可以在群内讨论。 ### 插件名称:`vk-unicloud-router` ### 作者:VK -### 更新时间:2021-01-08 +### 更新时间:2021-01-11 ## 主要功能 以及 对开发者的价值 #### 1、实现云函数路由模式 diff --git a/README/1.6/1.6.3.md b/README/1.6/1.6.3.md new file mode 100644 index 0000000..bd1993d --- /dev/null +++ b/README/1.6/1.6.3.md @@ -0,0 +1,23 @@ +### uniCloud 云函数路由研究群:22466457 如有问题或建议可以在群内讨论。 +### 更新内容 +#### 1、【升级】`vk-unicloud` 升级至 `1.9.2` +#### 2、【升级】`vk-unicloud-page` 升级至 `1.15.1` +#### 3、【优化】`middleware` 中间件的匹配规则`regExp`支持数组形式(满足数组内任意一条规则即可) +#### 4、【修复】`微信登陆`等API在云函数URL后,无法正常使用的问题。 +#### 5、【新增】`vk.pubfn.arrayToTree` 数组结构转树形结构(Array -> Tree) +#### 6、【新增】`vk.pubfn.treeToArray` 树形结构转数组结构(Tree -> Array)[点击查看详情](https://gitee.com/vk-uni/vk-uni-cloud-router/wikis/JS%20API%E6%96%87%E6%A1%A3%E5%A4%A7%E5%85%A8?sort_id=3268613) +#### 7、【新增】`template.h5.html` 用于配置H5的`web图标`等功能 +#### 8、【新增】全局函数 `$getData` 可以在页面渲染时使用$getData(data, key, defaultValue) 即使key不存在,也不会报错。 +``` +原生写法: {{ order.paymentInfo.balance} + +若order.paymentInfo 为 undefined,则会报如下异常: +Error in render: "TypeError: Cannot read property 'balance' of undefined" + +使用 $getData 的写法: {{ $getData(order, "paymentInfo.balance") }} + +此时,不会报异常,若指定 defaultValue ,则会渲染 defaultValue 的值 + +``` +#### 如有疑问,请加群:22466457 关于插件的问题包教包会! +### 你也可以在评论区发布留言交流心得。 \ No newline at end of file diff --git a/manifest.json b/manifest.json index 48c3074..7618312 100644 --- a/manifest.json +++ b/manifest.json @@ -80,6 +80,7 @@ }, "h5" : { "title" : "(开箱即用)uniCloud-云函数路由模式 - 带过滤器 - 支持权限拦截 - 已集成uni-id", - "domain" : "vkunicloud.fsq.pub" + "domain" : "vkunicloud.fsq.pub", + "template" : "template.h5.html" } } diff --git a/package-lock.json b/package-lock.json index 69e9b1d..3a49ca4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "integrity": "sha512-DqKc+qRrOZLPcyfWv4b0HspSS9n1Cd6BbgKiYEv9rjTAnWoqJV7rXsvWqZdr5iKGP5EMNbNS741GLNw4sIHbpw==" }, "vk-unicloud-page": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/vk-unicloud-page/-/vk-unicloud-page-1.14.1.tgz", - "integrity": "sha512-tDRFryr6w7jSrjh08NW2jRasD4JEVEcLqL18OOgiAywfZgr5YFOCC/cBAeQrcWA0g8AlhzsrV0ul1HtAJtJh3w==" + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/vk-unicloud-page/-/vk-unicloud-page-1.15.1.tgz", + "integrity": "sha512-+UTjn2pHfJNDmImM06q5KtSzx0s6KxhqYhx7biFPPyl9k8I1gBH150Fsb2Qi873EosuNGKuZ3N+mEcPU6wSwew==" } } } diff --git a/package.json b/package.json index fd84d33..a9d4165 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "【开箱即用】vk-uniCloud-router - 云函数路由模式 - uniCloud开发框架 - 已集成uni-id", "main": "main.js", "dependencies": { - "vk-unicloud-page": "^1.14.1", + "vk-unicloud-page": "^1.15.1", "uview-ui": "~1.8.3" }, "devDependencies": {}, diff --git a/template.h5.html b/template.h5.html new file mode 100644 index 0000000..0342106 --- /dev/null +++ b/template.h5.html @@ -0,0 +1,26 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + + + + + +
+ + + diff --git a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js index 6002cd4..44276e3 100644 --- a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js +++ b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/index.js @@ -1 +1 @@ -"use strict";var e={main:async e=>{let{uniID:t}=e.util,n={code:-1,msg:""},i=await t.checkToken(e.uniIdToken);if(i.code&&i.code>0)return i;let a=i.userInfo;return delete a.token,delete a.password,n.uid=i.uid,n.userInfo=a,i.token&&(n.token=i.token,n.tokenExpired=i.tokenExpired),n.code=0,n.msg="ok",n}},t=[{id:"pub",regExp:"/pub/",description:"pub函数为所有人都可以访问的函数",index:100,mode:"onActionExecuting",main:async function(t){let n={};return t.data.need_user_info&&(n=await e.main(t)),n.code=0,n.msg="ok",n}},{id:"kh",regExp:"/kh/",description:"kh函数为必须登录后才能访问的函数(客户端用户)",index:200,mode:"onActionExecuting",main:e.main},{id:"sys",regExp:"/sys/",description:"sys函数为后端管理人员才能访问的函数(商家后台工作人员)",index:300,mode:"onActionExecuting",main:{main:async t=>{let{url:n,util:i}=t,{uniID:a,config:r,pubFun:o,vk:l,db:s,_:d}=i,u={code:-1,msg:""};const c=e;if(u=await c.main(t),0!==u.code)return u;if(!u.userInfo.allow_login_background)return{code:403,msg:"您无权限登录后台"};if(l.pubfn.isNotNull(u.userInfo.role)&&u.userInfo.role.includes("admin"))return u;let f=await l.baseDao.select({dbName:"uni-id-roles",whereJson:{role_id:d.in(u.userInfo.role),enable:!0},fieldJson:{permission:!0}},t.util),g=[];for(let e in f.rows){let t=f.rows[e].permission;l.pubfn.isNotNull(t)&&(g=g.concat(t))}return 0==g.length||await l.baseDao.count({dbName:"uni-id-permissions",whereJson:{permission_id:d.in(g),enable:!0,url:n}},t.util)<=0?{code:403,msg:"权限不足"}:(u.code=0,u.msg="ok",u)}}.main}];var n=function(e){let n=[];if(e){let i=[...t,...e];i.sort((function(e,t){return e.index-t.index})),n=i.filter((e,t,n)=>{var a=[];return i.forEach((e,t)=>{a.push(e.id)}),a.indexOf(e.id)===t})}else n=t;return n},i=async(e,t)=>{let i={code:403,msg:"access denied",filterStack:[]},{url:a}=e;const r=n(t);for(let t in r){let n=r[t],{mode:o="onActionExecuting"}=n;if("onActionExecuting"===o&&new RegExp(n.regExp).test(a)){e.filterResponse=i;let t=await n.main(e);if(t.filterId=n.id,i.filterStack.push(t),0!==t.code){i=t;break}i=Object.assign(i,t)}}return i},a=async(e,t,i)=>{let{url:a}=e;const r=n(t);for(let t in r){let n=r[t],{mode:o="onActionExecuting"}=n;if("onActionExecuted"===o&&new RegExp(n.regExp).test(a)){let t=await n.main(e,i);if(t){if(0!==t.code){i=t;break}i=Object.assign(i,t)}}}return i};process.env.TZ="Asia/Shanghai";var r=async function(e){let t,{event:n,context:r,vk:o}=e,{config:l,uniID:s,uniPay:d,db:u,middlewareService:c,pubFun:f,customUtil:g}=o.config,p={event:n,context:r},y=o.getQueryStringParameters(n),{url:m,data:h,uniIdToken:_}=y,w={url:m,data:h,uniIdToken:_,util:{vk:o,config:l,pubFun:f,uniID:s,uniPay:d,db:u,customUtil:g,_:u.command},originalParam:p},b=await i(w,c);if(0!==b.code)return b;b.uid&&(h.uid=b.uid),w.filterResponse=b;try{t=o.require("service/"+m)}catch(e){return e&&"MODULE_NOT_FOUND"==e.code?{code:404,msg:`云函数 ${m} 不存在!`,err:e}:{code:500,msg:`云函数 ${m} 编译异常!`,err:e}}let x=await async function(e={}){let{res:t,serviceParam:n,serviceMain:i}=e;t.uid&&(n.uid=t.uid);t.userInfo&&(n.userInfo=t.userInfo);let a=await i.main(n);t.token&&"object"==typeof a&&(a.vk_uni_token={token:t.token,tokenExpired:t.tokenExpired});return a}({res:b,serviceParam:w,serviceMain:t});return x=await a(w,c,x),x};function o(e,t,n,i,a,r){return c((o=c(c(t,e),c(i,r)))<<(l=a)|o>>>32-l,n);var o,l}function l(e,t,n,i,a,r,l){return o(t&n|~t&i,e,t,a,r,l)}function s(e,t,n,i,a,r,l){return o(t&i|n&~i,e,t,a,r,l)}function d(e,t,n,i,a,r,l){return o(t^n^i,e,t,a,r,l)}function u(e,t,n,i,a,r,l){return o(n^(t|~i),e,t,a,r,l)}function c(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}var f=function(e){return function(e){for(var t="",n=0;n<4*e.length;n++)t+="0123456789abcdef".charAt(e[n>>2]>>n%4*8+4&15)+"0123456789abcdef".charAt(e[n>>2]>>n%4*8&15);return t}(function(e,t){e[t>>5]|=128<>>9<<4)]=t;for(var n=1732584193,i=-271733879,a=-1732584194,r=271733878,o=0;o>5]|=(255&e.charCodeAt(n/8))<100)return await g.selectAll(e,t);let l=await g.getSelectData(e,t),{result:s,hasMore:d,total:u,getCount:c,pageIndex:f}=l;return s=s.skip((f-1)*o).limit(o),s.get().then(e=>{let t={};return c?(t.hasMore=d,t.total=u):(t.total=e.data?e.data.length:0,t.hasMore=t.total>=o),t.rows=e.data,t.code=0,t.key=1,t.pageIndex=f,t.pageSize=o,t})},findById:async function(e,t){let{db:n,_:i}=t,{dbName:a,id:r,fieldJson:o}=e;try{let e=n.collection(a).doc(r);return o&&(e=e.field(o)),(await e.get()).data[0]}catch(e){return console.error(e),null}},findByWhereJson:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r,fieldJson:o}=e;try{if(r&&"{}"!==JSON.stringify(r)){let e=n.collection(a).where(r);o&&(e=e.field(o));let t=await e.limit(1).get();if(t.data&&t.data.length>0)return t.data[0]}else console.error("whereJson条件不能为空")}catch(e){console.error(e)}return null},count:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:i.neq("___")});try{return(await n.collection(a).where(r).count()).total}catch(e){return console.error(e),null}},select2:async function(e,t){let{foreignKeyType:n="many-to-one"}=e;return"many-to-one"===n?await g.select2_ManyToOne(e,t):"one-to-many"===n?await g.select2_OneToMany(e,t):(console.error("不支持的foreignKeyType"),{})},count2_ManyToOne:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p={},fieldJson:y={},fieldJson2:m={},as:h}=e;h||(h=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")});i.aggregate;let _=n.collection(r).aggregate();if(d&&"{}"!==JSON.stringify(d)&&(_=_.match(d)),y&&"{}"!==JSON.stringify(y)&&(_=_.project(y)),p&&"{}"!==JSON.stringify(p)){let e={};for(let t in p){let n=p[t],i=n.name,a=n.type;a=null==a||""==a||"asc"==a?1:-1,e[i]=a}_=_.sort(e)}let w={from:o,localField:l,foreignField:s,as:h};if(_=_.lookup(w),m&&"{}"!==JSON.stringify(m)){let e={};for(let t in m)e[h+"."+t]=m[t];_=_.project(e)}if(u&&"{}"!==JSON.stringify(u)){let e={};for(let t in u)e[h+"."+t]=u[t];_=_.match(e)}let b=await _.count("total").end();try{return b.data[0].total}catch(e){return console.log(e),0}},select2_ManyToOne:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p=[],fieldJson:y={},fieldJson2:m={},as:h,whereJsonPub:_={}}=e;h||(h=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")}),-1==f&&(c=1,f=999999999,g=!1);let w=0,b=!1;if(g){w=(await n.collection(r).where(d).count()).total,c0?J[e][h]=J[e][h][0]:J[e][h]={};return g?(x.hasMore=b,x.total=w):(x.total=J?J.length:0,x.hasMore=w>=f),x.rows=J,x.code=0,x.key=1,x},select2_OneToMany:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p=[],sortArr2:y=[],fieldJson:m={},fieldJson2:h={},as:_}=e;_||(_=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")}),-1==f&&(c=1,f=999999999,g=!1);let w=0,b=!1;if(g){w=(await n.collection(r).where(d).count()).total,c=f),x.rows=J,x.code=0,x.key=1,x},getSelectData:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r,pageIndex:o=1,pageSize:l=10,getCount:s=!1}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:i.neq("___")}),l<0&&(o=1,l=999999999,s=!0);let d=e.sortArr,u=e.fieldJson,c=0,f=!1;if(s){c=(await n.collection(a).where(r).count()).total,o0&&!c&&!f&&(c=y);let m={};if(f&&0===c)m={data:[]};else{let t=c;yr&&(n=r-t);let o=d.skip(t).limit(n).get();i.push(o)}try{m=(await Promise.all(i)).reduce((e,t)=>({data:e.data.concat(t.data),errMsg:e.errMsg}))}catch(t){console.error("selectAll-异常",e,t),m={data:[]}}}return o.rows=m.data,o.key=1,o.code=0,o.hasMore=u,o.pageIndex=p,o.pageSize=y,o.total=f?c:m.data?m.data.length:0,o},sum:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(a).aggregate().match(o).group({_id:null,num:l.sum("$"+r)}).end()).data[0].num}catch(e){return console.error(e),null}},avg:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(a).aggregate().match(o).group({_id:null,num:l.avg("$"+r)}).end()).data[0].num}catch(e){return console.error(e),null}},max:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(a).aggregate().match(o).group({_id:null,num:l.max("$"+r)}).end()).data[0].num}catch(e){return console.error(e),null}},min:async function(e,t){let{db:n,_:i}=t,{dbName:a,fieldName:r,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(a).aggregate().match(o).group({_id:null,num:l.min("$"+r)}).end()).data[0].num}catch(e){return console.error(e),null}},sample:async function(e,t){let{db:n,_:i}=t,{dbName:a,whereJson:r,size:o}=e;r&&"{}"!==JSON.stringify(r)||(r={_id:i.neq("___")});n.command.aggregate;try{return(await n.collection(a).aggregate().match(r).sample({size:o}).end()).data}catch(e){return console.error(e),null}},selects:async function(e,t){let{db:n,_:i,vk:a}=t,{dbName:r,foreignKey:o="_id",whereJson:l={},pageIndex:s=1,pageSize:d=10,getCount:u=!1,sortArr:c=[],fieldJson:f={},foreignDB:g=[]}=e;"{}"===JSON.stringify(l)&&(l={_id:i.neq("___")}),-1==d&&(s=1,d=999999999,u=!1);let p=0,y=!1;if(u){p=(await n.collection(r).where(l).count()).total,s0?w[e][n]=w[e][n][0]:w[e][n]={})}return u?(m.hasMore=y,m.total=p):(m.total=w?w.length:0,m.hasMore=p>=d),m.rows=w,m.code=0,m.key=1,m},addWhereJson:function(e,t,n={}){let{vk:i,db:a,_:r}=t,{formData:o,columns:l}=e;for(let e in l){let t,a=l[e],{key:s,mode:d,defaultValue:u,type:c=""}=a,f=s;if(i.pubfn.isNotNull(a.fieldName)&&(f=a.fieldName),t=i.pubfn.isNotNull(a.value)?a.value:o[s],i.pubfn.isNull(t)&&i.pubfn.isNotNull(u)&&(t=u),i.pubfn.isNull(d)&&(d=["address","province","city","area"].indexOf(c)>-1?"address":"[object Array]"===Object.prototype.toString.call(t)&&t.length>=2?"[]":"="),i.pubfn.isNotNull(t))if("custom"===d);else if("%%"===d)try{n[f]=new RegExp(t)}catch(e){}else if("%*"===d)try{n[f]=new RegExp("^"+t)}catch(e){}else if("*%"===d)try{n[f]=new RegExp(t+"$")}catch(e){}else if(">"===d)n[f]=r.gt(t);else if(">="===d)n[f]=r.gte(t);else if("<"===d)n[f]=r.lt(t);else if("<="===d)n[f]=r.lte(t);else if("in"===d)n[f]=r.in(t);else if("nin"===d)n[f]=r.nin(t);else if("!="===d)n[f]=r.neq(t);else if("[]"===d)n[f]=r.gte(t[0]).lte(t[1]);else if("[)"===d)n[f]=r.gte(t[0]).lt(t[1]);else if("(]"===d)n[f]=r.gt(t[0]).lte(t[1]);else if("()"===d)n[f]=r.gt(t[0]).lt(t[1]);else if("address"===d){let e={};t.province&&t.province.code&&(e["province.code"]=t.province.code),t.city&&t.city.code&&(e["city.code"]=t.city.code),t.area&&t.area.code&&(e["area.code"]=t.area.code),n[f]=e}else n[f]=t}return n}},p=g,y=async(e={})=>{"[object object]"==Object.prototype.toString.call(e.content)&&(e.content=JSON.stringify(e.content)),void 0===e.dataType&&(e.dataType="json"),"default"==e.dataType&&delete e.dataType,e.useContent&&(e.content=JSON.stringify(e.data)),e.method||(e.method="POST"),e.data&&(e.headers||(e.headers={"content-type":"application/json; charset=UTF-8"}));var t=await uniCloud.httpclient.request(e.url,e);return t&&t.data?t.data:t},m={formValidateItem:function(e,t,n){let i={code:0,msg:"ok"};for(let a in n){let r=n[a];if(void 0===e[t]&&r.required){i={type:"undefined",code:-1,msg:"字段:"+t+" 名称错误,请检查!",key:t,value:e[t]};break}if(r.required&&(null==e[t]||null==e[t]||""===e[t]||0==e[t].length)){i={type:"required",code:-1,msg:r.message,key:t,value:e[t]};break}if(r.type){if(Object.prototype.toString.call(e[t]).toLowerCase()!==`[object ${r.type}]`){i={type:"type",code:-1,msg:r.message,key:t,value:e[t]};break}}if(r.len&&e[t].length!=r.len){i={type:"len",code:-1,msg:r.message,key:t,value:e[t]};break}if(r.min)if(r.type&&"number"==r.type){if(e[t]r.max){i={type:"max",code:-1,msg:r.message,key:t,value:e[t]};break}}else if(e[t].length>r.max){i={type:"max",code:-1,msg:r.message,key:t,value:e[t]};break}if("function"==typeof r.validator){let n=r.validator(r,e[t],(function(e){return e}));if(void 0!==n&&!0!==n){i={type:"validator",code:-1,msg:r.message,key:t,value:e[t]};break}}}return i}};function h(e,t,n){let i=[];for(let a=e.length-1;a>-1;a--){const r=e[a],o=t.filter(e=>{if(e.parent_id===r.menu_id)return n.push(e.menu_id),!0});i=i.concat(o),r.children=o}i.length&&h(i,t,n)}function _(e,t){const n=[];let i=e;for(;i&&i.parent_id;)n.push(i.parent_id),i=t.find(e=>e.menu_id===i.parent_id);return n}var w={buildMenu:h,buildMenus:function(e,t=!0){if(e=e.sort((function(t,n){const i=_(t,e),a=_(n,e);return i.includes(n.menu_id)?1:i.length-a.length||t.sort-n.sort})),t)for(let t=e.length-1;t>-1;t--){const n=e[t],i=e.filter(e=>e.parent_id===n.menu_id);n.isLeafNode||i.length||e.splice(t,1)}const n=[],i=e.filter(e=>{if(!e.parent_id)return n.push(e.menu_id),!0});return h(i,e,n),t||n.length===e.length||i.push(...e.filter(e=>!n.includes(e.menu_id))),i}},b={timeFormat:function(e,t="yyyy-MM-dd hh:mm:ss",n=8){if(!e)return"";let i;"number"==typeof e?(10==e.toString().length&&(e*=1e3),i=new Date(e)):i=e;const a=60*i.getTimezoneOffset()*1e3+60*n*60*1e3,r=i.getTime()+a;i=new Date(r);let o={"M+":i.getMonth()+1,"d+":i.getDate(),"h+":i.getHours(),"m+":i.getMinutes(),"s+":i.getSeconds(),"q+":Math.floor((i.getMonth()+3)/3),S:i.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(i.getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in o)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?o[e]:("00"+o[e]).substr((""+o[e]).length)));return t},getFullTime:function(e,t=0,n=8){if(!e)return"";"number"==typeof e&&(e=new Date(e));const i=60*e.getTimezoneOffset()*1e3+60*n*60*1e3,a=e.getTime()+i;let r=(e=new Date(a)).getFullYear()+"",o=e.getMonth()+1<10?"0"+(e.getMonth()+1):e.getMonth()+1,l=e.getDate()<10?"0"+e.getDate():e.getDate(),s=e.getHours()<10?"0"+e.getHours():e.getHours(),d=e.getMinutes()<10?"0"+e.getMinutes():e.getMinutes(),u=e.getSeconds()<10?"0"+e.getSeconds():e.getSeconds();return 2===t?{YYYY:Number(r),MM:Number(o),DD:Number(l),hh:Number(s),mm:Number(d),ss:Number(u),year:Number(r),month:Number(o),day:Number(l),hour:Number(s),minute:Number(d),second:Number(u)}:1===t?r+""+o+l+s+d+u:r+"-"+o+"-"+l+" "+s+":"+d+":"+u},getWeekStartAndEnd:function(e=0,t=new Date,n=8){let i={};const a=60*t.getTimezoneOffset()*1e3+60*n*60*1e3,r=t.getTime()+a,o=new Date(r);let l=o.getDay();o.getDate();t=new Date(t.getTime()+6048e5*e);let s=0!=l?l-1:6,d=new Date(t.getTime()-864e5*s),u=new Date(d.getTime()+5184e5),c=b.getFullTime(d,2),f=b.getFullTime(u,2);return i.weekStart=new Date(`${c.year}/${c.month}/${c.day}`).getTime()-a,i.weekEnd=new Date(`${f.year}/${f.month}/${f.day}`).getTime()+86399999-a,i},getCommonTime:function(e=new Date,t=8){let n={};const i=60*e.getTimezoneOffset()*1e3+60*t*60*1e3,{year:a,month:r,day:o,hour:l,minute:s,second:d}=b.getFullTime(e,2);n.now={year:a,month:r,day:o,hour:l,minute:s,second:d};let u=new Date(a,r,0).getDate(),c=new Date(a,12,0).getDate();n.todayStart=new Date(`${a}/${r}/${o}`).getTime()-i,n.today12End=new Date(`${a}/${r}/${o}`).getTime()+43199999-i,n.todayEnd=new Date(`${a}/${r}/${o}`).getTime()+86399999-i,n.monthStart=new Date(`${a}/${r}/1`).getTime()-i,n.monthEnd=new Date(`${a}/${r}/${u}`).getTime()+86399999-i,n.yearStart=new Date(a+"/1/1").getTime()-i,n.yearEnd=new Date(`${a}/12/${c}`).getTime()+86399999-i;let f=b.getWeekStartAndEnd(0,e);n.weekStart=f.weekStart,n.weekEnd=f.weekEnd,n.months=[],n.months[0]={monthStart:n.monthStart,monthEnd:n.monthEnd};for(let e=1;e<=12;e++){let t=new Date(a,e,0).getDate(),r=new Date(`${a}/${e}/1`).getTime()-i,o=new Date(`${a}/${e}/${t}`).getTime()+86399999-i;n.months[e]={monthStart:r,monthEnd:o}}return n}},x=b,N={formValidate:function(e={}){let t={code:0,msg:"ok"},{data:n,rules:i}=e;if(i)for(let e in i){let a=i[e];if(t=m.formValidateItem(n,e,a),0!=t.code)break}return t}};N.buildUtil=w,N.timeUtil=x,N.urlStringToJson=function(e){var t={};if(""!=e&&null!=e&&null!=e)for(var n=e.split("&"),i=0;i-1){var o=a.indexOf('"',r),l=a.substring(r,o);if(o>r){var s=a.indexOf("---",o),d=a.substring(o+1,s).trim();n[l]=d}}}return n},N.timeFormat=N.timeUtil.timeFormat,N.getFullTime=N.timeUtil.getFullTime,N.getWeekStartAndEnd=N.timeUtil.getWeekStartAndEnd,N.getCommonTime=N.timeUtil.getCommonTime,N.validator=function(e){return function(t,n,i){let a=N.test(n,e);return"function"!=typeof i||!a&&n?i(!1):void i()}},N.test=function(e,t){switch(t){case"mobile":return new RegExp(/^1[3|4|5|6|7|8|9][0-9]{9}$/).test(e);case"tel":return new RegExp(/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/).test(e);case"card":return new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(e);case"mobileCode":return new RegExp(/^[0-9]{6}$/).test(e);case"username":return new RegExp(/^[a-zA-Z]([-_a-zA-Z0-9]{5,17})$/).test(e);case"pwd":return new RegExp(/^([a-zA-Z0-9_]){6,18}$/).test(e);case"payPwd":return new RegExp(/^[0-9]{6}$/).test(e);case"postal":return new RegExp(/[1-9]\d{5}(?!\d)/).test(e);case"QQ":return new RegExp(/^[1-9][0-9]{4,9}$/).test(e);case"email":return new RegExp(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/).test(e);case"money":return new RegExp(/^\d*(?:\.\d{0,2})?$/).test(e);case"URL":return new RegExp(/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/).test(e);case"IP":return new RegExp(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/).test(e);case"date":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/).test(e);case"time":return new RegExp(/^(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"dateTime":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"number":return new RegExp(/^[0-9]*$/).test(e);case"english":return new RegExp(/^[a-zA-Z]+$/).test(e);case"chinese":return new RegExp(/^[\\u4E00-\\u9FA5]+$/).test(e);case"lower":return new RegExp(/^[a-z]+$/).test(e);case"upper":return new RegExp(/^[A-Z]+$/).test(e);case"HTML":return new RegExp(/<("[^"]*"|'[^']*'|[^'">])*>/).test(e);default:return!0}},N.checkStr=N.test,N.priceFilter=function(e){return"string"==typeof e&&(e=parseFloat(e)),(e/100).toFixed(2)},N.objectAssign=function(e,t){return Object.assign(e,t)},N.copyObject=function(e){return JSON.parse(JSON.stringify(e))},N.formAssign=function(e,t){let n=N.copyObject(e);return N.objectAssign(n,t)},N.arr_concat=function(e,t,n){n||(n="id");var i=e.concat(t),a=[];if(-1!=n){var r=[];for(var o in i)-1==r.indexOf(i[o][n])&&(r.push(i[o][n]),a.push(i[o]))}else a=i;return a},N.getData=function(e,t){var n=JSON.parse(JSON.stringify(e));t=t.replace(/\s+/g,"")+".";for(var i="",a=0;ai){n+="0123456789"[e[i].charCodeAt()%10]}else n="0"+n;return n},N.hidden=function(e,t,n){let i=e.length-t-n,a="";for(let e=0;e-1&&(n=!0);return n},N.calcFreights=function(e,t){let{first_weight:n,first_weight_price:i,continuous_weight:a,continuous_weight_price:r,max_weight:o=1e8}=e,l=0,s=0,d=o,u=!1,c=0;for(;t>0;)u?(c++,t-=a,d-=a):(u=!0,s++,d=o,t-=n,d-=n),d<=0&&(u=!1);return l=s*i+r*c,l},N.getNewObject=function(e,t){let n=N.copyObject(e),i={};if(t&&t.length>0)for(let e in t){let a=t[e];N.isNotNull(n[a])&&(i[a]=n[a])}else i=n;return i},N.deleteObjectKeys=function(e,t=[]){var n={};if(e)for(let i in e)-1==t.indexOf(i)&&(n[i]=e[i]);return n},N.treeToArray=function(e,t){return N.treeToArrayFn(e,t)},N.treeToArrayFn=function(e,t={},n=[],i){let{children:a="children",id:r="id"}=t;for(let t in e){let o=e[t];i&&(o.parent_id=i),n.push(o),o[a]&&o[a].length>0&&(n=N.treeToArrayFn(o[a],{children:a,id:r},n,o[r]))}return n};var k=N;var S={addAsyncTasks:async(e={},t)=>{let{vk:n,db:i,_:a}=t,{type:r,title:o,out_trade_no:l,user_order_success:s}=e,d={};return d=await n.baseDao.add({dbName:"opendb-async-tasks",dataJson:{status:0,type:r,title:o,out_trade_no:l,user_order_success:s}},t),d},addPayOrders:async(e={},t)=>{let{vk:n,db:i,_:a}=t,{pay_type:r,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}=e,g={};return g=await n.baseDao.add({dbName:"uni-pay-orders",dataJson:{pay_type:r,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}},t),g},findPayOrdersByOutTradeNo:async(e="___",t)=>{let{vk:n,db:i,_:a}=t,r={};return r=await n.baseDao.findByWhereJson({dbName:"uni-pay-orders",whereJson:{out_trade_no:e}},t),r}},O=S,v={};v.payDao=O,v.pay=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={},userInfo:s,provider:d,originalParam:u}=e,{outTradeNo:c,subject:f="",body:g="",totalFee:p}=l;const{wxConfigMp:y,wxConfigApp:m,wxConfigH5:h,aliConfigMp:_,aliConfigApp:w,aliConfigH5:b,notifyUrl:x,alipay_app_to_h5:N}=i["uni-pay"];let k,S,O,v=d+"_"+u.context.PLATFORM;N&&"alipay_app-plus"==v&&(v="alipay_h5");var J=x+"/"+v;switch(v){case"wxpay_mp-weixin":k=n.initWeixin(y),S=s.wx_openid["mp-weixin"],O="JSAPI";break;case"wxpay_app-plus":k=n.initWeixin(m),O="APP";break;case"wxpay_h5":k=n.initWeixin(h),O="NATIVE";break;case"alipay_mp-alipay":k=n.initAlipay(_),S=s.ali_openid;break;case"alipay_app-plus":k=n.initAlipay(w),O="APP";break;case"alipay_h5":k=n.initAlipay(b),O="NATIVE";break;default:return{code:-1,msg:"参数错误",value:d+"_"+u.context.PLATFORM}}let A;try{S&&(l.openid=S),l.notifyUrl=J,l.tradeType=O,"alipay"===d&&void 0===l.extendParams&&(l.extendParams={sysServiceProviderId:"2088731216435275"}),A=await k.getOrderInfo(l)}catch(e){return console.log("error: ",e.message),{code:-3,msg:"获取支付信息失败,请稍后再试。"+e.message}}return{code:0,msg:"ok",outTradeNo:c,orderInfo:A}},v.payNotify=async function(e){let{event:t,context:n,vk:i,orderPaySuccess:a}=e,{config:r,uniPay:o,db:l,customUtil:s}=i.config,d={vk:i,config:r,uniPay:o,db:l,customUtil:s,_:l.command};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,alipay_app_to_h5:m}=r["uni-pay"];(new Date).getTime();let h,_=t.path.substring(1);switch(m&&"alipay_app-plus"==_&&(_="alipay_h5"),_){case"wxpay_mp-weixin":h=o.initWeixin(u);break;case"wxpay_app-plus":h=o.initWeixin(c);break;case"wxpay_h5":h=o.initWeixin(f);break;case"alipay_mp-alipay":h=o.initAlipay(g);break;case"alipay_app-plus":h=o.initAlipay(p);break;case"alipay_h5":h=o.initAlipay(y);break;default:return console.log("---------参数错误---------"),{code:-1,msg:"参数错误"}}let w=await h.verifyPaymentNotify(t);if(!w)return console.log("---------!验证未通过!---------"),{};let b,x,{outTradeNo:N,totalFee:k,transactionId:S,resultCode:v,openid:J,appId:A}=w;0==_.indexOf("wxpay_")?b=w:0==_.indexOf("alipay_")&&(x=w);let T=!1;return"function"==typeof a&&(T=await a({util:d,data:w})),"SUCCESS"==v&&(await O.addAsyncTasks({type:1001,title:`订单【${N}】付款成功`,out_trade_no:N,user_order_success:T},d),await O.addPayOrders({pay_type:_,out_trade_no:N,openid:J,total_fee:k,appid:A,original_data:t.body,wxpay_info:b,alipay_info:x},d)),0==_.indexOf("wxpay_")?{mpserverlessComposedResponse:!0,statusCode:200,headers:{"content-type":"text/xml"},body:""}:(_.indexOf("alipay_"),"SUCCESS")},v.payQuery=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=i["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let h=await O.findPayOrdersByOutTradeNo(s,t);if(!h)return{code:-2,msg:"订单不存在或订单未支付!"};let _;switch(h.pay_type){case"wxpay_mp-weixin":_=n.initWeixin(u);break;case"wxpay_app-plus":_=n.initWeixin(c);break;case"wxpay_h5":_=n.initWeixin(f);break;case"alipay_mp-alipay":_=n.initAlipay(g);break;case"alipay_app-plus":_=n.initAlipay(p);break;case"alipay_h5":_=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let w=await _.orderQuery({outTradeNo:s});if("SUCCESS"===w.tradeState||"FINISHED"===w.tradeState)d={code:0,msg:"支付成功",orderPaid:!0};else{let e=w.tradeStateDesc||"未支付或已退款";e.indexOf("订单发生过退款")>-1&&(e="订单已退款"),d={code:-1,msg:e,orderPaid:!1}}return d},v.refund=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={},originalParam:s,orderRefundSuccess:d}=e,{outTradeNo:u}=l,c={code:-1,msg:""};const{wxConfigMp:f,wxConfigApp:g,wxConfigH5:p,aliConfigMp:y,aliConfigApp:m,aliConfigH5:h,notifyUrl:_}=i["uni-pay"];let w=u;if(!u)return{code:-1,msg:"订单号不能为空"};let b=await O.findPayOrdersByOutTradeNo(u,t);if(!b)return{code:-2,msg:"订单不存在或订单未支付!"};let x=b.total_fee,N=x;const k=b.pay_type;let S;switch(k){case"wxpay_mp-weixin":S=n.initWeixin(f);break;case"wxpay_app-plus":S=n.initWeixin(g);break;case"wxpay_h5":S=n.initWeixin(p);break;case"alipay_mp-alipay":S=n.initAlipay(y);break;case"alipay_app-plus":S=n.initAlipay(m);break;case"alipay_h5":S=n.initAlipay(h);break;default:return{code:-1,msg:"参数错误,暂不支持"+k}}let v=!1;return"function"==typeof d&&(v=await d({payOrder:b})),await O.addAsyncTasks({type:1011,title:`订单【${u}】退款成功`,out_trade_no:u,user_order_success:v},t),console.log(`---- ${u} -- ${w} -- ${x} -- ${N}`),c=await S.refund({outTradeNo:u,outRefundNo:w,totalFee:x,refundFee:N}),c.outTradeNo?(c.code=0,c.msg="退款成功"):(c.code=-1,c.msg="退款失败"),c},v.refundQuery=async(e={},t)=>{let{uniPay:n,config:i,vk:a,db:r,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=i["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let h=await O.findPayOrdersByOutTradeNo(s,t);if(!h)return{code:-2,msg:"订单不存在或订单未支付!"};let _,w;switch(h.pay_type){case"wxpay_mp-weixin":_=n.initWeixin(u);break;case"wxpay_app-plus":_=n.initWeixin(c);break;case"wxpay_h5":_=n.initWeixin(f);break;case"alipay_mp-alipay":_=n.initAlipay(g);break;case"alipay_app-plus":_=n.initAlipay(p);break;case"alipay_h5":_=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let b={};try{w=await _.refundQuery({outTradeNo:s,outRefundNo:s})}catch(e){return{code:-1,msg:"查询失败,请稍后再试!",err:e,refundQueryJson:b,queryResult:w}}if(w.refundFee>0){let e="退款成功";for(let t in w.refundList){let n=w.refundList[t];e+=`${t+1}、 ${n.refundSuccessTime}: \r\n退款到 ${n.refundRecvAccout};\r\n`}d={code:0,msg:e,queryResult:w}}else d={code:-1,msg:"未退款",queryResult:w};return d};var J=v,A={},T={};A.get=function(e){let t,n=T[e];if(n){let{value:i,expired:a}=n;A.isExpired(e)?delete T[e]:t=i}return t},A.set=function(e,t,n=0){let i={value:t,expired:n>0?(new Date).getTime()+1e3*n:0};T[e]=i},A.del=function(e){delete T[e]},A.clear=function(e){if(e)for(let t in T)0==t.indexOf(e)&&delete T[t];else T={}},A.isExpired=function(e){let t=!0,n=T[e];return n&&(0==n.expired||n.expired>(new Date).getTime())&&(t=!1),t},A.getAll=function(e){let t={};if(e)for(let n in T)0==n.indexOf(e)&&(t[e]=T[e]);else t=T;for(let e in t)A.isExpired(e)&&(delete t[e],delete T[e]);return t};var $=A,E={};E.router=r,E.md5=f,E.baseDao=p,E.request=y,E.pubfn=k,E.payUtil=J,E.temporaryCache=$,E.requireCache={},E.require=function(e){if(E.requireCache&&E.requireCache[e])return E.requireCache[e];{const t=E.config.requireFn(E.config.baseDir+"/"+e);return E.requireCache[e]=t,t}},E.config={},E.init=function(e){E.config.config=e.config,E.config.uniID=e.uniID,E.config.db=e.db,E.config.pubFun=e.pubFun,E.config.middlewareService=e.middlewareService,E.config.customUtil=e.customUtil,E.config.uniPay=e.uniPay,E.config.baseDir=e.baseDir,E.config.requireFn=e.requireFn,E.daoCenter=e.daoCenter},E.getQueryStringParameters=function(e){let t={};if(e.httpMethod){if(e.body){let n=e.body;e.isBase64Encoded&&(n=Buffer.from(n,"base64").toString("utf-8")),"string"==typeof n&&(n=JSON.parse(n)),t=n}else if(e.queryStringParameters){let n=e.queryStringParameters;"string"==typeof n.data&&(n.data=JSON.parse(n.data)),t=n}}else t=JSON.parse(JSON.stringify(e));return t.data||(t.data={}),t.uniIdToken||(t.uniIdToken=t.uni_id_token),t.url=t.$url||"",t};var D=E;module.exports=D; +"use strict";var e={main:async e=>{let{uniID:t}=e.util,n={code:-1,msg:""},i=await t.checkToken(e.uniIdToken);if(i.code&&i.code>0)return i;let r=i.userInfo;return delete r.token,delete r.password,n.uid=i.uid,n.userInfo=r,i.token&&(n.token=i.token,n.tokenExpired=i.tokenExpired),n.code=0,n.msg="ok",n}},t=[{id:"pub",regExp:"/pub/",description:"pub函数为所有人都可以访问的函数",index:100,mode:"onActionExecuting",main:async function(t){let n={};return t.data.need_user_info&&(n=await e.main(t)),n.code=0,n.msg="ok",n}},{id:"kh",regExp:"/kh/",description:"kh函数为必须登录后才能访问的函数(客户端用户)",index:200,mode:"onActionExecuting",main:e.main},{id:"sys",regExp:"/sys/",description:"sys函数为后端管理人员才能访问的函数(商家后台工作人员)",index:300,mode:"onActionExecuting",main:{main:async t=>{let{url:n,util:i}=t,{uniID:r,config:a,pubFun:o,vk:l,db:s,_:d}=i,u={code:-1,msg:""};const c=e;if(u=await c.main(t),0!==u.code)return u;if(!u.userInfo.allow_login_background)return{code:403,msg:"您无权限登录后台"};if(l.pubfn.isNotNull(u.userInfo.role)&&u.userInfo.role.includes("admin"))return u;let f=await l.baseDao.select({dbName:"uni-id-roles",whereJson:{role_id:d.in(u.userInfo.role),enable:!0},fieldJson:{permission:!0}},t.util),g=[];for(let e in f.rows){let t=f.rows[e].permission;l.pubfn.isNotNull(t)&&(g=g.concat(t))}return 0==g.length||await l.baseDao.count({dbName:"uni-id-permissions",whereJson:{permission_id:d.in(g),enable:!0,url:n}},t.util)<=0?{code:403,msg:"权限不足"}:(u.code=0,u.msg="ok",u)}}.main}];var n=function(e){let n=[];if(e){let i=[...t,...e];i.sort((function(e,t){return e.index-t.index})),n=i.filter((e,t,n)=>{var r=[];return i.forEach((e,t)=>{r.push(e.id)}),r.indexOf(e.id)===t})}else n=t;return n},i={regExpTest:function(e,t){let n=!1;if("string"==typeof e){new RegExp(e).test(t)&&(n=!0)}else if("object"==typeof e)for(let i=0;i{let i={code:403,msg:"access denied",filterStack:[]},{url:a}=e;const o=n(t);for(let t in o){let n=o[t],{mode:l="onActionExecuting"}=n;if("onActionExecuting"===l&&r.regExpTest(n.regExp,a)){e.filterResponse=i;let t=await n.main(e);if(t.filterId=n.id,i.filterStack.push(t),0!==t.code){i=t;break}i=Object.assign(i,t)}}return i},o=async(e,t,i)=>{let{url:a}=e;const o=n(t);for(let t in o){let n=o[t],{mode:l="onActionExecuting"}=n;if("onActionExecuted"===l&&r.regExpTest(n.regExp,a)){let t=await n.main(e,i);if(t){if(0!==t.code){i=t;break}i=Object.assign(i,t)}}}return i};process.env.TZ="Asia/Shanghai";var l=async function(e){let t,{event:n,context:i,vk:r}=e,{config:l,uniID:s,uniPay:d,db:u,middlewareService:c,pubFun:f,customUtil:g}=r.config,p={event:n,context:i},y=r.getQueryStringParameters(n),{url:m,data:h,uniIdToken:_}=y,w={url:m,data:h,uniIdToken:_,util:{vk:r,config:l,pubFun:f,uniID:s,uniPay:d,db:u,customUtil:g,_:u.command},originalParam:p},b=await a(w,c);if(0!==b.code)return b;b.uid&&(h.uid=b.uid),w.filterResponse=b;try{t=r.require("service/"+m)}catch(e){return e&&"MODULE_NOT_FOUND"==e.code?{code:404,msg:`云函数 ${m} 不存在!`,err:e}:{code:500,msg:`云函数 ${m} 编译异常!`,err:e}}let x=await async function(e={}){let{res:t,serviceParam:n,serviceMain:i}=e;t.uid&&(n.uid=t.uid);t.userInfo&&(n.userInfo=t.userInfo);let r=await i.main(n);t.token&&"object"==typeof r&&(r.vk_uni_token={token:t.token,tokenExpired:t.tokenExpired});return r}({res:b,serviceParam:w,serviceMain:t});return x=await o(w,c,x),x};function s(e,t,n,i,r,a){return g((o=g(g(t,e),g(i,a)))<<(l=r)|o>>>32-l,n);var o,l}function d(e,t,n,i,r,a,o){return s(t&n|~t&i,e,t,r,a,o)}function u(e,t,n,i,r,a,o){return s(t&i|n&~i,e,t,r,a,o)}function c(e,t,n,i,r,a,o){return s(t^n^i,e,t,r,a,o)}function f(e,t,n,i,r,a,o){return s(n^(t|~i),e,t,r,a,o)}function g(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}var p=function(e){return function(e){for(var t="",n=0;n<4*e.length;n++)t+="0123456789abcdef".charAt(e[n>>2]>>n%4*8+4&15)+"0123456789abcdef".charAt(e[n>>2]>>n%4*8&15);return t}(function(e,t){e[t>>5]|=128<>>9<<4)]=t;for(var n=1732584193,i=-271733879,r=-1732584194,a=271733878,o=0;o>5]|=(255&e.charCodeAt(n/8))<100)return await y.selectAll(e,t);let l=await y.getSelectData(e,t),{result:s,hasMore:d,total:u,getCount:c,pageIndex:f}=l;return s=s.skip((f-1)*o).limit(o),s.get().then(e=>{let t={};return c?(t.hasMore=d,t.total=u):(t.total=e.data?e.data.length:0,t.hasMore=t.total>=o),t.rows=e.data,t.code=0,t.key=1,t.pageIndex=f,t.pageSize=o,t})},findById:async function(e,t){let{db:n,_:i}=t,{dbName:r,id:a,fieldJson:o}=e;try{let e=n.collection(r).doc(a);return o&&(e=e.field(o)),(await e.get()).data[0]}catch(e){return console.error(e),null}},findByWhereJson:async function(e,t){let{db:n,_:i}=t,{dbName:r,whereJson:a,fieldJson:o}=e;try{if(a&&"{}"!==JSON.stringify(a)){let e=n.collection(r).where(a);o&&(e=e.field(o));let t=await e.limit(1).get();if(t.data&&t.data.length>0)return t.data[0]}else console.error("whereJson条件不能为空")}catch(e){console.error(e)}return null},count:async function(e,t){let{db:n,_:i}=t,{dbName:r,whereJson:a}=e;a&&"{}"!==JSON.stringify(a)||(a={_id:i.neq("___")});try{return(await n.collection(r).where(a).count()).total}catch(e){return console.error(e),null}},select2:async function(e,t){let{foreignKeyType:n="many-to-one"}=e;return"many-to-one"===n?await y.select2_ManyToOne(e,t):"one-to-many"===n?await y.select2_OneToMany(e,t):(console.error("不支持的foreignKeyType"),{})},count2_ManyToOne:async function(e,t){let{db:n,_:i,vk:r}=t,{dbName:a,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p={},fieldJson:y={},fieldJson2:m={},as:h}=e;h||(h=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")});i.aggregate;let _=n.collection(a).aggregate();if(d&&"{}"!==JSON.stringify(d)&&(_=_.match(d)),y&&"{}"!==JSON.stringify(y)&&(_=_.project(y)),p&&"{}"!==JSON.stringify(p)){let e={};for(let t in p){let n=p[t],i=n.name,r=n.type;r=null==r||""==r||"asc"==r?1:-1,e[i]=r}_=_.sort(e)}let w={from:o,localField:l,foreignField:s,as:h};if(_=_.lookup(w),m&&"{}"!==JSON.stringify(m)){let e={};for(let t in m)e[h+"."+t]=m[t];_=_.project(e)}if(u&&"{}"!==JSON.stringify(u)){let e={};for(let t in u)e[h+"."+t]=u[t];_=_.match(e)}let b=await _.count("total").end();try{return b.data[0].total}catch(e){return console.log(e),0}},select2_ManyToOne:async function(e,t){let{db:n,_:i,vk:r}=t,{dbName:a,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p=[],fieldJson:y={},fieldJson2:m={},as:h,whereJsonPub:_={}}=e;h||(h=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")}),-1==f&&(c=1,f=999999999,g=!1);let w=0,b=!1;if(g){w=(await n.collection(a).where(d).count()).total,c0?J[e][h]=J[e][h][0]:J[e][h]={};return g?(x.hasMore=b,x.total=w):(x.total=J?J.length:0,x.hasMore=w>=f),x.rows=J,x.code=0,x.key=1,x},select2_OneToMany:async function(e,t){let{db:n,_:i,vk:r}=t,{dbName:a,dbName2:o,foreignKey:l="_id",foreignKey2:s="_id",whereJson:d={},whereJson2:u={},pageIndex:c=1,pageSize:f=10,getCount:g=!1,sortArr:p=[],sortArr2:y=[],fieldJson:m={},fieldJson2:h={},as:_}=e;_||(_=o),"{}"===JSON.stringify(d)&&(d={_id:i.neq("___")}),-1==f&&(c=1,f=999999999,g=!1);let w=0,b=!1;if(g){w=(await n.collection(a).where(d).count()).total,c=f),x.rows=J,x.code=0,x.key=1,x},getSelectData:async function(e,t){let{db:n,_:i}=t,{dbName:r,whereJson:a,pageIndex:o=1,pageSize:l=10,getCount:s=!1}=e;a&&"{}"!==JSON.stringify(a)||(a={_id:i.neq("___")}),l<0&&(o=1,l=999999999,s=!0);let d=e.sortArr,u=e.fieldJson,c=0,f=!1;if(s){c=(await n.collection(r).where(a).count()).total,o0&&!c&&!f&&(c=p);let m={};if(f&&0===c)m={data:[]};else{let t=c;pa&&(n=a-t);let o=d.skip(t).limit(n).get();i.push(o)}try{m=(await Promise.all(i)).reduce((e,t)=>({data:e.data.concat(t.data),errMsg:e.errMsg}))}catch(t){console.error("selectAll-异常",e,t),m={data:[]}}}return o.rows=m.data,o.key=1,o.code=0,o.hasMore=u,o.pageIndex=g,o.pageSize=p,o.total=f?c:m.data?m.data.length:0,o},sum:async function(e,t){let{db:n,_:i}=t,{dbName:r,fieldName:a,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(r).aggregate().match(o).group({_id:null,num:l.sum("$"+a)}).end()).data[0].num}catch(e){return console.error(e),null}},avg:async function(e,t){let{db:n,_:i}=t,{dbName:r,fieldName:a,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(r).aggregate().match(o).group({_id:null,num:l.avg("$"+a)}).end()).data[0].num}catch(e){return console.error(e),null}},max:async function(e,t){let{db:n,_:i}=t,{dbName:r,fieldName:a,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(r).aggregate().match(o).group({_id:null,num:l.max("$"+a)}).end()).data[0].num}catch(e){return console.error(e),null}},min:async function(e,t){let{db:n,_:i}=t,{dbName:r,fieldName:a,whereJson:o}=e;o&&"{}"!==JSON.stringify(o)||(o={_id:i.neq("___")});const l=n.command.aggregate;try{return(await n.collection(r).aggregate().match(o).group({_id:null,num:l.min("$"+a)}).end()).data[0].num}catch(e){return console.error(e),null}},sample:async function(e,t){let{db:n,_:i}=t,{dbName:r,whereJson:a,size:o}=e;a&&"{}"!==JSON.stringify(a)||(a={_id:i.neq("___")});n.command.aggregate;try{return(await n.collection(r).aggregate().match(a).sample({size:o}).end()).data}catch(e){return console.error(e),null}},selects:async function(e,t){let{db:n,_:i,vk:r}=t,{dbName:a,foreignKey:o="_id",whereJson:l={},pageIndex:s=1,pageSize:d=10,getCount:u=!1,sortArr:c=[],fieldJson:f={},foreignDB:g=[]}=e;"{}"===JSON.stringify(l)&&(l={_id:i.neq("___")}),-1==d&&(s=1,d=999999999,u=!1);let p=0,y=!1;if(u){p=(await n.collection(a).where(l).count()).total,s0?w[e][n]=w[e][n][0]:w[e][n]={})}return u?(m.hasMore=y,m.total=p):(m.total=w?w.length:0,m.hasMore=p>=d),m.rows=w,m.code=0,m.key=1,m},addWhereJson:function(e,t,n={}){let{vk:i,db:r,_:a}=t,{formData:o,columns:l}=e;for(let e in l){let t,r=l[e],{key:s,mode:d,defaultValue:u,type:c=""}=r,f=s;if(i.pubfn.isNotNull(r.fieldName)&&(f=r.fieldName),t=i.pubfn.isNotNull(r.value)?r.value:o[s],i.pubfn.isNull(t)&&i.pubfn.isNotNull(u)&&(t=u),i.pubfn.isNull(d)&&(d=["address","province","city","area"].indexOf(c)>-1?"address":"[object Array]"===Object.prototype.toString.call(t)&&t.length>=2?"[]":"="),i.pubfn.isNotNull(t))if("custom"===d);else if("%%"===d)try{n[f]=new RegExp(t)}catch(e){}else if("%*"===d)try{n[f]=new RegExp("^"+t)}catch(e){}else if("*%"===d)try{n[f]=new RegExp(t+"$")}catch(e){}else if(">"===d)n[f]=a.gt(t);else if(">="===d)n[f]=a.gte(t);else if("<"===d)n[f]=a.lt(t);else if("<="===d)n[f]=a.lte(t);else if("in"===d)n[f]=a.in(t);else if("nin"===d)n[f]=a.nin(t);else if("!="===d)n[f]=a.neq(t);else if("[]"===d)n[f]=a.gte(t[0]).lte(t[1]);else if("[)"===d)n[f]=a.gte(t[0]).lt(t[1]);else if("(]"===d)n[f]=a.gt(t[0]).lte(t[1]);else if("()"===d)n[f]=a.gt(t[0]).lt(t[1]);else if("address"===d){let e={};t.province&&t.province.code&&(e["province.code"]=t.province.code),t.city&&t.city.code&&(e["city.code"]=t.city.code),t.area&&t.area.code&&(e["area.code"]=t.area.code),n[f]=e}else n[f]=t}return n}},m=y,h=async(e={})=>{"[object object]"==Object.prototype.toString.call(e.content)&&(e.content=JSON.stringify(e.content)),void 0===e.dataType&&(e.dataType="json"),"default"==e.dataType&&delete e.dataType,e.useContent&&(e.content=JSON.stringify(e.data)),e.method||(e.method="POST"),e.data&&(e.headers||(e.headers={"content-type":"application/json; charset=UTF-8"}));var t=await uniCloud.httpclient.request(e.url,e);return t&&t.data?t.data:t},_={formValidateItem:function(e,t,n){let i={code:0,msg:"ok"};for(let r in n){let a=n[r];if(void 0===e[t]&&a.required){i={type:"undefined",code:-1,msg:"字段:"+t+" 名称错误,请检查!",key:t,value:e[t]};break}if(a.required&&(null==e[t]||null==e[t]||""===e[t]||0==e[t].length)){i={type:"required",code:-1,msg:a.message,key:t,value:e[t]};break}if(a.type){if(Object.prototype.toString.call(e[t]).toLowerCase()!==`[object ${a.type}]`){i={type:"type",code:-1,msg:a.message,key:t,value:e[t]};break}}if(a.len&&e[t].length!=a.len){i={type:"len",code:-1,msg:a.message,key:t,value:e[t]};break}if(a.min)if(a.type&&"number"==a.type){if(e[t]a.max){i={type:"max",code:-1,msg:a.message,key:t,value:e[t]};break}}else if(e[t].length>a.max){i={type:"max",code:-1,msg:a.message,key:t,value:e[t]};break}if("function"==typeof a.validator){let n=a.validator(a,e[t],(function(e){return e}));if(void 0!==n&&!0!==n){i={type:"validator",code:-1,msg:a.message,key:t,value:e[t]};break}}}return i}};function w(e){return JSON.parse(JSON.stringify(e))}var b={};function x(e){let t=[];for(let n=0;n0&&(n=b.treeToArrayFn(d[o],t,n,d[r])),l&&delete d[o]}return n},b.arrayToTree=function(e,t){let n=w(e),{id:i="_id",parent_id:r="parent_id",children:a="children",deleteParentId:o=!0,need_field:l}=t,s=[],d={};for(let e=0;e-1){var o=r.indexOf('"',a),l=r.substring(a,o);if(o>a){var s=r.indexOf("---",o),d=r.substring(o+1,s).trim();n[l]=d}}}return n},O.timeFormat=O.timeUtil.timeFormat,O.getFullTime=O.timeUtil.getFullTime,O.getWeekStartAndEnd=O.timeUtil.getWeekStartAndEnd,O.getCommonTime=O.timeUtil.getCommonTime,O.validator=function(e){return function(t,n,i){let r=O.test(n,e);return"function"!=typeof i||!r&&n?i(!1):void i()}},O.test=function(e,t){switch(t){case"mobile":return new RegExp(/^1[3|4|5|6|7|8|9][0-9]{9}$/).test(e);case"tel":return new RegExp(/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/).test(e);case"card":return new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(e);case"mobileCode":return new RegExp(/^[0-9]{6}$/).test(e);case"username":return new RegExp(/^[a-zA-Z]([-_a-zA-Z0-9]{5,17})$/).test(e);case"pwd":return new RegExp(/^([a-zA-Z0-9_]){6,18}$/).test(e);case"payPwd":return new RegExp(/^[0-9]{6}$/).test(e);case"postal":return new RegExp(/[1-9]\d{5}(?!\d)/).test(e);case"QQ":return new RegExp(/^[1-9][0-9]{4,9}$/).test(e);case"email":return new RegExp(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/).test(e);case"money":return new RegExp(/^\d*(?:\.\d{0,2})?$/).test(e);case"URL":return new RegExp(/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/).test(e);case"IP":return new RegExp(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/).test(e);case"date":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/).test(e);case"time":return new RegExp(/^(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"dateTime":return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(e);case"number":return new RegExp(/^[0-9]*$/).test(e);case"english":return new RegExp(/^[a-zA-Z]+$/).test(e);case"chinese":return new RegExp(/^[\\u4E00-\\u9FA5]+$/).test(e);case"lower":return new RegExp(/^[a-z]+$/).test(e);case"upper":return new RegExp(/^[A-Z]+$/).test(e);case"HTML":return new RegExp(/<("[^"]*"|'[^']*'|[^'">])*>/).test(e);default:return!0}},O.checkStr=O.test,O.priceFilter=function(e){return"string"==typeof e&&(e=parseFloat(e)),(e/100).toFixed(2)},O.objectAssign=function(e,t){return Object.assign(e,t)},O.copyObject=function(e){return JSON.parse(JSON.stringify(e))},O.formAssign=function(e,t){let n=O.copyObject(e);return O.objectAssign(n,t)},O.arr_concat=function(e,t,n){n||(n="id");var i=e.concat(t),r=[];if(-1!=n){var a=[];for(var o in i)-1==a.indexOf(i[o][n])&&(a.push(i[o][n]),r.push(i[o]))}else r=i;return r},O.getData=function(e,t,n){var i=JSON.parse(JSON.stringify(e));t=t.replace(/\s+/g,"")+".";for(var r="",a=0;ai){n+="0123456789"[e[i].charCodeAt()%10]}else n="0"+n;return n},O.hidden=function(e,t,n){let i=e.length-t-n,r="";for(let e=0;e-1&&(n=!0);return n},O.calcFreights=function(e,t){let{first_weight:n,first_weight_price:i,continuous_weight:r,continuous_weight_price:a,max_weight:o=1e8}=e,l=0,s=0,d=o,u=!1,c=0;for(;t>0;)u?(c++,t-=r,d-=r):(u=!0,s++,d=o,t-=n,d-=n),d<=0&&(u=!1);return l=s*i+a*c,l},O.getNewObject=function(e,t){let n=O.copyObject(e),i={};if(t&&t.length>0)for(let e in t){let r=t[e];O.isNotNull(n[r])&&(i[r]=n[r])}else i=n;return i},O.deleteObjectKeys=function(e,t=[]){var n={};if(e)for(let i in e)-1==t.indexOf(i)&&(n[i]=e[i]);return n},O.arrayToTree=O.treeUtil.arrayToTree,O.treeToArray=O.treeUtil.treeToArray;var v=O;var J={addAsyncTasks:async(e={},t)=>{let{vk:n,db:i,_:r}=t,{type:a,title:o,out_trade_no:l,user_order_success:s}=e,d={};return d=await n.baseDao.add({dbName:"opendb-async-tasks",dataJson:{status:0,type:a,title:o,out_trade_no:l,user_order_success:s}},t),d},addPayOrders:async(e={},t)=>{let{vk:n,db:i,_:r}=t,{pay_type:a,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}=e,g={};return g=await n.baseDao.add({dbName:"uni-pay-orders",dataJson:{pay_type:a,out_trade_no:o,openid:l,total_fee:s,appid:d,original_data:u,wxpay_info:c,alipay_info:f}},t),g},findPayOrdersByOutTradeNo:async(e="___",t)=>{let{vk:n,db:i,_:r}=t,a={};return a=await n.baseDao.findByWhereJson({dbName:"uni-pay-orders",whereJson:{out_trade_no:e}},t),a}},T=J,A={};A.payDao=T,A.pay=async(e={},t)=>{let{uniPay:n,config:i,vk:r,db:a,_:o}=t,{data:l={},userInfo:s,provider:d,originalParam:u}=e,{outTradeNo:c,subject:f="",body:g="",totalFee:p}=l;const{wxConfigMp:y,wxConfigApp:m,wxConfigH5:h,aliConfigMp:_,aliConfigApp:w,aliConfigH5:b,notifyUrl:x,alipay_app_to_h5:N}=i["uni-pay"];let k,S,O,v=d+"_"+u.context.PLATFORM;N&&"alipay_app-plus"==v&&(v="alipay_h5");var J=x+"/"+v;switch(v){case"wxpay_mp-weixin":k=n.initWeixin(y),S=s.wx_openid["mp-weixin"],O="JSAPI";break;case"wxpay_app-plus":k=n.initWeixin(m),O="APP";break;case"wxpay_h5":k=n.initWeixin(h),O="NATIVE";break;case"alipay_mp-alipay":k=n.initAlipay(_),S=s.ali_openid;break;case"alipay_app-plus":k=n.initAlipay(w),O="APP";break;case"alipay_h5":k=n.initAlipay(b),O="NATIVE";break;default:return{code:-1,msg:"参数错误",value:d+"_"+u.context.PLATFORM}}let T;try{S&&(l.openid=S),l.notifyUrl=J,l.tradeType=O,"alipay"===d&&void 0===l.extendParams&&(l.extendParams={sysServiceProviderId:"2088731216435275"}),T=await k.getOrderInfo(l)}catch(e){return console.log("error: ",e.message),{code:-3,msg:"获取支付信息失败,请稍后再试。"+e.message}}return{code:0,msg:"ok",outTradeNo:c,orderInfo:T}},A.payNotify=async function(e){let{event:t,context:n,vk:i,orderPaySuccess:r}=e,{config:a,uniPay:o,db:l,customUtil:s}=i.config,d={vk:i,config:a,uniPay:o,db:l,customUtil:s,_:l.command};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,alipay_app_to_h5:m}=a["uni-pay"];(new Date).getTime();let h,_=t.path.substring(1);switch(m&&"alipay_app-plus"==_&&(_="alipay_h5"),_){case"wxpay_mp-weixin":h=o.initWeixin(u);break;case"wxpay_app-plus":h=o.initWeixin(c);break;case"wxpay_h5":h=o.initWeixin(f);break;case"alipay_mp-alipay":h=o.initAlipay(g);break;case"alipay_app-plus":h=o.initAlipay(p);break;case"alipay_h5":h=o.initAlipay(y);break;default:return console.log("---------参数错误---------"),{code:-1,msg:"参数错误"}}let w=await h.verifyPaymentNotify(t);if(!w)return console.log("---------!验证未通过!---------"),{};let b,x,{outTradeNo:N,totalFee:k,transactionId:S,resultCode:O,openid:v,appId:J}=w;0==_.indexOf("wxpay_")?b=w:0==_.indexOf("alipay_")&&(x=w);let A=!1;return"function"==typeof r&&(A=await r({util:d,data:w})),"SUCCESS"==O&&(await T.addAsyncTasks({type:1001,title:`订单【${N}】付款成功`,out_trade_no:N,user_order_success:A},d),await T.addPayOrders({pay_type:_,out_trade_no:N,openid:v,total_fee:k,appid:J,original_data:t.body,wxpay_info:b,alipay_info:x},d)),0==_.indexOf("wxpay_")?{mpserverlessComposedResponse:!0,statusCode:200,headers:{"content-type":"text/xml"},body:""}:(_.indexOf("alipay_"),"SUCCESS")},A.payQuery=async(e={},t)=>{let{uniPay:n,config:i,vk:r,db:a,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=i["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let h=await T.findPayOrdersByOutTradeNo(s,t);if(!h)return{code:-2,msg:"订单不存在或订单未支付!"};let _;switch(h.pay_type){case"wxpay_mp-weixin":_=n.initWeixin(u);break;case"wxpay_app-plus":_=n.initWeixin(c);break;case"wxpay_h5":_=n.initWeixin(f);break;case"alipay_mp-alipay":_=n.initAlipay(g);break;case"alipay_app-plus":_=n.initAlipay(p);break;case"alipay_h5":_=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let w=await _.orderQuery({outTradeNo:s});if("SUCCESS"===w.tradeState||"FINISHED"===w.tradeState)d={code:0,msg:"支付成功",orderPaid:!0};else{let e=w.tradeStateDesc||"未支付或已退款";e.indexOf("订单发生过退款")>-1&&(e="订单已退款"),d={code:-1,msg:e,orderPaid:!1}}return d},A.refund=async(e={},t)=>{let{uniPay:n,config:i,vk:r,db:a,_:o}=t,{data:l={},originalParam:s,orderRefundSuccess:d}=e,{outTradeNo:u}=l,c={code:-1,msg:""};const{wxConfigMp:f,wxConfigApp:g,wxConfigH5:p,aliConfigMp:y,aliConfigApp:m,aliConfigH5:h,notifyUrl:_}=i["uni-pay"];let w=u;if(!u)return{code:-1,msg:"订单号不能为空"};let b=await T.findPayOrdersByOutTradeNo(u,t);if(!b)return{code:-2,msg:"订单不存在或订单未支付!"};let x=b.total_fee,N=x;const k=b.pay_type;let S;switch(k){case"wxpay_mp-weixin":S=n.initWeixin(f);break;case"wxpay_app-plus":S=n.initWeixin(g);break;case"wxpay_h5":S=n.initWeixin(p);break;case"alipay_mp-alipay":S=n.initAlipay(y);break;case"alipay_app-plus":S=n.initAlipay(m);break;case"alipay_h5":S=n.initAlipay(h);break;default:return{code:-1,msg:"参数错误,暂不支持"+k}}let O=!1;return"function"==typeof d&&(O=await d({payOrder:b})),await T.addAsyncTasks({type:1011,title:`订单【${u}】退款成功`,out_trade_no:u,user_order_success:O},t),console.log(`---- ${u} -- ${w} -- ${x} -- ${N}`),c=await S.refund({outTradeNo:u,outRefundNo:w,totalFee:x,refundFee:N}),c.outTradeNo?(c.code=0,c.msg="退款成功"):(c.code=-1,c.msg="退款失败"),c},A.refundQuery=async(e={},t)=>{let{uniPay:n,config:i,vk:r,db:a,_:o}=t,{data:l={}}=e,{outTradeNo:s}=l,d={code:-1,msg:""};const{wxConfigMp:u,wxConfigApp:c,wxConfigH5:f,aliConfigMp:g,aliConfigApp:p,aliConfigH5:y,notifyUrl:m}=i["uni-pay"];if(!s)return{code:-1,msg:"订单号不能为空"};let h=await T.findPayOrdersByOutTradeNo(s,t);if(!h)return{code:-2,msg:"订单不存在或订单未支付!"};let _,w;switch(h.pay_type){case"wxpay_mp-weixin":_=n.initWeixin(u);break;case"wxpay_app-plus":_=n.initWeixin(c);break;case"wxpay_h5":_=n.initWeixin(f);break;case"alipay_mp-alipay":_=n.initAlipay(g);break;case"alipay_app-plus":_=n.initAlipay(p);break;case"alipay_h5":_=n.initAlipay(y);break;default:return{code:-1,msg:"参数错误"}}let b={};try{w=await _.refundQuery({outTradeNo:s,outRefundNo:s})}catch(e){return{code:-1,msg:"查询失败,请稍后再试!",err:e,refundQueryJson:b,queryResult:w}}if(w.refundFee>0){let e="退款成功";for(let t in w.refundList){let n=w.refundList[t];e+=`${t+1}、 ${n.refundSuccessTime}: \r\n退款到 ${n.refundRecvAccout};\r\n`}d={code:0,msg:e,queryResult:w}}else d={code:-1,msg:"未退款",queryResult:w};return d};var $=A,E={},D={};E.get=function(e){let t,n=D[e];if(n){let{value:i,expired:r}=n;E.isExpired(e)?delete D[e]:t=i}return t},E.set=function(e,t,n=0){let i={value:t,expired:n>0?(new Date).getTime()+1e3*n:0};D[e]=i},E.del=function(e){delete D[e]},E.clear=function(e){if(e)for(let t in D)0==t.indexOf(e)&&delete D[t];else D={}},E.isExpired=function(e){let t=!0,n=D[e];return n&&(0==n.expired||n.expired>(new Date).getTime())&&(t=!1),t},E.getAll=function(e){let t={};if(e)for(let n in D)0==n.indexOf(e)&&(t[e]=D[e]);else t=D;for(let e in t)E.isExpired(e)&&(delete t[e],delete D[e]);return t};var C=E,M={};M.router=l,M.md5=p,M.baseDao=m,M.request=h,M.pubfn=v,M.payUtil=$,M.temporaryCache=C,M.requireCache={},M.require=function(e){if(M.requireCache&&M.requireCache[e])return M.requireCache[e];{const t=M.config.requireFn(M.config.baseDir+"/"+e);return M.requireCache[e]=t,t}},M.config={},M.init=function(e){M.config.config=e.config,M.config.uniID=e.uniID,M.config.db=e.db,M.config.pubFun=e.pubFun,M.config.middlewareService=e.middlewareService,M.config.customUtil=e.customUtil,M.config.uniPay=e.uniPay,M.config.baseDir=e.baseDir,M.config.requireFn=e.requireFn,M.daoCenter=e.daoCenter},M.getQueryStringParameters=function(e){let t={};if(e.httpMethod){if(e.body){let n=e.body;e.isBase64Encoded&&(n=Buffer.from(n,"base64").toString("utf-8")),"string"==typeof n&&(n=JSON.parse(n)),t=n}else if(e.queryStringParameters){let n=e.queryStringParameters;"string"==typeof n.data&&(n.data=JSON.parse(n.data)),t=n}}else t=JSON.parse(JSON.stringify(e));return t.data||(t.data={}),t.uniIdToken||(t.uniIdToken=t.uni_id_token),t.url=t.$url||"",t};var I=M;module.exports=I; diff --git a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json index 8b79aff..d5cfe83 100644 --- a/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json +++ b/uniCloud-aliyun/cloudfunctions/common/vk-unicloud/package.json @@ -1,6 +1,6 @@ { "name": "vk-unicloud", - "version": "1.9.1", + "version": "1.9.2", "description": "【云函数端SDK】VK云函数路由模式uniCloud开发框架,在router目录下执行 npm i vk-unicloud 进行安装和升级", "main": "index.js", "homepage": "https://gitee.com/vk-uni/vk-uni-cloud-router.git", diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js index e386cef..fb2599e 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindAlipay.js @@ -3,12 +3,10 @@ module.exports = { * 绑定支付宝 * @url user/kh/bindAlipay 前端调用的url参数地址 * @description 将当前登录用户绑定支付宝 - * @params {Object} data 请求参数 - * @params {String} uniIdToken 用户token - * @params {Object} util 公共工具包 + * @params {String} uid 当前登录用户的用户ID * data 请求参数 说明 - * @params {String} uid 用户Id,可以通过checkToken返回 * @params {String} code 支付宝登录返回的code + * @params {String} platform 客户端类型:mp-weixin、app-plus,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 * res 返回参数说明 * @params {Number} code 错误码,0表示成功 * @params {String} msg 详细信息 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js index 84df2c3..486ac3c 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/kh/bindWeixin.js @@ -3,12 +3,10 @@ module.exports = { * 绑定微信 * @url user/kh/bindWeixin 前端调用的url参数地址 * @description 将当前登录用户绑定微信 - * @params {Object} data 请求参数 - * @params {String} uniIdToken 用户token - * @params {Object} util 公共工具包 + * @params {String} uid 当前登录用户的用户ID * data 请求参数 说明 - * @params {String} uid 用户Id,可以通过checkToken返回 * @params {String} code 微信登录返回的code + * @params {String} platform 客户端类型:mp-weixin、app-plus,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 * res 返回参数说明 * @params {Number} code 错误码,0表示成功 * @params {String} msg 详细信息 diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionAlipay.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionAlipay.js index 05ff32a..4064127 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionAlipay.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionAlipay.js @@ -3,11 +3,9 @@ module.exports = { * 获取支付宝openid * @url user/pub/code2SessionAlipay 前端调用的url参数地址 * @description 获取微信openid - * @params {Object} data 请求参数 - * @params {String} uniIdToken 用户token - * @params {Object} util 公共工具包 * data 请求参数 说明 * @params {String} code 微信登录返回的code + * @params {String} platform 客户端类型:mp-weixin、app-plus,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 * res 返回参数说明 * @params {Number} code 错误码,0表示成功 * @params {String} msg 详细信息 @@ -22,9 +20,7 @@ module.exports = { let res = {}; // 业务逻辑开始----------------------------------------------------------- // 用户登录(账号+密码) - res = await uniID.code2SessionAlipay({ - code: event.data.code - }); + res = await uniID.code2SessionAlipay(event.data); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionWeixin.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionWeixin.js index be96f3f..891809c 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionWeixin.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/code2SessionWeixin.js @@ -3,11 +3,9 @@ module.exports = { * 获取微信openid * @url user/pub/code2SessionWeixin 前端调用的url参数地址 * @description 获取微信openid - * @params {Object} data 请求参数 - * @params {String} uniIdToken 用户token - * @params {Object} util 公共工具包 * data 请求参数 说明 * @params {String} code 微信登录返回的code + * @params {String} platform 客户端类型:mp-weixin、app-plus,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 * res 返回参数说明 * @params {Number} code 错误码,0表示成功 * @params {String} msg 详细信息 @@ -23,9 +21,7 @@ module.exports = { let res = {}; // 业务逻辑开始----------------------------------------------------------- // 用户登录(账号+密码) - res = await uniID.code2SessionWeixin({ - code: event.data.code - }); + res = await uniID.code2SessionWeixin(event.data); // 业务逻辑结束----------------------------------------------------------- return res; } diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js index 345852e..6548f0d 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByAlipay.js @@ -3,11 +3,9 @@ module.exports = { * 用户登录(支付宝授权) * @url user/pub/loginByAlipay 前端调用的url参数地址 * @description 用户登录(支付宝授权) - * @params {Object} data 请求参数 - * @params {String} uniIdToken 用户token - * @params {Object} util 公共工具包 * data 请求参数 说明 * @params {String} code 支付宝登录返回的code + * @params {String} platform 客户端类型:mp-weixin、app-plus,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 * res 返回参数说明 * @params {Number} code 错误码,0表示成功 * @params {String} msg 详细信息 @@ -20,7 +18,7 @@ module.exports = { let { uid } = data; let res = {}; // 业务逻辑开始----------------------------------------------------------- - res = await uniID.loginByAlipay(event.data.code); + res = await uniID.loginByAlipay(event.data); if(res.token){ // 日志服务 const loginLogService = vk.require("service/user/util/login_log"); diff --git a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js index cb8970a..d71bf24 100644 --- a/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js +++ b/uniCloud-aliyun/cloudfunctions/router/service/user/pub/loginByWeixin.js @@ -3,11 +3,9 @@ module.exports = { * 用户登录(微信授权) * @url user/pub/loginByWeixin 前端调用的url参数地址 * @description 用户登录(微信授权) - * @params {Object} data 请求参数 - * @params {String} uniIdToken 用户token - * @params {Object} util 公共工具包 * data 请求参数 说明 * @params {String} code 微信登录返回的code + * @params {String} platform 客户端类型:mp-weixin、app-plus,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 * res 返回参数说明 * @params {Number} code 错误码,0表示成功 * @params {String} msg 详细信息 @@ -21,7 +19,7 @@ module.exports = { let res = {}; // 业务逻辑开始----------------------------------------------------------- // 微信登录(未绑定任何账号时,会新建账号) - res = await uniID.loginByWeixin(event.data.code); + res = await uniID.loginByWeixin(event.data); if(res.token){ // 日志服务 const loginLogService = vk.require("service/user/util/login_log"); -- GitLab