Browse Source

first commit

wang jun 2 years ago
commit
71c37a272e
100 changed files with 17418 additions and 0 deletions
  1. 0 0
      .htaccess
  2. 1 0
      7yQhZzJ4Mi.txt
  3. 7 0
      AjaxResultClass.php
  4. 27 0
      ZTest/index.html
  5. 1 0
      ZTest/jquery.js
  6. 847 0
      ZTest/klyUnitTestPlat.html
  7. 717 0
      ZTest/klyUnitTestTrader.html
  8. 373 0
      ZTest/klyUnitTestTrader2.html
  9. 667 0
      ZTest/klyUnitTestWorker.html
  10. 782 0
      ZTest/yxpUnitTestAPP.html
  11. 1081 0
      ZTest/yxpUnitTestPlat.html
  12. 1 0
      a08jMRulEf.txt
  13. 71 0
      ajaxEntryCenter.php
  14. BIN
      assets/font/msyh.ttf
  15. 1076 0
      base/base.php
  16. 9 0
      base/composer/composer.json
  17. 2002 0
      base/composer/composer.lock
  18. 21 0
      base/composer/vendor/adbario/php-dot-notation/LICENSE.md
  19. 29 0
      base/composer/vendor/adbario/php-dot-notation/composer.json
  20. 601 0
      base/composer/vendor/adbario/php-dot-notation/src/Dot.php
  21. 23 0
      base/composer/vendor/adbario/php-dot-notation/src/helpers.php
  22. 14 0
      base/composer/vendor/alibabacloud/credentials/CHANGELOG.md
  23. 30 0
      base/composer/vendor/alibabacloud/credentials/CONTRIBUTING.md
  24. 13 0
      base/composer/vendor/alibabacloud/credentials/LICENSE.md
  25. 88 0
      base/composer/vendor/alibabacloud/credentials/NOTICE.md
  26. 250 0
      base/composer/vendor/alibabacloud/credentials/README-zh-CN.md
  27. 251 0
      base/composer/vendor/alibabacloud/credentials/README.md
  28. 21 0
      base/composer/vendor/alibabacloud/credentials/SECURITY.md
  29. 6 0
      base/composer/vendor/alibabacloud/credentials/UPGRADING.md
  30. 104 0
      base/composer/vendor/alibabacloud/credentials/composer.json
  31. 72 0
      base/composer/vendor/alibabacloud/credentials/src/AccessKeyCredential.php
  32. 53 0
      base/composer/vendor/alibabacloud/credentials/src/BearerTokenCredential.php
  33. 182 0
      base/composer/vendor/alibabacloud/credentials/src/Credential.php
  34. 50 0
      base/composer/vendor/alibabacloud/credentials/src/Credential/Config.php
  35. 102 0
      base/composer/vendor/alibabacloud/credentials/src/Credentials.php
  36. 23 0
      base/composer/vendor/alibabacloud/credentials/src/CredentialsInterface.php
  37. 151 0
      base/composer/vendor/alibabacloud/credentials/src/EcsRamRoleCredential.php
  38. 134 0
      base/composer/vendor/alibabacloud/credentials/src/Filter.php
  39. 202 0
      base/composer/vendor/alibabacloud/credentials/src/Helper.php
  40. 98 0
      base/composer/vendor/alibabacloud/credentials/src/MockTrait.php
  41. 187 0
      base/composer/vendor/alibabacloud/credentials/src/Providers/ChainProvider.php
  42. 94 0
      base/composer/vendor/alibabacloud/credentials/src/Providers/EcsRamRoleProvider.php
  43. 82 0
      base/composer/vendor/alibabacloud/credentials/src/Providers/Provider.php
  44. 49 0
      base/composer/vendor/alibabacloud/credentials/src/Providers/RamRoleArnProvider.php
  45. 53 0
      base/composer/vendor/alibabacloud/credentials/src/Providers/RsaKeyPairProvider.php
  46. 218 0
      base/composer/vendor/alibabacloud/credentials/src/RamRoleArnCredential.php
  47. 37 0
      base/composer/vendor/alibabacloud/credentials/src/Request/AssumeRole.php
  48. 33 0
      base/composer/vendor/alibabacloud/credentials/src/Request/GenerateSessionAccessKey.php
  49. 155 0
      base/composer/vendor/alibabacloud/credentials/src/Request/Request.php
  50. 158 0
      base/composer/vendor/alibabacloud/credentials/src/RsaKeyPairCredential.php
  51. 47 0
      base/composer/vendor/alibabacloud/credentials/src/Signature/BearerTokenSignature.php
  52. 47 0
      base/composer/vendor/alibabacloud/credentials/src/Signature/ShaHmac1Signature.php
  53. 47 0
      base/composer/vendor/alibabacloud/credentials/src/Signature/ShaHmac256Signature.php
  54. 64 0
      base/composer/vendor/alibabacloud/credentials/src/Signature/ShaHmac256WithRsaSignature.php
  55. 34 0
      base/composer/vendor/alibabacloud/credentials/src/Signature/SignatureInterface.php
  56. 98 0
      base/composer/vendor/alibabacloud/credentials/src/StsCredential.php
  57. 31 0
      base/composer/vendor/alibabacloud/darabonba-openapi/README-CN.md
  58. 31 0
      base/composer/vendor/alibabacloud/darabonba-openapi/README.md
  59. 17 0
      base/composer/vendor/alibabacloud/darabonba-openapi/autoload.php
  60. 32 0
      base/composer/vendor/alibabacloud/darabonba-openapi/composer.json
  61. 387 0
      base/composer/vendor/alibabacloud/darabonba-openapi/src/Models/Config.php
  62. 65 0
      base/composer/vendor/alibabacloud/darabonba-openapi/src/Models/OpenApiRequest.php
  63. 137 0
      base/composer/vendor/alibabacloud/darabonba-openapi/src/Models/Params.php
  64. 939 0
      base/composer/vendor/alibabacloud/darabonba-openapi/src/OpenApiClient.php
  65. 3 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/ChangeLog.md
  66. 35 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/README-CN.md
  67. 35 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/README.md
  68. 17 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/autoload.php
  69. 32 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/composer.json
  70. 975 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Dyplsapi.php
  71. 119 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddAxnTrackNoRequest.php
  72. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddAxnTrackNoResponse.php
  73. 71 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddAxnTrackNoResponseBody.php
  74. 131 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddSecretBlacklistRequest.php
  75. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddSecretBlacklistResponse.php
  76. 71 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddSecretBlacklistResponseBody.php
  77. 239 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbRequest.php
  78. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbResponse.php
  79. 84 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbResponseBody.php
  80. 71 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbResponseBody/secretBindDTO.php
  81. 251 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgRequest.php
  82. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgResponse.php
  83. 84 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgResponseBody.php
  84. 71 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgResponseBody/secretBindDTO.php
  85. 251 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionRequest.php
  86. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionResponse.php
  87. 84 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionResponseBody.php
  88. 71 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionResponseBody/secretBindDTO.php
  89. 263 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnRequest.php
  90. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnResponse.php
  91. 84 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnResponseBody.php
  92. 71 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnResponseBody/secretBindDTO.php
  93. 131 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoRequest.php
  94. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoResponse.php
  95. 84 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoResponseBody.php
  96. 47 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoResponseBody/secretBuyInfoDTO.php
  97. 119 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateAxgGroupRequest.php
  98. 61 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateAxgGroupResponse.php
  99. 83 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateAxgGroupResponseBody.php
  100. 131 0
      base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateSubscriptionRequest.php

+ 0 - 0
.htaccess


+ 1 - 0
7yQhZzJ4Mi.txt

@@ -0,0 +1 @@
+164d7bea74c787e0cdc8d44f8f81671b

+ 7 - 0
AjaxResultClass.php

@@ -0,0 +1,7 @@
+<?php
+defined('ONLY_ONLY_ONLY') or exit('Access Denied');
+class AjaxResult{ 
+    public $ErrCode = "";   
+    public $ErrMsg = "";    
+    public $Result = "";
+}

+ 27 - 0
ZTest/index.html

@@ -0,0 +1,27 @@
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>接口首页</title>
+        <meta name="renderer" content="webkit|ie-comp|ie-stand">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">                
+    </head>    
+    <body>   
+        <style>
+            a:link {
+                display:block;
+                text-decoration:none;
+                margin-top:8px;
+            }
+        </style>     
+        <div>---【快来优】-------------------------------------------------</div>
+        <a href="javascript:location.href='klyUnitTestWorker.html?t='+(new Date()).getTime();" >快来优会员侧接口页面</a>
+        <a href="javascript:location.href='klyUnitTestTrader.html?t='+(new Date()).getTime();" >快来优商家侧接口页面</a>
+        <a href="javascript:location.href='klyUnitTestTrader2.html?t='+(new Date()).getTime();" >快来优现场经理侧接口页面</a>
+        <a href="javascript:location.href='klyUnitTestPlat.html?t='+(new Date()).getTime();" >快来优PC平台侧接口页面</a>
+        <br/>
+        <div>----【优信聘】------------------------------------------------</div>
+        <a href="javascript:location.href='yxpUnitTestAPP.html?t='+(new Date()).getTime();" >优信聘APP侧接口页面</a>
+        <a href="javascript:location.href='yxpUnitTestPlat.html?t='+(new Date()).getTime();" >优信聘PC侧接口页面</a>
+    </body>
+</html>

File diff suppressed because it is too large
+ 1 - 0
ZTest/jquery.js


+ 847 - 0
ZTest/klyUnitTestPlat.html

@@ -0,0 +1,847 @@
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>快来优PC端接口测试</title>
+        <meta name="renderer" content="webkit|ie-comp|ie-stand">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">        
+        <script type="text/javascript" src="jquery.js"></script>   
+    </head>
+    <body>        
+        <button onclick="baseTest()">基本测试</button>
+        <button onclick="fetchPageDataTest()">通用分页数据获取接口测试</button>
+        <button onclick="entityHandleTest()">通用实体数据存取接口测试</button>        
+        <button onclick="loginPlatByIdNameTest()">平台用户IDNAME登录测试</button>         
+    </body>
+</html>
+<script type="text/javascript">
+    function getQueryVariable(varName){
+       var query = window.location.search.substring(1);
+       var vars = query.split("&");
+       for (var i=0;i<vars.length;i++) {
+            var pair = vars[i].split("=");
+            if(pair[0] == varName){return pair[1];}
+       }
+       return(false);
+    }
+    if(getQueryVariable("h5cb")=="true"){
+        let h5payno=getQueryVariable("h5payno");
+        alert("h5支付回调回来了,此时可以ajax去查单了[支付商家订单号:"+h5payno+"]");
+    }
+
+    //统一的持久化token方法
+    function baseSaveToken(token){
+        window.localStorage.setItem("TOKEN",token);
+        window.sessionStorage.setItem("TOKEN",token);
+    }
+    //统一获取token方法
+    function baseGetToken(){
+        return window.localStorage.getItem("TOKEN");
+        return window.sessionStorage.getItem("TOKEN");
+    }
+    //统一对接口回调结果数据进行校验的方法
+    function verifyAjaxResult(ajaxResult,handleReLogin){
+        if(typeof(ajaxResult.ErrMsg)=="undefined"){//必须返回ErrMsg属性,才算接口正常
+            alert("接口调用失败");//接口调用失败信息提示
+            return false;
+        }else if(ajaxResult.ErrMsg){//ErrMsg属性非空,则接口异常
+            if(handleReLogin && parseInt(ajaxResult.ErrMsg.indexOf("FOREND_TOKEN_INVAILD"))>-1){//登录TOKEN无效异常
+                alert("登录TOKEN无效:"+ajaxResult.ErrMsg);  
+                window.location.href="重定向到登录页面,登录后后端会返回一个新的token,然后持久化即可";
+                //wx.navigateTo("重定向到获取微信openid的接口/或直接ajax静默获取一下,此接口会返回新的token,然后持久化即可"); 
+                return false;                 
+            }
+            alert("接口调用失败:"+ajaxResult.ErrMsg);//接口调用失败信息提示   
+            return false;                 
+        }
+        return true;
+    }
+
+    //公共库中配置webapi url头 WsAjaxPrj为项目标记参数(优信聘YXP,快来优KLY),切记大小写敏感    
+    let webapiHost="https://zpwebapi.kaidekuai.com";    
+    let webapiUrl="https://zpwebapi.kaidekuai.com/ajaxEntryCenter.php?WsAjaxPrj=KLY";
+    
+    // webapiHost="https://api.kuailaiyou.top";    
+    // //快来优/快来优/快来优 公共库中配置webapi url头 
+    // webapiUrl="https://api.kuailaiyou.top/ajaxEntryCenter.php?WsAjaxPrj=KLY";    
+    function loginPlatByIdNameTest(){        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=loginById",            
+            data: {                
+                "loginName":"leader",//登录账号
+                "loginPwd":"kLy2021@ws.com",//登录密码
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                baseSaveToken(data.forendToken);//缓存token
+                let bizUserInfo=data.bizUserInfo;
+                alert("用户相关信息====>"+JSON.stringify(bizUserInfo));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+    function entityHandleTest(mode){      
+        let data={  };     
+        data["FOREND_TOKEN"]=baseGetToken();//统一传递一下前端token            
+        data["loginName"]="leader";//登录账号 
+                                        
+        /***PC侧拉取平台角色用户列表**/                
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="fetchPlatUserList";
+
+        /***PC侧设置平台角色用户新密码**/                
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="resetPlatUserPwd";
+        data["userid"]="1";//用户id
+        data["newPasswd"]="123456";         
+
+        /***PC侧普通用户修改自己的密码**/                
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="resetSelfPwd";        
+        data["newPasswd"]="123456";  
+
+        /***平台协议内容相关接口**/        
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="fetchall";//拉取所有数据
+        
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="fetch";//拉取单条数据接口
+        data["bizId"]="3";//1-会员注册协议;2-商家注册协议;3-平台内容;4-小优保障;5-小优保险;
+
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="update";//更新
+        data["bizId"]="3";//1-会员注册协议;2-商家注册协议;3-平台内容;4-小优保障;5-小优保险;
+        data["title"]="标题标题";
+        data["content"]="协议内容阿凡达协议内打发打发容332";   
+        data["picurls"]=["/pic/aaa/a.jpg"];//图片url数组   
+
+        /***轮播图**/
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="fetchall";//拉取所有记录
+        data["biz_catalog"]="0";//0-招聘轮播图;1-活动轮播图;
+
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="upsert";//编辑
+        data["bizData"]={
+            //id:"3",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            biz_catalog:"0",//0-招聘轮播图;1-活动轮播图;
+            slideshowImg:"修改后",
+            ofType:"1",//0-独立宣传页;1-关联招聘记录;
+            detailshowImg:"修改后顶顶顶顶顶顶",
+            biz_recruitid:1,
+        }  
+
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="fetch";//拉取单个
+        data["bizId"]="1";
+
+        /***招聘费用规则相关接口**/
+        data["bizCatalog"]="PlatConfigEntity";
+        data["handleMode"]="fetchRecuritRule";//拉取当前配置
+
+        data["bizCatalog"]="PlatConfigEntity";
+        data["handleMode"]="updateRecuritRule";//更新规则配置
+        data["cfgData"]={           
+            freeCount:22,//免费人次
+            pricePer:11.2222,//每人次价格,单位元,两位小数
+
+            feeper_min:22,//每人招聘费用的最低额
+            enroll_premoney:11.2222,//会员报名押金额
+            plater_getrate:22,//默认平台分成比例
+            share_getrate:11,//默认分佣比例
+            tbreak_cutrate:22,//商家违约会员的扣除比例
+            enroll_overate:11.2222,//溢报倍数
+        }  
+
+        /***招聘信息审核处理接口**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="audit";
+        data["bizId"]="2";//招聘记录ID
+        data["todo"]="refuse";//allow 同意/refuse 拒绝
+        data["reason"]="如果是拒绝的原因";//如果是拒绝的原因
+        data["platcutMode"]=1;//平台分成模式 0-比例模式;1-金额模式;
+        data["platcutValue"]=1.05;//平台分成值 比例(百分比)或金额(单位元,保留小数两位)
+        data["sharecutMode"]=1;//分享分享分成模式 0-比例模式;1-金额模式;
+        data["sharecutValue"]=0.05;//分享分享分成值 比例(百分比)或金额(单位元,保留小数两位)
+
+        /***招聘信息详情拉取接口**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetch";//拉取单个
+        data["bizId"]="1";
+
+        /***团组详情**/                
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchTeam";
+        data["teamid"]="1";
+
+        /***团成员项/工单详情**/                
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchTeamFollow";//fetch 工单详情/fetchTeamFollow 团组成员项详情
+        data["workid"]="1";      
+
+        /***获取某个会员信息**/        
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetch";          
+        data["workerId"]="1";//会员业务用户ID     
+
+        /***会员黑名单处理接口**/        
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="blackhandle";       
+        data["todo"]="set";//set-设为黑名单;reset-取消黑名单   
+        data["workerId"]="1";//会员业务用户ID  
+        data["reason"]="可选的原因";  
+
+        /***获取某个商家信息**/        
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="fetch";          
+        data["traderId"]="1";//商家ID     
+
+        /***商家黑名单处理接口**/        
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="blackhandle";       
+        data["todo"]="set";//set-设为黑名单;reset-取消黑名单   
+        data["traderId"]="1";//商家ID  
+        data["reason"]="可选的原因";  
+
+        /***商家实名认证确认接口**/        
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="certifConfirmed";       
+        data["todo"]="set";//set-确认已实名;reset-取消实名确认   
+        data["traderId"]="1";//商家ID  
+        data["reason"]="可选的原因";  
+
+        /***商家增值服务upsert接口**/        
+        data["bizCatalog"]="TraServiceEntity";
+        data["handleMode"]="upsert";
+        data["bizData"]={
+            //id:"1",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            title:"标题啊22",
+            profile_photo:"/头图2",//头图            
+            price:"1.22",//价钱 单位元 保留2位小数
+            content:"介绍说明2",
+            company_name:"公司名称2",
+            linker_name:"联系人姓名2",//联系人姓名
+            linker_phone:"18912345672",//联系人电话            
+            remark:"备注22",            
+        }  
+
+        /***获取商家增值服务信息接口**/        
+        data["bizCatalog"]="TraServiceEntity";
+        data["handleMode"]="fetch";
+        data["bizId"]="1";     
+
+        /***删除商家增值服务信息接口**/        
+        data["bizCatalog"]="TraServiceEntity";
+        data["handleMode"]="delete";
+        data["bizId"]="1";     
+        data["reason"]="可选的原因";     
+
+        /***通知公告发布接口**/            
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="upsert";    
+        data["bizData"]={            
+            //"id":"1",//id为空则为新增角色账号 非空则更新角色账号信息
+            "catalog":"1",//0-对所有人;1-会员侧;2-商家侧
+            "title":"可选标题222",//可选标题
+            "content":"通知内容33",//通知内容     
+        }   
+
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="fetch";    
+        data["bizId"]="1";
+
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="delete";    
+        data["bizId"]="1";
+        data["reason"]="可选的原因";   
+
+        /***营销活动upsert接口**/        
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="upsert";
+        data["bizData"]={
+            id:"1",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            list_photos:[
+                {"picurl":"/列表图片url","desc":"列表图片描述文本1111"},
+                {"picurl":"/列表图片url","desc":"列表图片描述文本2222"},
+            ],
+            detail_photos:["/详情图片url","/详情图片url",],
+            title:"标题啊2234343",
+            begin_datetime:"2021-12-12 12:12:33",//活动开始时间
+            finish_datetime:"2021-12-12 22:12:33",//活动结束时间  
+            total:"22",//可报名人数
+            price:"1.22",//价钱 单位元 保留2位小数            
+            company_name:"公司名称2",
+            linker_name:"联系人姓名2",//联系人姓名
+            linker_phone:"18912345672",//联系人电话   
+            activity_addr:"活动所在地址",//活动所在地址对象     
+            activity_addr1:"手工输入地址",             
+            addr_lng:"地址经度",       
+            addr_lat:"地址纬度",                 
+            biz_remark:"备注22",           
+            group_qrurl:"群二维码url",       
+            istop:"0",//0-取消置顶;1-设为置顶; 不传则保留原状;
+        }  
+
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="delete";//删除
+        data["bizId"]="1";
+        data["reason"]="可选的原因";
+
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetch";//获取详情
+        data["bizId"]="1";
+
+        /***获取意见反馈详情**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchSuggestion";
+        data["bizId"]="4";//意见反馈记录id
+
+        /***处理意见反馈**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="finishSuggestion";
+        data["bizId"]="4";//意见反馈记录id
+        data["replyContent"]="回复内容";
+
+        /***删除意见反馈**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="deleteSuggestion";
+        data["bizId"]="4";//意见反馈记录id
+        data["reason"]="可选的原因";
+
+        /***获取投诉详情**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchComplaint";
+        data["bizId"]="4";//投诉记录id
+
+        /***处理投诉**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="finishComplaint";
+        data["bizId"]="4";//投诉记录id
+        data["replyContent"]="回复内容";
+
+        /***删除投诉**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="deleteComplaint";
+        data["bizId"]="4";//投诉记录id
+        data["reason"]="可选的原因";
+        
+        /**招聘记录置顶****/
+        data["bizCatalog"]="RecruitEntity";        
+        data["handleMode"]="topHandle";
+        data["todo"]="set";//set-置顶;unset-取消置顶
+        data["bizIds"]=["1"];//空则全部记录;有限个则为批量处理;
+
+        /**招聘记录下架处理**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="downdrop";    
+        data["bizId"]="1";
+        data["reason"]="可选的原因";   
+        
+        /**营销活动置顶****/
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="topHandle";
+        data["todo"]="set";//set-置顶;unset-取消置顶
+        data["bizIds"]=["1"];//空则全部记录;有限个则为批量处理;
+
+        /***平台PC侧综合统计接口**/            
+        data["bizCatalog"]="StatisticsEntity";
+        data["handleMode"]="fetchall";//fetchall-获取所有统计信息;fetchmoney-只获取财务相关统计   
+        data["startDate"]="2020-12-12";//筛选的开始日期
+        data["endDate"]="2021-12-12";//筛选的截至日期
+
+        /***平台PC侧获取未处理数接口**/            
+        data["bizCatalog"]="StatisticsEntity";
+        data["handleMode"]="fetchUndoList";
+
+        //评价处理
+        data["bizCatalog"]="AppraisalEntity";
+        data["handleMode"]="delete";//删除评价记录
+        data["bizId"]="1";
+        
+        /***平台侧upsert平台角色人员接口**/            
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="upsertPlatRoleUser";
+        data["roleId"]="1";//角色ID
+        data["bizData"]={            
+            //"id":"20",//id为空则为新增角色账号 非空则更新角色账号信息
+            "loginName":"admin999",//登录号
+            "loginPwd":"23434",//新登录密码 为空则不修改
+            "remark":"阿凡达发的111",//备注         
+        }    
+        /***平台侧删除平台角色人员接口**/            
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="removePlatRoleUser";
+        data["userId"]="19";//账号id       
+        data["reason"]="afdfdf";//   
+
+        /***平台代:工单支付结算接口**/        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="paySettle";        
+        data["workid"]="0";//工单id 优选工单id
+        data["workPayCode"]="A00001";//工单核销码
+
+        /**招聘记录费用拆算****/
+        data["bizCatalog"]="RecruitEntity";        
+        data["handleMode"]="feeCalculate";        
+        data["bizId"]="134";//招聘记录id
+        data["platcutMode"]="";//平台分成模式 0-比例模式;1-金额模式;
+        data["platcutValue"]="";//平台分成值 比例(百分比)或金额(单位元,保留小数两位)
+        data["sharecutMode"]=1;//分享分享分成模式 0-比例模式;1-金额模式;
+        data["sharecutValue"]=0;//分享分享分成值 比例(百分比)或金额(单位元,保留小数两位)
+        
+        /**活动手工下架处理****/
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="dropdown";//手工下架
+        data["bizId"]="1";
+        data["reason"]="可选的原因";
+
+        /**招聘记录下架处理**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="downdrop";    
+        data["bizId"]="85";
+        data["reason"]="可选的原因";   
+
+        /**OCR 测试**/
+        data["bizCatalog"]="TXCLOUD_OCR";
+        data["handleMode"]="IDCardOCR";//BizLicenseOCR-营业执照 IDCardOCR-身份证
+        data["ocrParams"]={
+            "ImageUrl":"3434",
+            "ImageBase64":"343434334",
+            "CardSide":"FRONT",//BACK
+        };   
+        
+        // data["bizCatalog"]="PlatConfigEntity";
+        // data["handleMode"]="updateRecuritRule";//更新规则配置
+        // data["cfgData"]={           
+        //     freeCount:22,//免费人次
+        //     freeCount2:33,//
+        //     pricePer:11.2222,//每人次价格,单位元,两位小数
+
+        //     feeper_min:1.377,//每人招聘费用的最低额
+        //     enroll_premoney:2.6788,//会员报名押金额
+        //     plater_getrate:11,//默认平台分成比例
+        //     share_getrate:22,//默认分佣比例
+        //     tbreak_cutrate:33,//商家违约会员的扣除比例
+        //     enroll_overate:11.2222,//溢报倍数
+        // }  
+
+        /***招聘费用规则相关接口**/
+        // data["bizCatalog"]="PlatConfigEntity";
+        // data["handleMode"]="fetchRecuritRule";//拉取当前配置
+
+        /**审核拒绝支付请求**/
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="denyPayAudit";    
+        data["workid"]="398";//工单id
+        data["todo"]="allow";//allow 同意/refuse 拒绝
+        data["reason"]="可选的原因";   
+
+        /***商家等级设置**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="adjustLevel";        
+        data["becomeVip"]="0";//0-取消vip身份,1-设置为vip级别身份
+        data["traderIds"]=["43","44"];//商家记录ID 单个或批量 不能为空
+        data["reason"]="可选的原因";//可选的原因
+
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=entityDataHandle",            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchPageDataTest(mode){      
+        let data={};
+        data["FOREND_TOKEN"]=baseGetToken();//统一传递一下前端token 
+        data["loginName"]="leader";//登录账号 
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        
+        //招聘记录列表       
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchall";
+        data["exportExcel"]="true11";//是否导出excel true则导出,否则不导出 
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="1";//0空-最新发布倒序排序;1-距离倒序;2-薪资倒序;
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";
+        data["query"]={
+            "status":"",//0空-全部;1-待提交/草稿;2-待审核;3-已审核;4-被驳回;
+            "downed":"",//0空-全部;1-未下架;2-已下架;
+            "title":"",//招聘标题筛选
+            "mobile":"",//商家手机号
+            startDate:"",//起始日期2021-12-12
+            finishDate:"",//结束日期2021-12-21
+        };   
+        if(data["exportExcel"]=="true") return postExcelFile(data,ajaxUrl); 
+        
+        //获取团组列表        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallTeam";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;        
+        data["query"]={               
+            "status":"",//0空-全部;1-待成团;2-已成团待提交报名;3-已解散;4-已报名待审核;5-报名已审核通过;6-报名被驳回;7-被违约;8-主动取消报名;9-被动取消报名
+            "title":"",//招聘标题筛选
+        };  
+        
+        //获取团组成员项列表             
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallTeamFollow";
+        data["teamid"]="1";//团组id
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;        
+        data["query"]={  
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项;
+            "memberName":"",//成员姓名
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+        };        
+
+        //获取工单招聘分组列表               
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallRecurit";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={              
+            "recuritStatus":"",//0空-全部;1-待提交/草稿;2-待审核;3-已审核;4-被驳回;
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算;91-进行中;92-异常工单;                                             
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项; 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+            "recuritTitle":"",//招聘标题筛选  
+            "memberName":"",//成员姓名
+        };    
+
+        //获取工单明细列表               
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchall";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={     
+            "workSettleMode":"1",//结算模式:完工结/次结(含批量招聘);
+            "startDate":"2021-12-10",//应开工日期,普通招聘的开始日期/批量招聘的报名日期
+            "startDate2":"2021-12-10",//实际开工时间,工人单击开始工作的时间
+            "workerId":"1",//会员Id
+            "traderId":"1",//商家Id
+            "workArea":"河北省/秦皇岛市",//区域筛选
+            "recuritId":"1",//招聘记录Id
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算; 91-进行中;92-异常工单;93-会员异常工单;94-商家异常工单;                                            
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项; 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+            "recuritTitle":"",//招聘标题筛选  
+            "memberName":"",//成员姓名
+        };    
+
+        //获取现场经理列表            
+        data["bizCatalog"]="Trader2Entity";
+        data["handleMode"]="fetchall";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序; 
+        data["query"]={                          
+            "memberName":"",//姓名     
+            "verifyTime":"2022-12-12 12:12",//0空-全部;1-截止时间;       
+        };           
+
+        //用户记录列表       
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;       
+        data["orderby"]=0;//0-默认时间倒序;1-接单数倒序;2-提现数倒序;3-异常数倒序;       
+        data["query"]={            
+            // mobile:"13812345678",  
+            // regtime:"2021-10-18",    
+            // stoped:"0",//0空-全部;1-未停用的;2-已停用的;   
+            // breakType:"1",//0空-全部;1-迟到;2-其他类型;  
+            blocked:"0",//0空-全部;1-非黑名单;2-黑名单人员;   
+        };    
+
+        //商家记录列表       
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]=0;//0-默认时间倒序;1-发单数倒序;2-招聘人数倒序;3-充值金额倒序;4-异常数倒序;          
+        data["query"]={            
+            "companyName":"",
+            "mobile":"8138",
+            "regtime":"",//2021-10-13
+            "catalog":"0",//0空-全部;1-个人商家;2-企业商家;
+            "certif_confirmed":"0",//0空-全部;1-未确认;2-个人商家已确认;3-企业商家已确认;
+            "stoped":"0",//0空-全部;1-未停用;2-已停用;
+            "blocked":"0",//0空-全部;1-非黑名单;2-黑名单;
+            "breakType":"0",//0空-全部;1-拖欠工资;2-其他类型;
+            "statusCode":0,//0空-全部; 0-待提交;1-已提交待审核;2-已审核已发布;3-被驳回;  
+        };    
+
+        //商家服务记录列表       
+        data["bizCatalog"]="TraServiceEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={            
+            "title":"",//标题筛选    
+            "companyName":"",//公司名筛选      
+        };    
+
+        //公告通知列表
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={
+            "catalog":"",//0空-所有;1-针对所有端;2-会员侧;3-商家侧;
+            "keywords":"",//模糊查询
+        };                            
+
+        //分销商列表
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallSharer";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="1";//0空-分享次数倒序;1-分享钱数倒序;       
+        data["query"]={
+            memberName:"",//分销商姓名
+            startDate:"2021-12-12",//起始日期
+            finishDate:"2021-12-21",//结束日期
+        };                            
+        //某分销商下分销工单列表
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallShareWorks";
+        data["shareWorkerId"]="1",//分销商用户ID     
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="1";//0空-佣金额倒序;1-工单笔数倒序;     
+        data["query"]={                   
+            recuritTitle:"",//招聘标题
+            startDate:"",//起始日期2021-12-12
+            finishDate:"",//结束日期2021-12-21
+        };                            
+        //某分销商下分销粉丝列表
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallShareWorkers";
+        data["shareWorkerId"]="1",//分销商用户ID     
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="1";//0空-佣金额倒序;1-工单笔数倒序;       
+        data["query"]={
+            memberName:"",//粉丝姓名            
+            startDate:"",//起始日期2021-12-12
+            finishDate:"",//结束日期2021-12-21
+        };                       
+        
+        //营销活动列表
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetchall";
+        data["exportExcel"]="true11";//是否导出excel true则导出,否则不导出 
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-金额倒序;1-人数倒序;       
+        data["query"]={
+            "status":"",//状态筛选:0空-全部;1-未开始;2-待开始;3-进行中;4-已结束;
+            "title":"",//标题筛选
+            "linkphone":"",//联系电话
+        };   
+        if(data["exportExcel"]=="true") return postExcelFile(data,ajaxUrl);        
+                
+        //营销活动报名列表
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetchallEnroll";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;       
+        data["query"]={
+            "activityId":"",//活动id:0空-全部;否则为某活动下报名列表
+            "status":"",//状态筛选:0空-全部;1-已报名下单待支付;2-已支付待使用;3-已使用待评价;4-已评价;
+            "title":"",//标题筛选
+            "linkphone":"",//联系电话
+            "memberName":"",//会员姓名        
+        };                       
+        
+        //评价列表
+        data["bizCatalog"]="AppraisalEntity";
+        data["handleMode"]="fetchall";  
+        data["roleCatalog"]="";//0空-明细模式,否则为汇总模式;1-会员的评价;2-商家的评价;3-会员的被评价;4-商家的被评价;5-活动评价;6-招聘评价;
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;      
+        data["orderby"]=0;//0-时间倒序 1- 2-     
+        data["query"]={     
+            "fromWorkerId":"",//评价者会员id 会员的评价明细
+            "toWorkerId":"",//被评价者会员id 会员的被评价明细
+            "fromTraderId":"",//评价者商家id 商家的评价明细
+            "toTraderId":"",//被评价者商家id 商家的被评价明细
+            "activityId":"",//被评价活动id   活动评价明细
+            "recuritId":"",//被评价招聘id    招聘评价明细
+            "bizCatalog":"",//0空-全部;1-会员对活动评价;2-会员对工作过程雇主评价;3-雇主商家对会员工作过程评价;
+            "memberName":"",//会员姓名
+            "companyName":"",//商家名
+            "title":"",//活动标题或招聘标题
+        };       
+        
+        //意见反馈列表
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchallSuggestion";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;       
+        data["query"]={            
+            "catalog":"",//状态筛选:0空-全部;1-待回复;2-已完结;            
+            "memberName":"",//会员姓名        
+        };                 
+
+        //投诉列表
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchallComplaint";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;       
+        data["query"]={            
+            "catalog":"",//状态筛选:0空-全部;1-待回复;2-已完结;            
+            "memberName":"",//会员姓名        
+        };                       
+
+        //营销活动报名列表
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetchallEnroll";  
+        data["exportExcel"]="true11";//是否导出excel true则导出,否则不导出
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;       
+        data["query"]={
+            "activityId":"17",//活动id:0空-全部;否则为某活动下报名列表
+            "status":"",//状态筛选:0空-全部;1-已报名下单待支付;2-已支付待使用;3-已使用待评价;4-已评价;
+            "title":"",//标题筛选
+            "linkphone":"",//联系电话
+            "memberName":"",//会员姓名        
+        };                       
+        if(data["exportExcel"]=="true") return postExcelFile(data,ajaxUrl); 
+        
+        //招聘记录列表       
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchall";
+        data["exportExcel"]="";//是否导出excel true则导出,否则不导出 
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="1";//0空-最新发布倒序排序;1-距离倒序;2-薪资倒序;
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";
+        data["query"]={
+            "status":"",//0空-全部;1-待提交/草稿;2-待审核;3-已审核;4-被驳回;
+            "downed":"",//0空-全部;1-未下架;2-已下架;
+            "title":"",//招聘标题筛选
+            "mobile":"",//商家手机号
+            "nowUrgent":"1",//0空-所有;1-当日紧急;2-非当日紧急;
+            startDate:"",//起始日期2021-12-12
+            finishDate:"",//结束日期2021-12-21
+        };   
+        if(data["exportExcel"]=="true") return postExcelFile(data,ajaxUrl); 
+
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+                console.log(data);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+    function postExcelFile(params, url) {      
+      var form = document.createElement("form");
+      form.style.display = "none";
+      form.action = url;
+      form.method = "post";
+      document.body.appendChild(form);    
+      for (var key in params) {
+        var input = document.createElement("input");
+        input.type = "hidden";
+        input.name = key;
+        input.value = params[key];  
+        if(((params[key] instanceof Array)||(params[key] instanceof Object)))
+            input.value = JSON.stringify(params[key]);        
+        form.appendChild(input);
+      }
+      form.submit();
+      form.remove();
+    }
+
+    function baseTest(){
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: webapiUrl + "&WsAjaxBiz=ZTest&WsAjaxAction=action1",            
+            data: {                
+                "handle":"buildtoken",//生成token
+                "baseUserIds":["158","159"],//
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));                                
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+</script>

+ 717 - 0
ZTest/klyUnitTestTrader.html

@@ -0,0 +1,717 @@
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>快来优商家小程序接口测试</title>
+        <meta name="renderer" content="webkit|ie-comp|ie-stand">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">        
+        <script type="text/javascript" src="jquery.js"></script>   
+    </head>
+    <body>        
+        <button onclick="fetchPageDataTest()">通用分页数据获取接口测试</button>
+        <button onclick="entityHandleTest()">通用实体数据存取接口测试</button>        
+        <button onclick="registerTraderTest(this)">商户用户完善信息接口测试</button>        
+        <button onclick="fetchMinaPhoneTest()">商户获取手机号接口测试</button>      
+        <button onclick="fetchMinaOpenidTest()">商户获取openid接口测试</button>        
+    </body>
+</html>
+<script type="text/javascript">
+    function getQueryVariable(varName){
+       var query = window.location.search.substring(1);
+       var vars = query.split("&");
+       for (var i=0;i<vars.length;i++) {
+            var pair = vars[i].split("=");
+            if(pair[0] == varName){return pair[1];}
+       }
+       return(false);
+    }
+    if(getQueryVariable("h5cb")=="true"){
+        let h5payno=getQueryVariable("h5payno");
+        alert("h5支付回调回来了,此时可以ajax去查单了[支付商家订单号:"+h5payno+"]");
+    }
+
+    //统一的持久化token方法
+    function baseSaveToken(token){
+        window.localStorage.setItem("TOKEN",token);
+        window.sessionStorage.setItem("TOKEN",token);
+    }
+    //统一获取token方法
+    function baseGetToken(){
+        return window.localStorage.getItem("TOKEN");
+        return window.sessionStorage.getItem("TOKEN");
+    }
+    //统一对接口回调结果数据进行校验的方法
+    function verifyAjaxResult(ajaxResult,handleReLogin){
+        if(typeof(ajaxResult.ErrMsg)=="undefined"){//必须返回ErrMsg属性,才算接口正常
+            alert("接口调用失败");//接口调用失败信息提示
+            return false;
+        }else if(ajaxResult.ErrMsg){//ErrMsg属性非空,则接口异常
+            if(handleReLogin && parseInt(ajaxResult.ErrMsg.indexOf("FOREND_TOKEN_INVAILD"))>-1){//登录TOKEN无效异常
+                alert("登录TOKEN无效:"+ajaxResult.ErrMsg);  
+                window.location.href="重定向到登录页面,登录后后端会返回一个新的token,然后持久化即可";
+                //wx.navigateTo("重定向到获取微信openid的接口/或直接ajax静默获取一下,此接口会返回新的token,然后持久化即可"); 
+                return false;                 
+            }
+            alert("接口调用失败:"+JSON.stringify(ajaxResult.ErrMsg));//接口调用失败信息提示   
+            return false;                 
+        }
+        return true;
+    }
+
+    //公共库中配置webapi url头 WsAjaxPrj为项目标记参数(优信聘YXP,快来优KLY),切记大小写敏感    
+    let webapiHost="https://zpwebapi.kaidekuai.com";    
+    let webapiUrl="https://zpwebapi.kaidekuai.com/ajaxEntryCenter.php?WsAjaxPrj=KLY";
+        
+    // webapiHost="https://api.kuailaiyou.top";    
+    // //快来优/快来优/快来优 公共库中配置webapi url头 
+    // webapiUrl="https://api.kuailaiyou.top/ajaxEntryCenter.php?WsAjaxPrj=KLY";        
+    function fetchMinaOpenidTest(){
+        url=webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=fetchMinaOpenid";
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: url,            
+            data: {
+                //wx.login 的code
+                "minaCode":"0415mYFa1rRSXC0mldHa1pMHBq15mYF1",
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));                
+                let baseUser=data.baseUser;
+                //缓存基本用户信息id,后端会缓存解密数据的sessionkey
+                localStorage.setItem("baseUserId",baseUser["id"]);
+                //可选缓存一下openid
+                localStorage.setItem("openid",baseUser["wxmina_openid"]);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchMinaPhoneTest(){
+        url=webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=fetchMinaPhone";
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: url,            
+            data: {                
+                "baseUserId":localStorage.getItem("baseUserId"),   
+                //获取手机号后的相关数据            
+                "iv":"gX740ry7ii42usHmmjZlLQ==",
+                "encryptedData":"zQvkI6aKjR7UejeKXVgDx380CEUUKUXF3r/nVWGdwr7+nD+LK0pxEwJkv50rMSJUPsexg16ZEAVwC7MA7NsNNIzsPtZjrBAPoK4I0UAnb8HlWe/LDOlNEC78ErIHe2ui+GksgdBnrSnsegmcHpevBDo4zLZjbc0bIcTfNXpZb7/JEqo9IaY/0SRX70Hwra/x4C43tfUAoQHY6vUgKwc8LA==",
+                // "sesseion_key":"sYVcizJr7phhGHp0PAP+pQ==",//            
+                // "iv":"n8KZI4bkA5kosszJD3teUQ==",
+                // "encryptedData":"RU2LeokNrNWyBPSZkmTUPNJ0arRCXIomBzCkuTC1NgEr2hBcjlJqWQ45FePYUwRP8hTZJ+pEhI2auqNnVlelKqFrIGwR1x4198mmKNAyWtG04me8vv5nrsMthfu91RxNvRKPsTl5CG4RaSYa4FRrtuzylo1ttBHgRWTVOKHRRG8P4CkBYvOYTuIhz+BkTLtq9XrBWeW32jdyZiOI5nO8vw==",//
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                baseSaveToken(data.forendToken);//缓存token
+                let baseUser=data.baseUser;
+                //缓存基本用户信息id
+                localStorage.setItem("baseUserId",baseUser["id"]);
+                //缓存基本用户phone
+                localStorage.setItem("phone",baseUser["mobile"]);
+                //业务用户信息
+                let bizUserInfo=data.bizTrader;                
+                alert(data);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function registerTraderTest(){
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",             
+            //非商户用户注册完善信息接口;大小写敏感,直接复制即可
+            url: webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=registerInfo",            
+            data: {
+                "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token
+                "phone":localStorage.getItem("phone"),//手机号身份标识
+                "biz_catalog":1,//0-普通整体;1-昵称头像;
+                "catalog":0,//0-个人商家;1-企业商家;
+                "nickname":"🍉🍊🍋🍌🍍🥭🍎🍏",
+                "profile_photo":"",
+                "company_name":"商户名称",
+                "company_idcard":"公司统一识别号",   
+                "bizlicense_pic":"demo营业执照图片",             
+                "lawer_idcard":"个人身份证号/或公司法人身份证号",                                
+                "lawer_idcard_ppic":"身份证正面",
+                "lawer_idcard_npic":"身份证反面",
+                "lawer_idcard_mixpic":"手持身份证",                
+                "profile_photo":"头像图片url",
+                "linker_name":"demo联系人姓名5",
+                "linker_gender":"demo联系人性别",//0-男;1-女;
+                "company_addr":"demo公司地址6",
+                "company_desc":"demo公司简介",
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据
+                alert(data);//正常返回true
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+
+    function entityHandleTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            "phone":"18920407769",//登录账号  
+        };        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        
+        /***招聘费用规则相关接口**/
+        data["bizCatalog"]="PlatConfigEntity";
+        data["handleMode"]="fetchRecuritRule";//拉取当前配置
+
+        /*招聘信息相关接口*/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetch";
+        data["bizId"]="1";//招聘记录ID
+                
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="delete";
+        data["bizId"]="1";//招聘记录ID
+        data["reason"]="可选的原因";//可选的原因
+                
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="upsertLaunchAudit";//upsert 暂存到草稿;upsertLaunchAudit 直接提交;upsertReset 从驳回暂存到草稿箱;
+        data["bizData"]={
+            //id:"2",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            settle_catalog:"0",//0-单日结招聘;1-批量招聘;
+            title:"标题啊",
+            profile_photo:"/头图",//头图
+            work_typename:"焊工",//工种名
+            feeper:"1.16",//每人金额 单位元 保留2位小数
+            meals_providing:1,//是否管饭 0-不管;1-管饭;
+            begin_datetime:"2021-12-09",//单日工作日期或批量招聘的开始日期             
+            begin_hour:"08:30",//上班时间
+            finish_hour:"18:30",//下班时间
+            need_total:100,//需求总人数
+            need_perday:10,//每天需求人数
+            linker_name:"联系人姓名",//联系人姓名
+            linker_phone:"18912345678",//联系人电话
+            age_mode:1,//年龄, 0-不限;1-限制
+            age_min:16,//最小年龄
+            age_max:36,//最大年龄
+            gender_mode:1,//性别, 0-不限;1-限男;2-限女;
+            work_addr:"天津滨海新区工作地址",//工作地址
+            work_addr1:{city:"天津市",district:"滨海新区",area:"泰达大街"},//结构化对象
+            work_addr_lng:"117.33",//经度117.333
+            work_addr_lat:"39.99",//纬度39.33
+            work_desc:"工作内容工作内容",//工作内容
+            requirements:["有经验","能歌善舞"],//工作要求
+            enroll_audit:1,//报名审核, 0-不需要;1-需要;
+            settle_mode:1,//核销模式, 0-二维码;1-人工核销
+        }
+
+        /*次数账户相关接口*/
+        data["bizCatalog"]="NAccountEntity";
+        data["handleMode"]="buyPrepay";        
+        data["minaCode"]="091A35000odBMM1Ekc100D9Qc32A350K";//小程序登录态code
+        data["buyCount"]="7";//购买次数
+        /*
+        wx.login({
+            success:function(e){
+                minaCode=e.code//传递过来
+            }
+        })
+        {
+            "payBackBizCatalog":"0",//用于进行支付确认的参数,附加下一个接口调用参数中,用于确认支付结果;
+            "payBackBizId":"12",//用于进行支付确认的参数,附加下一个接口调用参数中,用于确认支付结果;
+            "appId":"wx8c230ea00ceb8676",
+            "timeStamp":"1636448664",
+            "nonceStr":"Qd4Ra46kpFWqGpMauTaDvTkQpt6n7goM",
+            "package":"prepay_id=wx09170424477823cd6b04110220c68f0000",
+            "signType":"RSA",
+            "paySign":"ZwWt4tXREUrIzMAtNfe5W3xZrHJ9clOntoH9K04gBdcqO6r3tkH02nuXMAw9zX4rfOda4rMvdFyAUEwLF8kPMiXO8dATBsW2SDnoNgccs3MAlzuh6KpukFPDZiizYpSlcc3ozRpHxn56FoUwPv0vl0HeIRl+wY8JOo64IoeZHseJm30Kg4+Eb2UAnOHcamzoKJwU5eikFd/SGTYRrAvVb/GrhncGlX3cbOG5Mpl5IO0562dKbJRoVzg0AbXNpudjR76aj1usJZRLOve/M0qA+KFyajG5ZSa0kgLCMzvlT/HaLn8TkM/0O7pyjA51dCBe51nruiIVgPy69Up1VAWAhQ=="
+        }
+        wx.requestPayment({
+            "timeStamp":"1636464033",
+            "nonceStr": "FTAm6y367cdKq8swYuW7dFPfvpUsf8C5",
+            "package": "prepay_id=wx092120331932728919625e055f0dfa0000",
+            "signType": "RSA",
+            "paySign": "DfqExz4l3zDPKvKQ3QcJ2+fiRv4gdgIeERG4bhRCfQ3IGFBDZfPJodiiBNTWFkZtzbcnOuCNLtMHZvLPuAcc7AlAPlXQSJTkGrpFLlAb5a/6NBbRVbbe56/ZrQw5F7m1RyZ3dIPYJUeT804H+LELEn9aFdY2j6MXKsrZ+62rKpCTdfFlRy1Wl7Pac2UKp/z6gvVZNT6+AUCVbF1b1otCaKbU/XgpeYmOCm8SlotFW6i2JujlLA78o7lPIjcTCJHj/Ebb0WGTM15Z7O8TkHVqc6Z4TsFwztIiYN6xaANnQYjFPymFVMO0ZRs7OGkY+SgXOnwMuKLu9YcCYjC4RAtBfA==",
+            "success":function(res){
+                wx.request("url?WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle&payBackBizCatalog=&payBackBizId=")
+            },
+            "fail":function(res){
+
+            },
+            "complete":function(res){
+                
+            }
+        });
+        */
+
+        /*通用支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="0";//支付业务类别:0-次数支付业务;
+        data["payBizId"]="6";//支付记录id
+
+        
+        /***团组详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchTeam";
+        data["teamid"]="1";
+
+        /***团成员项/工单详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchTeamFollow";//fetch 工单详情/fetchTeamFollow 团组成员项详情
+        data["workid"]="1";  
+        
+        /***终止招聘**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="terminate";
+        data["recuritIds"]=["1","2"];//招聘记录ID 单个或批量 不能为空
+        data["reason"]="可选的原因";//可选的原因
+        
+        /***拉取支付前(展示商家/活信息/工资/支付码/自己专款专户余额等信息)接口**/     
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="waitPay";        
+        data["workid"]="2";//工单id 优选工单id
+        data["workPayCode"]="A00001";//工单核销码
+
+        /***工单支付结算接口**/        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="paySettle";        
+        data["workid"]="0";//工单id 优选工单id
+        data["workPayCode"]="A00001";//工单核销码
+        data["minaCode"]="051gxVll2v9I884GkHkl2UMIfk2gxVlg";//小程序登录态code,以便在余额不足时,拉起微信支付        
+        //返回prePayInfo则为需微信支付一部分钱;否则为余额支付成功!
+        /*
+        wx.login({
+            success:function(e){
+                minaCode=e.code//传递过来
+            }
+        })
+        {
+            "payBackBizCatalog":"1",//用于进行支付确认的参数,附加下一个接口调用参数中,用于确认支付结果;
+            "payBackBizId":"2",//用于进行支付确认的参数,附加下一个接口调用参数中,用于确认支付结果;
+            "appId":"wx8c230ea00ceb8676",
+            "timeStamp":"1636448664",
+            "nonceStr":"Qd4Ra46kpFWqGpMauTaDvTkQpt6n7goM",
+            "package":"prepay_id=wx09170424477823cd6b04110220c68f0000",
+            "signType":"RSA",
+            "paySign":"ZwWt4tXREUrIzMAtNfe5W3xZrHJ9clOntoH9K04gBdcqO6r3tkH02nuXMAw9zX4rfOda4rMvdFyAUEwLF8kPMiXO8dATBsW2SDnoNgccs3MAlzuh6KpukFPDZiizYpSlcc3ozRpHxn56FoUwPv0vl0HeIRl+wY8JOo64IoeZHseJm30Kg4+Eb2UAnOHcamzoKJwU5eikFd/SGTYRrAvVb/GrhncGlX3cbOG5Mpl5IO0562dKbJRoVzg0AbXNpudjR76aj1usJZRLOve/M0qA+KFyajG5ZSa0kgLCMzvlT/HaLn8TkM/0O7pyjA51dCBe51nruiIVgPy69Up1VAWAhQ=="
+        }
+        wx.requestPayment({
+            "timeStamp":"1636464033",
+            "nonceStr": "FTAm6y367cdKq8swYuW7dFPfvpUsf8C5",
+            "package": "prepay_id=wx092120331932728919625e055f0dfa0000",
+            "signType": "RSA",
+            "paySign": "DfqExz4l3zDPKvKQ3QcJ2+fiRv4gdgIeERG4bhRCfQ3IGFBDZfPJodiiBNTWFkZtzbcnOuCNLtMHZvLPuAcc7AlAPlXQSJTkGrpFLlAb5a/6NBbRVbbe56/ZrQw5F7m1RyZ3dIPYJUeT804H+LELEn9aFdY2j6MXKsrZ+62rKpCTdfFlRy1Wl7Pac2UKp/z6gvVZNT6+AUCVbF1b1otCaKbU/XgpeYmOCm8SlotFW6i2JujlLA78o7lPIjcTCJHj/Ebb0WGTM15Z7O8TkHVqc6Z4TsFwztIiYN6xaANnQYjFPymFVMO0ZRs7OGkY+SgXOnwMuKLu9YcCYjC4RAtBfA==",
+            "success":function(res){
+                wx.request("url?WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle&payBackBizCatalog=&payBackBizId=")
+            },
+            "fail":function(res){
+
+            },
+            "complete":function(res){
+                
+            }
+        });
+        */
+        /****商家侧:余额模式支付成功后则提示,并引导到已结算工单列表页面(查看结算情况)*/
+        /****商家侧:微信支付模式前端支付成功后,需要用下面接口确认一下支付是否成功,成功则提示,并引导到已结算工单列表页面(查看结算情况)*/
+        /*工单支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="1";//支付业务类别:1-工单支付业务;
+        data["payBizId"]="35";//支付记录id
+
+        /***微信支付独立充值接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";    
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="wxRecharge";        
+        data["money"]="0.01";//金额
+        data["minaCode"]="061JT00w3BT8sX2Ou31w3HuXDn2JT00c";//小程序登录态code,拉起微信支付        
+        
+        /*微信充值支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="2";//支付业务类别:2-微信支付充值;
+        data["payBizId"]="45";//支付记录id
+
+        /***钱包余额转帐给现场经理接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";    
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="transferToTrader2";     
+        data["trader2Id"]="3";//现场经理用户id  
+        data["money"]="0.03";//转帐金额 
+        data["remark"]="转帐备注:如预支付工单费用"; 
+
+        /***商家基于工单对会员的评价**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="appraise";
+        data["workid"]="1";//工单id        
+        data["appraiseLevel"]="1";//评价等级 1-2-3等等
+        data["appraiseRemark"]="可选评价内容";    
+
+        /**获取某个协议内容信息**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="fetch";//拉取单条数据接口
+        data["bizId"]="3";//1-会员注册协议;2-商家注册协议;3-平台内容;4-小优保障;5-小优保险;
+
+        /***获取某个会员信息**/        
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetch";          
+        data["workerId"]="1";//会员业务用户ID    
+
+        /***获取自己的商家信息**/        
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="fetch";   
+        
+        /***获取商家增值服务信息接口**/        
+        data["bizCatalog"]="TraServiceEntity";
+        data["handleMode"]="fetch";
+        data["bizId"]="1";      
+        
+        /***商家侧提现接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="withdraw";
+        data["todo"]="all";//all-全部提现;part-部分提现;        
+        data["money"]="0.3";//部分提现的金额;单位元,小数点两位;
+        data["trueName"]="张三";//姓名核对
+        data["minaCode"]="011Nlz00018bOM1yUi100NO4Bq1Nlz0j";//当前小程序登录态code 
+        
+        /***获取最近意见反馈信息**/   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchLastSuggestion";
+
+        /***提交新意见反馈**/   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="submitNewSuggestion";
+        data["content"]="意见内容";
+        
+        /***报名审核接口(带预支付工单费用)**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="auditEnroll";
+        data["teamid"]="0";//团组工单id  不能批量因为需要加锁同步,前端可以异步批量处理
+        data["workid"]="398";//单独报名工单id 不能批量因为需要加锁同步,前端可以异步批量处理
+        data["todo"]="allow";//allow-同意;refuse-驳回;
+        data["reason"]="为什么拒绝呢";
+        data["minaCode"]="0516ofll2Z56U84PQWol2J40Va46oflW";//小程序登录态code,拉起微信支付        
+        
+        /*预支付工单费用支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="11";//支付业务类别:2-微信支付充值;
+        data["payBizId"]="494";//支付记录id
+
+        /***违约招聘**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="breakoff";        
+        data["breakdate"]="2022-04-09";//违约日期 不小于今日  日结违约当日/完工结可选违约日期
+        data["recuritIds"]=["266",];//招聘记录ID 单个或批量 不能为空
+        data["reason"]="可选的原因";//可选的原因
+
+        /***工单结算接口**/        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="paySettle";        
+        data["workid"]="398";//工单id 优选工单id
+        data["workPayCode"]="A00001";//工单核销码
+
+        /***商家拒绝支付结算接口**/     
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="denyPay";        
+        data["workid"]="398";//工单id
+        data["reason"]="原因"; 
+
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="upsertLaunchAudit";//upsert 暂存到草稿;upsertLaunchAudit 直接提交;upsertReset 从驳回暂存到草稿箱;
+        data["bizData"]={
+            //id:"2",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            settle_catalog:"0",//0-单日结招聘;1-批量招聘;
+            title:"标题啊",
+            profile_photo:"/头图",//头图
+            work_typename:"焊工",//工种名
+            feetotal:"2.66",//每人金额 单位元 保留2位小数
+            meals_providing:1,//是否管饭 0-不管;1-管饭;
+            begin_datetime:"2022-04-09",//单日工作日期或批量招聘的开始日期   
+            finish_datetime:"2022-04-10",//单日工作日期或批量招聘的开始日期            
+            begin_hour:"08:30",//上班时间
+            finish_hour:"18:30",//下班时间
+            need_total:6,//需求总人数
+            need_perday:10,//每天需求人数
+            linker_name:"联系人姓名",//联系人姓名
+            linker_phone:"18912345678",//联系人电话
+            age_mode:1,//年龄, 0-不限;1-限制
+            age_min:16,//最小年龄
+            age_max:36,//最大年龄
+            gender_mode:1,//性别, 0-不限;1-限男;2-限女;
+            work_addr:"天津滨海新区工作地址",//工作地址
+            work_addr1:{city:"天津市",district:"滨海新区",area:"泰达大街"},//结构化对象
+            work_addr_lng:"117.33",//经度117.333
+            work_addr_lat:"39.99",//纬度39.33
+            work_desc:"工作内容工作内容",//工作内容
+            requirements:["有经验","能歌善舞"],//工作要求  
+            urgent_level:565,//紧急程度, 0-普通;1-紧急 
+        }
+        
+        /***身份证核验接口**/     
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="idCardCheck";        
+        data["trueName"]="尤平午";//真实姓名
+        data["idCard"]="220203197706192095"; //身份证号
+
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchPageDataTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            "phone":"18920407769",//登录账号       
+        };       
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader&WsAjaxAction=fetchPageData";  
+
+        //招聘记录列表       
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="1";//0空-最新发布倒序排序;1-距离倒序;2-薪资倒序;
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";
+        data["query"]={
+            "status":"0",//0空-全部;1-待提交/草稿;2-待审核;3-已审核;4-被驳回;91-待上线;
+            "title":"标",//招聘标题筛选
+        };       
+        
+        //获取团组列表             
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallTeam";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;        
+        data["query"]={              
+            "status":"",//0空-全部;1-待成团;2-已成团待提交报名;3-已解散;4-已报名待审核;5-报名已审核通过;6-报名被驳回;7-被违约;8-主动取消报名;9-被动取消报名
+            "title":"",//招聘标题筛选
+        };       
+        
+        //获取团组成员项列表              
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallTeamFollow";
+        data["teamid"]="1";//团组id
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;        
+        data["query"]={  
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项;
+            "memberName":"",//成员姓名
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+        };      
+        
+        //获取工单招聘分组列表               
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallRecurit";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={              
+            "recuritStatus":"",//0空-全部;1-待提交/草稿;2-待审核;3-已审核;4-被驳回;91-待上线;
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算;91-进行中;92-异常工单;                                             
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项; 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+            "recuritTitle":"",//招聘标题筛选  
+            "memberName":"",//成员姓名
+        };    
+
+        //获取工单招聘下团组列表               
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallRecuritGroup";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={              
+            "recuritId":"",//招聘id
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算;91-进行中;92-异常工单;                                             
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项;5-报名成功后的代表项(单报项及团组代表项); 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;                                    
+        };    
+
+        //获取工单明细列表               
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchall";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={              
+            "recuritId":"1",//招聘记录Id
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算; 91-进行中;92-异常工单;                                            
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项; 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+            "recuritTitle":"",//招聘标题筛选  
+            "memberName":"",//成员姓名
+        };    
+
+        //获取现场经理列表            
+        data["bizCatalog"]="Trader2Entity";
+        data["handleMode"]="fetchall";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序; 
+        data["query"]={            
+            "memberName":"",//成员姓名
+            "verifyTime":"2021-12-12 12:12",//0空-全部;1-截止时间;
+        };        
+
+        //获取商家已授权的招聘列表            
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchallDelegate";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序; 
+        data["query"]={            
+            "trader2Id":"",//现场经理id
+            "verifyTime":"2021-12-12 12:12",//0空-全部;1-截止时间;
+        };        
+
+        //商家侧拉取自己的收支明细        
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]=0;//0默认时间倒序,1-金额倒序;            
+        data["query"]={
+            "catalog":"1",//类别:0-全部;1-不含现场经理项;2-含现场经理项 
+            "type":"1",//收支类型:0-全部;1-收入;2-支出    
+            "bizCatalog":"3",//业务类型:0-全部;收入:1-次数支付;2-支付工单;3-微信支付充值;4-转帐收入; 【支出】:1-次数支出;2-工单平台分成支出;3-工单佣金支出;4-工单工资支出;5-转帐支出;6-提现支出;                             
+            "occurdate":"",//发生日期   
+        };    
+
+        //商家服务记录列表       
+        data["bizCatalog"]="TraServiceEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={            
+            "title":"",//标题筛选    
+            "companyName":"",//公司名筛选      
+        };    
+        
+        //我的意见反馈列表
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchallSuggestion";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;       
+        data["query"]={            
+            "catalog":"",//状态筛选:0空-全部;1-待回复;2-已完结;                        
+        };                 
+
+        //评价列表
+        data["bizCatalog"]="AppraisalEntity";
+        data["handleMode"]="fetchall";  
+        data["roleCatalog"]="";//0空-明细模式,否则为汇总模式;1-会员的评价;2-商家的评价;3-会员的被评价;4-商家的被评价;5-活动评价;6-招聘评价;
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;          
+        data["query"]={     
+            "fromWorkerId":"",//评价者会员id 会员的评价明细
+            "toWorkerId":"",//被评价者会员id 会员的被评价明细
+            "fromTraderId":"",//评价者商家id 商家的评价明细
+            "toTraderId":"",//被评价者商家id 商家的被评价明细
+            "activityId":"",//被评价活动id   活动评价明细
+            "recuritId":"",//被评价招聘id    招聘评价明细
+            "bizCatalog":"",//0空-全部;1-会员对活动评价;2-会员对工作过程雇主评价;3-雇主商家对会员工作过程评价;
+            "memberName":"",//会员姓名
+            "companyName":"",//商家名
+            "title":"",//活动标题或招聘标题
+        };       
+        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));                
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+
+</script>

+ 373 - 0
ZTest/klyUnitTestTrader2.html

@@ -0,0 +1,373 @@
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>快来优商家小程序之现场经理接口测试</title>
+        <meta name="renderer" content="webkit|ie-comp|ie-stand">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">        
+        <script type="text/javascript" src="jquery.js"></script>   
+    </head>
+    <body>        
+        <button onclick="fetchPageDataTest()">通用分页数据获取接口测试</button>
+        <button onclick="entityHandleTest()">通用实体数据存取接口测试</button>        
+        <button onclick="registerTrader2Test(this)">现场经理完善信息接口测试</button>        
+        <button onclick="fetchMinaPhoneTest()">现场经理获取手机号接口测试</button>      
+        <button onclick="fetchMinaOpenidTest()">现场经理获取openid接口测试</button>        
+    </body>
+</html>
+<script type="text/javascript">
+    function getQueryVariable(varName){
+       var query = window.location.search.substring(1);
+       var vars = query.split("&");
+       for (var i=0;i<vars.length;i++) {
+            var pair = vars[i].split("=");
+            if(pair[0] == varName){return pair[1];}
+       }
+       return(false);
+    }
+    if(getQueryVariable("h5cb")=="true"){
+        let h5payno=getQueryVariable("h5payno");
+        alert("h5支付回调回来了,此时可以ajax去查单了[支付商家订单号:"+h5payno+"]");
+    }
+
+    //统一的持久化token方法
+    function baseSaveToken(token){
+        window.localStorage.setItem("TOKEN",token);
+        window.sessionStorage.setItem("TOKEN",token);
+    }
+    //统一获取token方法
+    function baseGetToken(){
+        return window.localStorage.getItem("TOKEN");
+        return window.sessionStorage.getItem("TOKEN");
+    }
+    //统一对接口回调结果数据进行校验的方法
+    function verifyAjaxResult(ajaxResult,handleReLogin){
+        if(typeof(ajaxResult.ErrMsg)=="undefined"){//必须返回ErrMsg属性,才算接口正常
+            alert("接口调用失败");//接口调用失败信息提示
+            return false;
+        }else if(ajaxResult.ErrMsg){//ErrMsg属性非空,则接口异常
+            if(handleReLogin && parseInt(ajaxResult.ErrMsg.indexOf("FOREND_TOKEN_INVAILD"))>-1){//登录TOKEN无效异常
+                alert("登录TOKEN无效:"+ajaxResult.ErrMsg);  
+                window.location.href="重定向到登录页面,登录后后端会返回一个新的token,然后持久化即可";
+                //wx.navigateTo("重定向到获取微信openid的接口/或直接ajax静默获取一下,此接口会返回新的token,然后持久化即可"); 
+                return false;                 
+            }
+            alert("接口调用失败:"+JSON.stringify(ajaxResult.ErrMsg));//接口调用失败信息提示   
+            return false;                 
+        }
+        return true;
+    }
+
+    //公共库中配置webapi url头 WsAjaxPrj为项目标记参数(优信聘YXP,快来优KLY),切记大小写敏感    
+    let webapiHost="https://zpwebapi.kaidekuai.com";    
+    let webapiUrl="https://zpwebapi.kaidekuai.com/ajaxEntryCenter.php?WsAjaxPrj=KLY";
+        
+    // webapiHost="https://api.kuailaiyou.top";    
+    // //快来优/快来优/快来优 公共库中配置webapi url头 
+    // webapiUrl="https://api.kuailaiyou.top/ajaxEntryCenter.php?WsAjaxPrj=KLY";        
+    function fetchMinaOpenidTest(){
+        url=webapiUrl + "&WsAjaxBiz=Trader2&WsAjaxAction=fetchMinaOpenid";
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: url,            
+            data: {
+                //wx.login 的code
+                "minaCode":"011I7F000D3fMM10hd200Af68P0I7F0i",
+                "regmode":"0",//0空-openid标识模式;1-phone标识模式;
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));   
+                baseSaveToken(data.forendToken);//缓存openid标识模式token             
+                let baseUser=data.baseUser;
+                //缓存基本用户信息id,后端会缓存解密数据的sessionkey
+                localStorage.setItem("baseUserId",baseUser["id"]);
+                //openid标识模式缓存openid
+                localStorage.setItem("openid",baseUser["wxmina_openid"]);
+                //openid标识模式业务用户信息
+                let bizUserInfo=data.bizTrader2;
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchMinaPhoneTest(){
+        url=webapiUrl + "&WsAjaxBiz=Trader2&WsAjaxAction=fetchMinaPhone";
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: url,            
+            data: {                
+                "regmode":"0",//0空-openid标识模式;1-phone标识模式;
+                "baseUserId":localStorage.getItem("baseUserId"),   
+                //获取手机号后的相关数据            
+                "iv":"4qoqG9U1dE+3WXQc7Ry0Eg==",
+                "encryptedData":"mswe7ZnbgY1m9kGfbs3CWwDEieCIlldA5W0blOoE1ARNcvmiTvLIkUb700RJFme2WUAW1QCpKGHERcMxw3MhMC03tmypd52LygePJRh+7g1YD+nmtGPiAaWQh4QgqfXH1G0YNsI3IHzRko0ZN2PPRIBQ9NI3QErrTM7YitDhQ2Z02L3AWmrxA9caH/TuR5xq5o+IA1VayoYScd3qYwh43Q==",
+                // "sesseion_key":"sYVcizJr7phhGHp0PAP+pQ==",//            
+                // "iv":"n8KZI4bkA5kosszJD3teUQ==",
+                // "encryptedData":"RU2LeokNrNWyBPSZkmTUPNJ0arRCXIomBzCkuTC1NgEr2hBcjlJqWQ45FePYUwRP8hTZJ+pEhI2auqNnVlelKqFrIGwR1x4198mmKNAyWtG04me8vv5nrsMthfu91RxNvRKPsTl5CG4RaSYa4FRrtuzylo1ttBHgRWTVOKHRRG8P4CkBYvOYTuIhz+BkTLtq9XrBWeW32jdyZiOI5nO8vw==",//
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                baseSaveToken(data.forendToken);//缓存token
+                let baseUser=data.baseUser;
+                //缓存基本用户信息id
+                localStorage.setItem("baseUserId",baseUser["id"]);
+                //缓存基本用户phone
+                localStorage.setItem("phone",baseUser["mobile"]);
+                //业务用户信息
+                let bizUserInfo=data.bizTrader2;                
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function registerTrader2Test(){
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",             
+            //非商户用户注册完善信息接口;大小写敏感,直接复制即可
+            url: webapiUrl + "&WsAjaxBiz=Trader2&WsAjaxAction=registerInfo",            
+            data: {
+                "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token
+                //"phone":localStorage.getItem("phone"),//手机号身份标识 两者手机优先
+                "openid":localStorage.getItem("openid"),//openid身份标识
+
+                "nickname":"昵称",//
+                "profile_photo":"头像",//
+                "true_name":"张三李四",//
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+
+    function entityHandleTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            //"phone":localStorage.getItem("phone"),//手机号身份标识 两者手机优先
+            "openid":localStorage.getItem("openid"),//openid身份标识
+        };        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader2&WsAjaxAction=entityDataHandle";
+        
+        /*招聘信息相关接口*/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetch";
+        data["bizId"]="1";//招聘记录ID
+                        
+        /***工单详情**/                
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetch";
+        data["workid"]="1";  
+
+        /***抢夺授权**/                
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="grabDelegate";
+        data["recruitId"]="1";//授权的招聘记录id 分享挂接 缓存后传递
+
+        /***拉取支付前(展示商家/活信息/工资/支付码/自己专款专户余额等信息)接口**/        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="waitPay";        
+        data["workid"]="0";//工单id 优选工单id
+        data["workPayCode"]="A00001";//工单核销码
+        
+        /***工单支付结算接口**/        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="paySettle";        
+        data["workid"]="2";//工单id 优选工单id
+        data["workPayCode"]="A00001";//工单核销码
+        data["minaCode"]="011VD4Ga1l147C0x8pFa1iZSSs1VD4Gx";//小程序登录态code,以便在余额不足时,拉起微信支付        
+        //返回prePayInfo则为需微信支付一部分钱;否则为余额支付成功!
+        /*
+        wx.login({
+            success:function(e){
+                minaCode=e.code//传递过来
+            }
+        })
+        {
+            "payBackBizCatalog":"1",//用于进行支付确认的参数,附加下一个接口调用参数中,用于确认支付结果;
+            "payBackBizId":"2",//用于进行支付确认的参数,附加下一个接口调用参数中,用于确认支付结果;
+            "appId":"wx8c230ea00ceb8676",
+            "timeStamp":"1636448664",
+            "nonceStr":"Qd4Ra46kpFWqGpMauTaDvTkQpt6n7goM",
+            "package":"prepay_id=wx09170424477823cd6b04110220c68f0000",
+            "signType":"RSA",
+            "paySign":"ZwWt4tXREUrIzMAtNfe5W3xZrHJ9clOntoH9K04gBdcqO6r3tkH02nuXMAw9zX4rfOda4rMvdFyAUEwLF8kPMiXO8dATBsW2SDnoNgccs3MAlzuh6KpukFPDZiizYpSlcc3ozRpHxn56FoUwPv0vl0HeIRl+wY8JOo64IoeZHseJm30Kg4+Eb2UAnOHcamzoKJwU5eikFd/SGTYRrAvVb/GrhncGlX3cbOG5Mpl5IO0562dKbJRoVzg0AbXNpudjR76aj1usJZRLOve/M0qA+KFyajG5ZSa0kgLCMzvlT/HaLn8TkM/0O7pyjA51dCBe51nruiIVgPy69Up1VAWAhQ=="
+        }
+        wx.requestPayment({
+            "timeStamp":"1636464033",
+            "nonceStr": "FTAm6y367cdKq8swYuW7dFPfvpUsf8C5",
+            "package": "prepay_id=wx092120331932728919625e055f0dfa0000",
+            "signType": "RSA",
+            "paySign": "DfqExz4l3zDPKvKQ3QcJ2+fiRv4gdgIeERG4bhRCfQ3IGFBDZfPJodiiBNTWFkZtzbcnOuCNLtMHZvLPuAcc7AlAPlXQSJTkGrpFLlAb5a/6NBbRVbbe56/ZrQw5F7m1RyZ3dIPYJUeT804H+LELEn9aFdY2j6MXKsrZ+62rKpCTdfFlRy1Wl7Pac2UKp/z6gvVZNT6+AUCVbF1b1otCaKbU/XgpeYmOCm8SlotFW6i2JujlLA78o7lPIjcTCJHj/Ebb0WGTM15Z7O8TkHVqc6Z4TsFwztIiYN6xaANnQYjFPymFVMO0ZRs7OGkY+SgXOnwMuKLu9YcCYjC4RAtBfA==",
+            "success":function(res){
+                wx.request("url?WsAjaxBiz=Trader&WsAjaxAction=entityDataHandle&payBackBizCatalog=&payBackBizId=")
+            },
+            "fail":function(res){
+
+            },
+            "complete":function(res){
+                
+            }
+        });
+        */
+        /****现场经理侧:余额模式支付成功后则提示,并引导到已结算工单列表页面(查看结算情况)*/
+        /****现场经理侧:微信支付模式前端支付成功后,需要用下面接口确认一下支付是否成功,成功则提示,并引导到已结算工单列表页面(查看结算情况)*/
+        /*工单支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="1";//支付业务类别:1-工单支付业务;
+        data["payBizId"]="35";//支付记录id
+
+        /***微信支付独立充值接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader2&WsAjaxAction=entityDataHandle";    
+        data["bizCatalog"]="Trader2Entity";
+        data["handleMode"]="wxRecharge";
+        data["bizTraderId"]="1";//所属商家id
+        data["money"]="0.01";//金额
+        data["minaCode"]="04165zll2C6C684Xvqml2WNFUu365zlZ";//小程序登录态code,拉起微信支付        
+        
+        /*微信充值支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="2";//支付业务类别:2-微信支付充值;
+        data["payBizId"]="47";//支付记录id
+
+        /***获取某个会员信息**/        
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetch";          
+        data["workerId"]="1";//会员业务用户ID     
+
+        /***获取某个商家信息**/        
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="fetch";          
+        data["traderId"]="1";//商家ID     
+
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchPageDataTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            "phone":"18920407769",//登录账号       
+        };       
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Trader2&WsAjaxAction=fetchPageData";  
+
+        //获取授权的招聘记录列表       
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="1";//0空-最新发布倒序排序;1-距离倒序;2-薪资倒序;
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";
+        data["query"]={
+            "status":"0",//0空-全部;1-待提交/草稿;2-待审核;3-已审核;4-被驳回;
+            "title":"标",//招聘标题筛选
+        };       
+                
+        //获取授权的工单列表            
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchall";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={              
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算;                      
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项; 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+            "recuritTitle":"",//招聘标题筛选  
+            "memberName":"",//成员姓名
+        };        
+
+
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));                
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+
+</script>

+ 667 - 0
ZTest/klyUnitTestWorker.html

@@ -0,0 +1,667 @@
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>快来优用户小程序接口测试</title>
+        <meta name="renderer" content="webkit|ie-comp|ie-stand">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">        
+        <script type="text/javascript" src="jquery.js"></script>   
+    </head>
+    <body>        
+        <button onclick="fetchPageDataTest()">通用分页数据获取接口测试</button>
+        <button onclick="entityHandleTest()">通用实体数据存取接口测试</button>        
+        <button onclick="registerWorkerTest(this)">非商户用户完善信息接口测试</button>        
+        <button onclick="fetchMinaPhoneTest()">非商户获取手机号接口测试</button>      
+        <button onclick="fetchMinaOpenidTest()">非商户获取openid接口测试</button>           
+    </body>
+</html>
+<script type="text/javascript">
+    function getQueryVariable(varName){
+       var query = window.location.search.substring(1);
+       var vars = query.split("&");
+       for (var i=0;i<vars.length;i++) {
+            var pair = vars[i].split("=");
+            if(pair[0] == varName){return pair[1];}
+       }
+       return(false);
+    }
+    if(getQueryVariable("h5cb")=="true"){
+        let h5payno=getQueryVariable("h5payno");
+        alert("h5支付回调回来了,此时可以ajax去查单了[支付商家订单号:"+h5payno+"]");
+    }
+
+    //统一的持久化token方法
+    function baseSaveToken(token){
+        window.localStorage.setItem("TOKEN",token);
+        window.sessionStorage.setItem("TOKEN",token);
+    }
+    //统一获取token方法
+    function baseGetToken(){
+        return window.localStorage.getItem("TOKEN");
+        return window.sessionStorage.getItem("TOKEN");
+    }
+    //统一对接口回调结果数据进行校验的方法
+    function verifyAjaxResult(ajaxResult,handleReLogin){
+        if(typeof(ajaxResult.ErrMsg)=="undefined"){//必须返回ErrMsg属性,才算接口正常
+            alert("接口调用失败");//接口调用失败信息提示
+            return false;
+        }else if(ajaxResult.ErrMsg){//ErrMsg属性非空,则接口异常
+            if(handleReLogin && parseInt(ajaxResult.ErrMsg.indexOf("FOREND_TOKEN_INVAILD"))>-1){//登录TOKEN无效异常
+                alert("登录TOKEN无效:"+ajaxResult.ErrMsg);  
+                window.location.href="重定向到登录页面,登录后后端会返回一个新的token,然后持久化即可";
+                //wx.navigateTo("重定向到获取微信openid的接口/或直接ajax静默获取一下,此接口会返回新的token,然后持久化即可"); 
+                return false;                 
+            }
+            alert("接口调用失败:"+ajaxResult.ErrMsg);//接口调用失败信息提示   
+            return false;                 
+        }
+        return true;
+    }
+
+    //公共库中配置webapi url头 WsAjaxPrj为项目标记参数(优信聘YXP,快来优KLY),切记大小写敏感    
+    let webapiHost="https://zpwebapi.kaidekuai.com";    
+    let webapiUrl="https://zpwebapi.kaidekuai.com/ajaxEntryCenter.php?WsAjaxPrj=KLY";
+        
+    // webapiHost="https://api.kuailaiyou.top";    
+    // //快来优/快来优/快来优 公共库中配置webapi url头 
+    // webapiUrl="https://api.kuailaiyou.top/ajaxEntryCenter.php?WsAjaxPrj=KLY";        
+    function fetchMinaOpenidTest(){
+        url=webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchMinaOpenid";
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: url,            
+            data: {
+                //wx.login 的code
+                "minaCode":"011EOKkl2rp8V84KNVnl2epjv74EOKkC",
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                let baseUser=data.baseUser;
+                //缓存基本用户信息id,后端会缓存解密数据的sessionkey
+                localStorage.setItem("baseUserId",baseUser["id"]);
+                //可选缓存一下openid
+                localStorage.setItem("openid",baseUser["wxmina_openid"]);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchMinaPhoneTest(){
+        url=webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchMinaPhone";
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: url,            
+            data: {
+                "baseUserId":localStorage.getItem("baseUserId"),                   
+                //获取手机号后的相关数据            
+                "iv":"GDOiaGZ6XRbmbx8zQxsbsQ==",
+                "encryptedData":"R56sEnpDpMzBlSuAYgl1lCc2ZNEdoKmoWqRKOqqe3CngbdEeNfMZOCmuKcCJ7D4a4zlxRKQ4CJcMJYPwZ49vwCXEY28sWlBTRiwqd4+xHn969QM5ODXso89xe+3WHNL8ptZUJJzrqjh+i9E02CXwpn5ubW8zQ/OVgzB93YZrUhRMfoSQ7fd9y7Io+ZsIenCp3G22bn4Hy0/2bd8c7NrExQ==",
+                // "iv":"n8KZI4bkA5kosszJD3teUQ==",
+                // "encryptedData":"RU2LeokNrNWyBPSZkmTUPNJ0arRCXIomBzCkuTC1NgEr2hBcjlJqWQ45FePYUwRP8hTZJ+pEhI2auqNnVlelKqFrIGwR1x4198mmKNAyWtG04me8vv5nrsMthfu91RxNvRKPsTl5CG4RaSYa4FRrtuzylo1ttBHgRWTVOKHRRG8P4CkBYvOYTuIhz+BkTLtq9XrBWeW32jdyZiOI5nO8vw==",//
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                baseSaveToken(data.forendToken);//缓存token
+                let baseUser=data.baseUser;
+                //缓存基本用户信息id
+                localStorage.setItem("baseUserId",baseUser["id"]);
+                //缓存基本用户phone
+                localStorage.setItem("phone",baseUser["mobile"]);
+                //业务用户信息
+                let bizUserInfo=data.bizWorker;                
+                alert(data);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }        
+    function registerWorkerTest(){
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",             
+            //非商户用户注册完善信息接口;大小写敏感,直接复制即可
+            url: webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=registerInfo",            
+            data: {
+                "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token
+                "phone":localStorage.getItem("phone"),//手机号身份标识
+                "biz_catalog":0,//0-普通整体;1-昵称头像;
+                "true_name":"张三姓名",//***必填***
+                "idcard":"身份证号",
+                "profile_photo":"头像url",
+                "gender":"0",//0-男;1-女;
+                "birthday":"2021-12-12",//出生日期
+                "edulevel_name":"学历名称",
+                "birthaddr":"籍贯",
+                "body_height":"身高",
+                "body_weight":"体重",
+                "work_skills":"技能",
+                "self_evaluation":"特长",
+                "work_history":"经验",
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据
+                alert(data);//正常返回true
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+
+    function entityHandleTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            "phone":"18920407769",//登录账号  
+        };        
+        /***轮播图**/      
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="fetchall";
+
+        /***招聘详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetch";
+        data["bizId"]="1";
+                
+        /***开团接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="openTeam";
+        data["recruitId"]="1";//招聘记录id
+        data["planDotime"]="2021-11-09";//干活日期,批量招聘必选
+        data["sharerWorkerId"]="1";//分享者id为空则没有分享者 /不使用手机号,有可能更换
+
+        /***参团接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="joinTeam";
+        data["teamid"]="1";//团组id
+
+        /***参团审核接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="joinAudit";
+        data["teamid"]="1";//团组id 优先级高
+        data["workerId"]="2";//踢出的组员id 前端异步执行实现批量模式
+        data["todo"]="refuse";//allow-同意;refuse-驳回;
+        data["reason"]="为什么拒绝呢";
+
+        /***团组管理接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="removeMember";//removeMember-踢人;dismiss-解散;
+        data["teamid"]="1";//团组id
+        data["workerId"]="2";//踢出的组员id 前端异步执行实现批量模式
+        
+        /***组团报名接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="teamEnroll";
+        data["teamid"]="2";//团组id
+
+        /***取消报名接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="enrollCancel";
+        data["teamid"]="0";//团组id 优先级高
+        data["workId"]="2";//工单id 前端异步执行实现批量模式
+        data["reason"]="为什么取消呢";
+
+        /***团组详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchTeam";
+        data["teamid"]="1";
+
+        /***团成员项/工单详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetch";//fetch 工单详情/fetchTeamFollow 团组成员项详情
+        data["workid"]="1";    
+        
+        /***工作过程管理**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="processControl";
+        data["todo"]="finish";//start-开始工作;finish-结束工作
+        data["workIds"]=["2"];//工单id集合 可单个/批量 不能为空
+        data["remark"]="附加信息";
+        /*
+             onLoad:function(options){                
+                //获取二维码传入的scene
+                var that = this;
+                const scene = decodeURIComponent(options.scene);
+                var arry = scene.split(':');
+                var bizCatalog = arry[0];//业务类型值 0-支付工资业务
+                var bizId = arry[1];//支付工资业务下为工单id    
+                var userId = arry[1];//支付工资业务下为工人用户id    
+                switch(bizCatalog){
+                    case 0:
+                        //根据业务类型进行后续相应处理
+                        break;
+                }
+            },
+        */
+
+        /***拉取支付前(展示商家/活信息/工资/支付码等信息)接口**/       
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="waitPay";        
+        data["workid"]="2";//工单id 优选工单id
+        data["workPayCode"]="A00001";//工单核销码
+        /****工人侧展示二维码+核销码页面,并周期性轮询工单支付结算状态,若支付结算完成=5则提示,并引导到收支明细页面(查看钱包到账情况)*/
+
+        /***会员侧提现接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="withdraw";
+        data["todo"]="part";//all-全部提现;part-部分提现;
+        data["money"]="0.3";//部分提现的金额;单位元,小数点两位;
+        data["trueName"]="张三";//姓名核对
+        data["minaCode"]="021b1A000m0cOM1SP7100p7pAv2b1A0F";//当前小程序登录态code 
+
+        /***会员基于工单对商家的评价**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="appraise";
+        data["workid"]="1";//工单id        
+        data["appraiseLevel"]="1";//评价等级 1-2-3等等
+        data["appraiseRemark"]="可选评价内容";    
+
+        /***获取自己的会员信息**/      
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetch";
+
+        /***获取某个商家信息**/        
+        data["bizCatalog"]="TraderEntity";
+        data["handleMode"]="fetch";          
+        data["traderId"]="1";//商家ID    
+        
+        /***获取营销活动详情**/   
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetch";//获取详情
+        data["bizId"]="1";
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";//经纬度用于距离测算
+
+        /***营销活动报名**/   
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="enroll";
+        data["activityId"]="1";//活动id
+        data["minaCode"]="031se80w3RfztX2f7P1w3dKCdY0se807";//小程序登录态code,以便在余额不足时,拉起微信支付        
+        //返回prePayInfo则为需微信支付一部分钱;否则为余额支付成功!
+
+        /*活动微信支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="3";//支付业务类别:3-营销活动支付;
+        data["payBizId"]="16";//支付记录id
+
+        /***微信支付独立充值接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";    
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="wxRecharge";        
+        data["money"]="0.01";//金额
+        data["minaCode"]="041PPpll2ptl984vNMkl2s4pY24PPpld";//小程序登录态code,拉起微信支付        
+        
+        /*微信充值支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="4";//支付业务类别:4-会员微信支付充值;
+        data["payBizId"]="2";//支付记录id
+
+        /***获取营销活动报名详情**/   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetchEnrollInfo";
+        data["enrollId"]="1";//报名记录ID
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";//经纬度用于距离测算
+
+        /***营销活动评价**/   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="appraise";
+        data["enrollId"]="1";//报名记录ID
+        data["appraiseLevel"]="1";//评价等级 1-2-3等等
+        data["appraiseRemark"]="可选评价内容";
+
+        /***获取最近意见反馈信息**/   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchLastSuggestion";
+
+        /***提交新意见反馈**/   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="submitNewSuggestion";
+        data["content"]="意见内容";
+
+        /***获取投诉详情**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchComplaint";
+        data["bizId"]="4";//投诉记录id
+
+        /***提交新投诉**/           
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="submitNewComplaint";
+        data["workid"]="1";//当前工单记录id 优先使用 两者必传其一
+        data["recuritid"]="1";//当前招聘记录id
+        data["content"]="投诉内容";
+
+        /***获取生成某个会员对于某个招聘的分享海报**/           
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchRecuritPoster";        
+        data["recuritid"]="145";//当前招聘记录id
+        
+        /***分享绑定留痕接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="markshare";
+        data["recruitId"]="4";//招聘记录id        
+        data["sharerWorkerId"]="1";//分享者id
+
+        /***单独报名接口(内含押金冻结逻辑)**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="singleEnroll";
+        data["recruitId"]="266";//招聘记录id
+        data["planDotime"]="2022-04-09";//干活日期,批量招聘必选        
+        data["minaCode"]="01122d000sAZzN1Z1n0006T2Qv022d0h";//小程序登录态code,以便在余额不足时,拉起微信支付        
+        //返回prePayInfo则为需微信支付一部分钱;否则为余额支付成功!
+
+        /*报名微信支付确认接口*/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WeiXinEntity";
+        data["handleMode"]="confirmPaySuccess";        
+        data["payBizCatalog"]="5";//支付业务类别:5-会员报名支付押金;
+        data["payBizId"]="258";//支付记录id
+
+        /***我的工单核销码**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchWorkPayQR";
+        data["bizId"]="398";//工单id
+        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchPageDataTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            "phone":"18920407769",//登录账号       
+        };        
+        //首页招聘信息列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=fetchPageData";
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="1";//0空-最新发布倒序排序;1-距离倒序;2-薪资倒序;
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";
+        data["query"]={            
+            "traceMode":0,//足迹模式 0-非足迹模式;1-足迹模式;
+            "title":"",//招聘标题筛选
+            "settleType":0,//结算方式 0-不限;1-次结;2-完工结;
+            "genderMode":0,//性别要求 0-不限;1-限男;2-限女;
+            "workArea":["滨海新区"],//空不限区域
+            "workCity":"天津",//空不限城市
+        };        
+
+        //获取团组列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallTeam";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;        
+        data["query"]={  
+            "catalog":"2",//0空-全部参与的团;1-我开的团;2-我参的团;   
+            "status":"",//0空-全部;1-待成团;2-已成团待提交报名;3-已解散;4-已报名待审核;5-报名已审核通过;6-报名被驳回;7-被违约;8-主动取消报名;9-被动取消报名
+            "title":"",//招聘标题筛选
+        };        
+
+        //获取团组成员项列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";        
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallTeamFollow";
+        data["teamid"]="1";//团组id
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;        
+        data["query"]={  
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项;
+            "memberName":"",//成员姓名
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+        };        
+
+        //获取工单招聘分组列表               
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallRecurit";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={              
+            "recuritStatus":"",//0空-全部;1-待提交/草稿;2-待审核;3-已审核;4-被驳回;
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算;91-进行中;92-异常工单;                                             
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项;5-报名成功后的代表项(单报项及团组代表项); 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+            "recuritTitle":"",//招聘标题筛选  
+            "memberName":"",//成员姓名
+        };    
+
+        //获取工单明细列表               
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchall";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="0";//0空-时间倒序;1-薪资倒序;     
+        data["query"]={              
+            "recuritId":"1",//招聘记录Id
+            "status":"",//0空-全部;1-待提交;2-已报名待审核;3-已审核待开工;4-报名被驳回;5-已开始工作;6-已结束工作待结算;7-已结算;8-主动取消报名;9-被违约 10-被动取消报名;11-未结算; 91-进行中;92-异常工单;                                            
+            "teamrole":"",//0空-全部;1-单报项;2-所有团项;3-开团项;4-参团项;5-报名成功后的代表项(单报项及团组代表项); 
+            "teamstatus":"",//0空-全部;1-待参团;2-已提交参团待审核;3-已审核入团;4-参团被驳回;5-参团被踢出;6-已解散;7-被动取消;            
+            "recuritTitle":"",//招聘标题筛选  
+            "memberName":"",//成员姓名
+        };    
+
+        //会员侧拉取自己的收支明细-钱包
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]=1;//0默认时间倒序,1-金额倒序;            
+        data["query"]={
+            "type":"",//收支类型:0-全部;1-收入;2-支出    
+            "bizCatalog":"",//业务类型:0-全部;工人收入模型下:1-工资收入;2-佣金收入;  工人支出模式下:1-提现;                             
+            "occurdate":"",//发生日期   
+            "memberName":"",
+        };    
+
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Public&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={
+            "catalog":"",//0空-所有;1-针对所有端;2-会员侧;3-商家侧;
+            "keywords":"",//模糊查询
+        };                         
+        
+        //我的分销工单列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallShareWorks";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="1";//0空-佣金额倒序;1-工单笔数倒序;     
+        data["query"]={                   
+            recuritTitle:"",//招聘标题
+            startDate:"",//起始日期2021-12-12
+            finishDate:"",//结束日期2021-12-21
+        };                            
+        //我的分销粉丝列表
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallShareWorkers";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="1";//0空-佣金额倒序;1-工单笔数倒序;       
+        data["query"]={
+            recruitid:"",//招聘id
+            memberName:"",//粉丝姓名            
+            startDate:"",//起始日期2021-12-12
+            finishDate:"",//结束日期2021-12-21
+        };     
+        
+        //营销活动列表
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetchall";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="2";//0空-金额倒序;1-人数倒序;2-距离倒序;
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";   
+        data["query"]={
+            "status":"",//状态筛选:0空-全部;1-未开始;2-待开始;3-进行中;4-已结束;5-展示列表;
+            "title":"",//标题筛选
+            "linkphone":"",//联系电话
+        };                    
+
+        //我的营销活动列表
+        data["bizCatalog"]="MActivityEntity";
+        data["handleMode"]="fetchallSelf";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;1-金额倒序;       
+        data["query"]={
+            "status":"",//状态筛选:0空-全部;1-已报名待支付;2-已支付待使用;3-已使用待评价;4-已评价;
+            "title":"",//标题筛选
+            "linkphone":"",//联系电话
+        };     
+
+        //我的意见反馈列表
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchallSuggestion";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;       
+        data["query"]={            
+            "catalog":"",//状态筛选:0空-全部;1-待回复;2-已完结;                        
+        };                 
+
+        //我的投诉列表
+        data["bizCatalog"]="InteractionEntity";
+        data["handleMode"]="fetchallComplaint";  
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="0";//0空-时间倒序;       
+        data["query"]={            
+            "catalog":"",//状态筛选:0空-全部;1-待回复;2-已完结;                        
+        };                       
+               
+        //评价列表
+        data["bizCatalog"]="AppraisalEntity";
+        data["handleMode"]="fetchall";  
+        data["roleCatalog"]="";//0空-明细模式,否则为汇总模式;1-会员的评价;2-商家的评价;3-会员的被评价;4-商家的被评价;5-活动评价;6-招聘评价;
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;          
+        data["query"]={     
+            "fromWorkerId":"",//评价者会员id 会员的评价明细
+            "toWorkerId":"",//被评价者会员id 会员的被评价明细
+            "fromTraderId":"",//评价者商家id 商家的评价明细
+            "toTraderId":"",//被评价者商家id 商家的被评价明细
+            "activityId":"",//被评价活动id   活动评价明细
+            "recuritId":"",//被评价招聘id    招聘评价明细
+            "bizCatalog":"",//0空-全部;1-会员对活动评价;2-会员对工作过程雇主评价;3-雇主商家对会员工作过程评价;
+            "memberName":"",//会员姓名
+            "companyName":"",//商家名
+            "title":"",//活动标题或招聘标题
+        };       
+        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));                
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+
+</script>

+ 782 - 0
ZTest/yxpUnitTestAPP.html

@@ -0,0 +1,782 @@
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>优信聘APP端接口测试</title>
+        <meta name="renderer" content="webkit|ie-comp|ie-stand">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">        
+        <script type="text/javascript" src="jquery.js"></script>   
+    </head>
+    <body>        
+        <button onclick="fetchPageDataTest()">通用分页数据获取接口测试</button>
+        <button onclick="entityHandleTest()">通用实体数据存取接口测试</button>        
+        <button onclick="registerServicerTest(this)">商户用户注册接口测试</button>
+        <button onclick="registerWorkerTest(this)">非商户用户注册接口测试</button>
+        <button onclick="loginByPhoneTest(2)">商户手机登录接口测试</button>
+        <button onclick="loginByPhoneTest(1)">非商户手机登录接口测试</button>        
+    </body>
+</html>
+<script type="text/javascript">
+    function getQueryVariable(varName){
+       var query = window.location.search.substring(1);
+       var vars = query.split("&");
+       for (var i=0;i<vars.length;i++) {
+            var pair = vars[i].split("=");
+            if(pair[0] == varName){return pair[1];}
+       }
+       return(false);
+    }
+    if(getQueryVariable("h5cb")=="true"){
+        let h5payno=getQueryVariable("h5payno");
+        alert("h5支付回调回来了,此时可以ajax去查单了[支付商家订单号:"+h5payno+"]");
+    }
+
+    //统一的持久化token方法
+    function baseSaveToken(token){
+        window.localStorage.setItem("TOKEN",token);
+        window.sessionStorage.setItem("TOKEN",token);
+    }
+    //统一获取token方法
+    function baseGetToken(){
+        return window.localStorage.getItem("TOKEN");
+        return window.sessionStorage.getItem("TOKEN");
+    }
+    //统一对接口回调结果数据进行校验的方法
+    function verifyAjaxResult(ajaxResult,handleReLogin,cbError){
+        if(typeof(ajaxResult.ErrMsg)=="undefined"){//必须返回ErrMsg属性,才算接口正常
+            alert("接口调用失败");//接口调用失败信息提示
+            return false;
+        }else if(ajaxResult.ErrMsg){//ErrMsg属性非空,则接口异常
+            if(handleReLogin && parseInt(ajaxResult.ErrMsg.indexOf("FOREND_TOKEN_INVAILD"))>-1){//登录TOKEN无效异常
+                alert("登录TOKEN无效:"+ajaxResult.ErrMsg);  
+                window.location.href="重定向到登录页面,登录后后端会返回一个新的token,然后持久化即可";
+                //wx.navigateTo("重定向到获取微信openid的接口/或直接ajax静默获取一下,此接口会返回新的token,然后持久化即可"); 
+                return false;                 
+            }
+            if(cbError) cbError(ajaxResult);
+            else alert("接口调用失败:"+ajaxResult.ErrMsg);//接口调用失败信息提示   
+            return false;                 
+        }
+        return true;
+    }
+
+    //公共库中配置webapi url头 WsAjaxPrj为项目标记参数(优信聘YXP,快来优KLY),切记大小写敏感    
+    let webapiHost="https://zpwebapi.kaidekuai.com";    
+    let webapiUrl="https://zpwebapi.kaidekuai.com/ajaxEntryCenter.php?WsAjaxPrj=YXP";
+        
+    // webapiHost="https://api.yxp1419153.com";
+    // //优信聘/优信聘/优信聘 公共库中配置webapi url头 
+    // webapiUrl="https://api.yxp1419153.com/ajaxEntryCenter.php?WsAjaxPrj=YXP";    
+    function registerServicerTest(){
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",             
+            //非商户用户注册完善信息接口;大小写敏感,直接复制即可
+            url: webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=registerInfo",            
+            data: {
+                "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token
+                "phone":"18920407769",//手机号码
+                "company_name":"demo公司名称122",
+                "company_idcard":"demo公司身份证2",
+                "lawer_name":"demo法人姓名,有可能是另一个公司3",
+                //"lawer_idcard":"demo法人身份证456789",
+                "lawer_idcard_ppic":"demo法人身份证正面",
+                "lawer_idcard_npic":"demo法人身份证反面",
+                "linker_name":"demo联系人姓名5",
+                "linker_phone":"13812345678",//管理员手机号暂时 输入则必须正确,可不输入
+                "company_addr":"demo公司地址6",
+                "bizlicense_pic":"demo营业执照图片url7",//先独立上传图片
+                "bizpermit_pic":"demo营业许可图片url8",//先独立上传图片
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据
+                alert(data);//正常返回true
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+    function registerWorkerTest(){
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",             
+            //非商户用户注册完善信息接口;大小写敏感,直接复制即可
+            url: webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=registerInfo",            
+            data: {
+                "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token
+                "phone":"18920407768",//手机号码
+                "inviteCode":"Y05",//邀请码
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据
+                alert(data);//正常返回true
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+    function loginByPhoneTest(subsystem){
+        if(subsystem=="1"){//商户用户手机登录接口;大小写敏感,直接复制即可
+            url=webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=loginByPhone";
+        }else{//非商户用户手机登录接口;大小写敏感,直接复制即可
+            url=webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=loginByPhone";
+        }
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: url,            
+            data: {
+                "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token
+                "phone":"18920407768",//手机号码 也可以是登录子账号名 leader111
+                "code":subsystem=="1"?"123456":"123456",//手工输入的短信验证码,不设置此参数则为获取验证码/设置则为核对验证码                               
+                "loginPwd":"yXp2021@ws.com",
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                baseSaveToken(data.forendToken);//缓存token
+                let bizUserInfo=data.bizUserInfo;
+                if(bizUserInfo){
+                    alert("已完成业务注册!====>"+JSON.stringify(bizUserInfo));
+                }else{
+                    alert("未完成业务注册,需进一步进行业务注册步骤!");
+                }
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function entityHandleTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            "phone":"18920407768",//登录账号  
+        };        
+        /***轮播图**/      
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker/Supplier&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="fetchallAPP";
+
+        /***招聘详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchAPP";
+        data["bizId"]="4";
+
+        /***获取简历信息**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchResume";//获取简历信息
+
+        /***更新简历信息**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["handleMode"]="updateResume";//更新简历信息
+        data["bizData"]={   
+            profile_photo:"/aaa/bbbbbb啊发发",         
+            true_name:"姓名诗歌风格风格",
+            gender:"1",//0 男/1 女
+            age:"12",
+            edulevel:"4",
+            edulevel_name:"本科111",            
+            work_history:"工作经历222",
+            work_skills:"技能333",
+            self_evaluation:"自我简介44",
+        }           
+        
+        /***会员报名接口(即立即报名)**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="enroll";
+        data["recruitId"]="3";//招聘信息记录ID
+
+        /***会员取消报名接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="enrollCancel";
+        data["recruitId"]="2";//招聘信息记录ID
+        data["reason"]="取消报名的原因阿萨";
+
+        /***商家审核报名**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="auditEnroll";
+        data["workId"]="2";//工单id
+        data["todo"]="allow";//allow 审核通过;refuse 拒绝报名;
+        data["reason"]="拒绝时必须输入的原因";
+
+        /***商家获取简历信息**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchResumeByServicer";//获取简历信息
+        data["workerId"]="3";//报名者id
+
+        /***会员侧拉取单个工单详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchWorkInfo";
+        data["workId"]="1";//工单id 
+        //结果集中属性说明
+        //backdata["lastWorkItemId"]="0";//工单当前工作项id
+        //backdata["todayStatus"]="0";//进行中工单的今日工作状态:-4 已过截止日期;-3 未到开工日期;-2 今日未开工且未到开工时间;-1 今日未开工且已到开工时间;0 今日已开工;1 暂停中;2 已重新开工;3 今日已完工; 4 待确认工时; 5 待商家确认工时; 6 双方已确认工时;
+        //backdata["todayStatusName"]="0";//进行中工单的今日工作状态名
+        //backdata["todayWorkHours"]="0";//工时
+        //backdata["lastWorkItemRemark"]="工时有异议请修正为8.5";//流转信息
+
+        /***商家侧拉取单个工单详情**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchWorkInfo";
+        data["workId"]="1";//工单id 
+        //结果集中属性说明
+        //backdata["lastWorkItemId"]="0";//工单当前工作项id
+        //backdata["todayStatus"]="0";//进行中工单的今日工作状态:-4 已过截止日期;-3 未到开工日期;-2 今日未开工且未到开工时间;-1 今日未开工且已到开工时间;0 今日已开工;1 暂停中;2 已重新开工;3 今日已完工; 4 待确认工时; 5 待商家确认工时; 6 双方已确认工时;
+        //backdata["todayStatusName"]="0";//进行中工单的今日工作状态名
+        //backdata["todayWorkHours"]="0";//工时
+        //backdata["lastWorkItemRemark"]="工时有异议请修正为8.5";//流转信息
+
+        /***商家处理离职人员**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="handleQuiter";
+        data["workId"]="1";//工单id        
+        data["reason"]="相关原因";
+
+        /***会员中断离职**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="handleQuiter";
+        data["workId"]="1";//工单id        
+        data["reason"]="相关原因";
+
+        /***商家对工单工作过程的控制**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="processControl";
+        data["todo"]="todayDeliverWKHours";//todayFirstStart 当然首次开工; todayInnerPause 当日中间暂停; todayRestart 当日中间重启;todayLastFinish 当日完工结束;todayDeliverWKHours 当日发放工时;
+        data["recruitId"]="2";//招聘信息记录ID
+        data["workIds"]=[];//工单id数组  为空则全部批量;1个则为单个处理,多个则小批量过程控制 
+        data["force"]="1";//是否强制处理;0-非强制(会报异常)操作;1-强制(静默)操作; 今日总开工是否可强制早于上班时间;今日总完工是否可强制早于下班时间;
+        data["reason"]="操作备注";
+
+        /***商家处理针对某个人员添加迟到记录**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="handleLater";
+        data["workId"]="1";//工单id,一个工单一天只有一次迟到记录,重复操作也只保留一条,只会追加更新reason信息  
+        data["reason"]="相关原因2222222";
+
+        /***会员侧工时回应接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="respondWorkHours";        
+        data["workItemId"]="210";//lastWorkItemId 工单当前工作项id
+        data["todo"]="agree";//agree 无异议;disagree 有异议;
+        data["reason"]="应该是8.5个工时,请修正";
+
+        /***商家侧工时修改接口**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="respondWorkHours";        
+        data["workItemId"]="2";//lastWorkItemId 工单当前工作项id
+        data["todo"]="2";//0-修改后再次让会员确认;1-不同意修改并给出理由,再次让会员侧确认;2-修改后不再确认直接提交;3-不同意修改并直接提交;
+        data["changedWorkHours"]="12.5";//变更后的新工时        
+        data["reason"]="工时没有问题333";
+
+        /***会员侧/商户侧平台协议相关接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker/Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="fetchall";//拉取所有数据
+        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker/Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="fetch";//拉取单条数据接口
+        data["bizId"]="2";//1-会员注册协议;2-商家注册协议;3-成为代理(超级会员)协议;4-成为经理协议;5-平台内容;
+
+        /***会员侧/商户侧代理合同**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker/Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="ContractEntity";
+        data["handleMode"]="fetch";//获取
+        data["catalog"]="0";//类别:0-超级会员;1-经理;
+
+        /***会员侧提交签署代理合同,申请升级为超级会员**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="applyBeAgent";//applyBeAgent 升级超级会员;applyBeManager 升级经理;
+        data["signInfo"]="阿道夫";//签署信息  
+
+        /***会员侧拉取超级会员升级申请**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchBeAgent";//fetchBeAgent 超级会员;fetchBeManager 经理;    
+        data["workerId"]="8";//申请者id  
+
+        /***会员侧审核超级会员升级申请**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="auditBeAgent";    
+        data["workerId"]="3";//申请者id    
+        data["todo"]="allow";//allow 同意;refuse 驳回;
+        data["reason"]="可选备注如拒绝理由等";    
+
+        /***获取个人信息**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchProfile";//获取个人信息
+
+        /***更新个人信息**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["handleMode"]="updateProfile";//更新个人信息
+        data["bizData"]={            
+            true_name:"姓名张三",//姓名
+            gender:"1",//0 男/1 女
+            idcard:"身份证号码222",//身份证号
+            age:"4",//年龄
+            nation_name:"民族汉",//民族
+            edulevel_name:"本科",//学历
+            birthday:"2000-12-12",//出生日期  
+            birthaddr:"籍贯河北2222222sdsds",//籍贯         
+            idcard_ppic:"/aaa/bbbbbb",//身份证正面
+            idcard_npic:"/pic/uslaaa",//身份证反面
+        }      
+
+        /***获取个人分享海报**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchPoster";//获取个人分享海报    
+
+        /***获取工种字典集合**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=PublicAPP&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="BaseConfigEntity";
+        data["handleMode"]="fetchRecruitWorkType"; 
+
+        /***获取超级/经理=工时佣金**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchWkHourCommission";//获取工时佣金统计信息
+
+        /***会员侧收藏配置接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="FavoriteEntity";
+        data["handleMode"]="set";//fetch-获取配置;set-收藏;cancel-取消收藏;
+        data["recruitId"]="5";//招聘信息记录ID
+
+        /***商家侧提交线下打款申请接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="offlinePayin";//线下打款充值
+        data["todo"]="upsertToAudit";//upsert-暂存草稿;upsertToAudit-提交审核;upsertToReset-驳回到草稿
+        data["bizData"]={
+            id:"1",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            "money":"111",//金额 单元元,小数点2位;
+            "offline_proof":"23434",//打款凭证照片url 
+            "offline_proofs":[6444],//可选多组打款凭证照片url   
+            "remark":"阿凡达发的111",//附加备注信息          
+        }
+
+        /***会员侧提现接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="withdraw";
+        data["wxopenid"]="afdfweeEEDF";//可选的微信openid
+        data["todo"]="part";//all-全部提现;part-部分提现;
+        data["money"]="0.3";//部分提现的金额;单位元,小数点两位;
+
+        /***会员侧投诉商家接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="launchComplaintServicer";//launchComplaintServicer-发起一次投诉;replyComplaintServicer-继续反馈投诉;finishComplaintServicer-投诉结束
+        data["servicerId"]="4";//商家id
+        data["bizData"]={
+            "content":"阿凡达发的111",//投诉内容
+            "picurl":"23434",//照片url 
+            "picurls":[6444],//可选多组照片url   
+        }
+        /***会员侧发起投诉商家接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="launchComplaintServicer";
+        data["servicerId"]="4";//商家id
+        data["bizData"]={
+            "content":"阿凡达发的111",//投诉内容
+            "picurl":"23434",//照片url 
+            "picurls":[6444],//可选多组照片url   
+        }
+        /***会员侧继续反馈投诉商家接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="replyComplaintServicer";
+        data["complaintId"]="1";//投诉记录ID
+        data["bizData"]={
+            "content":"22434343反对反对",//投诉内容
+            "picurl":"2343反对反对4",//照片url 
+            "picurls":[644545544],//可选多组照片url   
+        }
+        /***会员侧结束投诉商家接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="finishComplaintServicer";
+        data["complaintId"]="1";//投诉记录ID
+        data["bizData"]={
+            "appraise_level":"0",//对本次投诉结果的评价 0-非常满意 1-满意 2-不满意 3-非常不满意
+            "appraise_remark":"算了结单吧",//对本次投诉结果的评价留言
+        }
+        /***会员侧获取投诉详情接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";    
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="fetchDetail";
+        data["complaintId"]="1";//投诉记录ID        
+
+        /***会员侧更改手机号接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";    
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="changePhone";
+        data["newPhone"]="18920407769";//新手机号
+        data["code"]="185759";//新手机号的验证码 //无code则为发送验证码/有则是验证验证码进入具体的更换手机号的逻辑
+
+        /***商家侧更改手机号接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=entityDataHandle";    
+        data["bizCatalog"]="ServicerEntity";
+        data["handleMode"]="changePhone";
+        data["newPhone"]="18920407769";//新手机号
+        data["code"]="301526";//新手机号的验证码 //无code则为发送验证码/有则是验证验证码进入具体的更换手机号的逻辑
+
+        /***会员侧发布社区分享记录接口**/   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";             
+        data["bizCatalog"]="CommunityEntity";
+        data["handleMode"]="upsertShare";
+        data["bizData"]={
+            "id":"1",//id为空则为新增发布;id非空则为修改;
+            "recruitid":"3",//招聘记录id
+            "catalog":"1",//类别:0-图片分享;1-视频分享;
+            "introduce":"这是我推荐的22222222",//导语
+            "urls":[222],//照片/视频组url数组
+        }
+
+        /***获取收益/统计信息**/        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="StatisticsEntity";
+        data["handleMode"]="fetchall";//获取统计信息
+
+        /**相关接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=PublicAPP&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="WizardEntity";
+        data["handleMode"]="fetchall";//fetch fetchall   
+        data["bizId"]="1";
+        data["catalog"]="0";//0空全部;1-会员;2-超级会员;3-经理;4-商家
+        
+        /**虚拟拨号相关接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=PublicAPP&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="VirtualTeleEntity";
+        data["handleMode"]="fetchVPhone";//获取虚拟号 先展示,拨前再次验证或更新  
+        data["catalog"]="0";//0空-商家->会员;1-会员->商家;2-手工输入;
+        data["userId"]="1";//会员ID 或 商家id 
+        //data["phone"]="13912345678";//手机号码
+        ///返回结果 secretNo:"虚拟号码"   
+        
+        /**注销清理账号**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="clearUserInfo";
+        data["reason"]="可选的原因";     
+        
+
+        /***会员侧提现接口**/
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=entityDataHandle";
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="withdraw";
+        data["wxopenid"]="afdfweeEEDF";//可选的微信openid
+        data["todo"]="part";//all-全部提现;part-部分提现;
+        data["money"]="0.3";//部分提现的金额;单位元,小数点两位;
+        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchPageDataTest(mode){      
+        let data={    
+            "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token            
+            "phone":"18920407768",//登录账号       
+        };        
+        //首页招聘信息列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetchallAPP";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="3";//0:最新发布倒序排序;1:距离排序(需传经纬度);2:薪资大小排序,3:佣金大小排序
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";
+        data["query"]={
+        //    "work_duty":"0",//0空全部,1-临时工,2-长期工
+        //    "workType":"焊工",//
+        //    "district":"",
+        };        
+
+        //我的招聘信息列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="myfetchallAPP";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="3";//0:最新发布倒序排序;1:距离排序(需传经纬度);2:薪资大小排序,3:佣金大小排序
+        data["nowLngLat"]="117.68898010253906,39.0351862510659";
+        data["query"]={
+        //    "work_duty":"0",//0空全部,1-临时工,2-长期工
+        //    "workType":"焊工",//
+        //    "district":"",
+            "status":"0",//0空全部,1-待提交;2-已提交待审核发布;3-已审核待支付;4-被驳回;5-已支付已发布;6-已下架
+        };        
+
+        //会员侧工单列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallDownByWorker";//fetchallByWorker-自己的工单; fetchallDownByWorker-下属的工单;
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["status"]="2";//1-已报名未开始的工作列表;2-进行中工作列表;3-已完工的工作列表;4-其他异常订单(未通过审核/离职);
+        //结果集中属性说明 workid-工单ID;  recruitid-招聘记录ID
+        //backdata["lastWorkItemId"]="0";//工单当前工作项id
+        //backdata["todayStatus"]="0";//进行中工单的今日工作状态:-4 已过截止日期;-3 未到开工日期;-2 今日未开工且未到开工时间;-1 今日未开工且已到开工时间;0 今日已开工;1 暂停中;2 已重新开工;3 今日已完工; 4 待确认工时; 5 待商家确认工时; 6 双方已确认工时;
+        //backdata["todayStatusName"]="0";//进行中工单的今日工作状态名
+        //backdata["todayWorkHours"]="0";//工时
+        //backdata["lastWorkItemRemark"]="工时有异议请修正为8.5";//流转信息
+
+        //商家侧所属招聘记录(含其下某个状态工单的数量)列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallByServicer";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["status"]="3";//0-全部;1-已报名待审核的工作列表;2-进行中工作列表;3-已完工的工作列表;4-其他异常订单(未通过审核/离职);
+        //返回属性total是当前招聘信息下的某个状态下工单的数量;
+
+        //商家侧某个招聘信息下某个状态的工单列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="getWorksOfRecruitByServicer";
+        data["recruitid"]=2;//招聘信息记录ID      
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["status"]="0";//0-全部;-1-已被驳回列表; 1-已报名待审核的工作列表;2-进行中工作列表;3-已完工的工作列表;
+        data["todayStatus"]="8";//0空-全部;1-无总开工的;2-已总开工的;3-暂停中的;4-未总完工的;5-已总完工的;6-发放工时待会员确认的;7-有工时异议的;8-已确认工时的;        
+        //结果集中属性说明 workid-工单ID;  recruitid-招聘记录ID
+        //backdata["lastWorkItemId"]="0";//工单当前工作项id
+        //backdata["todayStatus"]="0";//进行中工单的今日工作状态:-4 已过截止日期;-3 未到开工日期;-2 今日未开工且未到开工时间;-1 今日未开工且已到开工时间;0 今日已开工;1 暂停中;2 已重新开工;3 今日已完工; 4 待确认工时; 5 待商家确认工时; 6 双方已确认工时;
+        //backdata["todayStatusName"]="0";//进行中工单的今日工作状态名
+        //backdata["todayWorkHours"]="0";//工时
+        //backdata["lastWorkItemRemark"]="工时有异议请修正为8.5";//流转信息
+
+        //会员侧待审核代理申请列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchAgentApplyList";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10; 
+        data["status"]="0";//0-全部;1-待审核;2-已审核;3-被驳回;
+        data["orderby"]=""; 
+        data["query"]={
+        
+        };            
+
+        //会员侧直属会员列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallSonWorkers";
+        data["level"]="0";//0空-全部2级佣金会员;1-1级佣金会员;2-二级佣金会员
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={
+            "memberLevel":0,//会员级别:0-全部;1-普通会员;2-超级会员;3-经理;
+        };         
+
+        //会员侧推荐会员列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallInviteders";
+        data["level"]="0";//0空-全部2级推荐会员;1-1级直属会员;2-二级推荐会员
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={
+            "memberLevel":0,//会员级别:0-全部;1-普通会员;2-超级会员;3-经理;
+        };         
+        
+        //会员侧查询自己工时佣金明细列表以及某个来源会员的工单明细列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallWkHoursCommission";
+        data["smemberId"]="6";//干活会员id 来源于 列表中的swkid属性;不传则为所有干活会员信息的统计列表;否则为某个干活会员的工单明细列表;
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;     
+        data["orderby"]=2;//0默认时间倒序,1-佣金额倒序,2-工时数倒序;     
+        data["query"]={            
+            "memberName":"",//会员姓名
+            "recruitTitle":"",//招聘标题
+        };            
+
+        //会员侧拉取自己的收藏列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="FavoriteEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;             
+        data["query"]={
+            
+        };                  
+
+
+        //会员侧拉取自己的收支明细
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]=0;//0默认时间倒序,1-金额倒序;            
+        data["query"]={
+            "type":"0",//收支类型:0-全部;1-收入;2-支出    
+            "bizCatalog":"0",//业务类型:0-全部;工人收入模型下:1-工资收入;2-佣金收入;  工人支出模式下:1-提现;                             
+            "occurdate":"2021-10-24",//发生日期   
+        };    
+        
+        //商家侧拉取自己的收支明细
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]=0;//0默认时间倒序,1-金额倒序;            
+        data["query"]={
+            "type":"0",//收支类型:0-全部;1-收入;2-支出    
+            "bizCatalog":"0",//业务类型:0-全部;商家收入模式下:1-线下打款后台充值;      商家支出模式下:1-工资支出;2-佣金支出;                             
+            "occurdate":"2021-10-24",//发生日期   
+        };    
+       
+        //商户侧拉取线下打款记录列表        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Supplier&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AccountEntity";        
+        data["handleMode"]="fetchallOfflinePayin";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["orderby"]=0;//0默认时间倒序,1-金额倒序; 
+        data["query"]={       
+            "status":"4",//状态类型:0-全部;1-待提交;2-已提交待审核;3-被驳回;4-已审批已落款;            
+            //"occurdate":"2021-10-24",//发生日期   
+        };                
+
+        //会员侧拉取投诉记录列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="ComplaintEntity";        
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["orderby"]=0;//0默认时间倒序; 
+        data["query"]={       
+            "status":"3",//状态类型:0-全部;1-待平台反馈;2-待会员反馈;3-会员已评价结单;            
+            "companyName":"公司",//商家公司名称                                        
+        };                
+
+        //会员侧拉取社区分享列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="CommunityEntity";        
+        data["handleMode"]="fetchallShare";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;   
+        data["orderby"]=0;//0默认时间倒序;              
+        data["query"]={     
+            "catalog":"2",//类别 0-全部;1-图片类;2-视频类                              
+            "companyName":"demo",//公司名称
+            "memberName":"李",//会员姓名
+            "keyword":"zz",//内容关键词
+        };                 
+
+        //下一级经理列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Worker&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";        
+        data["handleMode"]="fetchallSonManagers";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;   
+        data["orderby"]=0;//0默认粉丝数倒序;1-直推数倒序;
+        data["query"]={                 
+            "memberName":"",//经理姓名            
+        };                 
+        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));                
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+
+</script>

+ 1081 - 0
ZTest/yxpUnitTestPlat.html

@@ -0,0 +1,1081 @@
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>优信聘PC端接口测试</title>
+        <meta name="renderer" content="webkit|ie-comp|ie-stand">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">        
+        <script type="text/javascript" src="jquery.js"></script>   
+    </head>
+    <body>       
+        <button onclick="baseTest()">testtest</button> 
+        <button onclick="fetchPageDataTest()">通用分页数据获取接口测试</button>
+        <button onclick="entityHandleTest()">通用实体数据存取接口测试</button>        
+        <button onclick="loginPlatByIdNameTest()">平台用户IDNAME登录测试</button>
+        <button onclick="loginPlatByPhoneTest()">平台用户PHONE登录测试</button>         
+    </body>
+</html>
+<script type="text/javascript">
+    function baseTest(){
+        $.ajax({
+            //WsAjaxBiz 业务类别参数(大小写敏感);WsAjaxAction 业务操作参数(大小写敏感)
+            url: webapiUrl + "&WsAjaxBiz=ZTest&WsAjaxAction=action1&lockid=My dog do<div/> AA\"AA'BB the postman!",
+            //url:"http://127.0.0.1:8080/ePass/userInfo/getVerification",            
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            data: {//根据业务需要的其他参数
+                "FOREND_TOKEN":baseGetToken(),//统一传递一下前端token
+                p1:"abc中文测试\r\nAAABBB<div></div>",
+                p2:{ 
+                    aa:666,
+                    bb:888 
+                },
+                tel:"18920407769",
+                code:"232323",
+                zhtxt:"中国馆",
+                wxpaytrade_no:"salary98765",
+            },
+            dataType: "JSON",            
+            success: function (res) {
+                if(verifyAjaxResult(res,true)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    };
+    function getQueryVariable(varName){
+       var query = window.location.search.substring(1);
+       var vars = query.split("&");
+       for (var i=0;i<vars.length;i++) {
+            var pair = vars[i].split("=");
+            if(pair[0] == varName){return pair[1];}
+       }
+       return(false);
+    }
+    if(getQueryVariable("h5cb")=="true"){
+        let h5payno=getQueryVariable("h5payno");
+        alert("h5支付回调回来了,此时可以ajax去查单了[支付商家订单号:"+h5payno+"]");
+    }
+
+    //统一的持久化token方法
+    function baseSaveToken(token){
+        window.localStorage.setItem("TOKEN",token);
+        window.sessionStorage.setItem("TOKEN",token);
+    }
+    //统一获取token方法
+    function baseGetToken(){
+        return window.localStorage.getItem("TOKEN");
+        return window.sessionStorage.getItem("TOKEN");
+    }
+    //统一对接口回调结果数据进行校验的方法
+    function verifyAjaxResult(ajaxResult,handleReLogin,cbError){
+        if(typeof(ajaxResult.ErrMsg)=="undefined"){//必须返回ErrMsg属性,才算接口正常
+            alert("接口调用失败");//接口调用失败信息提示
+            return false;
+        }else if(ajaxResult.ErrMsg){//ErrMsg属性非空,则接口异常
+            if(handleReLogin && parseInt(ajaxResult.ErrMsg.indexOf("FOREND_TOKEN_INVAILD"))>-1){//登录TOKEN无效异常
+                alert("登录TOKEN无效:"+ajaxResult.ErrMsg);  
+                window.location.href="重定向到登录页面,登录后后端会返回一个新的token,然后持久化即可";
+                //wx.navigateTo("重定向到获取微信openid的接口/或直接ajax静默获取一下,此接口会返回新的token,然后持久化即可"); 
+                return false;                 
+            }
+            if(cbError) cbError(ajaxResult);//异常处理回调,用于根据异常码个性化显示提示信息
+            else alert("接口调用失败:"+ajaxResult.ErrMsg);//接口调用失败信息提示   
+            return false;                 
+        }
+        return true;
+    }
+
+    //公共库中配置webapi url头 WsAjaxPrj为项目标记参数(优信聘YXP,快来优KLY),切记大小写敏感    
+    let webapiHost="https://zpwebapi.kaidekuai.com";    
+    let webapiUrl="https://zpwebapi.kaidekuai.com/ajaxEntryCenter.php?WsAjaxPrj=YXP";
+        
+    // webapiHost="https//api.yxp1419153.com";
+    // //优信聘/优信聘/优信聘 公共库中配置webapi url头 
+    // webapiUrl="https://api.yxp1419153.com/ajaxEntryCenter.php?WsAjaxPrj=YXP";    
+    function loginPlatByIdNameTest(){        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=loginById",            
+            data: {                
+                "loginName":"leader",//登录账号
+                "loginPwd":"yXp2021@ws.com",//登录密码yXp2021@ws.com
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false,(ajaxResult)=>{
+                    switch(ajaxResult.ErrCode){//异常码,根据异常码,前端自定义输出提示信息内容
+                        case "FileNotFound"://样例
+                            alert("文件没有找到!");
+                            break;
+                        default:
+                            alert(ajaxResult.ErrMsg);
+                            break;
+                    }
+                })==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                baseSaveToken(data.forendToken);//缓存token
+                let bizUserInfo=data.bizUserInfo;
+                alert("用户相关信息====>"+JSON.stringify(bizUserInfo));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+    function loginPlatByPhoneTest(){        
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=loginByPhone",            
+            data: {                
+                "phone":"18920407768",//登录账号leader111
+                "code":"123456",
+                "loginPwd":"yXp2021@ws.com",
+            },            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                baseSaveToken(data.forendToken);//缓存token                
+                alert("信息====>"+JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    } 
+    function entityHandleTest(mode){      
+        let data={  };     
+        data["FOREND_TOKEN"]=baseGetToken();//统一传递一下前端token            
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录 
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=entityDataHandle";     
+                        
+        /*招聘信息拉取*/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="fetch";
+        data["bizId"]="4";//招聘记录ID
+
+        /***招聘信息审核处理接口**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="audit";
+        data["bizId"]="2";//招聘记录ID
+        data["todo"]="refuse";//allow 同意/refuse 拒绝
+        data["reason"]="如果是拒绝的原因";//如果是拒绝的原因
+
+        /***招聘信息下架处理接口**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="dropdown";
+        data["bizId"]="2";//招聘记录ID
+        data["reason"]="可选的原因";//可选的原因
+
+        /***招聘信息延展处理接口**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="extend";
+        data["bizId"]="2";//招聘记录ID
+        data["finishtime"]="2021-10-22";//新的截止日期
+        data["reason"]="可选的原因";//可选的原因
+
+        /***招聘信息删除处理接口**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="delete";
+        data["bizId"]="2";//招聘记录ID
+        data["reason"]="可选的原因";//可选的原因
+
+        /***招聘信息提交审核接口**/
+        data["loginName"]="18920407769";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录     
+
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="launchAudit";
+        data["bizId"]="2";//招聘记录ID        
+
+        /***招聘信息自动计算总费用接口**/
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="getNewPayplatTotal";
+        data["bizData"]={  
+            begin_datetime:"2021-10-29",
+            begin_hour:"16:00",
+            finish_datetime:"2021-10-22",
+            finish_hour:"21:00",
+            need_total:3,
+            price_toplat:33,
+        }
+
+        /***招聘信息提交审核接口**/
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录     
+        data["bizCatalog"]="RecruitEntity";
+        data["handleMode"]="upsert";
+        data["bizData"]={
+            //id:"1",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            urlImage:"修改后",
+            headline:"",
+            kind:"修改后顶顶顶顶顶顶",
+            work:2,
+            recruitingNumbers:"22",
+            salary:"0",
+            price_toplat:"2.5",//单位费用单价         
+            startTime:"2021-10-10",
+            finishTime:"2021-10-20",
+            startHour:"08:30",
+            finisHour:"18:30",
+            askFor:"修改后顶顶顶顶顶顶",
+            companyName:2,
+            linkman:"aadddd",
+            companyAddress:"222",
+            longitude:"117.133",
+            latitude:"32.33",
+            job:"aaaa",
+
+        }
+
+        /***平台协议相关接口**/
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录     
+
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="fetchall";//拉取所有数据
+        
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="fetch";//拉取单条数据接口
+        data["bizId"]="1";//1-会员注册协议;2-商家注册协议;3-成为代理(超级会员)协议;4-成为经理协议;5-平台内容;
+
+        data["bizCatalog"]="AgreementEntity";
+        data["handleMode"]="update";//更新
+        data["bizId"]="1";//1-会员注册协议;2-商家注册协议;3-成为代理(超级会员)协议;4-成为经理协议;5-平台内容;
+        data["title"]="标题标题";
+        data["content"]="协议内容阿凡达协议内打发打发容332";
+        
+        /***商家审核接口**/
+        data["bizCatalog"]="ServicerEntity";
+        data["handleMode"]="audit";//商户审核接口
+        data["bizId"]="2";//商户用户ID
+        data["todo"]="allow";//allow 同意/refuse 拒绝
+        data["reason"]="如果是拒绝的原因";//如果是拒绝的原因
+
+        data["bizCatalog"]="ServicerEntity";
+        data["handleMode"]="breakRecord";
+        data["bizId"]="4";//商户用户ID
+        data["breakType"]="0";//违规类型 0-拖欠工资;1-其他;
+        
+
+        data["bizCatalog"]="ServicerEntity";
+        data["handleMode"]="stop";
+        data["bizId"]="2";//商户用户ID
+        data["todo"]="";//警告; 停用一周;停用两周;拉入黑名单
+        data["breakType"]="";//警告; 0空-不发短信;1-拖欠工资或佣金;2-恶意线下交易;
+        data["date"]="2021-11-12 12:12";//日期
+
+        /***轮播图**/
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="fetch";
+        data["bizId"]="1";
+        
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="fetchall";
+
+        data["bizCatalog"]="CyclePicShowEntity";
+        data["handleMode"]="upsert";
+        data["bizData"]={
+            id:"3",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            slideshowImg:"修改后",
+            ofType:"0",//0-独立宣传页;1-关联招聘记录;
+            detailshowImg:"修改后顶顶顶顶顶顶",
+            biz_recruitid:2,
+        }
+        
+        /***代理合同**/
+        data["bizCatalog"]="ContractEntity";
+        data["handleMode"]="fetch";//获取
+        data["catalog"]="0";//类别:0-超级会员合同;1-经理合同;
+
+        data["bizCatalog"]="ContractEntity";
+        data["handleMode"]="upsert";//编辑保存        
+        data["bizData"]={
+            catalog:0,//类别:0-超级会员合同;1-经理合同;
+            title:"标题",
+            content:"详情内容",
+        }
+        
+        //已签署合同详情拉取
+        data["bizCatalog"]="AgentContractEntity";
+        data["handleMode"]="fetch";//获取
+        data["workerId"]="5";//会员ID
+        
+
+        /***会员详情**/
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetch";//拉取单条数据接口
+        data["workerId"]="1";
+
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="breakRecord";
+        data["workerId"]="5";//会员用户ID
+        data["breakType"]="2";//违规类型 0-上班迟到;1-未上班线下交易;2-中断工作
+        
+
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="stop";
+        data["workerId"]="8";//用户ID
+        data["todo"]="1";//1-警告; 2-停用一周;3-停用两周;4-拉入黑名单;5-解除惩罚;
+        data["breakType"]="";//警告; 0空-不发短信;1-线下交易;2-中断工作;
+        data["date"]="2021-11-12 12:12";//日期
+
+        /***设置升级经理身份**/
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="promoteBeManager"; 
+        data["workerId"]="3";//会员id   
+
+        /***PC侧拉取单个工单详情**/                
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchWorkInfo";
+        data["workId"]="1";//工单id 
+        //结果集中属性说明
+        //backdata["lastWorkItemId"]="0";//工单当前工作项id
+        //backdata["todayStatus"]="0";//进行中工单的今日工作状态:-4 已过截止日期;-3 未到开工日期;-2 今日未开工且未到开工时间;-1 今日未开工且已到开工时间;0 今日已开工;1 暂停中;2 已重新开工;3 今日已完工; 4 待确认工时; 5 待商家确认工时; 6 双方已确认工时;
+        //backdata["todayStatusName"]="0";//进行中工单的今日工作状态名
+        //backdata["todayWorkHours"]="0";//工时
+        //backdata["lastWorkItemRemark"]="工时有异议请修正为8.5";//流转信息
+
+        /***PC侧拉取平台角色用户列表**/                
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="fetchPlatUserList";
+
+        /***PC侧重置平台角色用户密码**/                
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="resetPlatUserPwd";
+        data["userid"]="1";//用户id
+        data["newPasswd"]="123456";         
+
+        /***PC侧普通用户修改自己的密码**/                
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="resetSelfPwd";        
+        data["newPasswd"]="123456";       
+
+        /***PC侧拉取佣金配置信息接口**/                
+        data["bizCatalog"]="CommissionRuleEntity";
+        data["handleMode"]="fetchall";    
+
+        /***PC侧更新规则接口**/                
+        data["bizCatalog"]="CommissionRuleEntity";
+        data["handleMode"]="updateRuleRates";   
+        data["cfgData"]={
+            "super":{
+                "rate":"5",
+            },
+            "crosser":{
+                "rate":"6",                
+            },
+            "manager":{
+                "rate":"7",                
+            },
+        };
+
+        /***PC侧更新升级条件接口**/                
+        data["bizCatalog"]="CommissionRuleEntity";
+        data["handleMode"]="updateSuperThreshold";   
+        data["newThreshold"]="12345";//新的升级条件粉丝数   
+
+        /***拉取海报背景**/
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录   
+
+        data["bizCatalog"]="PosterEntity";
+        data["handleMode"]="fetch";//获取
+        /***上传海报背景**/
+        data["bizCatalog"]="PosterEntity";
+        data["handleMode"]="upsert";//编辑保存        
+        data["bizData"]={            
+            bgpic:"AFDFD",//背景图片url
+        }     
+
+        /***商家侧发放工资/发放佣金**/        
+        data["loginName"]="18920407768";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录         
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="dispatchMoney";
+        data["catalog"]="1";//0空-发放工资;1-发放佣金
+        data["target"]=[93];//针对哪些工单:空-所有可发放的工单;否则为选择的workid数组集合;
+
+        /***商家侧提交线下打款申请接口**/        
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="offlinePayin";//线下打款充值
+        data["todo"]="upsertToAudit";//upsert-暂存草稿;upsertToAudit-提交审核;upsertToReset-驳回到草稿
+        data["bizData"]={
+            id:"1",//id参数非空则为更新模式,无id参数或id参数值为空,则为插入模式;插入模式下插入成功后,会返回新记录的id;
+            "money":"111",//金额 单元元,小数点2位;
+            "offline_proof":"23434",//打款凭证照片url 
+            "offline_proofs":[6444],//可选多组打款凭证照片url   
+            "remark":"阿凡达发的111",//附加备注信息          
+        }
+
+        /***平台侧审核线下打款接口**/   
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录        
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="offlinePayinAudit";//审核线下打款充值
+        data["todo"]="allow";//allow-通过审核落款充值;refuse-驳回
+        data["bizId"]="5";//申请记录ID
+        data["reason"]="驳回打发打发原因";
+
+        /***平台侧资金总统计:待提现等资金统计**/   
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录        
+        data["bizCatalog"]="AccountEntity";
+        data["handleMode"]="summary";
+        // 返回值
+        // backdata["plat_income"]="11";//平台总收入
+        // backdata["commission"]="11";//佣金总额
+        // backdata["plat_balance"]="11";//平台总收益
+        // backdata["worker_withdraw"]="11";//会员已提现总额
+        // backdata["worker_unwithdraw"]="11";//会员未提现总额 作为充值商户平台的依据   
+        
+        /***平台侧反馈投诉接口**/        
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="replyComplaintServicer";
+        data["complaintId"]="1";//投诉记录ID
+        data["bizData"]={
+            "content":"22434343反对反对",//内容
+            "picurl":"2343反对反对4",//照片url 
+            "picurls":[644545544],//可选多组照片url   
+        }
+        /***平台侧强制结束投诉接口**/        
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="finishComplaintServicer";
+        data["complaintId"]="1";//投诉记录ID
+        data["bizData"]={
+            "appraise_level":"2",//对本次投诉结果的评价 0-非常满意 1-满意 2-不满意 3-非常不满意
+            "appraise_remark":"算了结单吧444",//对本次投诉结果的评价留言
+        }
+        /***平台侧获取投诉详情接口**/        
+        data["bizCatalog"]="ComplaintEntity";
+        data["handleMode"]="fetchDetail";
+        data["complaintId"]="1";//投诉记录ID        
+
+        /***平台侧获取栏目详情接口**/        
+        data["bizCatalog"]="PageModuleEntity";
+        data["handleMode"]="fetch";
+        data["pageModuleId"]="1";//栏目ID        
+
+        /***平台侧更新栏目操作指南接口**/    
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录        
+        data["bizCatalog"]="PageModuleEntity";
+        data["handleMode"]="updateWizard";
+        data["pageModuleId"]="1";//栏目ID      
+        data["bizData"]={            
+            "pageName":"111",//栏目标题
+            "wizard_photo":"23434",//主图
+            "wizard_photos":[6444],//可选多组图片视频  
+            "wizard_content":"阿凡达发的111",//内容          
+        }    
+
+        /***平台侧upsert平台角色人员接口**/    
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录        
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="upsertPlatRoleUser";
+        data["roleId"]="1";//角色ID
+        data["bizData"]={            
+            //"id":"20",//id为空则为新增角色账号 非空则更新角色账号信息
+            "loginName":"admin999",//登录号
+            "loginPwd":"23434",//新登录密码 为空则不修改
+            "remark":"阿凡达发的111",//备注         
+        }    
+        /***平台侧删除平台角色人员接口**/    
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录        
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="removePlatRoleUser";
+        data["userId"]="19";//账号id       
+        data["reason"]="afdfdf";//   
+
+        /***商家侧upsert子账号接口**/    
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录        
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="upsertServicerRoleUser";        
+        data["bizData"]={            
+            "id":"28",//id为空则为新增角色账号 非空则更新角色账号信息
+            "loginName":"leader",//登录号
+            "loginPwd":"1234567",//新登录密码 为空则不修改
+            "remark":"阿凡达发的111",//备注         
+        }   
+        /***商家侧删除子账号接口**/    
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录        
+        data["bizCatalog"]="AAAEntity";
+        data["handleMode"]="removeServicerRoleUser";     
+        data["userId"]="25";//账号id       
+        data["reason"]="afdfdf";//   
+
+        /***平台PC侧删除社区分享记录接口**/    
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录      
+        data["bizCatalog"]="CommunityEntity";
+        data["handleMode"]="removeShare";     
+        data["shareId"]="1";//分享记录id       
+        data["reason"]="afdfdf";//   
+        
+        /***平台侧审核经理升级申请**/        
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="auditBeManager";    
+        data["workerId"]="3";//申请者id    
+        data["todo"]="allow";//allow 同意;refuse 驳回;
+        data["reason"]="可选备注如拒绝理由等";                     
+
+        /***通知公告发布接口**/    
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录            
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="upsert";    
+        data["bizData"]={            
+            "id":"1",//id为空则为新增角色账号 非空则更新角色账号信息
+            "catalog":"1",//0-对所有人;1-会员侧;2-商家侧
+            "title":"可选标题222",//可选标题
+            "content":"通知内容33",//通知内容     
+        }   
+
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="fetch";    
+        data["bizId"]="1";
+
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="delete";    
+        data["bizId"]="1";
+        data["reason"]="可选的原因";
+
+        /***操作攻略相关接口**/    
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录            
+        data["bizCatalog"]="WizardEntity";
+        data["handleMode"]="upsert";    
+        data["bizData"]={            
+            //"id":"1",//id为空则为新增角色账号 非空则更新角色账号信息
+            "catalog":"1",//0-会员;1-超级会员;2-经理;3-商家
+            "title":"栏目",//栏目标题
+            "content":"通知内容33",//通知内容
+            "picurl":"可选单图",//可选单图    
+            "picurls":["dfdjk"],//多组图视频
+        }   
+        /***操作攻略相关接口**/        
+        data["bizCatalog"]="WizardEntity";
+        data["handleMode"]="delete"; 
+        data["bizId"]="1";
+
+        /***经纬度返回行政区划信息接口**/    
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=PublicAPP&WsAjaxAction=entityDataHandle";  
+        data["bizCatalog"]="LbsEntity";
+        data["handleMode"]="fetchAddressByLocation"; 
+        data["coordtype"]="";//可不传默认wgs84ll
+        data["lat"]="33.11";//维度 
+        data["lng"]="117.330";//经度 
+
+        /***平台PC侧综合统计接口**/ 
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=entityDataHandle";   
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录      
+        data["bizCatalog"]="StatisticsEntity";
+        data["handleMode"]="fetchall";//fetchall-获取所有统计信息;fetchmoney-只获取财务相关统计      
+
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: ajaxUrl,            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }    
+    function fetchPageDataTest(mode){      
+        let data={};
+        data["FOREND_TOKEN"]=baseGetToken();//统一传递一下前端token 
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录             
+        // data["loginName"]="18920407769";//登录账号 
+        // data["loginType"]="2";//1平台登录 2商家登录     
+
+        //商家信息列表查询接口
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="ServicerPlaterA";//商家信息列表查询接口
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="bsid   desc";
+        data["query"]={
+            "companyName":"",
+            "mobile":"8138",
+            "regtime":"",//2021-10-13
+            "stoped":"0",//0空-全部;1-未停用;2-已停用;
+            "breakType":"0",//0空-全部;1-拖欠工资;2-其他类型;
+            "statusCode":99,//99-全部; 0-待提交;1-已提交待审核;2-已审核已发布;3-被驳回;                        
+        };        
+
+        //平台用户招聘信息通用列表业务
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="RecruitPlaterA";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;  
+        data["orderby"]="";   
+
+        //会员信息列表查询接口
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="";
+        data["query"]={
+            // memberLevel:"0",//0空-全部;1-普通会员;2-超级会员;3-经理;  
+            // mobile:"18920407769",  
+            // regtime:"2021-10-18",    
+            // stoped:"0",//0空-全部;1-未停用的;2-已停用的;   
+            // breakType:"1",//0空-全部;1-迟到;2-其他类型;   
+            managerAppStatus:"0",//0空-全部;1-待审核;2-已审核;3-被驳回;   
+        };        
+
+        //平台侧直属会员列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallSonWorkers";
+        data["level"]="0";//0空-全部2级佣金会员;1-1级佣金会员;2-二级佣金会员
+        data["workerId"]="3";//会员id       
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;      
+        data["orderby"]="1";//0空默认排序,1-佣金由高到低;2-粉丝数倒序;3-直推数倒序    
+        data["query"]={
+            "memberLevel":0,//会员级别:0-全部;1-普通会员;2-超级会员;3-经理;
+        };    
+
+        //平台侧推荐会员列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallInviteders";
+        data["level"]="0";//0空-全部2级佣金会员;1-1级佣金会员;2-二级佣金会员
+        data["workerId"]="1";//会员id       
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;      
+        data["orderby"]="1";//0空默认排序,1-佣金由高到低;2-粉丝数倒序;3-直推数倒序    
+        data["query"]={
+            "memberLevel":0,//会员级别:0-全部;1-普通会员;2-超级会员;3-经理;
+        };    
+
+        //平台侧工单列表
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";
+        data["handleMode"]="fetchallByPlater";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;             
+        data["status"]="0";//0-全部;1-已报名待审核的工作列表;2-进行中工作列表;3-已完工的工作列表;4-其他异常订单(未通过审核/离职);
+        data["query"]={
+            "recruitTitle":"详情",
+            "memberName":"张三",
+            "employerName":"",//工厂名称
+        };    
+        //结果集中属性说明 workid-工单ID;  recruitid-招聘记录ID
+        //backdata["lastWorkItemId"]="0";//工单当前工作项id
+        //backdata["todayStatus"]="0";//进行中工单的今日工作状态:-4 已过截止日期;-3 未到开工日期;-2 今日未开工且未到开工时间;-1 今日未开工且已到开工时间;0 今日已开工;1 暂停中;2 已重新开工;3 今日已完工; 4 待确认工时; 5 待商家确认工时; 6 双方已确认工时;
+        //backdata["todayStatusName"]="0";//进行中工单的今日工作状态名
+        //backdata["todayWorkHours"]="0";//工时
+        //backdata["lastWorkItemRemark"]="工时有异议请修正为8.5";//流转信息       
+
+        //已签署代理合同列表查询接口
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录   
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchAgentContracts";
+        data["catalog"]="0";//类别:0空全部;1-超级会员;2-经理;
+        data["status"]="0";//类别:0空全部;1-待审核;2-已审批;3-已驳回;
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="";
+        data["query"]={
+            
+        };        
+
+        //平台侧查询工时佣金明细列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["workerId"]="0";//会员id 0空则查询全部 
+        data["handleMode"]="fetchallWkHoursCommission";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;     
+        data["orderby"]=2;//0默认时间倒序,1-佣金额倒序,2-工时数倒序;     
+        data["query"]={
+            "memberName":"",//会员姓名
+            "recruitTitle":"",//招聘标题
+        };              
+        
+        //简历列表拉取
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchallResume";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;
+        data["orderby"]="";
+        data["query"]={
+            "memberName":"",//会员姓名
+            "edulevelName":"高中",//学历                                   
+        };                      
+
+        //PC侧拉取收藏列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="FavoriteEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;             
+        data["query"]={
+            "memberName":"春",
+            "recruitTitle":"1",
+        };    
+
+        //平台侧拉取商家账目统计列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录          
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";        
+        data["handleMode"]="fetchallSupplierSettle";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;         
+        data["orderby"]=2;//0费用总额倒序;1-工时数倒序;         
+        data["commission_status"]=1;//0全部;1-待发放;2-已发放;
+        data["query"]={                                    
+            "servicerId":"",//商家id
+            "employerName":"",//工厂名称
+            "yearMonth":"",//年月筛选
+            "workType":"0",//0空-全部;1-临时工;2-长期工
+        };                
+        //平台侧/商户侧佣金/工资发放列表(已确认工时后的记录集)
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录  
+        data["loginName"]="18920407769";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录         
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";        
+        data["handleMode"]="fetchallWkHourCommissionSettle";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10; 
+        data["groupby"]=1;//0默认只按工单分组;1-先按工单分组再按日期分组;   
+        data["orderby"]=2;//0默认时间倒序,1-佣金额倒序,2-工时数倒序; 
+        data["salary_status"]=0;//0全部;1-待发放;2-已发放;3-已发放已提现; 
+        data["commission_status"]=1;//0全部;1-待发放;2-已发放待提现;3-已发放已提现;
+        data["query"]={            
+            "memberName":"",//会员姓名
+            "companyName":"",//招聘公司名称
+            "employerName":"",//工厂名称
+            "recruitTitle":"",//招聘标题
+            "servicerId":"",//商家id
+            "yearMonth":"",//年月筛选
+            "workType":"",//0空-全部;1-临时工;2-长期工
+        };                
+
+        //平台侧/商户侧按某个工单某个日期查询列出当天的工作链记录
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录  
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录         
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";        
+        data["handleMode"]="fetchallWorkItemChain";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["orderby"]=0;//0默认时间正序;1按时间倒序        
+        data["query"]={       
+            // "workId":"1",//工单ID
+            // "workerId":"2",//某个工人的id
+            // "workDate":"2021-10-20",//工作日期         
+        };                
+
+        //平台侧/商户侧查询佣金项明细记录
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录  
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录         
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="TodoWorkEntity";        
+        data["handleMode"]="fetchallWorkItemCommission";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["orderby"]=2;//0默认时间倒序,1-佣金额倒序,2-工时数倒序; 
+        data["query"]={       
+            // "workId":"2",//工单ID
+            // "workerId":"2",//某个工人的id
+            "workDate":"2021-10-29",//工作日期         
+        };                
+
+        //平台侧/商户侧查询收支明细列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录  
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录         
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AccountEntity";        
+        data["handleMode"]="fetchallServicer";//fetchallServicer 商家账目明细/fetchallWorker会员账目明细
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["orderby"]=0;//0默认时间倒序,1-金额倒序; 
+        data["query"]={       
+            "type":"0",//收支类型:0-全部;1-收入;2-支出    
+            "bizCatalog":"0",//业务类型:0-全部;工人收入模型下:1-工资收入;2-佣金收入;  工人支出模式下:1-提现;
+                             //                 商家收入模式下:1-线下打款后台充值;      商家支出模式下:1-工资支出;2-佣金支出;
+            // "servicerId":"4",//某个商家的id
+            // "companyName":"aaa",//商家公司名称
+            // "workerId":"1",//某个工人的id
+            // "memberName":"11",//会员姓名
+            "occurdate":"2021-10-24",//发生日期   
+        };                
+
+        //平台侧/商户侧拉取线下打款记录列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录  
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录         
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AccountEntity";        
+        data["handleMode"]="fetchallOfflinePayin";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["orderby"]=0;//0默认时间倒序,1-金额倒序; 
+        data["query"]={       
+            "status":"4",//状态类型:0-全部;1-待提交;2-已提交待审核;3-被驳回;4-已审批已落款;
+            "servicerId":"4",//某个商家的id
+            "companyName":"",//商家公司名称            
+            //"occurdate":"2021-10-24",//发生日期   
+        };                
+
+        //平台侧拉取投诉记录列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录  
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录           
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="ComplaintEntity";        
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["orderby"]=0;//0默认时间倒序;1-评价分值倒序;2-评价分值正序; 
+        data["query"]={       
+            "status":"3",//状态类型:0-全部;1-待平台反馈;2-待会员反馈;3-会员已评价结单;            
+            "companyName":"公司",//商家公司名称                  
+            "memberName":"11",//会员姓名                       
+        };                
+
+        //平台侧拉取模块栏目列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录   
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录            
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="PageModuleEntity";        
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;                
+        data["query"]={                             
+            "moduleName":"角色",//模块栏目名称                       
+        };                
+
+        //平台侧拉取平台角色列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录         
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AAAEntity";        
+        data["handleMode"]="fetchallPlatRole";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;                
+        data["query"]={                             
+            "roleName":"管理",//角色名称                       
+        };                
+
+        //平台侧拉取平台角色人员列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录         
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AAAEntity";        
+        data["handleMode"]="fetchallPlatRoleUser";
+        data["roleId"]="1";//角色ID
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;                
+        data["query"]={                             
+            "loginName":"",//登录号          
+        };                
+
+        //PC侧商家拉取PC侧登录账号列表
+        data["loginName"]="13812345678";//登录账号 
+        data["loginType"]="2";//1平台登录 2商家登录      
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="AAAEntity";        
+        data["handleMode"]="fetchallServicerRoleUser";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;                
+        data["query"]={                             
+            "loginName":"",//登录号          
+        };               
+
+        //PC侧拉取社区分享列表
+        data["loginName"]="leader";//登录账号 
+        data["loginType"]="1";//1平台登录 2商家登录        
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="CommunityEntity";        
+        data["handleMode"]="fetchallShare";        
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;   
+        data["orderby"]=0;//0默认时间倒序;              
+        data["query"]={      
+            "catalog":"0",//类别 0-全部;1-图片类;2-视频类                       
+            "companyName":"",//公司名称
+            "memberName":"",//会员姓名
+            "keyword":"",//内容关键词
+        };     
+
+        //平台侧待审核经理申请列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchManagerApplyList";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10; 
+        data["status"]="0";//0-全部;1-待审核;2-已审核;3-被驳回;
+        data["orderby"]=""; 
+        data["query"]={
+        
+        };                    
+
+        //公告通知列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={
+            "catalog":"2",//0空-所有;1-针对所有端;2-会员侧;3-商家侧;
+            "keywords":"22",//模糊查询
+        };                            
+
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=PublicAPP&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="NoticeEntity";
+        data["handleMode"]="fetchall";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={
+            "catalog":"2",//0空-所有;1-针对所有端;2-会员侧;3-商家侧;
+            "keywords":"22",//模糊查询
+        };                         
+
+        //平台侧提现明细列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="fetchCanWithdraw";
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={
+            memberName:"",//会员姓名
+            memberLevel:"",//会员级别 0空-所有;1-普通会员;2-超级会员;3-经理;
+        };                    
+
+        //经理收益列表
+        ajaxUrl = webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData";  
+        data["bizCatalog"]="WorkerEntity";
+        data["handleMode"]="managerRevenueList";
+        data["exportExcel"]="true";//是否导出excel true则导出,否则不导出 
+        data["querydate"]="2021-12";//筛选年月
+        data["pageIndex"]=1;   
+        data["pageSize"]=10;        
+        data["query"]={            
+            
+        };    
+        if(data["exportExcel"]=="true") return postExcelFile(data,ajaxUrl);                 
+
+        $.ajax({
+            type: 'post',
+            contentType: 'text/json,charset=utf-8',
+            dataType: "JSON",         
+            url: webapiUrl + "&WsAjaxBiz=Plater&WsAjaxAction=fetchPageData",            
+            data: data,            
+            success: function (res) {
+                if(verifyAjaxResult(res,false)==false) return;//统一的进行接口返回数据的预检验!
+                let data=res.Result;//输入输出都可以是嵌套对象
+                console.log("成功:"+JSON.stringify(data));
+                //可以在此处放置前端的假数据                   
+                alert(JSON.stringify(data));
+                console.log(data);
+            },
+            error: function (xhr, textStatus, errorThrown) {
+                let failMsg="接口调用失败";
+                failMsg+="  状态码:"+xhr.status;
+                failMsg+="  错误信息:"+xhr.statusText;
+                failMsg+=errorThrown?" "+errorThrown:"";                            
+                console.log(failMsg);
+            },
+            complete:function(xhr,ts){
+                
+            }
+        });
+    }
+    function postExcelFile(params, url) {      
+      var form = document.createElement("form");
+      form.style.display = "none";
+      form.action = url;
+      form.method = "post";
+      document.body.appendChild(form);    
+      for (var key in params) {
+        var input = document.createElement("input");
+        input.type = "hidden";
+        input.name = key;
+        input.value = params[key];
+        form.appendChild(input);
+      }
+      form.submit();
+      form.remove();
+    }
+</script>

+ 1 - 0
a08jMRulEf.txt

@@ -0,0 +1 @@
+89163f7f239a2a962f8a28c3545fb7d6

+ 71 - 0
ajaxEntryCenter.php

@@ -0,0 +1,71 @@
+<?php
+define('ONLY_ONLY_ONLY','WWWSSS');
+include_once "base/const.php";
+define('WEB_PHY_ROOT', str_replace("\\",'/', dirname(__FILE__)));
+define('WEB_PHY_ASSETROOT', WEB_PHY_ROOT."/assets");
+$WEBSITE_HTTPPREFIX='http://';
+if(strtolower($_SERVER["REQUEST_SCHEME"]) == "https" || $_SERVER['SERVER_PORT'] == 443 || (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off')){
+	$WEBSITE_HTTPPREFIX='https://';
+}
+define('WEBSITE_ROOT', $WEBSITE_HTTPPREFIX.$_SERVER['HTTP_HOST']); 
+define('FOREND_TOKEN_MODE', "0");
+define('FOREND_TOKEN_NAME', "FOREND_TOKEN");
+define('FOREND_TOKEN_ERRMSGFLAG', "FOREND_TOKEN_INVAILD");
+//异常日志初始化
+require WEB_PHY_ROOT.'/exception2log.php';
+header('Content-Type:application/json;charset=UTF-8');
+header('Access-Control-Allow-Methods:GET, POST, PUT,DELETE,OPTIONS,PATCH');
+header('Access-Control-Allow-Headers:x-requested-with');
+header('Access-Control-Max-Age:86400'); // 允许访问的有效期
+header('Access-Control-Allow-Credentials:true');
+header('Access-Control-Allow-Origin:true');
+header('Access-Control-Allow-Headers:Content-Type, Access-Control-Allow-Headers,Access-Control-Allow-Credentials, Authorization,Accept, X-Requested-With'); 
+header('Access-Control-Allow-Headers:Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With');
+header('Access-Control-Allow-Origin:*'); 
+if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'){ 
+    echo "";   
+    exit;
+}
+include_once "AjaxResultClass.php";
+$ajaxRes = new AjaxResult;
+try{    
+    include_once "base/base.php";
+    include_once "base/mysql.php";    
+    $gobalTOKEN = "";
+    if (isset($_SERVER['HTTP_AUTHORIZATION'])) { 
+        $gobalTOKEN = $_SERVER['HTTP_AUTHORIZATION'];
+    }else if (isset($_SERVER['PHP_AUTH_DIGEST'])) { 
+        $gobalTOKEN = $_SERVER['PHP_AUTH_DIGEST']; 
+    } elseif (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { 
+        $gobalTOKEN = base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $_SERVER['PHP_AUTH_PW']); 
+    }
+    if(!isset($_GET["WsAjaxPrj"]) || empty($_GET["WsAjaxPrj"])
+    || !isset($_GET["WsAjaxBiz"]) || empty($_GET["WsAjaxBiz"])
+    || !isset($_GET["WsAjaxAction"]) || empty($_GET["WsAjaxAction"]) ){
+        throw new GeneralException("General","非常抱歉,ajax回调时发生异常,没有传递WsAjaxBiz 或 WsAjaxAction参数","ajaxEntry");        
+    }else{        
+        $WsAjaxPrj=$_GET["WsAjaxPrj"];
+        $WsAjaxPrj=(trim($WsAjaxPrj));   
+        $WsAjaxBiz=$_GET["WsAjaxBiz"];
+        $WsAjaxBiz=(trim($WsAjaxBiz));  
+        $WsAjaxAction=$_GET["WsAjaxAction"];
+        $WsAjaxAction=(trim($WsAjaxAction));
+        $prjRoot=WEB_PHY_ROOT."/prjcenter/prj$WsAjaxPrj";
+        $prjBase="$prjRoot/base/entry.php";
+        if(!file_exists($prjBase)){
+            throw new GeneralException("General","非常抱歉,ajax回调时发生异常:接口不被支持或未实现的调用!","ajaxEntry");        
+        }   
+        include_once $prjBase;
+        $actionFileName="$prjRoot/bizcenter/$WsAjaxBiz/$WsAjaxAction.php";
+        if(!file_exists($actionFileName)){
+            throw new GeneralException("General","非常抱歉,ajax回调时发生异常:接口不被支持或未实现的调用!","ajaxEntry");        
+        }         
+        define('WEB_PHY_FILEROOT', $prjRoot.'/fileroot/uploads');    
+        define('WEB_URL_FILEROOT', "/prjcenter/prj$WsAjaxPrj".'/fileroot/uploads');   
+        include_once $actionFileName;
+    }    
+}catch(Throwable $e){    
+    eeglobal_exception_handler($e,true);
+}
+echo @json_encode($ajaxRes);
+exit;

BIN
assets/font/msyh.ttf


+ 1076 - 0
base/base.php

@@ -0,0 +1,1076 @@
+<?php
+defined('ONLY_ONLY_ONLY') or exit('Access Denied');
+function crossdomain_cookie_init()
+{
+    $maxlifetime = 0;
+    $secure = true;
+    $httponly = true;
+    $samesite = 'None';
+    if (PHP_VERSION_ID < 70300) {
+        session_set_cookie_params($maxlifetime, '/; samesite=' . $samesite, $_SERVER['HTTP_HOST'], $secure, $httponly);
+    } else {
+        session_set_cookie_params([
+            'lifetime' => $maxlifetime,
+            'path' => '/',
+            'secure' => $secure,
+            'httponly' => $httponly,
+            'samesite' => $samesite,
+        ]);
+    }
+}
+
+function input_getPostObj()
+{
+    $httpdata = file_get_contents("php://input");
+    $ajaxdata = @json_decode($httpdata, true);
+    if (empty($ajaxdata)) {
+        parse_str($httpdata, $ajaxdata);
+    }
+    return $ajaxdata;
+}
+function base_stripslashes_deep($value)
+{
+    $value = is_array($value) ? array_map('base_stripslashes_deep', $value) : stripslashes($value);
+    return $value;
+}
+function base_irequestsplite($var)
+{
+    if (is_array($var)) {
+        foreach ($var as $key => $value) {
+            $var[htmlspecialchars($key)] = base_irequestsplite($value);
+        }
+    } else {
+        $var = str_replace('&amp;', '&', htmlspecialchars($var, ENT_QUOTES));
+    }
+    return $var;
+}
+function input_param_handle($preHandle = true)
+{
+    $GET = $_GET;
+    $POST = $_POST;
+    $COOKIE = $_COOKIE;
+    $REQUEST = $_REQUEST;
+    if ($preHandle) {
+        $GET = array_map('base_stripslashes_deep', $_GET);
+        $POST = array_map('base_stripslashes_deep', $_POST);
+        $COOKIE = array_map('base_stripslashes_deep', $_COOKIE);
+        $REQUEST = array_map('base_stripslashes_deep', $_REQUEST);
+    }
+    $_GPC = array();
+    $_GPC = array_merge($GET, $POST, $_GPC);
+    if ($preHandle) {
+        $_GPC = base_irequestsplite($_GPC);
+    }
+    return $_GPC;
+}
+function input_file_errhandle($filectl)
+{
+    $fileerror = intval($filectl["error"]);
+    if ($fileerror > 0) {
+        switch ($fileerror) {
+            case 1: //UPLOAD_ERR_INI_SIZE
+                $err_msg = "上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值";
+                break;
+            case 2: //UPLOAD_ERR_FORM_SIZE
+                $err_msg = "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
+                break;
+            case 3: //UPLOAD_ERR_PARTIAL
+                $err_msg = "文件只有部分被上传";
+                break;
+            case 4: //UPLOAD_ERR_NO_FILE
+                $err_msg = "文件没有被上传";
+                break;
+            case 5: //UPLOAD_ERR_NO_TMP_DIR
+                $err_msg = "找不到临时文件夹";
+                break;
+            case 6: //UPLOAD_ERR_CANT_WRITE
+                $err_msg = "文件写入失败";
+                break;
+            default:
+                $err_msg = "未知错误";
+                break;
+        }
+        throw new Exception("上传失败:" . $err_msg);
+    }
+}
+function input_file_upload($filectl_name, $subdir, $filename = "", $maxsize = 10 * 1024 * 1024, $filetypes = "jpg|png|jpeg|gif")
+{
+    if (!isset($_FILES[$filectl_name])) {
+        $GPC = input_param_handle(false);
+        $ajaxdata = input_getPostObj();
+        $tmpfilectl_name = isset($ajaxdata[$filectl_name]) ? $ajaxdata[$filectl_name] : $GPC[$filectl_name];
+        if (empty($tmpfilectl_name) || !isset($_FILES[$tmpfilectl_name])) {
+            throw new GeneralException("", "没有定位到文件控件或文件内容为空,请核查!!");
+        }
+
+        $filectl_name = $tmpfilectl_name;
+    }
+    $filectl = $_FILES[$filectl_name];
+    input_file_errhandle($filectl);
+    $filetype = $filectl["type"];
+    $filesize = $filectl["size"];
+    if ($filesize > $maxsize) {
+        throw new GeneralException("", "上传失败:文件不能超过" . ($maxsize / 1024) . "KB,请您核查一下是否上传错了:)");
+    }
+
+    $fileex = pathinfo($filectl["name"])['extension'];
+    if (empty($filetypes) || (mb_strpos($filetypes, strtolower($fileex) . "|") !== false)) {
+        $dest_urldir = WEB_URL_FILEROOT . (empty($subdir) ? "" : "/" . $subdir);
+        $dest_phydir = WEB_PHY_FILEROOT . (empty($subdir) ? "" : "/" . $subdir);
+        is_dir($dest_phydir) or mkdir($dest_phydir, 0755, false);
+        if (empty($filename)) {
+            do {
+                $filename = 'file_' . rand(123456, 9999) . "." . $fileex;
+                $file_relative_path = $dest_urldir . "/" . $filename;
+                $file_physical_path = $dest_phydir . "/" . $filename;
+            } while (is_file($file_physical_path));
+        } else {
+            $file_relative_path = $dest_urldir . "/" . $filename;
+            $file_physical_path = $dest_phydir . "/" . $filename;
+        }
+        $filetmp_name = $filectl["tmp_name"];
+        if (move_uploaded_file($filetmp_name, $file_physical_path)) {
+        } else {
+            throw new GeneralException("", "图片上传保存时失败");
+        }
+        return $file_relative_path;
+    } else {
+        throw new GeneralException("", "上传失败:图片文件只能是" . $filetypes . "格式");
+    }
+}
+
+/*****************/
+function random($length, $numeric = false)
+{
+    $seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
+    $seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
+    if ($numeric) {
+        $hash = '';
+    } else {
+        $hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
+        $length--;
+    }
+    $max = strlen($seed) - 1;
+    for ($i = 0; $i < $length; $i++) {
+        $hash .= $seed[mt_rand(0, $max)];
+    }
+    return $hash;
+}
+
+/******http通信处理******/
+function http_post($url, $header = array(), $post_data, $withpem = false, $client_cert_pem = '', $client_cert_key = '', $cert_pwd = '')
+{
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    curl_setopt($ch, CURLOPT_TIMEOUT, 10); //10秒超时
+    curl_setopt($ch, CURLOPT_POST, 1);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
+    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1');
+    if ($withpem) { //证书相关
+        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
+        curl_setopt($ch, CURLOPT_SSLCERT, '' . $client_cert_pem . '');
+        curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
+        curl_setopt($ch, CURLOPT_SSLKEY, '' . $client_cert_key . '');
+        curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $cert_pwd);
+        curl_setopt($ch, CURLOPT_KEYPASSWD, $cert_pwd);
+    }
+    $data = curl_exec($ch);
+    $error_no = curl_errno($ch);
+    $err_msg = "";
+    curl_close($ch);
+    if (!empty($error_no)) {
+        $err_msg = http_curl_geterr($error_no);
+        eeglobal_log_handler('http_post', 'error', "http_post通信异常 err_msg=>$err_msg  result=>$data");
+        throw new GeneralException("http_post", "http_post通信异常");
+    }
+    return $data;
+}
+function http_get($url, $header = array())
+{
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    curl_setopt($ch, CURLOPT_HEADER, 0);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1');
+    $data = curl_exec($ch);
+    $error_no = curl_errno($ch);
+    $err_msg = "";
+    curl_close($ch);
+    if (!empty($error_no)) {
+        $err_msg = http_curl_geterr($error_no);
+        eeglobal_log_handler('http_get', 'error', "http_get通信异常 err_msg=>$err_msg  result=>$data");
+        throw new GeneralException("http_get", 'http_get通信异常');
+    }
+    return $data;
+}
+function http_curl_geterr($no)
+{
+    $error_codes = array(
+        '1' => 'CURLE_UNSUPPORTED_PROTOCOL (1) – 您传送给 libcurl 的网址使用了此 libcurl 不支持的协议。 可能是您没有使用的编译时选项造成了这种情况(可能是协议字符串拼写有误,或没有指定协议 libcurl 代码)。',
+        '2' => 'CURLE_FAILED_INIT (2) – 非常早期的初始化代码失败。 可能是内部错误或问题。',
+        '3' => 'CURLE_URL_MALFORMAT (3) – 网址格式不正确。',
+        '5' => 'CURLE_COULDNT_RESOLVE_PROXY (5) – 无法解析代理服务器。 指定的代理服务器主机无法解析。',
+        '6' => 'CURLE_COULDNT_RESOLVE_HOST (6) – 无法解析主机。 指定的远程主机无法解析。',
+        '7' => 'CURLE_COULDNT_CONNECT (7) – 无法通过 connect() 连接至主机或代理服务器。',
+        '8' => 'CURLE_FTP_WEIRD_SERVER_REPLY (8) – 在连接到 FTP 服务器后,libcurl 需要收到特定的回复。 此错误代码表示收到了不正常或不正确的回复。 指定的远程服务器可能不是正确的 FTP 服务器。',
+        '9' => 'CURLE_REMOTE_ACCESS_DENIED (9) – 我们无法访问网址中指定的资源。 对于 FTP,如果尝试更改为远程目录,就会发生这种情况。',
+        '11' => 'CURLE_FTP_WEIRD_PASS_REPLY (11) – 在将 FTP 密码发送到服务器后,libcurl 需要收到正确的回复。 此错误代码表示返回的是意外的代码。',
+        '13' => 'CURLE_FTP_WEIRD_PASV_REPLY (13) – libcurl 无法从服务器端收到有用的结果,作为对 PASV 或 EPSV 命令的响应。 服务器有问题。',
+        '14' => 'CURLE_FTP_WEIRD_227_FORMAT (14) – FTP 服务器返回 227 行作为对 PASV 命令的响应。如果 libcurl 无法解析此行,就会返回此代码。',
+        '15' => 'CURLE_FTP_CANT_GET_HOST (15) – 在查找用于新连接的主机时出现内部错误。',
+        '17' => 'CURLE_FTP_COULDNT_SET_TYPE (17) – 在尝试将传输模式设置为二进制或 ascii 时发生错误。',
+        '18' => 'CURLE_PARTIAL_FILE (18) – 文件传输尺寸小于或大于预期。当服务器先报告了一个预期的传输尺寸,然后所传送的数据与先前指定尺寸不相符时,就会发生此错误。',
+        '19' => 'CURLE_FTP_COULDNT_RETR_FILE (19) – ‘RETR’ 命令收到了不正常的回复,或完成的传输尺寸为零字节。',
+        '21' => 'CURLE_QUOTE_ERROR (21) – 在向远程服务器发送自定义 “QUOTE” 命令时,其中一个命令返回的错误代码为 400 或更大的数字(对于 FTP),或以其他方式表明命令无法成功完成。',
+        '22' => 'CURLE_HTTP_RETURNED_ERROR (22) – 如果 CURLOPT_FAILONERROR 设置为 TRUE,且 HTTP 服务器返回 >= 400 的错误代码,就会返回此代码。 (此错误代码以前又称为 CURLE_HTTP_NOT_FOUND。)',
+        '23' => 'CURLE_WRITE_ERROR (23) – 在向本地文件写入所收到的数据时发生错误,或由写入回调 (write callback) 向 libcurl 返回了一个错误。',
+        '25' => 'CURLE_UPLOAD_FAILED (25) – 无法开始上传。 对于 FTP,服务器通常会拒绝执行 STOR 命令。错误缓冲区通常会提供服务器对此问题的说明。 (此错误代码以前又称为 CURLE_FTP_COULDNT_STOR_FILE。)',
+        '26' => 'CURLE_READ_ERROR (26) – 读取本地文件时遇到问题,或由读取回调 (read callback) 返回了一个错误。',
+        '27' => 'CURLE_OUT_OF_MEMORY (27) – 内存分配请求失败。此错误比较严重,若发生此错误,则表明出现了非常严重的问题。',
+        '28' => 'CURLE_OPERATION_TIMEDOUT (28) – 操作超时。 已达到根据相应情况指定的超时时间。',
+        '30' => 'CURLE_FTP_PORT_FAILED (30) – FTP PORT 命令返回错误。 在没有为 libcurl 指定适当的地址使用时,最有可能发生此问题。 请参阅 CURLOPT_FTPPORT。',
+        '31' => 'CURLE_FTP_COULDNT_USE_REST (31) – FTP REST 命令返回错误。如果服务器正常,则应当不会发生这种情况。',
+        '33' => 'CURLE_RANGE_ERROR (33) – 服务器不支持或不接受范围请求。',
+        '34' => 'CURLE_HTTP_POST_ERROR (34) – 此问题比较少见,主要由内部混乱引发。',
+        '35' => 'CURLE_SSL_CONNECT_ERROR (35) – 同时使用 SSL/TLS 时可能会发生此错误。您可以访问错误缓冲区查看相应信息,其中会对此问题进行更详细的介绍。可能是证书(文件格式、路径、许可)、密码及其他因素导致了此问题。',
+        '36' => 'CURLE_FTP_BAD_DOWNLOAD_RESUME (36) – 尝试恢复超过文件大小限制的 FTP 连接。',
+        '37' => 'CURLE_FILE_COULDNT_READ_FILE (37) – 无法打开 FILE:// 路径下的文件。原因很可能是文件路径无法识别现有文件。 建议您检查文件的访问权限。',
+        '38' => 'CURLE_LDAP_CANNOT_BIND (38) – LDAP 无法绑定。LDAP 绑定操作失败。',
+        '39' => 'CURLE_LDAP_SEARCH_FAILED (39) – LDAP 搜索无法进行。',
+        '41' => 'CURLE_FUNCTION_NOT_FOUND (41) – 找不到函数。 找不到必要的 zlib 函数。',
+        '42' => 'CURLE_ABORTED_BY_CALLBACK (42) – 由回调中止。 回调向 libcurl 返回了 “abort”。',
+        '43' => 'CURLE_BAD_FUNCTION_ARGUMENT (43) – 内部错误。 使用了不正确的参数调用函数。',
+        '45' => 'CURLE_INTERFACE_FAILED (45) – 界面错误。 指定的外部界面无法使用。 请通过 CURLOPT_INTERFACE 设置要使用哪个界面来处理外部连接的来源 IP 地址。 (此错误代码以前又称为 CURLE_HTTP_PORT_FAILED。)',
+        '47' => 'CURLE_TOO_MANY_REDIRECTS (47) – 重定向过多。 进行重定向时,libcurl 达到了网页点击上限。请使用 CURLOPT_MAXREDIRS 设置上限。',
+        '48' => 'CURLE_UNKNOWN_TELNET_OPTION (48) – 无法识别以 CURLOPT_TELNETOPTIONS 设置的选项。 请参阅相关文档。',
+        '49' => 'CURLE_TELNET_OPTION_SYNTAX (49) – telnet 选项字符串的格式不正确。',
+        '51' => 'CURLE_PEER_FAILED_VERIFICATION (51) – 远程服务器的 SSL 证书或 SSH md5 指纹不正确。',
+        '52' => 'CURLE_GOT_NOTHING (52) – 服务器未返回任何数据,在相应情况下,未返回任何数据就属于出现错误。',
+        '53' => 'CURLE_SSL_ENGINE_NOTFOUND (53) – 找不到指定的加密引擎。',
+        '54' => 'CURLE_SSL_ENGINE_SETFAILED (54) – 无法将选定的 SSL 加密引擎设为默认选项。',
+        '55' => 'CURLE_SEND_ERROR (55) – 无法发送网络数据。',
+        '56' => 'CURLE_RECV_ERROR (56) – 接收网络数据失败。',
+        '58' => 'CURLE_SSL_CERTPROBLEM (58) – 本地客户端证书有问题',
+        '59' => 'CURLE_SSL_CIPHER (59) – 无法使用指定的密钥',
+        '60' => 'CURLE_SSL_CACERT (60) – 无法使用已知的 CA 证书验证对等证书',
+        '61' => 'CURLE_BAD_CONTENT_ENCODING (61) – 无法识别传输编码',
+        '62' => 'CURLE_LDAP_INVALID_URL (62) – LDAP 网址无效',
+        '63' => 'CURLE_FILESIZE_EXCEEDED (63) – 超过了文件大小上限',
+        '64' => 'CURLE_USE_SSL_FAILED (64) – 请求的 FTP SSL 级别失败',
+        '65' => 'CURLE_SEND_FAIL_REWIND (65) – 进行发送操作时,curl 必须回转数据以便重新传输,但回转操作未能成功',
+        '66' => 'CURLE_SSL_ENGINE_INITFAILED (66) – SSL 引擎初始化失败',
+        '67' => 'CURLE_LOGIN_DENIED (67) – 远程服务器拒绝 curl 登录(7.13.1 新增功能)',
+        '68' => 'CURLE_TFTP_NOTFOUND (68) – 在 TFTP 服务器上找不到文件',
+        '69' => 'CURLE_TFTP_PERM (69) – 在 TFTP 服务器上遇到权限问题',
+        '70' => 'CURLE_REMOTE_DISK_FULL (70) – 服务器磁盘空间不足',
+        '71' => 'CURLE_TFTP_ILLEGAL (71) – TFTP 操作非法',
+        '72' => 'CURLE_TFTP_UNKNOWNID (72) – TFTP 传输 ID 未知',
+        '73' => 'CURLE_REMOTE_FILE_EXISTS (73) – 文件已存在,无法覆盖',
+        '74' => 'CURLE_TFTP_NOSUCHUSER (74) – 运行正常的 TFTP 服务器不会返回此错误',
+        '75' => 'CURLE_CONV_FAILED (75) – 字符转换失败',
+        '76' => 'CURLE_CONV_REQD (76) – 调用方必须注册转换回调',
+        '77' => 'CURLE_SSL_CACERT_BADFILE (77) – 读取 SSL CA 证书时遇到问题(可能是路径错误或访问权限问题)',
+        '78' => 'CURLE_REMOTE_FILE_NOT_FOUND (78) – 网址中引用的资源不存在',
+        '79' => 'CURLE_SSH (79) – SSH 会话中发生无法识别的错误',
+        '80' => 'CURLE_SSL_SHUTDOWN_FAILED (80) – 无法终止 SSL 连接',
+        '81' => 'CURLE_AGAIN---Socket是没有准备好发送/接收等待,直到它准备好了,然后再试一次。',
+        '82' => 'CURLE_SSL_CRL_BADFILE---无法加载CRL文件(在7.19.0版加入)',
+        '83' => 'CURLE_SSL_ISSUER_ERROR---发行人检查失败(在7.19.0版加入)',
+        '84' => 'CURLE_FTP_PRET_FAILED---FTP服务器不理解的PRET命令,所有不支持给定的参数。要小心时usingCURLOPT_CUSTOMREQUEST,自定义列表“命令将发送PRET CMD前PASV以及。',
+        '85' => 'CURLE_RTSP_CSEQ_ERROR---RTSP的Cseq号码不匹配。',
+        '86' => 'CURLE_RTSP_SESSION_ERROR---RTSP会话标识符不匹配。',
+        '87' => 'CURLE_FTP_BAD_FILE_LIST--无法,解析FTP文件列表(在FTP通配符下载)。',
+        '88' => 'CURLE_CHUNK_FAILED--块回调报告错误。',
+    );
+    if (isset($error_codes[$no])) {
+        return $error_codes[$no];
+    } else {
+        return '通信异常=>' . $no;
+    }
+}
+function oshandle_mkdirs($path)
+{
+    if (!is_dir($path)) {
+        oshandle_mkdirs(dirname($path));
+        if (!empty($path)) {
+            mkdir($path);
+        }
+    }
+    return is_dir($path);
+}
+class global_process2lock
+{
+    public static $flockSet = array();
+    public static function lock($fp)
+    {
+        if (empty($fp)) {
+            throw new Exception("锁文件参数为空!");
+        }
+        if (!file_exists($fp)) {
+            throw new Exception("锁文件路径【" . $fp . "】不存在!");
+        }
+        global_process2lock::$flockSet[$fp] = fopen($fp, 'r');
+        if (empty(global_process2lock::$flockSet[$fp])) {
+            throw new Exception(" global_process2lock 未能打开文件 fp=>" . $fp);
+        }
+
+        $flockflag = flock(global_process2lock::$flockSet[$fp], LOCK_EX);
+        if (empty($flockflag)) {
+            throw new Exception(" global_process2lock flock没有能够加上LOCK_EX独占阻塞锁 fp=>" . $fp);
+        }
+
+        return $flockflag;
+    }
+    public static function unlock($fp)
+    {
+        try {
+            if (empty(global_process2lock::$flockSet[$fp])) {
+                throw new Exception(" global_process2lock flock解锁LOCK_UN未成功 fp为空");
+            }
+
+            $resultA = flock(global_process2lock::$flockSet[$fp], LOCK_UN);
+            if (empty($resultA)) {
+                throw new Exception(" global_process2lock flock解锁LOCK_UN未成功 fp=>" . $fp);
+            }
+
+            $resultB = fclose(global_process2lock::$flockSet[$fp]);
+            if (empty($resultB)) {
+                throw new Exception(" global_process2lock fclose释放文件锁未成功 fp=>" . $fp);
+            }
+
+        } catch (Throwable $ex) {
+            if (true) {
+                eeglobal_log_handler("global_process2lock", 'ERROR', " global_process2lock fp=>" . $fp . "  释放锁时异常=>" . $ex->getMessage());
+            }
+        }
+    }
+}
+function filelock_handle($lockCatalog, $lockId, $handleArgs, $bizHandle)
+{
+    $logCatalog = "filelock_handle";
+    eeglobal_log_handler($logCatalog, "debug", "enter lockCatalog=$lockCatalog  lockId=$lockId");
+    if (empty($lockCatalog)) {
+        throw new GeneralException("", "lockCatalog文件锁类别不能为空!");
+    }
+
+    $lockId = intval($lockId);
+    if ($lockId == 0) {
+        $lockId = "all";
+    }
+//为空则为此业务类别的全局锁,非记录锁
+    $FLCK_PHY_ROOT = WEB_PHY_FILEROOT . "/FILELOCK_ROOT";
+    $lockFile = $FLCK_PHY_ROOT . "/$lockCatalog/FL_$lockId.flk";
+    $destPhyPath = dirname($lockFile);
+    try {
+        if (!is_dir($destPhyPath)) {
+            if (!mkdir($destPhyPath, 0777, true)) {
+                throw new Exception("创建lockId文件锁相关目录时发生错误!");
+            }
+            chmod($destPhyPath, 0777);
+        }
+        if (!file_exists($lockFile)) {
+            if (!fopen($lockFile, "w")) {
+                throw new Exception("创建lockId文件锁文件失败!");
+            }
+        }
+    } catch (Throwable $e) {
+        throw new GeneralException("", "创建lockId文件锁相关目录及文件时发生错误!" . $e->getMessage());
+    }
+    try {
+        eeglobal_log_handler($logCatalog, "debug", "lockbefore lockCatalog=$lockCatalog  lockId=$lockId");
+        global_process2lock::lock($lockFile);
+        eeglobal_log_handler($logCatalog, "debug", "lockafter lockCatalog=$lockCatalog  lockId=$lockId");
+        return $bizHandle($handleArgs);
+    } catch (Throwable $ex) {
+        throw $ex;
+    } finally {
+        eeglobal_log_handler($logCatalog, "debug", "unlockbefore lockCatalog=$lockCatalog  lockId=$lockId");
+        global_process2lock::unlock($lockFile);
+        eeglobal_log_handler($logCatalog, "debug", "unlockafter lockCatalog=$lockCatalog  lockId=$lockId");
+    }
+}
+function basecfg_getKey($subSystem, $groupKey)
+{
+    if (empty($groupKey)) {
+        throw new GeneralException("", "groupKey不能为空");
+    }
+
+    if (empty(trim($subSystem))) {
+        $subSystem = "GC";
+    }
+
+    $groupKeyALL = trim($subSystem . "_" . $groupKey);
+    if (empty($groupKeyALL)) {
+        throw new GeneralException("", "groupKeyALL不能为空");
+    }
+
+    $groupKeyCache = "GGCONFIG_$groupKeyALL";
+    return array(
+        "groupKeyALL" => $groupKeyALL,
+        "groupKeyCache" => $groupKeyCache,
+    );
+}
+function basecfg_getConfig($subSystem, $groupKey)
+{
+    $keyInfo = basecfg_getKey($subSystem, $groupKey);
+    $groupKeyALL = $keyInfo["groupKeyALL"];
+    $groupKeyCache = $keyInfo["groupKeyCache"];
+    if (!empty($GLOBALS[$groupKeyCache])) {
+        return $GLOBALS[$groupKeyCache];
+    }
+    $system_config_cache = pdo_fetch("select * from base_config where `group`=:group and `name`='system_config_cache'", array(':group' => $groupKeyALL));
+    if (empty($system_config_cache['value'])) {
+        $config = array();
+        $configdata = pdo_fetchall("select * from base_config where `group`=:group", array(':group' => $groupKeyALL));
+        foreach ($configdata as $item) {
+            $cvalue = $item['value'];
+            if (mb_strpos($item['value'], "YPWYPWARRAY") !== false) {
+                $cvalue = mb_ereg_replace("YPWYPWARRAY", "", $item['value']);
+                $cvalue = json_decode($cvalue, true);
+            }
+            $config[$item['name']] = $cvalue;
+        }
+        if (!empty($system_config_cache['name'])) {
+            pdo_update('base_config', array('value' => serialize($config)), array('name' => 'system_config_cache', 'group' => $groupKeyALL));
+        } else {
+            pdo_insert('base_config', array('name' => 'system_config_cache', 'value' => serialize($config), 'group' => $groupKeyALL));
+        }
+        $GLOBALS[$groupKeyCache] = $config;
+        return $GLOBALS[$groupKeyCache];
+    } else {
+        $GLOBALS[$groupKeyCache] = unserialize($system_config_cache['value']);
+        return $GLOBALS[$groupKeyCache];
+    }
+}
+function basecfg_setConfig($subSystem, $groupKey, $arrays, $needClear = false)
+{
+    $keyInfo = basecfg_getKey($subSystem, $groupKey);
+    $groupKeyALL = $keyInfo["groupKeyALL"];
+    $groupKeyCache = $keyInfo["groupKeyCache"];
+    if (empty($arrays) || !is_array($arrays) || count($arrays) <= 0) {
+        throw new GeneralException("", "basecfg_setConfig的参数arrays不能为空");
+    }
+
+    $sqlTemp = "";
+    $sqlParam = array();
+    $sqlParam[":group"] = $groupKeyALL;
+    if ($needClear == true) {
+        $sqlTemp .= " delete from base_config where `group`=:group; ";
+    }
+
+    $index = 0;
+    foreach ($arrays as $cname => $cvalue) {
+        $index++;
+        $cnamePN = ":P{$index}_cname";
+        $cvaluePN = ":P{$index}_cvalue";
+        $sqlParam[$cnamePN] = $cname;
+        $sqlParam[$cvaluePN] = (!is_array($cvalue) ? $cvalue : "YPWYPWARRAY" . json_encode($cvalue));
+        $sqlTemp .= " set @handle_id='0'; "; //根据条件查询是否存在对应记录limit 1
+        $sqlTemp .= " select @handle_id:=`name` from base_config where `group`=:group and `name`=$cnamePN limit 1;";
+        //基于查询结果作为条件的dual虚表进行关联插入
+        $sqlTemp .= " insert into base_config ( `group`,`name`,`value` )";
+        $sqlTemp .= "    select :group,$cnamePN,$cvaluePN from dual where ifnull(@handle_id,'0')='0' ;";
+        //候补更新,可能为空更新
+        $sqlTemp .= " update base_config SET `value`=$cvaluePN where ifnull(@handle_id,'0')<>'0' and `group`=:group and `name`=$cnamePN;";
+    }
+    $sqlTemp .= " update base_config SET `value`='' where `group`=:group and `name`='system_config_cache'; ";
+    pdo_query3($sqlTemp, $sqlParam);
+    unset($GLOBALS[$groupKeyCache]); //清理同一进程内可共享缓存
+}
+
+/**序列化相关**/
+function base_iserializer($value)
+{
+    return serialize($value);
+}
+function base_iunserializer($value)
+{
+    if (empty($value)) {
+        return '';
+    }
+    if (!base_isserialized($value)) {
+        return $value;
+    }
+    $result = unserialize($value);
+    if ($result === false) {
+        $temp = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $value);
+        return unserialize($temp);
+    }
+    return $result;
+}
+function base_isserialized($data, $strict = true)
+{
+    if (!is_string($data)) {
+        return false;
+    }
+    $data = trim($data);
+    if ('N;' == $data) {
+        return true;
+    }
+    if (strlen($data) < 4) {
+        return false;
+    }
+    if (':' !== $data[1]) {
+        return false;
+    }
+    if ($strict) {
+        $lastc = substr($data, -1);
+        if (';' !== $lastc && '}' !== $lastc) {
+            return false;
+        }
+    } else {
+        $semicolon = strpos($data, ';');
+        $brace = strpos($data, '}');
+        if (false === $semicolon && false === $brace) {
+            return false;
+        }
+
+        if (false !== $semicolon && $semicolon < 3) {
+            return false;
+        }
+
+        if (false !== $brace && $brace < 4) {
+            return false;
+        }
+
+    }
+    $token = $data[0];
+    switch ($token) {
+        case 's':
+            if ($strict) {
+                if ('"' !== substr($data, -2, 1)) {
+                    return false;
+                }
+            } elseif (false === strpos($data, '"')) {
+                return false;
+            }
+        case 'a':
+        case 'O':
+            return (bool) preg_match("/^{$token}:[0-9]+:/s", $data);
+        case 'b':
+        case 'i':
+        case 'd':
+            $end = $strict ? '$' : '';
+            return (bool) preg_match("/^{$token}:[0-9.E-]+;$end/", $data);
+    }
+    return false;
+}
+
+function imghandle_buildAllUrl($oldUrl)
+{
+    if (empty($oldUrl)) {
+        return '';
+    }
+
+    $newUrl = $oldUrl;
+    if (mb_strpos(strtolower($oldUrl), "http") !== 0) {
+        $newUrl = WEBSITE_ROOT . $oldUrl;
+    }
+    return $newUrl;
+}
+function imghandle_createImage($imgurl)
+{
+    $resp = http_get(imghandle_buildAllUrl($imgurl));
+    return imagecreatefromstring($resp);
+}
+function imghandle_mergeImage($target, $data, $imgurl)
+{
+    $img = imghandle_createImage($imgurl);
+    $w = imagesx($img);
+    $h = imagesy($img);
+    if (intval($data['width']) <= 0) {
+        $data['width'] = $w;
+    }
+
+    if (intval($data['height']) <= 0) {
+        $data['height'] = $w;
+    }
+
+    imagecopyresized($target, $img, $data['left'], $data['top'], 0, 0, $data['width'], $data['height'], $w, $h);
+    imagedestroy($img);
+    return $target;
+}
+function imghandle_mergeText($target, $data, $text, $fontFileName)
+{
+    $font = WEB_PHY_ASSETROOT . "/font/$fontFileName.ttf";
+    if (!file_exists($font)) {
+        $font = WEB_PHY_ASSETROOT . "/font/msyh.ttf";
+    }
+    if (intval($data['size']) <= 0) {
+        $data['size'] = 12;
+    }
+
+    $colors = imghandle_hex2rgb($data['color']);
+    if (empty($colors)) {
+        $colors = array('red' => 0, 'green' => 0, 'blue' => 0);
+    }
+
+    $color = imagecolorallocate($target, $colors['red'], $colors['green'], $colors['blue']);
+    if (intval($data['width']) <= 0) {
+        $data['width'] = 50;
+    }
+
+    mb_internal_encoding("UTF-8"); //设置编码
+    $content = "";
+    // 将字符串拆分成一个个单字 保存到数组 letter 中
+    for ($i = 0; $i < mb_strlen($text); $i++) {
+        $letter[] = mb_substr($text, $i, 1);
+    }
+    foreach ($letter as $l) {
+        $teststr = $content . " " . $l;
+        $fontBox = imagettfbbox($data['size'], 0, $font, $teststr);
+        // 判断拼接后的字符串是否超过预设的宽度
+        if (($fontBox[2] > intval($data['width'])) && ($content !== "")) {
+            $content .= "\n";
+        }
+        $content .= $l;
+    }
+    imagettftext($target, $data['size'], 0, $data['left'], $data['top'] + $data['size'], $color, $font, $content);
+    return $target;
+}
+function imghandle_hex2rgb($colour)
+{
+    if ($colour[0] == '#') {
+        $colour = substr($colour, 1);
+    }
+    if (strlen($colour) == 6) {
+        list($r, $g, $b) = array(
+            $colour[0] . $colour[1],
+            $colour[2] . $colour[3],
+            $colour[4] . $colour[5],
+        );
+    } elseif (strlen($colour) == 3) {
+        list($r, $g, $b) = array(
+            $colour[0] . $colour[0],
+            $colour[1] . $colour[1],
+            $colour[2] . $colour[2],
+        );
+    } else {
+        return false;
+    }
+    $r = hexdec($r);
+    $g = hexdec($g);
+    $b = hexdec($b);
+    return array(
+        'red' => $r,
+        'green' => $g,
+        'blue' => $b,
+    );
+}
+function poster_build_pre($bizCatalog, $bizid, $userid, $poster, $saveSubPath, $cbQR, $cbQrMina)
+{
+    $bizCatalog = intval($bizCatalog);
+    $bizid = intval($bizid);
+    $userid = intval($userid);
+    foreach ($poster["data"] as &$d) {
+        if ($d['type'] == 'qr') {
+            $qr_imgtype = $d["imgtype"] == "png" ? "png" : "jpeg";
+            $qr_md5 = md5(json_encode($d));
+            $qr_fileName = "{$bizCatalog}_{$bizid}_{$userid}_$qr_md5.{$qr_imgtype}";
+            $bizData = $cbQR($bizCatalog, $bizid, $userid, $d);
+            $qrEmbedData = $bizData["qrEmbedData"];
+            $qrSubPath = $bizData["qrSubPath"];
+            $qr_pathPath = "$qrSubPath/$qr_fileName";
+            $qr_urlPath = WEB_URL_FILEROOT . "/$qr_pathPath";
+            $qr_phyPath = WEB_PHY_FILEROOT . "/$qr_pathPath";
+            $destPhyPath = dirname($qr_phyPath);
+            if (!is_dir($destPhyPath)) {
+                oshandle_mkdirs($destPhyPath);
+            }
+            if (!file_exists($qr_phyPath)) {
+                require_once WEB_PHY_ROOT . "/base/lib_qr.php";
+                $d['margin'] = intval(str_replace('px', '', $d['margin']));
+                $d['size'] = intval(str_replace('px', '', $d['size']));
+                lib_qrbuild_core($qr_imgtype, $qrEmbedData, $qr_phyPath, $d['size'], $d['margin']
+                    , null, null, null, null, $d["logpath"]);
+            }
+            $d['src'] = $qr_urlPath;
+            $d['type'] = "img";
+        } else if ($d['type'] == 'qrmina') {
+            $qrmina_imgtype = $d["imgtype"] == "png" ? "png" : "jpeg";
+            $qrmina_md5 = md5(json_encode($d));
+            $qrmina_fileName = "{$bizCatalog}_{$bizid}_{$userid}_$qrmina_md5.{$qrmina_imgtype}";
+            $bizData = $cbQrMina($bizCatalog, $bizid, $userid, $d);
+            $qrminaSubPath = $bizData["qrminaSubPath"];
+            $qrminaAppId = $bizData["qrminaAppId"];
+            $qrminaAppSecret = $bizData["qrminaAppSecret"];
+            $qrminaPagePath = $bizData["qrminaPagePath"];
+            $qrmina_pathPath = "$qrminaSubPath/$qrmina_fileName";
+            $qrmina_urlPath = WEB_URL_FILEROOT . "/$qrmina_pathPath";
+            $qrmina_phyPath = WEB_PHY_FILEROOT . "/$qrmina_pathPath";
+            $destPhyPath = dirname($qrmina_phyPath);
+            if (!is_dir($destPhyPath)) {
+                oshandle_mkdirs($destPhyPath);
+            }
+            if (!file_exists($qrmina_phyPath)) {
+                require_once WEB_PHY_ROOT . "/base/wxsrv.php";
+                $d['size'] = intval(str_replace('px', '', $d['size']));
+                weixin_getMinaQCode($qrminaAppId, $qrminaAppSecret, $qrmina_phyPath,
+                    $bizCatalog, $bizid, $userid, $qrminaPagePath, $d['size']);
+            }
+            $d['src'] = $qrmina_urlPath;
+            $d['type'] = "img";
+        }
+    }
+    $poster_md5 = md5(json_encode(array(
+        'version' => 1,
+        'catalog' => $bizCatalog,
+        'bizid' => $bizid,
+        'userid' => $userid,
+        'width' => $poster["width"],
+        'height' => $poster["height"],
+        'bg' => $poster["bg"],
+        'data' => $poster["data"],
+        'imgtype' => $poster["imgtype"],
+    )));
+    $poster_fileName = "{$bizCatalog}_{$bizid}_{$userid}_$poster_md5.{$poster["imgtype"]}";
+    $poster_pathPath = "$saveSubPath/$poster_fileName";
+    $poster_phyPath = WEB_PHY_FILEROOT . "/$poster_pathPath";
+    $destPhyPath = dirname($poster_phyPath);
+    if (!is_dir($destPhyPath)) {
+        oshandle_mkdirs($destPhyPath);
+    }
+    if (!file_exists($poster_phyPath)) {
+        poster_build($poster["width"], $poster["height"], $poster["bg"], $poster["data"], $poster_phyPath, $poster["imgtype"]);
+    }
+    return WEB_URL_FILEROOT . "/$poster_pathPath";
+}
+function poster_build($width, $height, $bgPicPath, $data, $savePath, $saveType = "jpg")
+{
+    set_time_limit(0);
+    @ini_set('memory_limit', '256M');
+    $width = intval($width);
+    if ($width < 10) {
+        $width = 10;
+    }
+
+    if ($width > 1240) {
+        $width = 1240;
+    }
+
+    $height = intval($height);
+    if ($height < 10) {
+        $height = 10;
+    }
+
+    if ($height > 1624) {
+        $height = 1624;
+    }
+
+    $target = imagecreatetruecolor($width, $height);
+    if (!empty($bgPicPath)) {
+        $bg = imghandle_createImage($bgPicPath);
+        imagecopy($target, $bg, 0, 0, 0, 0, $width, $height);
+        imagedestroy($bg);
+    }
+    foreach ($data as $d) {
+        $d['left'] = intval(str_replace('px', '', $d['left']));
+        $d['top'] = intval(str_replace('px', '', $d['top']));
+        $d['width'] = intval(str_replace('px', '', $d['width']));
+        $d['height'] = intval(str_replace('px', '', $d['height']));
+        $d['size'] = intval(str_replace('px', '', $d['size']));
+        $d['src'] = imghandle_buildAllUrl($d['src']);
+        if ($d['type'] == 'img') {
+            $target = imghandle_mergeImage($target, $d, $d['src']);
+        } else if ($d['type'] == 'text') {
+            if ($d['width'] <= 0) {
+                $d['width'] = $width;
+            }
+
+            $target = imghandle_mergeText($target, $d, $d['text'], $d['font']);
+        }
+    }
+    $saveType == "jpg" ? imagejpeg($target, $savePath) : imagepng($target, $savePath);
+    imagedestroy($target);
+}
+
+function base_putForendErrLog($forendtype)
+{
+    $GPC = input_param_handle(false);
+    $ajaxdata = input_getPostObj();
+    $forendid = isset($ajaxdata["forendid"]) ? $ajaxdata["forendid"] : $GPC["forendid"];
+    if (empty(trim($forendid))) {
+        $forendid = "无";
+    }
+
+    $catalog = isset($ajaxdata["catalog"]) ? $ajaxdata["catalog"] : $GPC["catalog"];
+    if (empty(trim($catalog))) {
+        $catalog = "无";
+    }
+
+    $content = isset($ajaxdata["content"]) ? $ajaxdata["content"] : $GPC["content"];
+    if (empty(trim($content))) {
+        $content = "没有传递content,内容为空";
+    }
+
+    pdo_insert("base_forend_errlog", array(
+        "createtime" => time(),
+        "forendtype" => $forendtype,
+        "forendid" => $forendid,
+        "errcatalog" => $catalog,
+        "errcontent" => $content,
+    ));
+}
+function base_buildForendToken($userInfo)
+{
+    $stoptime = time() + 3600 * 24 * 15;
+    $userInfo["salt"] = random(8);
+    pdo_query("update base_user set salt=:salt where id=:id;", array(
+        ":salt" => $userInfo["salt"], ":id" => $userInfo["id"],
+    ));
+    switch (FOREND_TOKEN_MODE) {
+        default:
+            $nowsign = base_getforendTokenSign($userInfo, $stoptime);
+            return FOREND_TOKEN_MODE . "_$stoptime$nowsign";
+            break;
+    }
+}
+function base_getforendTokenSign($userInfo, $stoptime)
+{
+    return md5(trim($stoptime) . "_" . trim($userInfo["id"]) . "_" . trim($userInfo["createtime"]) . "_" . trim($userInfo["salt"]));
+}
+function base_verifyForendToken($userInfo)
+{
+    $GPC = input_param_handle(false);
+    $ajaxdata = input_getPostObj();
+    $token = isset($ajaxdata[FOREND_TOKEN_NAME]) ? $ajaxdata[FOREND_TOKEN_NAME] : $GPC[FOREND_TOKEN_NAME];
+    if (empty(trim($token))) {
+        throw new GeneralException("", "没有传递前端会话Token的参数[ " . FOREND_TOKEN_NAME . " ]或参数为空!");
+    }
+
+    $token = mb_ereg_replace("_", "", $token);
+    switch (intval($token[0])) { //0-md5/sha1; 1-对称加密; 2-非对称加密
+        default:
+            $stoptime = mb_substr($token, 1, 10);
+            if (time() > intval($stoptime)) {
+                base_verifyForendTokenFail("会话令牌已过期,请重新登录验证以获取新令牌!");
+            }
+
+            $oldsign = mb_substr($token, 11);
+            $nowsign = base_getforendTokenSign($userInfo, $stoptime);
+            if ($oldsign != $nowsign) {
+                base_verifyForendTokenFail("会话令牌不匹配,请重新登录验证以获取新令牌!");
+            }
+
+            break;
+    }
+    return true;
+}
+function base_verifyForendTokenFail($attachMsg = "会话令牌无效,请重新登录验证以获取新令牌!")
+{
+    $ajaxRes = new AjaxResult;
+    $ajaxRes->ErrMsg = FOREND_TOKEN_ERRMSGFLAG . $attachMsg;
+    ob_clean();
+    ob_start();
+    header('Content-Type:application/json;charset=UTF-8');
+    echo @json_encode($ajaxRes);
+    exit;
+}
+
+function base_loginByPhone($subSystem)
+{
+    $GPC = input_param_handle(false);
+    $ajaxdata = input_getPostObj();
+    $phone = isset($ajaxdata["phone"]) ? $ajaxdata["phone"] : $GPC["phone"];
+    if (empty($phone)) {
+        throw new GeneralException("", "没有传递必要的phone参数");
+    }
+
+    if (!preg_match("/^1\d{10,10}$/", trim($phone))) {
+        throw new GeneralException("", "传递的不是正确的手机号");
+    }
+    $code = isset($ajaxdata["code"]) ? $ajaxdata["code"] : $GPC["code"];
+    if ($phone == "18920787806" && (intval($subSystem) == 1)) {
+        $code = "123456";
+    }
+//会员侧测试锁码,用于测试及第三方验证
+    if ($phone == "13920062668" && (intval($subSystem) == 2)) {
+        $code = "687206";
+    }
+//商家侧测试锁码,用于测试及第三方验证
+    if (empty(trim($code))) {
+        $code = rand(123456, 654321);
+        /***UPSERT手机用户记录**start***/
+        $sqlTemp = "";
+        $sqlParam = array();
+        $sqlParam[":nowtime"] = time();
+        $sqlParam[":subsystem"] = intval($subSystem);
+        $sqlParam[":mobile"] = trim($phone);
+        $sqlParam[":smscode"] = $code;
+        $sqlParam[":salt"] = random(8);
+        $sqlTemp .= " set @handle_id='0'; ";
+        $sqlTemp .= " select @handle_id:=`mobile` from base_user where subsystem=:subsystem and `mobile`=:mobile limit 1;";
+        $sqlTemp .= " insert into base_user ( `createtime`,`subsystem`,`mobile`,`smscode`,`salt` )";
+        $sqlTemp .= "    select                  :nowtime ,:subsystem ,:mobile ,:smscode ,:salt  from dual where ifnull(@handle_id,'0')='0' ;";
+        $sqlTemp .= " update base_user SET `updatetime`=:nowtime,`smscode`=:smscode where ifnull(@handle_id,'0')<>'0' and subsystem=:subsystem and `mobile`=:mobile;";
+        pdo_query3($sqlTemp, $sqlParam);
+        /***UPSERT手机用户记录**finish***/
+        include_once WEB_PHY_ROOT . "/base/smslib.php"; //发短信阿里
+        $sended = alisms_sendSms($phone, AliSMS_CODE_TMPCODE, AliSMS_CODE_TMPSIGN, array("code" => $code));
+        return true;
+    } else {
+        $baseUser = pdo_fetch("select * from base_user where subsystem=:subsystem and `mobile`=:mobile limit 1;", array(
+            ":subsystem" => intval($subSystem),
+            ":mobile" => trim($phone),
+        ));
+        if (empty($baseUser)) {
+            throw new GeneralException("", "没有定位到此手机号的用户记录,请先不带code参数方式调用此接口先获取验证码并预构建手机用户记录!");
+        }
+        if (trim($baseUser["smscode"]) != trim($code)) {
+            throw new GeneralException("", "输入的短信验证码不正确,或者已过期!");
+        } else { //生成并返给前端会话token
+            $baseUser["FOREND_TOKEN"] = base_buildForendToken($baseUser);
+            return $baseUser;
+        }
+    }
+}
+function basebaidumap_fetchplace($lat, $lng, $coordtype = "wgs84ll")
+{
+    $url = "https://api.map.baidu.com/reverse_geocoding/v3/?";
+    $url .= "ak=" . BaiduLBS_APPKEY;
+    $url .= "&output=json&coordtype={$coordtype}";
+    $url .= "&location={$lat},{$lng}";
+    $result = http_get($url);
+    $obj = @json_decode($result, true);
+    if (!empty($obj) && intval($obj["status"]) == 0
+        && is_array($obj["result"]) && !empty($obj["result"]["formatted_address"])) {
+        return $obj["result"];
+    } else {
+        throw new Exception($result);
+    }
+}
+//-----------------------------------------------------
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Dyplsapi;
+use Darabonba\OpenApi\Models\Config;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\CreateSubscriptionRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnRequest;
+function alivphone_BindAxn($expiration, $phoneNoA, $poolKey)
+{
+    require_once WEB_PHY_ROOT . "/base/composer/vendor/autoload.php";
+    try {
+        $config = new Config([
+            "accessKeyId" => AliSMSAccessKey,
+            "accessKeySecret" => AliSMSAccessSecret,
+        ]);
+        $config->endpoint = "dyplsapi.aliyuncs.com";
+        $client = new Dyplsapi($config);
+        $bindAxnRequest = new BindAxnRequest([
+            "poolKey" => $poolKey,
+            "phoneNoA" => $phoneNoA,
+            "expiration" => date("Y-m-d H:i:s", $expiration),
+        ]);
+        eeglobal_log_handler('alivphone_BindAxn', 'info', "bindAxnRequest=>" . json_encode($bindAxnRequest));
+        $response = $client->bindAxn($bindAxnRequest);
+        if ($response->body->code == "OK") {
+            eeglobal_log_handler('alivphone_BindAxn', 'info', "bindok=>" . json_encode($response->body->secretBindDTO));
+            $secretNo = $response->body->secretBindDTO->secretNo;
+            $subsId = $response->body->secretBindDTO->subsId;
+            return array("secretNo" => $secretNo, "subsId" => $subsId);
+        } else {
+            throw new GeneralException("AlibabaCloudError", json_encode($response->body));
+        }
+    } catch (Throwable $ex) {
+        throw new GeneralException("AlibabaCloudError", $ex->getMessage());
+    }
+}
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QueryCallStatusRequest;
+function alivphone_QueryCallStatus($poolKey, $subsId)
+{
+    require_once WEB_PHY_ROOT . "/base/composer/vendor/autoload.php";
+    try {
+        $config = new Config([
+            "accessKeyId" => AliSMSAccessKey,
+            "accessKeySecret" => AliSMSAccessSecret,
+        ]);
+        $config->endpoint = "dyplsapi.aliyuncs.com";
+        $client = new Dyplsapi($config);
+        $queryCallStatusRequest = new QueryCallStatusRequest([
+            "poolKey" => $poolKey,
+            "subsId" => $subsId,
+        ]);
+        eeglobal_log_handler('alivphone_QueryCallStatus', 'info', "queryCallStatusRequest=>" . json_encode($queryCallStatusRequest));
+        $response = $client->queryCallStatus($queryCallStatusRequest);
+        if ($response->body->code == "OK") {
+            eeglobal_log_handler('alivphone_QueryCallStatus', 'info', "queryok=>" . json_encode($response->body->secretCallStatusDTO));
+            $calledNo = $response->body->secretCallStatusDTO->calledNo;
+            $status = $response->body->secretCallStatusDTO->status;
+            return array("calledNo" => $calledNo, "status" => $status);
+        } else {
+            throw new GeneralException("AlibabaCloudError", json_encode($response->body));
+        }
+    } catch (Throwable $ex) {
+        throw new GeneralException("AlibabaCloudError", $ex->getMessage());
+    }
+}
+/**************************************************************/
+function baseexcel_exportCsv($fileName, $title, $args, $handle)
+{
+    require_once WEB_PHY_ROOT . "/base/composer/vendor/autoload.php";
+    set_time_limit(0);
+    $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
+    $activeSheet = $spreadsheet->getActiveSheet();
+    foreach ($title as $key => $value) {
+        $activeSheet->setCellValueByColumnAndRow($key + 1, 1, $value);
+    }
+    $writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
+    $writer->setOutputEncoding("GBK");
+    $writer->save('php://output');
+    $fp = fopen('php://output', 'w'); //打开output流
+    header("Content-Description: File Transfer");
+    header("Expires: 0");
+    header("Cache-Control: must-revalidate");
+    header("Pragma: public");
+    header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+    header("Content-Disposition: attachment;filename={$fileName}.csv");
+    header("Cache-Control: max-age=0");
+    do {
+        $backdata = $handle($args);
+        if (empty($backdata)) {
+            break;
+        }
+
+        $pagedata = $backdata["pagedata"];
+        if (empty($pagedata)) {
+            break;
+        }
+
+        $args = $backdata["args"];
+        foreach ($pagedata as $item) {
+            mb_convert_variables('GBK', 'UTF-8', $item);
+            fputcsv($fp, $item);
+        }
+        ob_flush();
+        flush();
+    } while (!empty($pagedata));
+    fclose($fp);
+    exit();
+}
+
+function base_buildSNById($prefix, $id, $prefixMaxLen = 11, $zeroPadMaxLen = 11)
+{
+    $strId = intval($id) . "";
+    if ((intval($prefixMaxLen) - mb_strlen($strId)) <= 0) {
+        $prefix = "";
+    }
+
+    $diff = intval($zeroPadMaxLen) - mb_strlen($strId);
+    $strPad = "";
+    for ($iii = 0; $diff > 0 && $iii < $diff; $iii++) {
+        $strPad .= "0";
+    }
+
+    return $prefix . $strPad . $strId;
+}
+function base_fetchIdBySN($sn)
+{
+    preg_match_all('/\d/', $sn, $arr);
+    $id = implode($arr[0]);
+    return intval($id);
+}

+ 9 - 0
base/composer/composer.json

@@ -0,0 +1,9 @@
+{
+    "require": {
+        "endroid/qr-code": "^4.3",
+        "wechatpay/wechatpay": "^1.3",
+        "alibabacloud/dyplsapi-20170525": "^1.0",
+        "phpoffice/phpspreadsheet": "^1.19",
+        "tencentcloud/tencentcloud-sdk-php": "^3.0"
+    }
+}

+ 2002 - 0
base/composer/composer.lock

@@ -0,0 +1,2002 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "ee0599eb05628a1ac93d2aaa99658569",
+    "packages": [
+        {
+            "name": "adbario/php-dot-notation",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/adbario/php-dot-notation.git",
+                "reference": "eee4fc81296531e6aafba4c2bbccfc5adab1676e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/adbario/php-dot-notation/zipball/eee4fc81296531e6aafba4c2bbccfc5adab1676e",
+                "reference": "eee4fc81296531e6aafba4c2bbccfc5adab1676e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0|^5.0|^6.0",
+                "squizlabs/php_codesniffer": "^3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Adbar\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Riku Särkinen",
+                    "email": "riku@adbar.io"
+                }
+            ],
+            "description": "PHP dot notation access to arrays",
+            "homepage": "https://github.com/adbario/php-dot-notation",
+            "keywords": [
+                "ArrayAccess",
+                "dotnotation"
+            ],
+            "support": {
+                "issues": "https://github.com/adbario/php-dot-notation/issues",
+                "source": "https://github.com/adbario/php-dot-notation/tree/2.x"
+            },
+            "time": "2019-01-01T23:59:15+00:00"
+        },
+        {
+            "name": "alibabacloud/credentials",
+            "version": "1.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/credentials-php.git",
+                "reference": "e79d4151ad8924c0cf79d4fe0ec151b8d7663a25"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/credentials-php/zipball/e79d4151ad8924c0cf79d4fe0ec151b8d7663a25",
+                "reference": "e79d4151ad8924c0cf79d4fe0ec151b8d7663a25",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "adbario/php-dot-notation": "^2.2",
+                "alibabacloud/tea": "^3.0",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "ext-xmlwriter": "*",
+                "guzzlehttp/guzzle": "^6.3|^7.0",
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "composer/composer": "^1.8",
+                "drupal/coder": "^8.3",
+                "ext-dom": "*",
+                "ext-pcre": "*",
+                "ext-sockets": "*",
+                "ext-spl": "*",
+                "mikey179/vfsstream": "^1.6",
+                "monolog/monolog": "^1.24",
+                "phpunit/phpunit": "^4.8.35|^5.4.3",
+                "psr/cache": "^1.0",
+                "symfony/dotenv": "^3.4",
+                "symfony/var-dumper": "^3.4"
+            },
+            "suggest": {
+                "ext-sockets": "To use client-side monitoring"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Credentials\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com",
+                    "homepage": "http://www.alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud Credentials for PHP",
+            "homepage": "https://www.alibabacloud.com/",
+            "keywords": [
+                "alibaba",
+                "alibabacloud",
+                "aliyun",
+                "client",
+                "cloud",
+                "credentials",
+                "library",
+                "sdk",
+                "tool"
+            ],
+            "support": {
+                "issues": "https://github.com/aliyun/credentials-php/issues",
+                "source": "https://github.com/aliyun/credentials-php"
+            },
+            "time": "2021-06-08T10:49:34+00:00"
+        },
+        {
+            "name": "alibabacloud/darabonba-openapi",
+            "version": "0.1.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/darabonba-openapi.git",
+                "reference": "6f03803394ab48ef54a498e079a3575881e7fc34"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/darabonba-openapi/zipball/6f03803394ab48ef54a498e079a3575881e7fc34",
+                "reference": "6f03803394ab48ef54a498e079a3575881e7fc34",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "alibabacloud/credentials": "^1.1",
+                "alibabacloud/openapi-util": "^0.1.7",
+                "alibabacloud/tea-utils": "^0.2.0",
+                "php": ">5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Darabonba\\OpenApi\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud OpenApi Client",
+            "support": {
+                "issues": "https://github.com/alibabacloud-sdk-php/darabonba-openapi/issues",
+                "source": "https://github.com/alibabacloud-sdk-php/darabonba-openapi/tree/0.1.9"
+            },
+            "time": "2021-09-07T09:37:46+00:00"
+        },
+        {
+            "name": "alibabacloud/dyplsapi-20170525",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/dyplsapi-20170525.git",
+                "reference": "1525041b97486807f1fbcefe04e30c00ae972a76"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/dyplsapi-20170525/zipball/1525041b97486807f1fbcefe04e30c00ae972a76",
+                "reference": "1525041b97486807f1fbcefe04e30c00ae972a76",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "alibabacloud/darabonba-openapi": "^0.1.0",
+                "alibabacloud/endpoint-util": "^0.1.0",
+                "alibabacloud/tea-utils": "^0.2.0",
+                "php": ">5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\SDK\\Dyplsapi\\V20170525\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud Dyplsapi (20170525) SDK Library for PHP",
+            "support": {
+                "source": "https://github.com/alibabacloud-sdk-php/dyplsapi-20170525/tree/1.0.0"
+            },
+            "time": "2020-12-30T03:22:59+00:00"
+        },
+        {
+            "name": "alibabacloud/endpoint-util",
+            "version": "0.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/endpoint-util.git",
+                "reference": "f3fe88a25d8df4faa3b0ae14ff202a9cc094e6c5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/endpoint-util/zipball/f3fe88a25d8df4faa3b0ae14ff202a9cc094e6c5",
+                "reference": "f3fe88a25d8df4faa3b0ae14ff202a9cc094e6c5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35|^5.4.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Endpoint\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud Endpoint Library for PHP",
+            "support": {
+                "source": "https://github.com/alibabacloud-sdk-php/endpoint-util/tree/0.1.1"
+            },
+            "time": "2020-06-04T10:57:15+00:00"
+        },
+        {
+            "name": "alibabacloud/openapi-util",
+            "version": "0.1.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/openapi-util.git",
+                "reference": "c5734b3e0c2c560fd11c280edbe6cbe6115c4fd9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/openapi-util/zipball/c5734b3e0c2c560fd11c280edbe6cbe6115c4fd9",
+                "reference": "c5734b3e0c2c560fd11c280edbe6cbe6115c4fd9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "alibabacloud/tea": "^3.1",
+                "alibabacloud/tea-utils": "^0.2",
+                "lizhichao/one-sm": "^1.5",
+                "php": ">5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35|^5.4.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\OpenApiUtil\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud OpenApi Util",
+            "support": {
+                "issues": "https://github.com/alibabacloud-sdk-php/openapi-util/issues",
+                "source": "https://github.com/alibabacloud-sdk-php/openapi-util/tree/0.1.9"
+            },
+            "time": "2021-09-07T08:13:50+00:00"
+        },
+        {
+            "name": "alibabacloud/tea",
+            "version": "3.1.22",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/tea-php.git",
+                "reference": "f9c9b2c927253a1c23a5381cc655e41311be7f65"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/tea-php/zipball/f9c9b2c927253a1c23a5381cc655e41311be7f65",
+                "reference": "f9c9b2c927253a1c23a5381cc655e41311be7f65",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "adbario/php-dot-notation": "^2.2",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "ext-xmlwriter": "*",
+                "guzzlehttp/guzzle": "^6.3|^7.0",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*",
+                "symfony/dotenv": "^3.4",
+                "symfony/var-dumper": "^3.4"
+            },
+            "suggest": {
+                "ext-sockets": "To use client-side monitoring"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Tea\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com",
+                    "homepage": "http://www.alibabacloud.com"
+                }
+            ],
+            "description": "Client of Tea for PHP",
+            "homepage": "https://www.alibabacloud.com/",
+            "keywords": [
+                "alibabacloud",
+                "client",
+                "cloud",
+                "tea"
+            ],
+            "support": {
+                "issues": "https://github.com/aliyun/tea-php/issues",
+                "source": "https://github.com/aliyun/tea-php"
+            },
+            "time": "2021-05-11T06:17:44+00:00"
+        },
+        {
+            "name": "alibabacloud/tea-utils",
+            "version": "0.2.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/tea-utils.git",
+                "reference": "381df15cb4bdb58dbf596f94869ffd2ef680eddd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/tea-utils/zipball/381df15cb4bdb58dbf596f94869ffd2ef680eddd",
+                "reference": "381df15cb4bdb58dbf596f94869ffd2ef680eddd",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "alibabacloud/tea": "^3.1",
+                "php": ">5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Tea\\Utils\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud Tea Utils for PHP",
+            "support": {
+                "issues": "https://github.com/aliyun/tea-util/issues",
+                "source": "https://github.com/aliyun/tea-util"
+            },
+            "time": "2021-02-02T10:10:58+00:00"
+        },
+        {
+            "name": "bacon/bacon-qr-code",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Bacon/BaconQrCode.git",
+                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
+                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
+                "shasum": ""
+            },
+            "require": {
+                "dasprid/enum": "^1.0.3",
+                "ext-iconv": "*",
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "phly/keep-a-changelog": "^1.4",
+                "phpunit/phpunit": "^7 | ^8 | ^9",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "suggest": {
+                "ext-imagick": "to generate QR code images"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "BaconQrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "mail@dasprids.de",
+                    "homepage": "https://dasprids.de/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "BaconQrCode is a QR code generator for PHP.",
+            "homepage": "https://github.com/Bacon/BaconQrCode",
+            "time": "2021-06-18T13:26:35+00:00"
+        },
+        {
+            "name": "dasprid/enum",
+            "version": "1.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/DASPRiD/Enum.git",
+                "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2",
+                "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2",
+                "shasum": ""
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7 | ^8 | ^9",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DASPRiD\\Enum\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "mail@dasprids.de",
+                    "homepage": "https://dasprids.de/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "PHP 7.1 enum implementation",
+            "keywords": [
+                "enum",
+                "map"
+            ],
+            "time": "2020-10-02T16:03:48+00:00"
+        },
+        {
+            "name": "endroid/qr-code",
+            "version": "4.3.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/endroid/qr-code.git",
+                "reference": "5630e192948b466d418608ecce697465d20260af"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/endroid/qr-code/zipball/5630e192948b466d418608ecce697465d20260af",
+                "reference": "5630e192948b466d418608ecce697465d20260af",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "bacon/bacon-qr-code": "^2.0",
+                "php": "^7.3||^8.0"
+            },
+            "require-dev": {
+                "endroid/quality": "dev-master",
+                "ext-gd": "*",
+                "khanamiryan/qrcode-detector-decoder": "^1.0.4",
+                "setasign/fpdf": "^1.8.2"
+            },
+            "suggest": {
+                "ext-gd": "Enables you to write PNG images",
+                "khanamiryan/qrcode-detector-decoder": "Enables you to use the image validator",
+                "roave/security-advisories": "Makes sure package versions with known security issues are not installed",
+                "setasign/fpdf": "Enables you to use the PDF writer"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Endroid\\QrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jeroen van den Enden",
+                    "email": "info@endroid.nl"
+                }
+            ],
+            "description": "Endroid QR Code",
+            "homepage": "https://github.com/endroid/qr-code",
+            "keywords": [
+                "code",
+                "endroid",
+                "php",
+                "qr",
+                "qrcode"
+            ],
+            "support": {
+                "issues": "https://github.com/endroid/qr-code/issues",
+                "source": "https://github.com/endroid/qr-code/tree/4.3.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/endroid",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-09-17T07:50:43+00:00"
+        },
+        {
+            "name": "ezyang/htmlpurifier",
+            "version": "v4.13.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ezyang/htmlpurifier.git",
+                "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75",
+                "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2"
+            },
+            "require-dev": {
+                "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "HTMLPurifier": "library/"
+                },
+                "files": [
+                    "library/HTMLPurifier.composer.php"
+                ],
+                "exclude-from-classmap": [
+                    "/library/HTMLPurifier/Language/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Edward Z. Yang",
+                    "email": "admin@htmlpurifier.org",
+                    "homepage": "http://ezyang.com"
+                }
+            ],
+            "description": "Standards compliant HTML filter written in PHP",
+            "homepage": "http://htmlpurifier.org/",
+            "keywords": [
+                "html"
+            ],
+            "support": {
+                "issues": "https://github.com/ezyang/htmlpurifier/issues",
+                "source": "https://github.com/ezyang/htmlpurifier/tree/master"
+            },
+            "time": "2020-06-29T00:56:53+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "7008573787b430c1c1f650e3722d9bba59967628"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628",
+                "reference": "7008573787b430c1c1f650e3722d9bba59967628",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.4",
+                "guzzlehttp/psr7": "^1.7 || ^2.0",
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-client": "^1.0"
+            },
+            "provide": {
+                "psr/http-client-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "ext-curl": "*",
+                "php-http/client-integration-tests": "^3.0",
+                "phpunit/phpunit": "^8.5.5 || ^9.3.5",
+                "psr/log": "^1.1"
+            },
+            "suggest": {
+                "ext-curl": "Required for CURL handler support",
+                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "7.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "psr-18",
+                "psr-7",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle/issues",
+                "source": "https://github.com/guzzle/guzzle/tree/7.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/alexeyshockov",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/gmponos",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-03-23T11:33:13+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^4.4 || ^5.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/1.4.1"
+            },
+            "time": "2021-03-07T09:25:29+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7",
+                "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.0",
+                "ralouphie/getallheaders": "^3.0"
+            },
+            "provide": {
+                "psr/http-factory-implementation": "1.0",
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "http-interop/http-factory-tests": "^0.9",
+                "phpunit/phpunit": "^8.5.8 || ^9.3.10"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "homepage": "https://github.com/Tobion"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/psr7/issues",
+                "source": "https://github.com/guzzle/psr7/tree/2.0.0"
+            },
+            "time": "2021-06-30T20:03:07+00:00"
+        },
+        {
+            "name": "guzzlehttp/uri-template",
+            "version": "v1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/uri-template.git",
+                "reference": "88fcf8a3ea7489a8af6b25c9dfd3f688ddb51966"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/uri-template/zipball/88fcf8a3ea7489a8af6b25c9dfd3f688ddb51966",
+                "reference": "88fcf8a3ea7489a8af6b25c9dfd3f688ddb51966",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "symfony/polyfill-php80": "^1.17"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5.19 || ^9.5.8",
+                "uri-template/tests": "1.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\UriTemplate\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A polyfill class for uri_template of PHP",
+            "homepage": "https://github.com/guzzlehttp/uri-template",
+            "keywords": [
+                "guzzlehttp",
+                "uri-template"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/uri-template/issues",
+                "source": "https://github.com/guzzle/uri-template/tree/v1.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/gmponos",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-08-14T22:34:51+00:00"
+        },
+        {
+            "name": "lizhichao/one-sm",
+            "version": "1.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/lizhichao/sm.git",
+                "reference": "687a012a44a5bfd4d9143a0234e1060543be455a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/lizhichao/sm/zipball/687a012a44a5bfd4d9143a0234e1060543be455a",
+                "reference": "687a012a44a5bfd4d9143a0234e1060543be455a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "OneSm\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "tanszhe",
+                    "email": "1018595261@qq.com"
+                }
+            ],
+            "description": "国密sm3",
+            "keywords": [
+                "php",
+                "sm3"
+            ],
+            "support": {
+                "issues": "https://github.com/lizhichao/sm/issues",
+                "source": "https://github.com/lizhichao/sm/tree/1.10"
+            },
+            "funding": [
+                {
+                    "url": "https://www.vicsdf.com/img/w.jpg",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.vicsdf.com/img/z.jpg",
+                    "type": "custom"
+                }
+            ],
+            "time": "2021-05-26T06:19:22+00:00"
+        },
+        {
+            "name": "maennchen/zipstream-php",
+            "version": "2.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/maennchen/ZipStream-PHP.git",
+                "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58",
+                "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58",
+                "shasum": ""
+            },
+            "require": {
+                "myclabs/php-enum": "^1.5",
+                "php": ">= 7.1",
+                "psr/http-message": "^1.0",
+                "symfony/polyfill-mbstring": "^1.0"
+            },
+            "require-dev": {
+                "ext-zip": "*",
+                "guzzlehttp/guzzle": ">= 6.3",
+                "mikey179/vfsstream": "^1.6",
+                "phpunit/phpunit": ">= 7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "ZipStream\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paul Duncan",
+                    "email": "pabs@pablotron.org"
+                },
+                {
+                    "name": "Jonatan Männchen",
+                    "email": "jonatan@maennchen.ch"
+                },
+                {
+                    "name": "Jesse Donat",
+                    "email": "donatj@gmail.com"
+                },
+                {
+                    "name": "András Kolesár",
+                    "email": "kolesar@kolesar.hu"
+                }
+            ],
+            "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+            "keywords": [
+                "stream",
+                "zip"
+            ],
+            "support": {
+                "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
+                "source": "https://github.com/maennchen/ZipStream-PHP/tree/master"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/zipstream",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2020-05-30T13:11:16+00:00"
+        },
+        {
+            "name": "markbaker/complex",
+            "version": "3.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/MarkBaker/PHPComplex.git",
+                "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/ab8bc271e404909db09ff2d5ffa1e538085c0f22",
+                "reference": "ab8bc271e404909db09ff2d5ffa1e538085c0f22",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "phpcompatibility/php-compatibility": "^9.0",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Complex\\": "classes/src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@lange.demon.co.uk"
+                }
+            ],
+            "description": "PHP Class for working with complex numbers",
+            "homepage": "https://github.com/MarkBaker/PHPComplex",
+            "keywords": [
+                "complex",
+                "mathematics"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPComplex/issues",
+                "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.1"
+            },
+            "time": "2021-06-29T15:32:53+00:00"
+        },
+        {
+            "name": "markbaker/matrix",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/MarkBaker/PHPMatrix.git",
+                "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/c66aefcafb4f6c269510e9ac46b82619a904c576",
+                "reference": "c66aefcafb4f6c269510e9ac46b82619a904c576",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "phpcompatibility/php-compatibility": "^9.0",
+                "phpdocumentor/phpdocumentor": "2.*",
+                "phploc/phploc": "^4.0",
+                "phpmd/phpmd": "2.*",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3",
+                "sebastian/phpcpd": "^4.0",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Matrix\\": "classes/src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Baker",
+                    "email": "mark@demon-angel.eu"
+                }
+            ],
+            "description": "PHP Class for working with matrices",
+            "homepage": "https://github.com/MarkBaker/PHPMatrix",
+            "keywords": [
+                "mathematics",
+                "matrix",
+                "vector"
+            ],
+            "support": {
+                "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
+                "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.0"
+            },
+            "time": "2021-07-01T19:01:15+00:00"
+        },
+        {
+            "name": "myclabs/php-enum",
+            "version": "1.8.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/php-enum.git",
+                "reference": "b942d263c641ddb5190929ff840c68f78713e937"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937",
+                "reference": "b942d263c641ddb5190929ff840c68f78713e937",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.3 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5",
+                "squizlabs/php_codesniffer": "1.*",
+                "vimeo/psalm": "^4.6.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MyCLabs\\Enum\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP Enum contributors",
+                    "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
+                }
+            ],
+            "description": "PHP Enum implementation",
+            "homepage": "http://github.com/myclabs/php-enum",
+            "keywords": [
+                "enum"
+            ],
+            "support": {
+                "issues": "https://github.com/myclabs/php-enum/issues",
+                "source": "https://github.com/myclabs/php-enum/tree/1.8.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/mnapoli",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-07-05T08:18:36+00:00"
+        },
+        {
+            "name": "phpoffice/phpspreadsheet",
+            "version": "1.19.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+                "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
+                "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-dom": "*",
+                "ext-fileinfo": "*",
+                "ext-gd": "*",
+                "ext-iconv": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-simplexml": "*",
+                "ext-xml": "*",
+                "ext-xmlreader": "*",
+                "ext-xmlwriter": "*",
+                "ext-zip": "*",
+                "ext-zlib": "*",
+                "ezyang/htmlpurifier": "^4.13",
+                "maennchen/zipstream-php": "^2.1",
+                "markbaker/complex": "^3.0",
+                "markbaker/matrix": "^3.0",
+                "php": "^7.2 || ^8.0",
+                "psr/http-client": "^1.0",
+                "psr/http-factory": "^1.0",
+                "psr/simple-cache": "^1.0"
+            },
+            "require-dev": {
+                "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+                "dompdf/dompdf": "^1.0",
+                "friendsofphp/php-cs-fixer": "^2.18",
+                "jpgraph/jpgraph": "^4.0",
+                "mpdf/mpdf": "^8.0",
+                "phpcompatibility/php-compatibility": "^9.3",
+                "phpstan/phpstan": "^0.12.82",
+                "phpstan/phpstan-phpunit": "^0.12.18",
+                "phpunit/phpunit": "^8.5",
+                "squizlabs/php_codesniffer": "^3.5",
+                "tecnickcom/tcpdf": "^6.3"
+            },
+            "suggest": {
+                "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
+                "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+                "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+                "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Maarten Balliauw",
+                    "homepage": "https://blog.maartenballiauw.be"
+                },
+                {
+                    "name": "Mark Baker",
+                    "homepage": "https://markbakeruk.net"
+                },
+                {
+                    "name": "Franck Lefevre",
+                    "homepage": "https://rootslabs.net"
+                },
+                {
+                    "name": "Erik Tilt"
+                },
+                {
+                    "name": "Adrien Crivelli"
+                }
+            ],
+            "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+            "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+            "keywords": [
+                "OpenXML",
+                "excel",
+                "gnumeric",
+                "ods",
+                "php",
+                "spreadsheet",
+                "xls",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.19.0"
+            },
+            "time": "2021-10-31T15:09:20+00:00"
+        },
+        {
+            "name": "psr/http-client",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-client.git",
+                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "psr/http-message": "^1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP clients",
+            "homepage": "https://github.com/php-fig/http-client",
+            "keywords": [
+                "http",
+                "http-client",
+                "psr",
+                "psr-18"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-client/tree/master"
+            },
+            "time": "2020-06-29T06:28:15+00:00"
+        },
+        {
+            "name": "psr/http-factory",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-factory.git",
+                "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+                "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.0.0",
+                "psr/http-message": "^1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for PSR-7 HTTP message factories",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "psr",
+                "psr-17",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-factory/tree/master"
+            },
+            "time": "2019-04-30T12:38:16+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/master"
+            },
+            "time": "2016-08-06T14:39:51+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/simple-cache/tree/master"
+            },
+            "time": "2017-10-23T01:57:42+00:00"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.23.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6",
+                "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.23-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-05-27T12:26:48+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.23.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be",
+                "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.23-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-07-28T13:41:28+00:00"
+        },
+        {
+            "name": "tencentcloud/tencentcloud-sdk-php",
+            "version": "3.0.551",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git",
+                "reference": "dc5fca27258258e4b8df9f0f0996d4d3358c1d37"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/dc5fca27258258e4b8df9f0f0996d4d3358c1d37",
+                "reference": "dc5fca27258258e4b8df9f0f0996d4d3358c1d37",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6.3 || ^7.0",
+                "php": ">=5.6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/QcloudApi/QcloudApi.php"
+                ],
+                "psr-4": {
+                    "TencentCloud\\": "./src/TencentCloud"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "coolli",
+                    "email": "tencentcloudapi@tencent.com",
+                    "homepage": "https://cloud.tencent.com/document/sdk/PHP",
+                    "role": "Developer"
+                }
+            ],
+            "description": "TencentCloudApi php sdk",
+            "homepage": "https://github.com/TencentCloud/tencentcloud-sdk-php",
+            "support": {
+                "issues": "https://github.com/TencentCloud/tencentcloud-sdk-php/issues",
+                "source": "https://github.com/TencentCloud/tencentcloud-sdk-php/tree/3.0.551"
+            },
+            "time": "2021-12-30T00:37:24+00:00"
+        },
+        {
+            "name": "wechatpay/wechatpay",
+            "version": "1.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wechatpay-apiv3/wechatpay-php.git",
+                "reference": "abc22471dc0fd0867ad63e5bac98215aee2cbb37"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wechatpay-apiv3/wechatpay-php/zipball/abc22471dc0fd0867ad63e5bac98215aee2cbb37",
+                "reference": "abc22471dc0fd0867ad63e5bac98215aee2cbb37",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-libxml": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "guzzlehttp/guzzle": "^7.0",
+                "guzzlehttp/uri-template": "^0.2 || ^1.0",
+                "php": ">=7.2"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^0.12.89",
+                "phpunit/phpunit": "^8.5.5 || ^9.3.5"
+            },
+            "bin": [
+                "bin/CertificateDownloader.php"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "WeChatPay\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "James ZHANG",
+                    "homepage": "https://github.com/TheNorthMemory"
+                },
+                {
+                    "name": "WeChatPay Community",
+                    "homepage": "https://developers.weixin.qq.com/community/pay"
+                }
+            ],
+            "description": "[A]Sync Chainable WeChatPay v2&v3's OpenAPI SDK for PHP",
+            "homepage": "https://pay.weixin.qq.com/",
+            "keywords": [
+                "AES-GCM",
+                "aes-ecb",
+                "openapi-chainable",
+                "rsa-oaep",
+                "wechatpay",
+                "xml-builder",
+                "xml-parser"
+            ],
+            "support": {
+                "issues": "https://github.com/wechatpay-apiv3/wechatpay-php/issues",
+                "source": "https://github.com/wechatpay-apiv3/wechatpay-php/tree/v1.3.2"
+            },
+            "time": "2021-09-30T02:41:06+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": [],
+    "plugin-api-version": "2.1.0"
+}

+ 21 - 0
base/composer/vendor/adbario/php-dot-notation/LICENSE.md

@@ -0,0 +1,21 @@
+# The MIT License (MIT)
+
+Copyright (c) 2016-2019 Riku Särkinen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 29 - 0
base/composer/vendor/adbario/php-dot-notation/composer.json

@@ -0,0 +1,29 @@
+{
+    "name": "adbario/php-dot-notation",
+    "description": "PHP dot notation access to arrays",
+    "keywords": ["dotnotation", "arrayaccess"],
+    "homepage": "https://github.com/adbario/php-dot-notation",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Riku Särkinen",
+            "email": "riku@adbar.io"
+        }
+    ],
+    "require": {
+        "php": ">=5.5",
+        "ext-json": "*"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^4.0|^5.0|^6.0",
+        "squizlabs/php_codesniffer": "^3.0"
+    },
+    "autoload": {
+        "files": [
+            "src/helpers.php"
+        ],
+        "psr-4": {
+            "Adbar\\": "src"
+        }
+    }
+}

+ 601 - 0
base/composer/vendor/adbario/php-dot-notation/src/Dot.php

@@ -0,0 +1,601 @@
+<?php
+/**
+ * Dot - PHP dot notation access to arrays
+ *
+ * @author  Riku Särkinen <riku@adbar.io>
+ * @link    https://github.com/adbario/php-dot-notation
+ * @license https://github.com/adbario/php-dot-notation/blob/2.x/LICENSE.md (MIT License)
+ */
+namespace Adbar;
+
+use Countable;
+use ArrayAccess;
+use ArrayIterator;
+use JsonSerializable;
+use IteratorAggregate;
+
+/**
+ * Dot
+ *
+ * This class provides a dot notation access and helper functions for
+ * working with arrays of data. Inspired by Laravel Collection.
+ */
+class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
+{
+    /**
+     * The stored items
+     *
+     * @var array
+     */
+    protected $items = [];
+
+    /**
+     * Create a new Dot instance
+     *
+     * @param mixed $items
+     */
+    public function __construct($items = [])
+    {
+        $this->items = $this->getArrayItems($items);
+    }
+
+    /**
+     * Set a given key / value pair or pairs
+     * if the key doesn't exist already
+     *
+     * @param array|int|string $keys
+     * @param mixed            $value
+     */
+    public function add($keys, $value = null)
+    {
+        if (is_array($keys)) {
+            foreach ($keys as $key => $value) {
+                $this->add($key, $value);
+            }
+        } elseif (is_null($this->get($keys))) {
+            $this->set($keys, $value);
+        }
+    }
+
+    /**
+     * Return all the stored items
+     *
+     * @return array
+     */
+    public function all()
+    {
+        return $this->items;
+    }
+
+    /**
+     * Delete the contents of a given key or keys
+     *
+     * @param array|int|string|null $keys
+     */
+    public function clear($keys = null)
+    {
+        if (is_null($keys)) {
+            $this->items = [];
+
+            return;
+        }
+
+        $keys = (array) $keys;
+
+        foreach ($keys as $key) {
+            $this->set($key, []);
+        }
+    }
+
+    /**
+     * Delete the given key or keys
+     *
+     * @param array|int|string $keys
+     */
+    public function delete($keys)
+    {
+        $keys = (array) $keys;
+
+        foreach ($keys as $key) {
+            if ($this->exists($this->items, $key)) {
+                unset($this->items[$key]);
+
+                continue;
+            }
+
+            $items = &$this->items;
+            $segments = explode('.', $key);
+            $lastSegment = array_pop($segments);
+
+            foreach ($segments as $segment) {
+                if (!isset($items[$segment]) || !is_array($items[$segment])) {
+                    continue 2;
+                }
+
+                $items = &$items[$segment];
+            }
+
+            unset($items[$lastSegment]);
+        }
+    }
+
+    /**
+     * Checks if the given key exists in the provided array.
+     *
+     * @param  array      $array Array to validate
+     * @param  int|string $key   The key to look for
+     *
+     * @return bool
+     */
+    protected function exists($array, $key)
+    {
+        return array_key_exists($key, $array);
+    }
+
+    /**
+     * Flatten an array with the given character as a key delimiter
+     *
+     * @param  string     $delimiter
+     * @param  array|null $items
+     * @param  string     $prepend
+     * @return array
+     */
+    public function flatten($delimiter = '.', $items = null, $prepend = '')
+    {
+        $flatten = [];
+
+        if (is_null($items)) {
+            $items = $this->items;
+        }
+
+        foreach ($items as $key => $value) {
+            if (is_array($value) && !empty($value)) {
+                $flatten = array_merge(
+                    $flatten,
+                    $this->flatten($delimiter, $value, $prepend.$key.$delimiter)
+                );
+            } else {
+                $flatten[$prepend.$key] = $value;
+            }
+        }
+
+        return $flatten;
+    }
+
+    /**
+     * Return the value of a given key
+     *
+     * @param  int|string|null $key
+     * @param  mixed           $default
+     * @return mixed
+     */
+    public function get($key = null, $default = null)
+    {
+        if (is_null($key)) {
+            return $this->items;
+        }
+
+        if ($this->exists($this->items, $key)) {
+            return $this->items[$key];
+        }
+
+        if (strpos($key, '.') === false) {
+            return $default;
+        }
+
+        $items = $this->items;
+
+        foreach (explode('.', $key) as $segment) {
+            if (!is_array($items) || !$this->exists($items, $segment)) {
+                return $default;
+            }
+
+            $items = &$items[$segment];
+        }
+
+        return $items;
+    }
+
+    /**
+     * Return the given items as an array
+     *
+     * @param  mixed $items
+     * @return array
+     */
+    protected function getArrayItems($items)
+    {
+        if (is_array($items)) {
+            return $items;
+        } elseif ($items instanceof self) {
+            return $items->all();
+        }
+
+        return (array) $items;
+    }
+
+    /**
+     * Check if a given key or keys exists
+     *
+     * @param  array|int|string $keys
+     * @return bool
+     */
+    public function has($keys)
+    {
+        $keys = (array) $keys;
+
+        if (!$this->items || $keys === []) {
+            return false;
+        }
+
+        foreach ($keys as $key) {
+            $items = $this->items;
+
+            if ($this->exists($items, $key)) {
+                continue;
+            }
+
+            foreach (explode('.', $key) as $segment) {
+                if (!is_array($items) || !$this->exists($items, $segment)) {
+                    return false;
+                }
+
+                $items = $items[$segment];
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Check if a given key or keys are empty
+     *
+     * @param  array|int|string|null $keys
+     * @return bool
+     */
+    public function isEmpty($keys = null)
+    {
+        if (is_null($keys)) {
+            return empty($this->items);
+        }
+
+        $keys = (array) $keys;
+
+        foreach ($keys as $key) {
+            if (!empty($this->get($key))) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Merge a given array or a Dot object with the given key
+     * or with the whole Dot object
+     *
+     * @param array|string|self $key
+     * @param array|self        $value
+     */
+    public function merge($key, $value = [])
+    {
+        if (is_array($key)) {
+            $this->items = array_merge($this->items, $key);
+        } elseif (is_string($key)) {
+            $items = (array) $this->get($key);
+            $value = array_merge($items, $this->getArrayItems($value));
+
+            $this->set($key, $value);
+        } elseif ($key instanceof self) {
+            $this->items = array_merge($this->items, $key->all());
+        }
+    }
+
+    /**
+     * Recursively merge a given array or a Dot object with the given key
+     * or with the whole Dot object.
+     *
+     * Duplicate keys are converted to arrays.
+     *
+     * @param array|string|self $key
+     * @param array|self        $value
+     */
+    public function mergeRecursive($key, $value = [])
+    {
+        if (is_array($key)) {
+            $this->items = array_merge_recursive($this->items, $key);
+        } elseif (is_string($key)) {
+            $items = (array) $this->get($key);
+            $value = array_merge_recursive($items, $this->getArrayItems($value));
+
+            $this->set($key, $value);
+        } elseif ($key instanceof self) {
+            $this->items = array_merge_recursive($this->items, $key->all());
+        }
+    }
+
+    /**
+     * Recursively merge a given array or a Dot object with the given key
+     * or with the whole Dot object.
+     *
+     * Instead of converting duplicate keys to arrays, the value from
+     * given array will replace the value in Dot object.
+     *
+     * @param array|string|self $key
+     * @param array|self        $value
+     */
+    public function mergeRecursiveDistinct($key, $value = [])
+    {
+        if (is_array($key)) {
+            $this->items = $this->arrayMergeRecursiveDistinct($this->items, $key);
+        } elseif (is_string($key)) {
+            $items = (array) $this->get($key);
+            $value = $this->arrayMergeRecursiveDistinct($items, $this->getArrayItems($value));
+
+            $this->set($key, $value);
+        } elseif ($key instanceof self) {
+            $this->items = $this->arrayMergeRecursiveDistinct($this->items, $key->all());
+        }
+    }
+
+    /**
+     * Merges two arrays recursively. In contrast to array_merge_recursive,
+     * duplicate keys are not converted to arrays but rather overwrite the
+     * value in the first array with the duplicate value in the second array.
+     *
+     * @param  array $array1 Initial array to merge
+     * @param  array $array2 Array to recursively merge
+     * @return array
+     */
+    protected function arrayMergeRecursiveDistinct(array $array1, array $array2)
+    {
+        $merged = &$array1;
+
+        foreach ($array2 as $key => $value) {
+            if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
+                $merged[$key] = $this->arrayMergeRecursiveDistinct($merged[$key], $value);
+            } else {
+                $merged[$key] = $value;
+            }
+        }
+
+        return $merged;
+    }
+
+    /**
+     * Return the value of a given key and
+     * delete the key
+     *
+     * @param  int|string|null $key
+     * @param  mixed           $default
+     * @return mixed
+     */
+    public function pull($key = null, $default = null)
+    {
+        if (is_null($key)) {
+            $value = $this->all();
+            $this->clear();
+
+            return $value;
+        }
+
+        $value = $this->get($key, $default);
+        $this->delete($key);
+
+        return $value;
+    }
+
+    /**
+     * Push a given value to the end of the array
+     * in a given key
+     *
+     * @param mixed $key
+     * @param mixed $value
+     */
+    public function push($key, $value = null)
+    {
+        if (is_null($value)) {
+            $this->items[] = $key;
+
+            return;
+        }
+
+        $items = $this->get($key);
+
+        if (is_array($items) || is_null($items)) {
+            $items[] = $value;
+            $this->set($key, $items);
+        }
+    }
+
+    /**
+     * Replace all values or values within the given key
+     * with an array or Dot object
+     *
+     * @param array|string|self $key
+     * @param array|self        $value
+     */
+    public function replace($key, $value = [])
+    {
+        if (is_array($key)) {
+            $this->items = array_replace($this->items, $key);
+        } elseif (is_string($key)) {
+            $items = (array) $this->get($key);
+            $value = array_replace($items, $this->getArrayItems($value));
+
+            $this->set($key, $value);
+        } elseif ($key instanceof self) {
+            $this->items = array_replace($this->items, $key->all());
+        }
+    }
+
+    /**
+     * Set a given key / value pair or pairs
+     *
+     * @param array|int|string $keys
+     * @param mixed            $value
+     */
+    public function set($keys, $value = null)
+    {
+        if (is_array($keys)) {
+            foreach ($keys as $key => $value) {
+                $this->set($key, $value);
+            }
+
+            return;
+        }
+
+        $items = &$this->items;
+
+        foreach (explode('.', $keys) as $key) {
+            if (!isset($items[$key]) || !is_array($items[$key])) {
+                $items[$key] = [];
+            }
+
+            $items = &$items[$key];
+        }
+
+        $items = $value;
+    }
+
+    /**
+     * Replace all items with a given array
+     *
+     * @param mixed $items
+     */
+    public function setArray($items)
+    {
+        $this->items = $this->getArrayItems($items);
+    }
+
+    /**
+     * Replace all items with a given array as a reference
+     *
+     * @param array $items
+     */
+    public function setReference(array &$items)
+    {
+        $this->items = &$items;
+    }
+
+    /**
+     * Return the value of a given key or all the values as JSON
+     *
+     * @param  mixed  $key
+     * @param  int    $options
+     * @return string
+     */
+    public function toJson($key = null, $options = 0)
+    {
+        if (is_string($key)) {
+            return json_encode($this->get($key), $options);
+        }
+
+        $options = $key === null ? 0 : $key;
+
+        return json_encode($this->items, $options);
+    }
+
+    /*
+     * --------------------------------------------------------------
+     * ArrayAccess interface
+     * --------------------------------------------------------------
+     */
+
+    /**
+     * Check if a given key exists
+     *
+     * @param  int|string $key
+     * @return bool
+     */
+    public function offsetExists($key)
+    {
+        return $this->has($key);
+    }
+
+    /**
+     * Return the value of a given key
+     *
+     * @param  int|string $key
+     * @return mixed
+     */
+    public function offsetGet($key)
+    {
+        return $this->get($key);
+    }
+
+    /**
+     * Set a given value to the given key
+     *
+     * @param int|string|null $key
+     * @param mixed           $value
+     */
+    public function offsetSet($key, $value)
+    {
+        if (is_null($key)) {
+            $this->items[] = $value;
+
+            return;
+        }
+
+        $this->set($key, $value);
+    }
+
+    /**
+     * Delete the given key
+     *
+     * @param int|string $key
+     */
+    public function offsetUnset($key)
+    {
+        $this->delete($key);
+    }
+
+    /*
+     * --------------------------------------------------------------
+     * Countable interface
+     * --------------------------------------------------------------
+     */
+
+    /**
+     * Return the number of items in a given key
+     *
+     * @param  int|string|null $key
+     * @return int
+     */
+    public function count($key = null)
+    {
+        return count($this->get($key));
+    }
+
+    /*
+     * --------------------------------------------------------------
+     * IteratorAggregate interface
+     * --------------------------------------------------------------
+     */
+
+     /**
+     * Get an iterator for the stored items
+     *
+     * @return \ArrayIterator
+     */
+    public function getIterator()
+    {
+        return new ArrayIterator($this->items);
+    }
+
+    /*
+     * --------------------------------------------------------------
+     * JsonSerializable interface
+     * --------------------------------------------------------------
+     */
+
+    /**
+     * Return items for JSON serialization
+     *
+     * @return array
+     */
+    public function jsonSerialize()
+    {
+        return $this->items;
+    }
+}

+ 23 - 0
base/composer/vendor/adbario/php-dot-notation/src/helpers.php

@@ -0,0 +1,23 @@
+<?php
+/**
+ * Dot - PHP dot notation access to arrays
+ *
+ * @author  Riku Särkinen <riku@adbar.io>
+ * @link    https://github.com/adbario/php-dot-notation
+ * @license https://github.com/adbario/php-dot-notation/blob/2.x/LICENSE.md (MIT License)
+ */
+
+use Adbar\Dot;
+
+if (! function_exists('dot')) {
+    /**
+     * Create a new Dot object with the given items
+     *
+     * @param  mixed $items
+     * @return \Adbar\Dot
+     */
+    function dot($items)
+    {
+        return new Dot($items);
+    }
+}

+ 14 - 0
base/composer/vendor/alibabacloud/credentials/CHANGELOG.md

@@ -0,0 +1,14 @@
+# CHANGELOG
+
+## 1.1.3 - 2020-12-24
+
+- Require guzzle ^6.3|^7.0
+
+## 1.0.2 - 2020-02-14
+- Update Tea.
+
+## 1.0.1 - 2019-12-30
+- Supported get `Role Name` automatically.
+
+## 1.0.0 - 2019-09-01
+- Initial release of the Alibaba Cloud Credentials for PHP Version 1.0.0 on Packagist See <https://github.com/aliyun/credentials-php> for more information.

+ 30 - 0
base/composer/vendor/alibabacloud/credentials/CONTRIBUTING.md

@@ -0,0 +1,30 @@
+# CONTRIBUTING
+
+We work hard to provide a high-quality and useful SDK for Alibaba Cloud, and
+we greatly value feedback and contributions from our community. Please submit
+your [issues][issues] or [pull requests][pull-requests] through GitHub.
+
+## Tips
+
+- The SDK is released under the [Apache license][license]. Any code you submit
+   will be released under that license. For substantial contributions, we may
+   ask you to sign a [Alibaba Documentation Corporate Contributor License 
+   Agreement (CLA)][cla].
+- We follow all of the relevant PSR recommendations from the [PHP Framework
+   Interop Group][php-fig]. Please submit code that follows these standards.
+   The [PHP CS Fixer][cs-fixer] tool can be helpful for formatting your code.
+   Your can use `composer fixer` to fix code.
+- We maintain a high percentage of code coverage in our unit tests. If you make
+   changes to the code, please add, update, and/or remove tests as appropriate.
+- If your code does not conform to the PSR standards, does not include adequate
+   tests, or does not contain a changelog document, we may ask you to update
+   your pull requests before we accept them. We also reserve the right to deny
+   any pull requests that do not align with our standards or goals.
+
+[issues]: https://github.com/aliyun/credentials-php/issues
+[pull-requests]: https://github.com/aliyun/credentials-php/pulls
+[license]: http://www.apache.org/licenses/LICENSE-2.0
+[cla]: https://alibaba-cla-2018.oss-cn-beijing.aliyuncs.com/Alibaba_Documentation_Open_Source_Corporate_CLA.pdf
+[php-fig]: http://php-fig.org
+[cs-fixer]: http://cs.sensiolabs.org/
+[docs-readme]: https://github.com/aliyun/credentials-php/blob/master/README.md

+ 13 - 0
base/composer/vendor/alibabacloud/credentials/LICENSE.md

@@ -0,0 +1,13 @@
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.

+ 88 - 0
base/composer/vendor/alibabacloud/credentials/NOTICE.md

@@ -0,0 +1,88 @@
+# NOTICE
+
+<https://www.alibabacloud.com/>
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License").
+You may not use this file except in compliance with the License.
+A copy of the License is located at
+
+<http://www.apache.org/licenses/LICENSE-2.0>
+
+or in the "license" file accompanying this file. This file is distributed
+on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+express or implied. See the License for the specific language governing
+permissions and limitations under the License.
+
+# Guzzle
+
+<https://github.com/guzzle/guzzle>
+
+Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+# jmespath.php
+
+<https://github.com/mtdowling/jmespath.php>
+
+Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+# Dot
+
+<https://github.com/adbario/php-dot-notation>
+
+Copyright (c) 2016-2019 Riku Särkinen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 250 - 0
base/composer/vendor/alibabacloud/credentials/README-zh-CN.md

@@ -0,0 +1,250 @@
+[English](/README.md) | 简体中文
+
+
+# Alibaba Cloud Credentials for PHP
+[![Latest Stable Version](https://poser.pugx.org/alibabacloud/credentials/v/stable)](https://packagist.org/packages/alibabacloud/credentials)
+[![composer.lock](https://poser.pugx.org/alibabacloud/credentials/composerlock)](https://packagist.org/packages/alibabacloud/credentials)
+[![Total Downloads](https://poser.pugx.org/alibabacloud/credentials/downloads)](https://packagist.org/packages/alibabacloud/credentials)
+[![License](https://poser.pugx.org/alibabacloud/credentials/license)](https://packagist.org/packages/alibabacloud/credentials)
+[![codecov](https://codecov.io/gh/aliyun/credentials-php/branch/master/graph/badge.svg)](https://codecov.io/gh/aliyun/credentials-php)
+[![Travis Build Status](https://travis-ci.org/aliyun/credentials-php.svg?branch=master)](https://travis-ci.org/aliyun/credentials-php)
+[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/6jxpwmhyfipagtge/branch/master?svg=true)](https://ci.appveyor.com/project/aliyun/credentials-php)
+
+
+![](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
+
+
+Alibaba Cloud Credentials for PHP 是帮助 PHP 开发者管理凭据的工具。
+
+
+## 先决条件
+您的系统需要满足[先决条件](/docs/zh-CN/0-Prerequisites.md),包括 PHP> = 5.6。 我们强烈建议使用cURL扩展,并使用TLS后端编译cURL 7.16.2+。
+
+
+## 安装依赖
+如果已在系统上[全局安装 Composer](https://getcomposer.org/doc/00-intro.md#globally),请直接在项目目录中运行以下内容来安装 Alibaba Cloud Credentials for PHP 作为依赖项:
+```
+composer require alibabacloud/credentials
+```
+> 一些用户可能由于网络问题无法安装,可以使用[阿里云 Composer 全量镜像](https://developer.aliyun.com/composer)。
+
+请看[安装](/docs/zh-CN/1-Installation.md)有关通过 Composer 和其他方式安装的详细信息。
+
+
+## 快速使用
+在您开始之前,您需要注册阿里云帐户并获取您的[凭证](https://usercenter.console.aliyun.com/#/manage/ak)。
+
+### 凭证类型
+
+#### AccessKey
+
+通过[用户信息管理][ak]设置 access_key,它们具有该账户完全的权限,请妥善保管。有时出于安全考虑,您不能把具有完全访问权限的主账户 AccessKey 交于一个项目的开发者使用,您可以[创建RAM子账户][ram]并为子账户[授权][permissions],使用RAM子用户的 AccessKey 来进行API调用。
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+// Chain Provider if no Parameter
+$credential = new Credential();
+$credential->getAccessKeyId();
+$credential->getAccessKeySecret();
+
+// Access Key
+$ak = new Credential([
+    'type'              => 'access_key',
+    'access_key_id'     => '<access_key_id>',
+    'access_key_secret' => '<access_key_secret>',
+]);
+$ak->getAccessKeyId();
+$ak->getAccessKeySecret();
+```
+
+#### STS
+
+通过安全令牌服务(Security Token Service,简称 STS),申请临时安全凭证(Temporary Security Credentials,简称 TSC),创建临时安全凭证。
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$sts = new Credential([
+    'type'             => 'sts',
+    'access_key_id'    => '<access_key_id>',
+    'accessKey_secret' => '<accessKey_secret>',
+    'security_token'   => '<security_token>',
+]);
+$sts->getAccessKeyId();
+$sts->getAccessKeySecret();
+$sts->getSecurityToken();
+```
+
+#### RamRoleArn
+
+通过指定[RAM角色][RAM Role],让凭证自动申请维护 STS Token。你可以通过为 `Policy` 赋值来限制获取到的 STS Token 的权限。
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$ramRoleArn = new Credential([
+    'type'              => 'ram_role_arn',
+    'access_key_id'     => '<access_key_id>',
+    'access_key_secret' => '<access_key_secret>',
+    'role_arn'          => '<role_arn>',
+    'role_session_name' => '<role_session_name>',
+    'policy'            => '',
+]);
+$ramRoleArn->getAccessKeyId();
+$ramRoleArn->getAccessKeySecret();
+$ramRoleArn->getRoleArn();
+$ramRoleArn->getRoleSessionName();
+$ramRoleArn->getPolicy();
+```
+
+#### EcsRamRole
+
+通过指定角色名称,让凭证自动申请维护 STS Token
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$ecsRamRole = new Credential([
+    'type'      => 'ecs_ram_role',
+    'role_name' => '<role_name>',
+]);
+$ecsRamRole->getRoleName();
+// Note: `role_name` is optional. It will be retrieved automatically if not set. It is highly recommended to set it up to reduce requests.
+```
+
+#### RsaKeyPair
+
+通过指定公钥Id和私钥文件,让凭证自动申请维护 AccessKey。仅支持日本站。
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$rsaKeyPair = new Credential([
+    'type'             => 'rsa_key_pair',
+    'public_key_id'    => '<public_key_id>',
+    'private_key_file' => '<private_key_file>',
+]);
+$rsaKeyPair->getPublicKeyId();
+$rsaKeyPair->getPrivateKey();
+```
+
+#### Bearer Token
+
+如呼叫中心(CCC)需用此凭证,请自行申请维护 Bearer Token。
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$bearerToken = new Credential([
+    'type'         => 'bearer_token',
+    'bearer_token' => '<bearer_token>',
+]);
+$bearerToken->getBearerToken();
+$bearerToken->getSignature();
+```
+
+## 默认凭证提供程序链
+默认凭证提供程序链查找可用的凭证,寻找顺序如下:
+
+### 1. 环境凭证
+程序首先会在环境变量里寻找环境凭证,如果定义了 `ALIBABA_CLOUD_ACCESS_KEY_ID`  和 `ALIBABA_CLOUD_ACCESS_KEY_SECRET` 环境变量且不为空,程序将使用他们创建默认凭证。
+
+### 2. 配置文件
+> 如果用户主目录存在默认文件 `~/.alibabacloud/credentials` (Windows 为 `C:\Users\USER_NAME\.alibabacloud\credentials`),程序会自动创建指定类型和名称的凭证。默认文件可以不存在,但解析错误会抛出异常。  凭证名称不分大小写,若凭证同名,后者会覆盖前者。不同的项目、工具之间可以共用这个配置文件,因为超出项目之外,也不会被意外提交到版本控制。Windows 上可以使用环境变量引用到主目录 %UserProfile%。类 Unix 的系统可以使用环境变量 $HOME 或 ~ (tilde)。 可以通过定义 `ALIBABA_CLOUD_CREDENTIALS_FILE` 环境变量修改默认文件的路径。
+
+```ini
+[default]
+type = access_key                  # 认证方式为 access_key
+access_key_id = foo                # Key
+access_key_secret = bar            # Secret
+
+[project1]
+type = ecs_ram_role                # 认证方式为 ecs_ram_role
+role_name = EcsRamRoleTest         # Role Name,非必填,不填则自动获取,建议设置,可以减少网络请求。
+
+[project2]
+type = ram_role_arn                # 认证方式为 ram_role_arn
+access_key_id = foo
+access_key_secret = bar
+role_arn = role_arn
+role_session_name = session_name
+
+[project3]
+type = rsa_key_pair                # 认证方式为 rsa_key_pair
+public_key_id = publicKeyId        # Public Key ID
+private_key_file = /your/pk.pem    # Private Key 文件
+```
+
+### 3. 实例 RAM 角色
+如果定义了环境变量 `ALIBABA_CLOUD_ECS_METADATA` 且不为空,程序会将该环境变量的值作为角色名称,请求 `http://100.100.100.200/latest/meta-data/ram/security-credentials/` 获取临时安全凭证作为默认凭证。
+
+### 自定义凭证提供程序链
+可通过自定义程序链代替默认程序链的寻找顺序,也可以自行编写闭包传入提供者。
+```php
+<?php
+
+use AlibabaCloud\Credentials\Providers\ChainProvider;
+
+ChainProvider::set(
+        ChainProvider::ini(),
+        ChainProvider::env(),
+        ChainProvider::instance()
+);
+```
+
+
+## 文档
+* [先决条件](/docs/zh-CN/0-Prerequisites.md)
+* [安装](/docs/zh-CN/1-Installation.md)
+
+
+## 问题
+[提交 Issue](https://github.com/aliyun/credentials-php/issues/new/choose),不符合指南的问题可能会立即关闭。
+
+
+## 发行说明
+每个版本的详细更改记录在[发行说明](/CHANGELOG.md)中。
+
+
+## 贡献
+提交 Pull Request 之前请阅读[贡献指南](/CONTRIBUTING.md)。
+
+
+## 相关
+* [OpenAPI 开发者门户][open-api]
+* [Packagist][packagist]
+* [Composer][composer]
+* [Guzzle中文文档][guzzle-docs]
+* [最新源码][latest-release]
+
+
+## 许可证
+[Apache-2.0](/LICENSE.md)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
+
+
+[open-api]: https://next.api.aliyun.com
+[latest-release]: https://github.com/aliyun/credentials-php
+[guzzle-docs]: https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html
+[composer]: https://getcomposer.org
+[packagist]: https://packagist.org/packages/alibabacloud/credentials
+[home]: https://home.console.aliyun.com
+[aliyun]: https://www.aliyun.com
+[cURL]: http://php.net/manual/zh/book.curl.php
+[OPCache]: http://php.net/manual/zh/book.opcache.php
+[xdebug]: http://xdebug.org
+[OpenSSL]: http://php.net/manual/zh/book.openssl.php

+ 251 - 0
base/composer/vendor/alibabacloud/credentials/README.md

@@ -0,0 +1,251 @@
+English | [简体中文](/README-zh-CN.md)
+
+
+# Alibaba Cloud Credentials for PHP
+[![Latest Stable Version](https://poser.pugx.org/alibabacloud/credentials/v/stable)](https://packagist.org/packages/alibabacloud/credentials)
+[![composer.lock](https://poser.pugx.org/alibabacloud/credentials/composerlock)](https://packagist.org/packages/alibabacloud/credentials)
+[![Total Downloads](https://poser.pugx.org/alibabacloud/credentials/downloads)](https://packagist.org/packages/alibabacloud/credentials)
+[![License](https://poser.pugx.org/alibabacloud/credentials/license)](https://packagist.org/packages/alibabacloud/credentials)
+[![codecov](https://codecov.io/gh/aliyun/credentials-php/branch/master/graph/badge.svg)](https://codecov.io/gh/aliyun/credentials-php)
+[![Travis Build Status](https://travis-ci.org/aliyun/credentials-php.svg?branch=master)](https://travis-ci.org/aliyun/credentials-php)
+[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/6jxpwmhyfipagtge/branch/master?svg=true)](https://ci.appveyor.com/project/aliyun/credentials-php)
+
+
+![](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
+
+
+Alibaba Cloud Credentials for PHP is a tool that helps PHP developers manage their credentials.
+
+
+## Prerequisites
+Your system needs to meet [Prerequisites](/docs/zh-CN/0-Prerequisites.md), including PHP> = 5.6. We strongly recommend using the cURL extension and compiling cURL 7.16.2+ using the TLS backend.
+
+
+## Installation
+If you have [Globally Install Composer](https://getcomposer.org/doc/00-intro.md#globally) on your system, install Alibaba Cloud Credentials for PHP as a dependency by running the following directly in the project directory:
+```
+composer require alibabacloud/credentials
+```
+> Some users may not be able to install due to network problems, you can switch to the [Alibaba Cloud Composer Mirror](https://developer.aliyun.com/composer).
+
+See [Installation](/docs/zh-CN/1-Installation.md) for details on installing through Composer and other means.
+
+
+## Quick Examples
+Before you begin, you need to sign up for an Alibaba Cloud account and retrieve your [Credentials](https://usercenter.console.aliyun.com/#/manage/ak).
+
+### Credential Type
+
+#### AccessKey
+
+Setup access_key credential through [User Information Management][ak], it have full authority over the account, please keep it safe. Sometimes for security reasons, you cannot hand over a primary account AccessKey with full access to the developer of a project. You may create a sub-account [RAM Sub-account][ram] , grant its [authorization][permissions],and use the AccessKey of RAM Sub-account.
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+// Chain Provider if no Parameter
+$credential = new Credential();
+$credential->getAccessKeyId();
+$credential->getAccessKeySecret();
+
+// Access Key
+$ak = new Credential([
+    'type'              => 'access_key',
+    'access_key_id'     => '<access_key_id>',
+    'access_key_secret' => '<access_key_secret>',
+]);
+$ak->getAccessKeyId();
+$ak->getAccessKeySecret();
+```
+
+#### STS
+
+Create a temporary security credential by applying Temporary Security Credentials (TSC) through the Security Token Service (STS).
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$sts = new Credential([
+    'type'             => 'sts',
+    'access_key_id'    => '<access_key_id>',
+    'accessKey_secret' => '<accessKey_secret>',
+    'security_token'   => '<security_token>',
+]);
+$sts->getAccessKeyId();
+$sts->getAccessKeySecret();
+$sts->getSecurityToken();
+```
+
+#### RamRoleArn
+
+By specifying [RAM Role][RAM Role], the credential will be able to automatically request maintenance of STS Token. If you want to limit the permissions([How to make a policy][policy]) of STS Token, you can assign value for `Policy`.
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$ramRoleArn = new Credential([
+    'type'              => 'ram_role_arn',
+    'access_key_id'     => '<access_key_id>',
+    'access_key_secret' => '<access_key_secret>',
+    'role_arn'          => '<role_arn>',
+    'role_session_name' => '<role_session_name>',
+    'policy'            => '',
+]);
+$ramRoleArn->getAccessKeyId();
+$ramRoleArn->getAccessKeySecret();
+$ramRoleArn->getRoleArn();
+$ramRoleArn->getRoleSessionName();
+$ramRoleArn->getPolicy();
+```
+
+#### EcsRamRole
+
+By specifying the role name, the credential will be able to automatically request maintenance of STS Token.
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$ecsRamRole = new Credential([
+    'type'      => 'ecs_ram_role',
+    'role_name' => '<role_name>',
+]);
+$ecsRamRole->getRoleName();
+// Note: `role_name` is optional. It will be retrieved automatically if not set. It is highly recommended to set it up to reduce requests.
+```
+
+#### RsaKeyPair
+
+By specifying the public key Id and the private key file, the credential will be able to automatically request maintenance of the AccessKey before sending the request. Only Japan station is supported. 
+
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$rsaKeyPair = new Credential([
+    'type'             => 'rsa_key_pair',
+    'public_key_id'    => '<public_key_id>',
+    'private_key_file' => '<private_key_file>',
+]);
+$rsaKeyPair->getPublicKeyId();
+$rsaKeyPair->getPrivateKey();
+```
+
+#### Bearer Token
+
+If credential is required by the Cloud Call Centre (CCC), please apply for Bearer Token maintenance by yourself.
+
+```php
+<?php
+
+use AlibabaCloud\Credentials\Credential;
+
+$bearerToken = new Credential([
+    'type'         => 'bearer_token',
+    'bearer_token' => '<bearer_token>',
+]);
+$bearerToken->getBearerToken();
+$bearerToken->getSignature();
+```
+
+## Default credential provider chain
+The default credential provider chain looks for available credentials, looking in the following order:
+
+### 1. Environmental certificate
+The program first looks for environment credentials in the environment variable. If the `ALIBABA_CLOUD_ACCESS_KEY_ID` and `ALIBABA_CLOUD_ACCESS_KEY_SECRET` environment variables are defined and not empty, the program will use them to create default credentials.
+
+### 2. Configuration file
+> If the user's home directory has the default file `~/.alibabacloud/credentials` (Windows is `C:\Users\USER_NAME\.alibabacloud\credentials`), the program will automatically create credentials with the specified type and name. The default file may not exist, but parsing errors will throw an exception. The voucher name is not case sensitive. If the voucher has the same name, the latter will overwrite the former. This configuration file can be shared between different projects and tools, and it will not be accidentally submitted to version control because it is outside the project. Environment variables can be referenced to the home directory %UserProfile% on Windows. Unix-like systems can use the environment variable $HOME or ~ (tilde). The path to the default file can be modified by defining the `ALIBABA_CLOUD_CREDENTIALS_FILE` environment variable.
+
+```ini
+[default]
+type = access_key                  # Authentication method is access_key
+access_key_id = foo                # Key
+access_key_secret = bar            # Secret
+
+[project1]
+type = ecs_ram_role                # Authentication method is ecs_ram_role
+role_name = EcsRamRoleTest         # Role name, optional. It will be retrieved automatically if not set. It is highly recommended to set it up to reduce requests.
+
+[project2]
+type = ram_role_arn                # Authentication method is ram_role_arn
+access_key_id = foo
+access_key_secret = bar
+role_arn = role_arn
+role_session_name = session_name
+
+[project3]
+type = rsa_key_pair                # Authentication method is rsa_key_pair
+public_key_id = publicKeyId        # Public Key ID
+private_key_file = /your/pk.pem    # Private Key File
+```
+
+### 3. Instance RAM role
+If the environment variable `ALIBABA_CLOUD_ECS_METADATA` is defined and not empty, the program will take the value of the environment variable as the role name and request `http://100.100.100.200/latest/meta-data/ram/security-credentials/` to get the temporary Security credentials are used as default credentials.
+
+### Custom credential provider chain
+You can replace the default order of the program chain by customizing the program chain, or you can write the closure to the provider.
+```php
+<?php
+
+use AlibabaCloud\Credentials\Providers\ChainProvider;
+
+ChainProvider::set(
+        ChainProvider::ini(),
+        ChainProvider::env(),
+        ChainProvider::instance()
+);
+```
+
+
+## Documentation
+* [Prerequisites](/docs/zh-CN/0-Prerequisites.md)
+* [Installation](/docs/zh-CN/1-Installation.md)
+
+
+## Issue
+[Submit Issue](https://github.com/aliyun/credentials-php/issues/new/choose), Problems that do not meet the guidelines may close immediately.
+
+
+## Release notes
+Detailed changes for each version are recorded in the [Release Notes](/CHANGELOG.md).
+
+
+## Contribution
+Please read the [Contribution Guide](/CONTRIBUTING.md) before submitting a Pull Request.
+
+
+## Related
+* [OpenAPI Developer Portal][open-api]
+* [Packagist][packagist]
+* [Composer][composer]
+* [Guzzle Doc][guzzle-docs]
+* [Latest Release][latest-release]
+
+
+## License
+[Apache-2.0](/LICENSE.md)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
+
+
+[open-api]: https://next.api.aliyun.com
+[latest-release]: https://github.com/aliyun/credentials-php
+[guzzle-docs]: http://docs.guzzlephp.org/en/stable/request-options.html
+[composer]: https://getcomposer.org
+[packagist]: https://packagist.org/packages/alibabacloud/credentials
+[home]: https://home.console.aliyun.com
+[aliyun]: https://www.aliyun.com
+[cURL]: https://www.php.net/manual/en/book.curl.php
+[OPCache]: http://php.net/manual/en/book.opcache.php
+[xdebug]: http://xdebug.org
+[OpenSSL]: http://php.net/manual/en/book.openssl.php

+ 21 - 0
base/composer/vendor/alibabacloud/credentials/SECURITY.md

@@ -0,0 +1,21 @@
+# Security Policy
+
+## Supported Versions
+
+Use this section to tell people about which versions of your project are
+currently being supported with security updates.
+
+| Version | Supported          |
+| ------- | ------------------ |
+| 5.1.x   | :white_check_mark: |
+| 5.0.x   | :x:                |
+| 4.0.x   | :white_check_mark: |
+| < 4.0   | :x:                |
+
+## Reporting a Vulnerability
+
+Use this section to tell people how to report a vulnerability.
+
+Tell them where to go, how often they can expect to get an update on a
+reported vulnerability, what to expect if the vulnerability is accepted or
+declined, etc.

+ 6 - 0
base/composer/vendor/alibabacloud/credentials/UPGRADING.md

@@ -0,0 +1,6 @@
+Upgrading Guide
+===============
+
+1.x
+-----------------------
+- This is the first version. See <https://github.com/aliyun/credentials-php> for more information.

+ 104 - 0
base/composer/vendor/alibabacloud/credentials/composer.json

@@ -0,0 +1,104 @@
+{
+    "name": "alibabacloud/credentials",
+    "homepage": "https://www.alibabacloud.com/",
+    "description": "Alibaba Cloud Credentials for PHP",
+    "keywords": [
+        "sdk",
+        "tool",
+        "cloud",
+        "client",
+        "aliyun",
+        "library",
+        "alibaba",
+        "Credentials",
+        "alibabacloud"
+    ],
+    "type": "library",
+    "license": "Apache-2.0",
+    "support": {
+        "source": "https://github.com/aliyun/credentials-php",
+        "issues": "https://github.com/aliyun/credentials-php/issues"
+    },
+    "authors": [
+        {
+            "name": "Alibaba Cloud SDK",
+            "email": "sdk-team@alibabacloud.com",
+            "homepage": "http://www.alibabacloud.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.6",
+        "ext-curl": "*",
+        "ext-json": "*",
+        "ext-libxml": "*",
+        "ext-openssl": "*",
+        "ext-mbstring": "*",
+        "ext-simplexml": "*",
+        "ext-xmlwriter": "*",
+        "guzzlehttp/guzzle": "^6.3|^7.0",
+        "adbario/php-dot-notation": "^2.2",
+        "alibabacloud/tea": "^3.0"
+    },
+    "require-dev": {
+        "ext-spl": "*",
+        "ext-dom": "*",
+        "ext-pcre": "*",
+        "psr/cache": "^1.0",
+        "ext-sockets": "*",
+        "drupal/coder": "^8.3",
+        "symfony/dotenv": "^3.4",
+        "phpunit/phpunit": "^4.8.35|^5.4.3",
+        "monolog/monolog": "^1.24",
+        "composer/composer": "^1.8",
+        "mikey179/vfsstream": "^1.6",
+        "symfony/var-dumper": "^3.4"
+    },
+    "suggest": {
+        "ext-sockets": "To use client-side monitoring"
+    },
+    "autoload": {
+        "psr-4": {
+            "AlibabaCloud\\Credentials\\": "src"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "AlibabaCloud\\Credentials\\Tests\\": "tests/"
+        }
+    },
+    "config": {
+        "preferred-install": "dist",
+        "optimize-autoloader": true
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
+    "scripts-descriptions": {
+        "cs": "Tokenizes PHP, JavaScript and CSS files to detect violations of a defined coding standard.",
+        "cbf": "Automatically correct coding standard violations.",
+        "fixer": "Fixes code to follow standards.",
+        "test": "Run all tests.",
+        "unit": "Run Unit tests.",
+        "feature": "Run Feature tests.",
+        "clearCache": "Clear cache like coverage.",
+        "coverage": "Show Coverage html.",
+        "endpoints": "Update endpoints from OSS."
+    },
+    "scripts": {
+        "cs": "phpcs --standard=PSR2 -n ./",
+        "cbf": "phpcbf --standard=PSR2 -n ./",
+        "fixer": "php-cs-fixer fix ./",
+        "test": [
+            "phpunit --colors=always"
+        ],
+        "unit": [
+            "@clearCache",
+            "phpunit --testsuite=Unit --colors=always"
+        ],
+        "feature": [
+            "@clearCache",
+            "phpunit --testsuite=Feature --colors=always"
+        ],
+        "coverage": "open cache/coverage/index.html",
+        "clearCache": "rm -rf cache/*"
+    }
+}

+ 72 - 0
base/composer/vendor/alibabacloud/credentials/src/AccessKeyCredential.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
+
+/**
+ * Use the AccessKey to complete the authentication.
+ */
+class AccessKeyCredential implements CredentialsInterface
+{
+    /**
+     * @var string
+     */
+    private $accessKeyId;
+
+    /**
+     * @var string
+     */
+    private $accessKeySecret;
+
+    /**
+     * AccessKeyCredential constructor.
+     *
+     * @param string $access_key_id     Access key ID
+     * @param string $access_key_secret Access Key Secret
+     */
+    public function __construct($access_key_id, $access_key_secret)
+    {
+        Filter::accessKey($access_key_id, $access_key_secret);
+
+        $this->accessKeyId     = $access_key_id;
+        $this->accessKeySecret = $access_key_secret;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAccessKeyId()
+    {
+        return $this->accessKeyId;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAccessKeySecret()
+    {
+        return $this->accessKeySecret;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return "$this->accessKeyId#$this->accessKeySecret";
+    }
+
+    /**
+     * @return ShaHmac1Signature
+     */
+    public function getSignature()
+    {
+        return new ShaHmac1Signature();
+    }
+
+    public function getSecurityToken()
+    {
+        return '';
+    }
+}

+ 53 - 0
base/composer/vendor/alibabacloud/credentials/src/BearerTokenCredential.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Signature\BearerTokenSignature;
+
+/**
+ * Class BearerTokenCredential
+ */
+class BearerTokenCredential implements CredentialsInterface
+{
+
+    /**
+     * @var string
+     */
+    private $bearerToken;
+
+    /**
+     * BearerTokenCredential constructor.
+     *
+     * @param $bearerToken
+     */
+    public function __construct($bearerToken)
+    {
+        Filter::bearerToken($bearerToken);
+
+        $this->bearerToken = $bearerToken;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBearerToken()
+    {
+        return $this->bearerToken;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return "bearerToken#$this->bearerToken";
+    }
+
+    /**
+     * @return BearerTokenSignature
+     */
+    public function getSignature()
+    {
+        return new BearerTokenSignature();
+    }
+}

+ 182 - 0
base/composer/vendor/alibabacloud/credentials/src/Credential.php

@@ -0,0 +1,182 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Credential\Config;
+use InvalidArgumentException;
+use ReflectionClass;
+use ReflectionException;
+use ReflectionParameter;
+
+/**
+ * Class Credential
+ *
+ * @package AlibabaCloud\Credentials
+ *
+ * @mixin AccessKeyCredential
+ * @mixin BearerTokenCredential
+ * @mixin EcsRamRoleCredential
+ * @mixin RamRoleArnCredential
+ * @mixin RsaKeyPairCredential
+ */
+class Credential
+{
+    /**
+     * @var array
+     */
+    protected $config = [];
+
+    /**
+     * @var array
+     */
+    protected $types = [
+        'access_key'   => AccessKeyCredential::class,
+        'sts'          => StsCredential::class,
+        'ecs_ram_role' => EcsRamRoleCredential::class,
+        'ram_role_arn' => RamRoleArnCredential::class,
+        'rsa_key_pair' => RsaKeyPairCredential::class,
+    ];
+
+    /**
+     * @var AccessKeyCredential|BearerTokenCredential|EcsRamRoleCredential|RamRoleArnCredential|RsaKeyPairCredential
+     */
+    protected $credential;
+
+    /**
+     * @var string
+     */
+    protected $type;
+
+    /**
+     * Credential constructor.
+     *
+     * @param array|Config $config
+     *
+     * @throws ReflectionException
+     */
+    public function __construct($config = [])
+    {
+        if ($config instanceof Config) {
+            $config = $this->parse($config);
+        }
+        if ($config !== []) {
+            $this->config = array_change_key_case($config);
+            $this->parseConfig();
+        } else {
+            $this->credential = Credentials::get()->getCredential();
+        }
+    }
+
+    /**
+     * @param Config $config
+     *
+     * @return array
+     */
+    private function parse($config)
+    {
+        $config = get_object_vars($config);
+        $res    = [];
+        foreach ($config as $key => $value) {
+            $res[$this->toUnderScore($key)] = $value;
+        }
+        return $res;
+    }
+
+    private function toUnderScore($str)
+    {
+        $dstr = preg_replace_callback('/([A-Z]+)/', function ($matchs) {
+            return '_' . strtolower($matchs[0]);
+        }, $str);
+        return trim(preg_replace('/_{2,}/', '_', $dstr), '_');
+    }
+
+    /**
+     * @throws ReflectionException
+     */
+    private function parseConfig()
+    {
+        if (!isset($this->config['type'])) {
+            throw  new InvalidArgumentException('Missing required type option');
+        }
+
+        $this->type = $this->config['type'];
+        if (!isset($this->types[$this->type])) {
+            throw  new InvalidArgumentException(
+                'Invalid type option, support: ' .
+                implode(', ', array_keys($this->types))
+            );
+        }
+
+        $class      = new ReflectionClass($this->types[$this->type]);
+        $parameters = [];
+        /**
+         * @var $parameter ReflectionParameter
+         */
+        foreach ($class->getConstructor()->getParameters() as $parameter) {
+            $parameters[] = $this->getValue($parameter);
+        }
+
+        $this->credential = $class->newInstance(...$parameters);
+    }
+
+    /**
+     * @param ReflectionParameter $parameter
+     *
+     * @return string|array
+     * @throws ReflectionException
+     */
+    protected function getValue(ReflectionParameter $parameter)
+    {
+        if ($parameter->name === 'config' || $parameter->name === 'credential') {
+            return $this->config;
+        }
+
+        foreach ($this->config as $key => $value) {
+            if (strtolower($parameter->name) === $key) {
+                return $value;
+            }
+        }
+
+        if ($parameter->isDefaultValueAvailable()) {
+            return $parameter->getDefaultValue();
+        }
+
+        throw new InvalidArgumentException("Missing required {$parameter->name} option in config for {$this->type}");
+    }
+
+    /**
+     * @return AccessKeyCredential|BearerTokenCredential|EcsRamRoleCredential|RamRoleArnCredential|RsaKeyPairCredential
+     */
+    public function getCredential()
+    {
+        return $this->credential;
+    }
+
+    /**
+     * @return array
+     */
+    public function getConfig()
+    {
+        return $this->config;
+    }
+
+    /**
+     * @return string
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+
+    /**
+     * @param string $name
+     * @param array  $arguments
+     *
+     * @return mixed
+     */
+    public function __call($name, $arguments)
+    {
+        return $this->credential->$name($arguments);
+    }
+}

+ 50 - 0
base/composer/vendor/alibabacloud/credentials/src/Credential/Config.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Credential;
+
+class Config
+{
+    /**
+     * @var string
+     */
+    public $type = 'default';
+
+    public $accessKeyId = "";
+
+    public $accessKeySecret = "";
+
+    public $securityToken = "";
+
+    public $bearerToken = "";
+
+    public $roleName = "";
+
+    public $roleArn = "";
+
+    public $roleSessionName = "";
+
+    public $host = "";
+
+    public $publicKeyId = "";
+
+    public $privateKeyFile = "";
+
+    public $readTimeout = 0;
+
+    public $connectTimeout = 0;
+
+    public $certFile = "";
+
+    public $certPassword = "";
+
+    public $proxy = "";
+
+    public $expiration = 0;
+
+    public function __construct($config)
+    {
+        foreach ($config as $k => $v) {
+            $this->{$k} = $v;
+        }
+    }
+}

+ 102 - 0
base/composer/vendor/alibabacloud/credentials/src/Credentials.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Providers\ChainProvider;
+use ReflectionException;
+use RuntimeException;
+
+/**
+ * Class Credentials
+ *
+ * @package AlibabaCloud\Credentials
+ */
+class Credentials
+{
+    use MockTrait;
+
+    /**
+     * @var array|CredentialsInterface[] containers of credentials
+     */
+    protected static $credentials = [];
+
+    /**
+     * Get the credential instance by name.
+     *
+     * @param string $name
+     *
+     * @return Credential
+     * @throws ReflectionException
+     */
+    public static function get($name = null)
+    {
+        if ($name !== null) {
+            Filter::credentialName($name);
+        } else {
+            $name = ChainProvider::getDefaultName();
+        }
+
+        self::load();
+
+        if (self::has($name)) {
+            return new Credential(self::$credentials[\strtolower($name)]);
+        }
+
+        throw new RuntimeException("Credential '$name' not found");
+    }
+
+    private static function load()
+    {
+        if (self::$credentials) {
+            return;
+        }
+
+        if (ChainProvider::hasCustomChain()) {
+            ChainProvider::customProvider(ChainProvider::getDefaultName());
+        } else {
+            ChainProvider::defaultProvider(ChainProvider::getDefaultName());
+        }
+    }
+
+    /**
+     * Determine whether there is a credential.
+     *
+     * @param string $name
+     *
+     * @return bool
+     */
+    public static function has($name)
+    {
+        Filter::credentialName($name);
+
+        return isset(self::$credentials[\strtolower($name)]);
+    }
+
+    public static function flush()
+    {
+        self::$credentials = [];
+    }
+
+    /**
+     * Get all credentials.
+     *
+     * @return array
+     */
+    public static function all()
+    {
+        self::load();
+
+        return self::$credentials;
+    }
+
+    /**
+     * @param string $name
+     * @param array  $credential
+     */
+    public static function set($name, array $credential)
+    {
+        Filter::credentialName($name);
+
+        self::$credentials[\strtolower($name)] = \array_change_key_case($credential);
+    }
+}

+ 23 - 0
base/composer/vendor/alibabacloud/credentials/src/CredentialsInterface.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Signature\SignatureInterface;
+
+/**
+ * Interface CredentialsInterface
+ *
+ * @codeCoverageIgnore
+ */
+interface CredentialsInterface
+{
+    /**
+     * @return string
+     */
+    public function __toString();
+
+    /**
+     * @return SignatureInterface
+     */
+    public function getSignature();
+}

+ 151 - 0
base/composer/vendor/alibabacloud/credentials/src/EcsRamRoleCredential.php

@@ -0,0 +1,151 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Providers\EcsRamRoleProvider;
+use AlibabaCloud\Credentials\Request\Request;
+use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
+use Exception;
+use GuzzleHttp\Exception\GuzzleException;
+use InvalidArgumentException;
+use RuntimeException;
+
+/**
+ * Use the RAM role of an ECS instance to complete the authentication.
+ */
+class EcsRamRoleCredential implements CredentialsInterface
+{
+
+    /**
+     * @var string
+     */
+    private $roleName;
+
+    /**
+     * EcsRamRoleCredential constructor.
+     *
+     * @param $role_name
+     */
+    public function __construct($role_name = null)
+    {
+        Filter::roleName($role_name);
+
+        $this->roleName = $role_name;
+    }
+
+    /**
+     * @return string
+     * @throws GuzzleException
+     * @throws Exception
+     */
+    public function getRoleName()
+    {
+        if ($this->roleName !== null) {
+            return $this->roleName;
+        }
+
+        $this->roleName = $this->getRoleNameFromMeta();
+
+        return $this->roleName;
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     */
+    public function getRoleNameFromMeta()
+    {
+        $options = [
+            'http_errors'     => false,
+            'timeout'         => 1,
+            'connect_timeout' => 1,
+        ];
+
+        $result = Request::createClient()->request(
+            'GET',
+            'http://100.100.100.200/latest/meta-data/ram/security-credentials/',
+            $options
+        );
+
+        if ($result->getStatusCode() === 404) {
+            throw new InvalidArgumentException('The role name was not found in the instance');
+        }
+
+        if ($result->getStatusCode() !== 200) {
+            throw new RuntimeException('Error retrieving credentials from result: ' . $result->getBody());
+        }
+
+        $role_name = (string)$result;
+        if (!$role_name) {
+            throw new RuntimeException('Error retrieving credentials from result is empty');
+        }
+
+        return $role_name;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return "roleName#$this->roleName";
+    }
+
+    /**
+     * @return ShaHmac1Signature
+     */
+    public function getSignature()
+    {
+        return new ShaHmac1Signature();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getAccessKeyId()
+    {
+        return $this->getSessionCredential()->getAccessKeyId();
+    }
+
+    /**
+     * @return StsCredential
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    protected function getSessionCredential()
+    {
+        return (new EcsRamRoleProvider($this))->get();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getAccessKeySecret()
+    {
+        return $this->getSessionCredential()->getAccessKeySecret();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getSecurityToken()
+    {
+        return $this->getSessionCredential()->getSecurityToken();
+    }
+
+    /**
+     * @return int
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getExpiration()
+    {
+        return $this->getSessionCredential()->getExpiration();
+    }
+}

+ 134 - 0
base/composer/vendor/alibabacloud/credentials/src/Filter.php

@@ -0,0 +1,134 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use InvalidArgumentException;
+
+class Filter
+{
+
+    /**
+     * @param $name
+     *
+     * @codeCoverageIgnore
+     * @return string
+     */
+    public static function credentialName($name)
+    {
+        if (!is_string($name)) {
+            throw new InvalidArgumentException('Name must be a string');
+        }
+
+        if ($name === '') {
+            throw new InvalidArgumentException('Name cannot be empty');
+        }
+
+        return $name;
+    }
+
+    /**
+     * @param $bearerToken
+     *
+     * @return mixed
+     * @throws InvalidArgumentException
+     */
+    public static function bearerToken($bearerToken)
+    {
+        if (!is_string($bearerToken)) {
+            throw new InvalidArgumentException('Bearer Token must be a string');
+        }
+
+        if ($bearerToken === '') {
+            throw new InvalidArgumentException('Bearer Token cannot be empty');
+        }
+
+        return $bearerToken;
+    }
+
+    /**
+     * @param $publicKeyId
+     *
+     * @return mixed
+     */
+    public static function publicKeyId($publicKeyId)
+    {
+        if (!is_string($publicKeyId)) {
+            throw new InvalidArgumentException('public_key_id must be a string');
+        }
+
+        if ($publicKeyId === '') {
+            throw new InvalidArgumentException('public_key_id cannot be empty');
+        }
+
+        return $publicKeyId;
+    }
+
+    /**
+     * @param $privateKeyFile
+     *
+     * @return mixed
+     */
+    public static function privateKeyFile($privateKeyFile)
+    {
+        if (!is_string($privateKeyFile)) {
+            throw new InvalidArgumentException('private_key_file must be a string');
+        }
+
+        if ($privateKeyFile === '') {
+            throw new InvalidArgumentException('private_key_file cannot be empty');
+        }
+
+        return $privateKeyFile;
+    }
+
+    /**
+     * @param string|null $role_name
+     */
+    public static function roleName($role_name)
+    {
+        if ($role_name === null) {
+            return;
+        }
+
+        if (!is_string($role_name)) {
+            throw new InvalidArgumentException('role_name must be a string');
+        }
+
+        if ($role_name === '') {
+            throw new InvalidArgumentException('role_name cannot be empty');
+        }
+    }
+
+    /**
+     * @param string $accessKeyId
+     * @param string $accessKeySecret
+     */
+    public static function accessKey($accessKeyId, $accessKeySecret)
+    {
+        if (!is_string($accessKeyId)) {
+            throw new InvalidArgumentException('access_key_id must be a string');
+        }
+
+        if ($accessKeyId === '') {
+            throw new InvalidArgumentException('access_key_id cannot be empty');
+        }
+
+        if (!is_string($accessKeySecret)) {
+            throw new InvalidArgumentException('access_key_secret must be a string');
+        }
+
+        if ($accessKeySecret === '') {
+            throw new InvalidArgumentException('access_key_secret cannot be empty');
+        }
+    }
+
+    /**
+     * @param int $expiration
+     */
+    public static function expiration($expiration)
+    {
+        if (!is_int($expiration)) {
+            throw new InvalidArgumentException('expiration must be a int');
+        }
+    }
+}

+ 202 - 0
base/composer/vendor/alibabacloud/credentials/src/Helper.php

@@ -0,0 +1,202 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use Closure;
+
+/**
+ * Class Helper
+ *
+ * @package AlibabaCloud\Credentials
+ */
+class Helper
+{
+    /**
+     * @param array $arrays
+     *
+     * @return array
+     */
+    public static function merge(array $arrays)
+    {
+        $result = [];
+        foreach ($arrays as $array) {
+            foreach ($array as $key => $value) {
+                if (is_int($key)) {
+                    $result[] = $value;
+                    continue;
+                }
+
+                if (isset($result[$key]) && is_array($result[$key])) {
+                    $result[$key] = self::merge(
+                        [$result[$key], $value]
+                    );
+                    continue;
+                }
+
+                $result[$key] = $value;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * @param      $filename
+     *
+     * @return bool
+     */
+    public static function inOpenBasedir($filename)
+    {
+        $open_basedir = ini_get('open_basedir');
+        if (!$open_basedir) {
+            return true;
+        }
+
+        $dirs = explode(PATH_SEPARATOR, $open_basedir);
+
+        return empty($dirs) || self::inDir($filename, $dirs);
+    }
+
+    /**
+     * @param string $filename
+     * @param array  $dirs
+     *
+     * @return bool
+     */
+    public static function inDir($filename, array $dirs)
+    {
+        foreach ($dirs as $dir) {
+            if ($dir[strlen($dir) - 1] !== DIRECTORY_SEPARATOR) {
+                $dir .= DIRECTORY_SEPARATOR;
+            }
+
+            if (0 === strpos($filename, $dir)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * @return bool
+     */
+    public static function isWindows()
+    {
+        return PATH_SEPARATOR === ';';
+    }
+
+    /**
+     * @param $key
+     *
+     * @return bool|mixed
+     */
+    public static function envNotEmpty($key)
+    {
+        $value = self::env($key, false);
+        if ($value) {
+            return $value;
+        }
+
+        return false;
+    }
+
+    /**
+     * Gets the value of an environment variable.
+     *
+     * @param string $key
+     * @param mixed  $default
+     *
+     * @return mixed
+     */
+    public static function env($key, $default = null)
+    {
+        $value = getenv($key);
+
+        if ($value === false) {
+            return self::value($default);
+        }
+
+        if (self::envSubstr($value)) {
+            return substr($value, 1, -1);
+        }
+
+        return self::envConversion($value);
+    }
+
+    /**
+     * Return the default value of the given value.
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     */
+    public static function value($value)
+    {
+        return $value instanceof Closure ? $value() : $value;
+    }
+
+    /**
+     * @param $value
+     *
+     * @return bool
+     */
+    public static function envSubstr($value)
+    {
+        return ($valueLength = strlen($value)) > 1
+            && strpos($value, '"') === 0
+            && $value[$valueLength - 1] === '"';
+    }
+
+    /**
+     * @param $value
+     *
+     * @return bool|string|null
+     */
+    public static function envConversion($value)
+    {
+        $key = strtolower($value);
+
+        if ($key === 'null' || $key === '(null)') {
+            return null;
+        }
+
+        $list = [
+            'true'    => true,
+            '(true)'  => true,
+            'false'   => false,
+            '(false)' => false,
+            'empty'   => '',
+            '(empty)' => '',
+        ];
+
+        return isset($list[$key]) ? $list[$key] : $value;
+    }
+
+    /**
+     * Gets the environment's HOME directory.
+     *
+     * @return null|string
+     */
+    public static function getHomeDirectory()
+    {
+        if (getenv('HOME')) {
+            return getenv('HOME');
+        }
+
+        return (getenv('HOMEDRIVE') && getenv('HOMEPATH'))
+            ? getenv('HOMEDRIVE') . getenv('HOMEPATH')
+            : null;
+    }
+
+    /**
+     * @param mixed ...$parameters
+     *
+     * @codeCoverageIgnore
+     */
+    public static function dd(...$parameters)
+    {
+        dump(...$parameters);
+        exit;
+    }
+}

+ 98 - 0
base/composer/vendor/alibabacloud/credentials/src/MockTrait.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use Exception;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\Handler\MockHandler;
+use GuzzleHttp\Psr7\Response;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Trait MockTrait
+ *
+ * @package AlibabaCloud\Credentials
+ */
+trait MockTrait
+{
+    /**
+     * @var array
+     */
+    private static $mockQueue = [];
+
+    /**
+     * @var MockHandler
+     */
+    private static $mock;
+
+    /**
+     * @param integer             $status
+     * @param array               $headers
+     * @param array|string|object $body
+     */
+    public static function mockResponse($status = 200, array $headers = [], $body = null)
+    {
+        if (is_array($body) || is_object($body)) {
+            $body = json_encode($body);
+        }
+
+        self::$mockQueue[] = new Response($status, $headers, $body);
+        self::createHandlerStack();
+    }
+
+    private static function createHandlerStack()
+    {
+        self::$mock = new MockHandler(self::$mockQueue);
+    }
+
+    /**
+     * @param string                 $message
+     * @param RequestInterface       $request
+     * @param ResponseInterface|null $response
+     * @param Exception|null         $previous
+     * @param array                  $handlerContext
+     */
+    public static function mockRequestException(
+        $message,
+        RequestInterface $request,
+        ResponseInterface $response = null,
+        Exception $previous = null,
+        array $handlerContext = []
+    ) {
+        self::$mockQueue[] = new RequestException(
+            $message,
+            $request,
+            $response,
+            $previous,
+            $handlerContext
+        );
+
+        self::createHandlerStack();
+    }
+
+    /**
+     * @return void
+     */
+    public static function cancelMock()
+    {
+        self::$mockQueue = [];
+        self::$mock      = null;
+    }
+
+    /**
+     * @return bool
+     */
+    public static function hasMock()
+    {
+        return (bool)self::$mockQueue;
+    }
+
+    /**
+     * @return MockHandler
+     */
+    public static function getMock()
+    {
+        return self::$mock;
+    }
+}

+ 187 - 0
base/composer/vendor/alibabacloud/credentials/src/Providers/ChainProvider.php

@@ -0,0 +1,187 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Providers;
+
+use AlibabaCloud\Credentials\Credentials;
+use AlibabaCloud\Credentials\Helper;
+use Closure;
+use InvalidArgumentException;
+use RuntimeException;
+
+/**
+ * Class ChainProvider
+ *
+ * @package AlibabaCloud\Credentials\Providers
+ */
+class ChainProvider
+{
+    /**
+     * @var array
+     */
+    private static $customChains;
+
+    /**
+     * @param callable ...$providers
+     */
+    public static function set(...$providers)
+    {
+        if (empty($providers)) {
+            throw new InvalidArgumentException('No providers in chain');
+        }
+
+        foreach ($providers as $provider) {
+            if (!$provider instanceof Closure) {
+                throw new InvalidArgumentException('Providers must all be Closures');
+            }
+        }
+
+        self::$customChains = $providers;
+    }
+
+    /**
+     * @return bool
+     */
+    public static function hasCustomChain()
+    {
+        return (bool)self::$customChains;
+    }
+
+    public static function flush()
+    {
+        self::$customChains = [];
+    }
+
+    /**
+     * @param string $name
+     */
+    public static function customProvider($name)
+    {
+        foreach (self::$customChains as $provider) {
+            $provider();
+
+            if (Credentials::has($name)) {
+                break;
+            }
+        }
+    }
+
+    /**
+     * @param string $name
+     */
+    public static function defaultProvider($name)
+    {
+        $providers = [
+            self::env(),
+            self::ini(),
+            self::instance(),
+        ];
+
+        foreach ($providers as $provider) {
+            $provider();
+
+            if (Credentials::has($name)) {
+                break;
+            }
+        }
+    }
+
+    /**
+     * @return Closure
+     */
+    public static function env()
+    {
+        return static function () {
+            $accessKeyId     = Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_ID');
+            $accessKeySecret = Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
+
+            if ($accessKeyId && $accessKeySecret) {
+                Credentials::set(
+                    self::getDefaultName(),
+                    [
+                        'type'              => 'access_key',
+                        'access_key_id'     => $accessKeyId,
+                        'access_key_secret' => $accessKeySecret,
+                    ]
+                );
+            }
+        };
+    }
+
+    /**
+     * @return string
+     */
+    public static function getDefaultName()
+    {
+        $name = Helper::envNotEmpty('ALIBABA_CLOUD_PROFILE');
+
+        if ($name) {
+            return $name;
+        }
+
+        return 'default';
+    }
+
+    /**
+     * @return Closure
+     */
+    public static function ini()
+    {
+        return static function () {
+            $filename = Helper::envNotEmpty('ALIBABA_CLOUD_CREDENTIALS_FILE');
+            if (!$filename) {
+                $filename = self::getDefaultFile();
+            }
+
+            if (!Helper::inOpenBasedir($filename)) {
+                return;
+            }
+
+            if ($filename !== self::getDefaultFile() && (!\is_readable($filename) || !\is_file($filename))) {
+                throw new RuntimeException(
+                    'Credentials file is not readable: ' . $filename
+                );
+            }
+
+            $file_array = \parse_ini_file($filename, true);
+
+            if (\is_array($file_array) && !empty($file_array)) {
+                foreach (\array_change_key_case($file_array) as $name => $configures) {
+                    Credentials::set($name, $configures);
+                }
+            }
+        };
+    }
+
+    /**
+     * Get the default credential file.
+     *
+     * @return string
+     */
+    public static function getDefaultFile()
+    {
+        return Helper::getHomeDirectory() .
+               DIRECTORY_SEPARATOR .
+               '.alibabacloud' .
+               DIRECTORY_SEPARATOR .
+               'credentials';
+    }
+
+    /**
+     * @return Closure
+     */
+    public static function instance()
+    {
+        return static function () {
+            $instance = Helper::envNotEmpty('ALIBABA_CLOUD_ECS_METADATA');
+            if ($instance) {
+                Credentials::set(
+                    self::getDefaultName(),
+                    [
+                        'type'      => 'ecs_ram_role',
+                        'role_name' => $instance,
+                    ]
+                );
+            }
+        };
+    }
+}

+ 94 - 0
base/composer/vendor/alibabacloud/credentials/src/Providers/EcsRamRoleProvider.php

@@ -0,0 +1,94 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Providers;
+
+use AlibabaCloud\Credentials\Request\Request;
+use AlibabaCloud\Credentials\StsCredential;
+use Exception;
+use GuzzleHttp\Exception\GuzzleException;
+use AlibabaCloud\Tea\Response;
+use InvalidArgumentException;
+use Psr\Http\Message\ResponseInterface;
+use RuntimeException;
+
+/**
+ * Class EcsRamRoleProvider
+ *
+ * @package AlibabaCloud\Credentials\Providers
+ */
+class EcsRamRoleProvider extends Provider
+{
+
+    /**
+     * Expiration time slot for temporary security credentials.
+     *
+     * @var int
+     */
+    protected $expirationSlot = 10;
+
+    /**
+     * @var string
+     */
+    private $uri = 'http://100.100.100.200/latest/meta-data/ram/security-credentials/';
+
+    /**
+     * Get credential.
+     *
+     * @return StsCredential
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function get()
+    {
+        $result = $this->getCredentialsInCache();
+
+        if ($result === null) {
+            $result = $this->request();
+
+            if (!isset($result['AccessKeyId'], $result['AccessKeySecret'], $result['SecurityToken'])) {
+                throw new RuntimeException($this->error);
+            }
+
+            $this->cache($result->toArray());
+        }
+
+        return new StsCredential(
+            $result['AccessKeyId'],
+            $result['AccessKeySecret'],
+            strtotime($result['Expiration']),
+            $result['SecurityToken']
+        );
+    }
+
+    /**
+     * Get credentials by request.
+     *
+     * @return ResponseInterface
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function request()
+    {
+        $credential = $this->credential;
+        $url        = $this->uri . $credential->getRoleName();
+
+        $options = [
+            'http_errors'     => false,
+            'timeout'         => 1,
+            'connect_timeout' => 1,
+        ];
+
+        $result = Request::createClient()->request('GET', $url, $options);
+
+        if ($result->getStatusCode() === 404) {
+            $message = 'The role was not found in the instance';
+            throw new InvalidArgumentException($message);
+        }
+
+        if ($result->getStatusCode() !== 200) {
+            throw new RuntimeException('Error retrieving credentials from result: ' . $result->toJson());
+        }
+
+        return $result;
+    }
+}

+ 82 - 0
base/composer/vendor/alibabacloud/credentials/src/Providers/Provider.php

@@ -0,0 +1,82 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Providers;
+
+use AlibabaCloud\Credentials\CredentialsInterface;
+use AlibabaCloud\Credentials\EcsRamRoleCredential;
+use AlibabaCloud\Credentials\RamRoleArnCredential;
+use AlibabaCloud\Credentials\RsaKeyPairCredential;
+
+abstract class Provider
+{
+    /**
+     * For TSC Duration Seconds
+     */
+    const DURATION_SECONDS = 3600;
+
+    /**
+     * @var array
+     */
+    protected static $credentialsCache = [];
+
+    /**
+     * Expiration time slot for temporary security credentials.
+     *
+     * @var int
+     */
+    protected $expirationSlot = 180;
+
+    /**
+     * @var RamRoleArnCredential|RsaKeyPairCredential|EcsRamRoleCredential
+     */
+    protected $credential;
+
+    /**
+     * @var string
+     */
+    protected $error = 'Result contains no credentials';
+
+    /**
+     * @var array
+     */
+    protected $config = [];
+
+    /**
+     * CredentialTrait constructor.
+     *
+     * @param CredentialsInterface $credential
+     * @param array                $config
+     */
+    public function __construct(CredentialsInterface $credential, $config = [])
+    {
+        $this->credential = $credential;
+        $this->config     = $config;
+    }
+
+    /**
+     * Get the credentials from the cache in the validity period.
+     *
+     * @return array|null
+     */
+    public function getCredentialsInCache()
+    {
+        if (isset(self::$credentialsCache[(string)$this->credential])) {
+            $result = self::$credentialsCache[(string)$this->credential];
+            if (\strtotime($result['Expiration']) - \time() >= $this->expirationSlot) {
+                return $result;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Cache credentials.
+     *
+     * @param array $credential
+     */
+    protected function cache(array $credential)
+    {
+        self::$credentialsCache[(string)$this->credential] = $credential;
+    }
+}

+ 49 - 0
base/composer/vendor/alibabacloud/credentials/src/Providers/RamRoleArnProvider.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Providers;
+
+use AlibabaCloud\Credentials\Request\AssumeRole;
+use AlibabaCloud\Credentials\StsCredential;
+use Exception;
+use GuzzleHttp\Exception\GuzzleException;
+use RuntimeException;
+
+class RamRoleArnProvider extends Provider
+{
+
+    /**
+     * Get credential.
+     *
+     * @return StsCredential
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function get()
+    {
+        $credential = $this->getCredentialsInCache();
+
+        if (null === $credential) {
+            $result = (new AssumeRole($this->credential))->request();
+
+            if ($result->getStatusCode() !== 200) {
+                throw new RuntimeException(isset($result['Message']) ? $result['Message'] : (string)$result->getBody());
+            }
+
+            if (!isset($result['Credentials']['AccessKeyId'],
+                $result['Credentials']['AccessKeySecret'],
+                $result['Credentials']['SecurityToken'])) {
+                throw new RuntimeException($this->error);
+            }
+
+            $credential = $result['Credentials'];
+            $this->cache($credential);
+        }
+
+        return new StsCredential(
+            $credential['AccessKeyId'],
+            $credential['AccessKeySecret'],
+            strtotime($credential['Expiration']),
+            $credential['SecurityToken']
+        );
+    }
+}

+ 53 - 0
base/composer/vendor/alibabacloud/credentials/src/Providers/RsaKeyPairProvider.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Providers;
+
+use AlibabaCloud\Credentials\Request\GenerateSessionAccessKey;
+use AlibabaCloud\Credentials\StsCredential;
+use Exception;
+use GuzzleHttp\Exception\GuzzleException;
+use RuntimeException;
+
+/**
+ * Class RsaKeyPairProvider
+ *
+ * @package AlibabaCloud\Credentials\Providers
+ */
+class RsaKeyPairProvider extends Provider
+{
+
+    /**
+     * Get credential.
+     *
+     *
+     * @return StsCredential
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function get()
+    {
+        $credential = $this->getCredentialsInCache();
+
+        if ($credential === null) {
+            $result = (new GenerateSessionAccessKey($this->credential))->request();
+
+            if ($result->getStatusCode() !== 200) {
+                throw new RuntimeException(isset($result['Message']) ? $result['Message'] : (string)$result->getBody());
+            }
+
+            if (!isset($result['SessionAccessKey']['SessionAccessKeyId'],
+                $result['SessionAccessKey']['SessionAccessKeySecret'])) {
+                throw new RuntimeException($this->error);
+            }
+
+            $credential = $result['SessionAccessKey'];
+            $this->cache($credential);
+        }
+
+        return new StsCredential(
+            $credential['SessionAccessKeyId'],
+            $credential['SessionAccessKeySecret'],
+            strtotime($credential['Expiration'])
+        );
+    }
+}

+ 218 - 0
base/composer/vendor/alibabacloud/credentials/src/RamRoleArnCredential.php

@@ -0,0 +1,218 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Providers\RamRoleArnProvider;
+use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
+use Exception;
+use GuzzleHttp\Exception\GuzzleException;
+use InvalidArgumentException;
+
+/**
+ * Use the AssumeRole of the RAM account to complete  the authentication.
+ */
+class RamRoleArnCredential implements CredentialsInterface
+{
+
+    /**
+     * @var string
+     */
+    private $accessKeyId;
+
+    /**
+     * @var string
+     */
+    private $accessKeySecret;
+
+    /**
+     * @var string
+     */
+    private $roleArn;
+
+    /**
+     * @var string
+     */
+    private $roleSessionName;
+
+    /**
+     * @var string
+     */
+    private $policy;
+
+    /**
+     * @var array
+     */
+    private $config;
+
+    /**
+     * RamRoleArnCredential constructor.
+     *
+     * @param array $credential
+     * @param array $config
+     */
+    public function __construct(array $credential = [], array $config = [])
+    {
+        $this->filterParameters($credential);
+        $this->filterPolicy($credential);
+
+        Filter::accessKey($credential['access_key_id'], $credential['access_key_secret']);
+
+        $this->config          = $config;
+        $this->accessKeyId     = $credential['access_key_id'];
+        $this->accessKeySecret = $credential['access_key_secret'];
+        $this->roleArn         = $credential['role_arn'];
+        $this->roleSessionName = $credential['role_session_name'];
+    }
+
+    /**
+     * @param array $credential
+     */
+    private function filterParameters(array $credential)
+    {
+        if (!isset($credential['access_key_id'])) {
+            throw new InvalidArgumentException('Missing required access_key_id option in config for ram_role_arn');
+        }
+
+        if (!isset($credential['access_key_secret'])) {
+            throw new InvalidArgumentException('Missing required access_key_secret option in config for ram_role_arn');
+        }
+
+        if (!isset($credential['role_arn'])) {
+            throw new InvalidArgumentException('Missing required role_arn option in config for ram_role_arn');
+        }
+
+        if (!isset($credential['role_session_name'])) {
+            throw new InvalidArgumentException('Missing required role_session_name option in config for ram_role_arn');
+        }
+    }
+
+    /**
+     * @param array $credential
+     */
+    private function filterPolicy(array $credential)
+    {
+        if (isset($credential['policy'])) {
+            if (is_string($credential['policy'])) {
+                $this->policy = $credential['policy'];
+            }
+
+            if (is_array($credential['policy'])) {
+                $this->policy = json_encode($credential['policy']);
+            }
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getConfig()
+    {
+        return $this->config;
+    }
+
+    /**
+     * @return string
+     */
+    public function getRoleArn()
+    {
+        return $this->roleArn;
+    }
+
+    /**
+     * @return string
+     */
+    public function getRoleSessionName()
+    {
+        return $this->roleSessionName;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPolicy()
+    {
+        return $this->policy;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return "$this->accessKeyId#$this->accessKeySecret#$this->roleArn#$this->roleSessionName";
+    }
+
+    /**
+     * @return ShaHmac1Signature
+     */
+    public function getSignature()
+    {
+        return new ShaHmac1Signature();
+    }
+
+    /**
+     * @return string
+     */
+    public function getOriginalAccessKeyId()
+    {
+        return $this->accessKeyId;
+    }
+
+    /**
+     * @return string
+     */
+    public function getOriginalAccessKeySecret()
+    {
+        return $this->accessKeySecret;
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getAccessKeyId()
+    {
+        return $this->getSessionCredential()->getAccessKeyId();
+    }
+
+    /**
+     * @return StsCredential
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    protected function getSessionCredential()
+    {
+        return (new RamRoleArnProvider($this))->get();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getAccessKeySecret()
+    {
+        return $this->getSessionCredential()->getAccessKeySecret();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getSecurityToken()
+    {
+        return $this->getSessionCredential()->getSecurityToken();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getExpiration()
+    {
+        return $this->getSessionCredential()->getExpiration();
+    }
+}

+ 37 - 0
base/composer/vendor/alibabacloud/credentials/src/Request/AssumeRole.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Request;
+
+use AlibabaCloud\Credentials\Providers\Provider;
+use AlibabaCloud\Credentials\RamRoleArnCredential;
+use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
+
+/**
+ * Retrieving assume role credentials.
+ */
+class AssumeRole extends Request
+{
+    /**
+     * AssumeRole constructor.
+     *
+     * @param RamRoleArnCredential $arnCredential
+     */
+    public function __construct(RamRoleArnCredential $arnCredential)
+    {
+        parent::__construct();
+        $this->signature                           = new ShaHmac1Signature();
+        $this->credential                          = $arnCredential;
+        $this->uri                                 = $this->uri->withHost('sts.aliyuncs.com');
+        $this->options['verify']                   = false;
+        $this->options['query']['RoleArn']         = $arnCredential->getRoleArn();
+        $this->options['query']['RoleSessionName'] = $arnCredential->getRoleSessionName();
+        $this->options['query']['DurationSeconds'] = Provider::DURATION_SECONDS;
+        $this->options['query']['AccessKeyId']     = $this->credential->getOriginalAccessKeyId();
+        $this->options['query']['Version']         = '2015-04-01';
+        $this->options['query']['Action']          = 'AssumeRole';
+        $this->options['query']['RegionId']        = 'cn-hangzhou';
+        if ($arnCredential->getPolicy()) {
+            $this->options['query']['Policy'] = $arnCredential->getPolicy();
+        }
+    }
+}

+ 33 - 0
base/composer/vendor/alibabacloud/credentials/src/Request/GenerateSessionAccessKey.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Request;
+
+use AlibabaCloud\Credentials\Providers\Provider;
+use AlibabaCloud\Credentials\RsaKeyPairCredential;
+use AlibabaCloud\Credentials\Signature\ShaHmac256WithRsaSignature;
+
+/**
+ * Use the RSA key pair to complete the authentication (supported only on Japanese site)
+ */
+class GenerateSessionAccessKey extends Request
+{
+    /**
+     * GenerateSessionAccessKey constructor.
+     *
+     * @param RsaKeyPairCredential $credential
+     */
+    public function __construct(RsaKeyPairCredential $credential)
+    {
+        parent::__construct();
+        $this->signature                           = new ShaHmac256WithRsaSignature();
+        $this->credential                          = $credential;
+        $this->uri                                 = $this->uri->withHost('sts.ap-northeast-1.aliyuncs.com');
+        $this->options['verify']                   = false;
+        $this->options['query']['Version']         = '2015-04-01';
+        $this->options['query']['Action']          = 'GenerateSessionAccessKey';
+        $this->options['query']['RegionId']        = 'cn-hangzhou';
+        $this->options['query']['AccessKeyId']     = $credential->getPublicKeyId();
+        $this->options['query']['PublicKeyId']     = $credential->getPublicKeyId();
+        $this->options['query']['DurationSeconds'] = Provider::DURATION_SECONDS;
+    }
+}

+ 155 - 0
base/composer/vendor/alibabacloud/credentials/src/Request/Request.php

@@ -0,0 +1,155 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Request;
+
+use AlibabaCloud\Credentials\Credentials;
+use AlibabaCloud\Credentials\EcsRamRoleCredential;
+use AlibabaCloud\Credentials\Helper;
+use AlibabaCloud\Credentials\RamRoleArnCredential;
+use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
+use AlibabaCloud\Credentials\Signature\ShaHmac256WithRsaSignature;
+use Exception;
+use GuzzleHttp\Client;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Middleware;
+use GuzzleHttp\Psr7\Uri;
+use AlibabaCloud\Tea\Response;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * RESTful RPC Request.
+ */
+class Request
+{
+
+    /**
+     * Request Connect Timeout
+     */
+    const CONNECT_TIMEOUT = 5;
+
+    /**
+     * Request Timeout
+     */
+    const TIMEOUT = 10;
+
+    /**
+     * @var array
+     */
+    private static $config = [];
+
+    /**
+     * @var array
+     */
+    public $options = [];
+
+    /**
+     * @var Uri
+     */
+    public $uri;
+
+    /**
+     * @var EcsRamRoleCredential|RamRoleArnCredential
+     */
+    protected $credential;
+
+    /**
+     * @var ShaHmac256WithRsaSignature|ShaHmac1Signature
+     */
+    protected $signature;
+
+    /**
+     * Request constructor.
+     */
+    public function __construct()
+    {
+        $this->uri                        = (new Uri())->withScheme('https');
+        $this->options['http_errors']     = false;
+        $this->options['connect_timeout'] = self::CONNECT_TIMEOUT;
+        $this->options['timeout']         = self::TIMEOUT;
+
+        // Turn on debug mode based on environment variable.
+        if (strtolower(Helper::env('DEBUG')) === 'sdk') {
+            $this->options['debug'] = true;
+        }
+    }
+
+    /**
+     * @return ResponseInterface
+     * @throws Exception
+     */
+    public function request()
+    {
+        $this->options['query']['Format']           = 'JSON';
+        $this->options['query']['SignatureMethod']  = $this->signature->getMethod();
+        $this->options['query']['SignatureVersion'] = $this->signature->getVersion();
+        $this->options['query']['SignatureNonce']   = self::uuid(json_encode($this->options['query']));
+        $this->options['query']['Timestamp']        = gmdate('Y-m-d\TH:i:s\Z');
+        $this->options['query']['Signature']        = $this->signature->sign(
+            self::signString('GET', $this->options['query']),
+            $this->credential->getOriginalAccessKeySecret() . '&'
+        );
+        return self::createClient()->request('GET', (string)$this->uri, $this->options);
+    }
+
+    /**
+     * @param string $salt
+     *
+     * @return string
+     */
+    public static function uuid($salt)
+    {
+        return md5($salt . uniqid(md5(microtime(true)), true));
+    }
+
+    /**
+     * @param string $method
+     * @param array  $parameters
+     *
+     * @return string
+     */
+    public static function signString($method, array $parameters)
+    {
+        ksort($parameters);
+        $canonicalized = '';
+        foreach ($parameters as $key => $value) {
+            $canonicalized .= '&' . self::percentEncode($key) . '=' . self::percentEncode($value);
+        }
+
+        return $method . '&%2F&' . self::percentEncode(substr($canonicalized, 1));
+    }
+
+    /**
+     * @param string $string
+     *
+     * @return null|string|string[]
+     */
+    private static function percentEncode($string)
+    {
+        $result = rawurlencode($string);
+        $result = str_replace(['+', '*'], ['%20', '%2A'], $result);
+        $result = preg_replace('/%7E/', '~', $result);
+
+        return $result;
+    }
+
+    /**
+     * @return Client
+     * @throws Exception
+     */
+    public static function createClient()
+    {
+        if (Credentials::hasMock()) {
+            $stack = HandlerStack::create(Credentials::getMock());
+        } else {
+            $stack = HandlerStack::create();
+        }
+
+        $stack->push(Middleware::mapResponse(static function (ResponseInterface $response) {
+            return new Response($response);
+        }));
+
+        self::$config['handler'] = $stack;
+
+        return new Client(self::$config);
+    }
+}

+ 158 - 0
base/composer/vendor/alibabacloud/credentials/src/RsaKeyPairCredential.php

@@ -0,0 +1,158 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Providers\RsaKeyPairProvider;
+use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
+use Exception;
+use GuzzleHttp\Exception\GuzzleException;
+use InvalidArgumentException;
+
+/**
+ * Use the RSA key pair to complete the authentication (supported only on Japanese site)
+ */
+class RsaKeyPairCredential implements CredentialsInterface
+{
+
+    /**
+     * @var string
+     */
+    private $publicKeyId;
+
+    /**
+     * @var string
+     */
+    private $privateKey;
+
+    /**
+     * @var array
+     */
+    private $config;
+
+    /**
+     * RsaKeyPairCredential constructor.
+     *
+     * @param string $public_key_id
+     * @param string $private_key_file
+     * @param array  $config
+     */
+    public function __construct($public_key_id, $private_key_file, array $config = [])
+    {
+        Filter::publicKeyId($public_key_id);
+        Filter::privateKeyFile($private_key_file);
+
+        $this->publicKeyId = $public_key_id;
+        $this->config      = $config;
+        try {
+            $this->privateKey = file_get_contents($private_key_file);
+        } catch (Exception $exception) {
+            throw new InvalidArgumentException($exception->getMessage());
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getConfig()
+    {
+        return $this->config;
+    }
+
+    /**
+     * @return string
+     */
+    public function getOriginalAccessKeyId()
+    {
+        return $this->getPublicKeyId();
+    }
+
+    /**
+     * @return string
+     */
+    public function getPublicKeyId()
+    {
+        return $this->publicKeyId;
+    }
+
+    /**
+     * @return string
+     */
+    public function getOriginalAccessKeySecret()
+    {
+        return $this->getPrivateKey();
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getPrivateKey()
+    {
+        return $this->privateKey;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return "publicKeyId#$this->publicKeyId";
+    }
+
+    /**
+     * @return ShaHmac1Signature
+     */
+    public function getSignature()
+    {
+        return new ShaHmac1Signature();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getAccessKeyId()
+    {
+        return $this->getSessionCredential()->getAccessKeyId();
+    }
+
+    /**
+     * @return StsCredential
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    protected function getSessionCredential()
+    {
+        return (new RsaKeyPairProvider($this))->get();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getAccessKeySecret()
+    {
+        return $this->getSessionCredential()->getAccessKeySecret();
+    }
+
+    /**
+     * @return string
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getSecurityToken()
+    {
+        return $this->getSessionCredential()->getSecurityToken();
+    }
+
+    /**
+     * @return int
+     * @throws Exception
+     * @throws GuzzleException
+     */
+    public function getExpiration()
+    {
+        return $this->getSessionCredential()->getExpiration();
+    }
+}

+ 47 - 0
base/composer/vendor/alibabacloud/credentials/src/Signature/BearerTokenSignature.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Signature;
+
+/**
+ * Class BearerTokenSignature
+ *
+ * @package AlibabaCloud\Credentials\Signature
+ */
+class BearerTokenSignature implements SignatureInterface
+{
+
+    /**
+     * @return string
+     */
+    public function getMethod()
+    {
+        return '';
+    }
+
+    /**
+     * @return string
+     */
+    public function getType()
+    {
+        return 'BEARERTOKEN';
+    }
+
+    /**
+     * @return string
+     */
+    public function getVersion()
+    {
+        return '1.0';
+    }
+
+    /**
+     * @param string $string
+     * @param string $accessKeySecret
+     *
+     * @return string
+     */
+    public function sign($string, $accessKeySecret)
+    {
+        return '';
+    }
+}

+ 47 - 0
base/composer/vendor/alibabacloud/credentials/src/Signature/ShaHmac1Signature.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Signature;
+
+/**
+ * Class ShaHmac1Signature
+ *
+ * @package AlibabaCloud\Credentials\Signature
+ */
+class ShaHmac1Signature implements SignatureInterface
+{
+
+    /**
+     * @return string
+     */
+    public function getMethod()
+    {
+        return 'HMAC-SHA1';
+    }
+
+    /**
+     * @return string
+     */
+    public function getType()
+    {
+        return '';
+    }
+
+    /**
+     * @return string
+     */
+    public function getVersion()
+    {
+        return '1.0';
+    }
+
+    /**
+     * @param string $string
+     * @param string $accessKeySecret
+     *
+     * @return string
+     */
+    public function sign($string, $accessKeySecret)
+    {
+        return base64_encode(hash_hmac('sha1', $string, $accessKeySecret, true));
+    }
+}

+ 47 - 0
base/composer/vendor/alibabacloud/credentials/src/Signature/ShaHmac256Signature.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Signature;
+
+/**
+ * Class ShaHmac256Signature
+ *
+ * @package AlibabaCloud\Credentials\Signature
+ */
+class ShaHmac256Signature implements SignatureInterface
+{
+
+    /**
+     * @return string
+     */
+    public function getMethod()
+    {
+        return 'HMAC-SHA256';
+    }
+
+    /**
+     * @return string
+     */
+    public function getType()
+    {
+        return '';
+    }
+
+    /**
+     * @return string
+     */
+    public function getVersion()
+    {
+        return '1.0';
+    }
+
+    /**
+     * @param string $string
+     * @param string $accessKeySecret
+     *
+     * @return string
+     */
+    public function sign($string, $accessKeySecret)
+    {
+        return base64_encode(hash_hmac('sha256', $string, $accessKeySecret, true));
+    }
+}

+ 64 - 0
base/composer/vendor/alibabacloud/credentials/src/Signature/ShaHmac256WithRsaSignature.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Signature;
+
+use Exception;
+use InvalidArgumentException;
+
+/**
+ * Class ShaHmac256WithRsaSignature
+ *
+ * @package AlibabaCloud\Credentials\Signature
+ */
+class ShaHmac256WithRsaSignature implements SignatureInterface
+{
+
+    /**
+     * @return string
+     */
+    public function getMethod()
+    {
+        return 'SHA256withRSA';
+    }
+
+    /**
+     * @return string
+     */
+    public function getType()
+    {
+        return 'PRIVATEKEY';
+    }
+
+    /**
+     * @return string
+     */
+    public function getVersion()
+    {
+        return '1.0';
+    }
+
+    /**
+     * @param string $string
+     * @param string $privateKey
+     *
+     * @return string
+     */
+    public function sign($string, $privateKey)
+    {
+        $binarySignature = '';
+        try {
+            openssl_sign(
+                $string,
+                $binarySignature,
+                $privateKey,
+                \OPENSSL_ALGO_SHA256
+            );
+        } catch (Exception $exception) {
+            throw  new InvalidArgumentException(
+                $exception->getMessage()
+            );
+        }
+
+        return base64_encode($binarySignature);
+    }
+}

+ 34 - 0
base/composer/vendor/alibabacloud/credentials/src/Signature/SignatureInterface.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace AlibabaCloud\Credentials\Signature;
+
+/**
+ * Interface SignatureInterface
+ *
+ * @package AlibabaCloud\Credentials\Signature
+ */
+interface SignatureInterface
+{
+    /**
+     * @return string
+     */
+    public function getMethod();
+
+    /**
+     * @return string
+     */
+    public function getVersion();
+
+    /**
+     * @param string $string
+     * @param string $accessKeySecret
+     *
+     * @return string
+     */
+    public function sign($string, $accessKeySecret);
+
+    /**
+     * @return string
+     */
+    public function getType();
+}

+ 98 - 0
base/composer/vendor/alibabacloud/credentials/src/StsCredential.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace AlibabaCloud\Credentials;
+
+use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
+
+/**
+ * Use the STS Token to complete the authentication.
+ */
+class StsCredential implements CredentialsInterface
+{
+
+    /**
+     * @var string
+     */
+    private $accessKeyId;
+
+    /**
+     * @var string
+     */
+    private $accessKeySecret;
+
+    /**
+     * @var string
+     */
+    private $securityToken;
+
+    /**
+     * @var int
+     */
+    private $expiration;
+
+    /**
+     * StsCredential constructor.
+     *
+     * @param string $access_key_id     Access key ID
+     * @param string $access_key_secret Access Key Secret
+     * @param int    $expiration
+     * @param string $security_token    Security Token
+     */
+    public function __construct($access_key_id, $access_key_secret, $expiration, $security_token = '')
+    {
+        Filter::accessKey($access_key_id, $access_key_secret);
+        Filter::expiration($expiration);
+        $this->accessKeyId     = $access_key_id;
+        $this->accessKeySecret = $access_key_secret;
+        $this->expiration      = $expiration;
+        $this->securityToken   = $security_token;
+    }
+
+    /**
+     * @return int
+     */
+    public function getExpiration()
+    {
+        return $this->expiration;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAccessKeyId()
+    {
+        return $this->accessKeyId;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAccessKeySecret()
+    {
+        return $this->accessKeySecret;
+    }
+
+    /**
+     * @return string
+     */
+    public function getSecurityToken()
+    {
+        return $this->securityToken;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return "$this->accessKeyId#$this->accessKeySecret#$this->securityToken";
+    }
+
+    /**
+     * @return ShaHmac1Signature
+     */
+    public function getSignature()
+    {
+        return new ShaHmac1Signature();
+    }
+}

+ 31 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/README-CN.md

@@ -0,0 +1,31 @@
+[English](README.md) | 简体中文
+
+![](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
+
+## Alibaba Cloud OpenApi Client
+
+## 安装
+
+### Composer
+
+```bash
+composer require alibabacloud/darabonba-openapi
+```
+
+## 问题
+
+[提交 Issue](https://github.com/aliyun/darabonba-openapi/issues/new),不符合指南的问题可能会立即关闭。
+
+## 发行说明
+
+每个版本的详细更改记录在[发行说明](./ChangeLog.txt)中。
+
+## 相关
+
+* [最新源码](https://github.com/aliyun/darabonba-openapi)
+
+## 许可证
+
+[Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.

+ 31 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/README.md

@@ -0,0 +1,31 @@
+English | [简体中文](README-CN.md)
+
+![](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
+
+## Alibaba Cloud OpenApi Client
+
+## Installation
+
+### Composer
+
+```bash
+composer require alibabacloud/darabonba-openapi
+```
+
+## Issues
+
+[Opening an Issue](https://github.com/aliyun/darabonba-openapi/issues/new), Issues not conforming to the guidelines may be closed immediately.
+
+## Changelog
+
+Detailed changes for each release are documented in the [release notes](./ChangeLog.txt).
+
+## References
+
+* [Latest Release](https://github.com/aliyun/darabonba-openapi)
+
+## License
+
+[Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.

+ 17 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/autoload.php

@@ -0,0 +1,17 @@
+<?php
+
+if (file_exists(__DIR__ . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php')) {
+    require_once __DIR__ . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
+}
+
+spl_autoload_register(function ($class) {
+    $name = str_replace('Darabonba\\OpenApi\\', '', $class);
+    $file = __DIR__ . \DIRECTORY_SEPARATOR . 'src' . \DIRECTORY_SEPARATOR . str_replace('\\', \DIRECTORY_SEPARATOR, $name) . '.php';
+    if (file_exists($file)) {
+        require_once $file;
+
+        return true;
+    }
+
+    return false;
+});

+ 32 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/composer.json

@@ -0,0 +1,32 @@
+{
+  "name": "alibabacloud/darabonba-openapi",
+  "description": "Alibaba Cloud OpenApi Client",
+  "type": "library",
+  "license": "Apache-2.0",
+  "authors": [
+    {
+      "name": "Alibaba Cloud SDK",
+      "email": "sdk-team@alibabacloud.com"
+    }
+  ],
+  "require": {
+    "php": ">5.5",
+    "alibabacloud/tea-utils": "^0.2.0",
+    "alibabacloud/credentials": "^1.1",
+    "alibabacloud/openapi-util": "^0.1.7"
+  },
+  "autoload": {
+    "psr-4": {
+      "Darabonba\\OpenApi\\": "src"
+    }
+  },
+  "scripts": {
+    "fixer": "php-cs-fixer fix ./"
+  },
+  "config": {
+    "sort-packages": true,
+    "preferred-install": "dist",
+    "optimize-autoloader": true
+  },
+  "prefer-stable": true
+}

+ 387 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/src/Models/Config.php

@@ -0,0 +1,387 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace Darabonba\OpenApi\Models;
+
+use AlibabaCloud\Credentials\Credential;
+use AlibabaCloud\Tea\Model;
+
+/**
+ * Model for initing client.
+ */
+class Config extends Model
+{
+    /**
+     * @description accesskey id
+     *
+     * @var string
+     */
+    public $accessKeyId;
+
+    /**
+     * @description accesskey secret
+     *
+     * @var string
+     */
+    public $accessKeySecret;
+
+    /**
+     * @description security token
+     *
+     * @example a.txt
+     *
+     * @var string
+     */
+    public $securityToken;
+
+    /**
+     * @description http protocol
+     *
+     * @example http
+     *
+     * @var string
+     */
+    public $protocol;
+
+    /**
+     * @description region id
+     *
+     * @example cn-hangzhou
+     *
+     * @var string
+     */
+    public $regionId;
+
+    /**
+     * @description read timeout
+     *
+     * @example 10
+     *
+     * @var int
+     */
+    public $readTimeout;
+
+    /**
+     * @description connect timeout
+     *
+     * @example 10
+     *
+     * @var int
+     */
+    public $connectTimeout;
+
+    /**
+     * @description http proxy
+     *
+     * @example http://localhost
+     *
+     * @var string
+     */
+    public $httpProxy;
+
+    /**
+     * @description https proxy
+     *
+     * @example https://localhost
+     *
+     * @var string
+     */
+    public $httpsProxy;
+
+    /**
+     * @description credential
+     *
+     * @example
+     *
+     * @var Credential
+     */
+    public $credential;
+
+    /**
+     * @description endpoint
+     *
+     * @example cs.aliyuncs.com
+     *
+     * @var string
+     */
+    public $endpoint;
+
+    /**
+     * @description proxy white list
+     *
+     * @example http://localhost
+     *
+     * @var string
+     */
+    public $noProxy;
+
+    /**
+     * @description max idle conns
+     *
+     * @example 3
+     *
+     * @var int
+     */
+    public $maxIdleConns;
+
+    /**
+     * @description network for endpoint
+     *
+     * @example public
+     *
+     * @var string
+     */
+    public $network;
+
+    /**
+     * @description user agent
+     *
+     * @example Alibabacloud/1
+     *
+     * @var string
+     */
+    public $userAgent;
+
+    /**
+     * @description suffix for endpoint
+     *
+     * @example aliyun
+     *
+     * @var string
+     */
+    public $suffix;
+
+    /**
+     * @description socks5 proxy
+     *
+     * @var string
+     */
+    public $socks5Proxy;
+
+    /**
+     * @description socks5 network
+     *
+     * @example TCP
+     *
+     * @var string
+     */
+    public $socks5NetWork;
+
+    /**
+     * @description endpoint type
+     *
+     * @example internal
+     *
+     * @var string
+     */
+    public $endpointType;
+
+    /**
+     * @description OpenPlatform endpoint
+     *
+     * @example openplatform.aliyuncs.com
+     *
+     * @var string
+     */
+    public $openPlatformEndpoint;
+
+    /**
+     * @description credential type
+     *
+     * @example access_key
+     *
+     * @deprecated
+     *
+     * @var string
+     */
+    public $type;
+
+    /**
+     * @description Signature Algorithm
+     *
+     * @example ACS3-HMAC-SHA256
+     *
+     * @var string
+     */
+    public $signatureAlgorithm;
+    protected $_default = [
+        'accessKeyId'          => '',
+        'accessKeySecret'      => '',
+        'securityToken'        => '',
+        'protocol'             => 'http',
+        'regionId'             => '',
+        'readTimeout'          => '',
+        'connectTimeout'       => '',
+        'httpProxy'            => '',
+        'httpsProxy'           => '',
+        'credential'           => '',
+        'endpoint'             => '',
+        'noProxy'              => '',
+        'maxIdleConns'         => '',
+        'network'              => '',
+        'userAgent'            => '',
+        'suffix'               => '',
+        'socks5Proxy'          => '',
+        'socks5NetWork'        => '',
+        'endpointType'         => '',
+        'openPlatformEndpoint' => '',
+        'type'                 => '',
+        'signatureAlgorithm'   => '',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->accessKeyId) {
+            $res['accessKeyId'] = $this->accessKeyId;
+        }
+        if (null !== $this->accessKeySecret) {
+            $res['accessKeySecret'] = $this->accessKeySecret;
+        }
+        if (null !== $this->securityToken) {
+            $res['securityToken'] = $this->securityToken;
+        }
+        if (null !== $this->protocol) {
+            $res['protocol'] = $this->protocol;
+        }
+        if (null !== $this->regionId) {
+            $res['regionId'] = $this->regionId;
+        }
+        if (null !== $this->readTimeout) {
+            $res['readTimeout'] = $this->readTimeout;
+        }
+        if (null !== $this->connectTimeout) {
+            $res['connectTimeout'] = $this->connectTimeout;
+        }
+        if (null !== $this->httpProxy) {
+            $res['httpProxy'] = $this->httpProxy;
+        }
+        if (null !== $this->httpsProxy) {
+            $res['httpsProxy'] = $this->httpsProxy;
+        }
+        if (null !== $this->credential) {
+            $res['credential'] = null !== $this->credential ? $this->credential->toMap() : null;
+        }
+        if (null !== $this->endpoint) {
+            $res['endpoint'] = $this->endpoint;
+        }
+        if (null !== $this->noProxy) {
+            $res['noProxy'] = $this->noProxy;
+        }
+        if (null !== $this->maxIdleConns) {
+            $res['maxIdleConns'] = $this->maxIdleConns;
+        }
+        if (null !== $this->network) {
+            $res['network'] = $this->network;
+        }
+        if (null !== $this->userAgent) {
+            $res['userAgent'] = $this->userAgent;
+        }
+        if (null !== $this->suffix) {
+            $res['suffix'] = $this->suffix;
+        }
+        if (null !== $this->socks5Proxy) {
+            $res['socks5Proxy'] = $this->socks5Proxy;
+        }
+        if (null !== $this->socks5NetWork) {
+            $res['socks5NetWork'] = $this->socks5NetWork;
+        }
+        if (null !== $this->endpointType) {
+            $res['endpointType'] = $this->endpointType;
+        }
+        if (null !== $this->openPlatformEndpoint) {
+            $res['openPlatformEndpoint'] = $this->openPlatformEndpoint;
+        }
+        if (null !== $this->type) {
+            $res['type'] = $this->type;
+        }
+        if (null !== $this->signatureAlgorithm) {
+            $res['signatureAlgorithm'] = $this->signatureAlgorithm;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return Config
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['accessKeyId'])) {
+            $model->accessKeyId = $map['accessKeyId'];
+        }
+        if (isset($map['accessKeySecret'])) {
+            $model->accessKeySecret = $map['accessKeySecret'];
+        }
+        if (isset($map['securityToken'])) {
+            $model->securityToken = $map['securityToken'];
+        }
+        if (isset($map['protocol'])) {
+            $model->protocol = $map['protocol'];
+        }
+        if (isset($map['regionId'])) {
+            $model->regionId = $map['regionId'];
+        }
+        if (isset($map['readTimeout'])) {
+            $model->readTimeout = $map['readTimeout'];
+        }
+        if (isset($map['connectTimeout'])) {
+            $model->connectTimeout = $map['connectTimeout'];
+        }
+        if (isset($map['httpProxy'])) {
+            $model->httpProxy = $map['httpProxy'];
+        }
+        if (isset($map['httpsProxy'])) {
+            $model->httpsProxy = $map['httpsProxy'];
+        }
+        if (isset($map['credential'])) {
+            $model->credential = Credential::fromMap($map['credential']);
+        }
+        if (isset($map['endpoint'])) {
+            $model->endpoint = $map['endpoint'];
+        }
+        if (isset($map['noProxy'])) {
+            $model->noProxy = $map['noProxy'];
+        }
+        if (isset($map['maxIdleConns'])) {
+            $model->maxIdleConns = $map['maxIdleConns'];
+        }
+        if (isset($map['network'])) {
+            $model->network = $map['network'];
+        }
+        if (isset($map['userAgent'])) {
+            $model->userAgent = $map['userAgent'];
+        }
+        if (isset($map['suffix'])) {
+            $model->suffix = $map['suffix'];
+        }
+        if (isset($map['socks5Proxy'])) {
+            $model->socks5Proxy = $map['socks5Proxy'];
+        }
+        if (isset($map['socks5NetWork'])) {
+            $model->socks5NetWork = $map['socks5NetWork'];
+        }
+        if (isset($map['endpointType'])) {
+            $model->endpointType = $map['endpointType'];
+        }
+        if (isset($map['openPlatformEndpoint'])) {
+            $model->openPlatformEndpoint = $map['openPlatformEndpoint'];
+        }
+        if (isset($map['type'])) {
+            $model->type = $map['type'];
+        }
+        if (isset($map['signatureAlgorithm'])) {
+            $model->signatureAlgorithm = $map['signatureAlgorithm'];
+        }
+
+        return $model;
+    }
+}

+ 65 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/src/Models/OpenApiRequest.php

@@ -0,0 +1,65 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace Darabonba\OpenApi\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class OpenApiRequest extends Model
+{
+    public $headers;
+
+    public $query;
+
+    public $body;
+
+    public $stream;
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->query) {
+            $res['query'] = $this->query;
+        }
+        if (null !== $this->body) {
+            $res['body'] = $this->body;
+        }
+        if (null !== $this->stream) {
+            $res['stream'] = $this->stream;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return OpenApiRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['query'])) {
+            $model->query = $map['query'];
+        }
+        if (isset($map['body'])) {
+            $model->body = $map['body'];
+        }
+        if (isset($map['stream'])) {
+            $model->stream = $map['stream'];
+        }
+
+        return $model;
+    }
+}

+ 137 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/src/Models/Params.php

@@ -0,0 +1,137 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace Darabonba\OpenApi\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class Params extends Model
+{
+    /**
+     * @var string
+     */
+    public $action;
+
+    /**
+     * @var string
+     */
+    public $version;
+
+    /**
+     * @var string
+     */
+    public $protocol;
+
+    /**
+     * @var string
+     */
+    public $pathname;
+
+    /**
+     * @var string
+     */
+    public $method;
+
+    /**
+     * @var string
+     */
+    public $authType;
+
+    /**
+     * @var string
+     */
+    public $bodyType;
+
+    /**
+     * @var string
+     */
+    public $reqBodyType;
+
+    public $style;
+
+    public function validate()
+    {
+        Model::validateRequired('action', $this->action, true);
+        Model::validateRequired('version', $this->version, true);
+        Model::validateRequired('protocol', $this->protocol, true);
+        Model::validateRequired('pathname', $this->pathname, true);
+        Model::validateRequired('method', $this->method, true);
+        Model::validateRequired('authType', $this->authType, true);
+        Model::validateRequired('bodyType', $this->bodyType, true);
+        Model::validateRequired('reqBodyType', $this->reqBodyType, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->action) {
+            $res['action'] = $this->action;
+        }
+        if (null !== $this->version) {
+            $res['version'] = $this->version;
+        }
+        if (null !== $this->protocol) {
+            $res['protocol'] = $this->protocol;
+        }
+        if (null !== $this->pathname) {
+            $res['pathname'] = $this->pathname;
+        }
+        if (null !== $this->method) {
+            $res['method'] = $this->method;
+        }
+        if (null !== $this->authType) {
+            $res['authType'] = $this->authType;
+        }
+        if (null !== $this->bodyType) {
+            $res['bodyType'] = $this->bodyType;
+        }
+        if (null !== $this->reqBodyType) {
+            $res['reqBodyType'] = $this->reqBodyType;
+        }
+        if (null !== $this->style) {
+            $res['style'] = $this->style;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return Params
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['action'])) {
+            $model->action = $map['action'];
+        }
+        if (isset($map['version'])) {
+            $model->version = $map['version'];
+        }
+        if (isset($map['protocol'])) {
+            $model->protocol = $map['protocol'];
+        }
+        if (isset($map['pathname'])) {
+            $model->pathname = $map['pathname'];
+        }
+        if (isset($map['method'])) {
+            $model->method = $map['method'];
+        }
+        if (isset($map['authType'])) {
+            $model->authType = $map['authType'];
+        }
+        if (isset($map['bodyType'])) {
+            $model->bodyType = $map['bodyType'];
+        }
+        if (isset($map['reqBodyType'])) {
+            $model->reqBodyType = $map['reqBodyType'];
+        }
+        if (isset($map['style'])) {
+            $model->style = $map['style'];
+        }
+
+        return $model;
+    }
+}

+ 939 - 0
base/composer/vendor/alibabacloud/darabonba-openapi/src/OpenApiClient.php

@@ -0,0 +1,939 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace Darabonba\OpenApi;
+
+use AlibabaCloud\Credentials\Credential;
+use AlibabaCloud\Credentials\Credential\Config;
+use AlibabaCloud\OpenApiUtil\OpenApiUtilClient;
+use AlibabaCloud\Tea\Exception\TeaError;
+use AlibabaCloud\Tea\Exception\TeaUnableRetryError;
+use AlibabaCloud\Tea\Request;
+use AlibabaCloud\Tea\Tea;
+use AlibabaCloud\Tea\Utils\Utils;
+use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
+use Darabonba\OpenApi\Models\OpenApiRequest;
+use Darabonba\OpenApi\Models\Params;
+use Exception;
+
+/**
+ * This is for OpenApi SDK.
+ */
+class OpenApiClient
+{
+    protected $_endpoint;
+
+    protected $_regionId;
+
+    protected $_protocol;
+
+    protected $_userAgent;
+
+    protected $_endpointRule;
+
+    protected $_endpointMap;
+
+    protected $_suffix;
+
+    protected $_readTimeout;
+
+    protected $_connectTimeout;
+
+    protected $_httpProxy;
+
+    protected $_httpsProxy;
+
+    protected $_socks5Proxy;
+
+    protected $_socks5NetWork;
+
+    protected $_noProxy;
+
+    protected $_network;
+
+    protected $_productId;
+
+    protected $_maxIdleConns;
+
+    protected $_endpointType;
+
+    protected $_openPlatformEndpoint;
+
+    protected $_credential;
+
+    protected $_signatureAlgorithm;
+
+    protected $_headers;
+
+    /**
+     * Init client with Config.
+     *
+     * @param config config contains the necessary information to create a client
+     * @param mixed $config
+     */
+    public function __construct($config)
+    {
+        if (Utils::isUnset($config)) {
+            throw new TeaError([
+                'code'    => 'ParameterMissing',
+                'message' => "'config' can not be unset",
+            ]);
+        }
+        if (!Utils::empty_($config->accessKeyId) && !Utils::empty_($config->accessKeySecret)) {
+            if (!Utils::empty_($config->securityToken)) {
+                $config->type = 'sts';
+            } else {
+                $config->type = 'access_key';
+            }
+            $credentialConfig = new Config([
+                'accessKeyId'     => $config->accessKeyId,
+                'type'            => $config->type,
+                'accessKeySecret' => $config->accessKeySecret,
+                'securityToken'   => $config->securityToken,
+            ]);
+            $this->_credential = new Credential($credentialConfig);
+        } elseif (!Utils::isUnset($config->credential)) {
+            $this->_credential = $config->credential;
+        }
+        $this->_endpoint           = $config->endpoint;
+        $this->_endpointType       = $config->endpointType;
+        $this->_protocol           = $config->protocol;
+        $this->_regionId           = $config->regionId;
+        $this->_userAgent          = $config->userAgent;
+        $this->_readTimeout        = $config->readTimeout;
+        $this->_connectTimeout     = $config->connectTimeout;
+        $this->_httpProxy          = $config->httpProxy;
+        $this->_httpsProxy         = $config->httpsProxy;
+        $this->_noProxy            = $config->noProxy;
+        $this->_socks5Proxy        = $config->socks5Proxy;
+        $this->_socks5NetWork      = $config->socks5NetWork;
+        $this->_maxIdleConns       = $config->maxIdleConns;
+        $this->_signatureAlgorithm = $config->signatureAlgorithm;
+    }
+
+    /**
+     * Encapsulate the request and invoke the network.
+     *
+     * @param string         $action   api name
+     * @param string         $version  product version
+     * @param string         $protocol http or https
+     * @param string         $method   e.g. GET
+     * @param string         $authType authorization type e.g. AK
+     * @param string         $bodyType response body type e.g. String
+     * @param OpenApiRequest $request  object of OpenApiRequest
+     * @param RuntimeOptions $runtime  which controls some details of call api, such as retry times
+     *
+     * @throws TeaError
+     * @throws Exception
+     * @throws TeaUnableRetryError
+     *
+     * @return array the response
+     */
+    public function doRPCRequest($action, $version, $protocol, $method, $authType, $bodyType, $request, $runtime)
+    {
+        $request->validate();
+        $runtime->validate();
+        $_runtime = [
+            'timeouted'      => 'retry',
+            'readTimeout'    => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
+            'connectTimeout' => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
+            'httpProxy'      => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
+            'httpsProxy'     => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
+            'noProxy'        => Utils::defaultString($runtime->noProxy, $this->_noProxy),
+            'maxIdleConns'   => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
+            'retry'          => [
+                'retryable'   => $runtime->autoretry,
+                'maxAttempts' => Utils::defaultNumber($runtime->maxAttempts, 3),
+            ],
+            'backoff' => [
+                'policy' => Utils::defaultString($runtime->backoffPolicy, 'no'),
+                'period' => Utils::defaultNumber($runtime->backoffPeriod, 1),
+            ],
+            'ignoreSSL' => $runtime->ignoreSSL,
+        ];
+        $_lastRequest   = null;
+        $_lastException = null;
+        $_now           = time();
+        $_retryTimes    = 0;
+        while (Tea::allowRetry(@$_runtime['retry'], $_retryTimes, $_now)) {
+            if ($_retryTimes > 0) {
+                $_backoffTime = Tea::getBackoffTime(@$_runtime['backoff'], $_retryTimes);
+                if ($_backoffTime > 0) {
+                    Tea::sleep($_backoffTime);
+                }
+            }
+            $_retryTimes = $_retryTimes + 1;
+
+            try {
+                $_request           = new Request();
+                $_request->protocol = Utils::defaultString($this->_protocol, $protocol);
+                $_request->method   = $method;
+                $_request->pathname = '/';
+                $_request->query    = Tea::merge([
+                    'Action'         => $action,
+                    'Format'         => 'json',
+                    'Version'        => $version,
+                    'Timestamp'      => OpenApiUtilClient::getTimestamp(),
+                    'SignatureNonce' => Utils::getNonce(),
+                ], $request->query);
+                $headers = $this->getRpcHeaders();
+                if (Utils::isUnset($headers)) {
+                    // endpoint is setted in product client
+                    $_request->headers = [
+                        'host'          => $this->_endpoint,
+                        'x-acs-version' => $version,
+                        'x-acs-action'  => $action,
+                        'user-agent'    => $this->getUserAgent(),
+                    ];
+                } else {
+                    $_request->headers = Tea::merge([
+                        'host'          => $this->_endpoint,
+                        'x-acs-version' => $version,
+                        'x-acs-action'  => $action,
+                        'user-agent'    => $this->getUserAgent(),
+                    ], $headers);
+                }
+                if (!Utils::isUnset($request->body)) {
+                    $m                                 = Utils::assertAsMap($request->body);
+                    $tmp                               = Utils::anyifyMapValue(OpenApiUtilClient::query($m));
+                    $_request->body                    = Utils::toFormString($tmp);
+                    $_request->headers['content-type'] = 'application/x-www-form-urlencoded';
+                }
+                if (!Utils::equalString($authType, 'Anonymous')) {
+                    $accessKeyId     = $this->getAccessKeyId();
+                    $accessKeySecret = $this->getAccessKeySecret();
+                    $securityToken   = $this->getSecurityToken();
+                    if (!Utils::empty_($securityToken)) {
+                        $_request->query['SecurityToken'] = $securityToken;
+                    }
+                    $_request->query['SignatureMethod']  = 'HMAC-SHA1';
+                    $_request->query['SignatureVersion'] = '1.0';
+                    $_request->query['AccessKeyId']      = $accessKeyId;
+                    $t                                   = null;
+                    if (!Utils::isUnset($request->body)) {
+                        $t = Utils::assertAsMap($request->body);
+                    }
+                    $signedParam                  = Tea::merge($_request->query, OpenApiUtilClient::query($t));
+                    $_request->query['Signature'] = OpenApiUtilClient::getRPCSignature($signedParam, $_request->method, $accessKeySecret);
+                }
+                $_lastRequest = $_request;
+                $_response    = Tea::send($_request, $_runtime);
+                if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
+                    $_res      = Utils::readAsJSON($_response->body);
+                    $err       = Utils::assertAsMap($_res);
+                    $requestId = self::defaultAny(@$err['RequestId'], @$err['requestId']);
+
+                    throw new TeaError([
+                        'code'    => '' . (string) (self::defaultAny(@$err['Code'], @$err['code'])) . '',
+                        'message' => 'code: ' . (string) ($_response->statusCode) . ', ' . (string) (self::defaultAny(@$err['Message'], @$err['message'])) . ' request id: ' . (string) ($requestId) . '',
+                        'data'    => $err,
+                    ]);
+                }
+                if (Utils::equalString($bodyType, 'binary')) {
+                    $resp = [
+                        'body'    => $_response->body,
+                        'headers' => $_response->headers,
+                    ];
+
+                    return $resp;
+                }
+                if (Utils::equalString($bodyType, 'byte')) {
+                    $byt = Utils::readAsBytes($_response->body);
+
+                    return [
+                        'body'    => $byt,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'string')) {
+                    $str = Utils::readAsString($_response->body);
+
+                    return [
+                        'body'    => $str,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'json')) {
+                    $obj = Utils::readAsJSON($_response->body);
+                    $res = Utils::assertAsMap($obj);
+
+                    return [
+                        'body'    => $res,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'array')) {
+                    $arr = Utils::readAsJSON($_response->body);
+
+                    return [
+                        'body'    => $arr,
+                        'headers' => $_response->headers,
+                    ];
+                }
+
+                return [
+                    'headers' => $_response->headers,
+                ];
+            } catch (Exception $e) {
+                if (!($e instanceof TeaError)) {
+                    $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
+                }
+                if (Tea::isRetryable($e)) {
+                    $_lastException = $e;
+
+                    continue;
+                }
+
+                throw $e;
+            }
+        }
+
+        throw new TeaUnableRetryError($_lastRequest, $_lastException);
+    }
+
+    /**
+     * Encapsulate the request and invoke the network.
+     *
+     * @param string         $action   api name
+     * @param string         $version  product version
+     * @param string         $protocol http or https
+     * @param string         $method   e.g. GET
+     * @param string         $authType authorization type e.g. AK
+     * @param string         $pathname pathname of every api
+     * @param string         $bodyType response body type e.g. String
+     * @param OpenApiRequest $request  object of OpenApiRequest
+     * @param RuntimeOptions $runtime  which controls some details of call api, such as retry times
+     *
+     * @throws TeaError
+     * @throws Exception
+     * @throws TeaUnableRetryError
+     *
+     * @return array the response
+     */
+    public function doROARequest($action, $version, $protocol, $method, $authType, $pathname, $bodyType, $request, $runtime)
+    {
+        $request->validate();
+        $runtime->validate();
+        $_runtime = [
+            'timeouted'      => 'retry',
+            'readTimeout'    => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
+            'connectTimeout' => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
+            'httpProxy'      => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
+            'httpsProxy'     => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
+            'noProxy'        => Utils::defaultString($runtime->noProxy, $this->_noProxy),
+            'maxIdleConns'   => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
+            'retry'          => [
+                'retryable'   => $runtime->autoretry,
+                'maxAttempts' => Utils::defaultNumber($runtime->maxAttempts, 3),
+            ],
+            'backoff' => [
+                'policy' => Utils::defaultString($runtime->backoffPolicy, 'no'),
+                'period' => Utils::defaultNumber($runtime->backoffPeriod, 1),
+            ],
+            'ignoreSSL' => $runtime->ignoreSSL,
+        ];
+        $_lastRequest   = null;
+        $_lastException = null;
+        $_now           = time();
+        $_retryTimes    = 0;
+        while (Tea::allowRetry(@$_runtime['retry'], $_retryTimes, $_now)) {
+            if ($_retryTimes > 0) {
+                $_backoffTime = Tea::getBackoffTime(@$_runtime['backoff'], $_retryTimes);
+                if ($_backoffTime > 0) {
+                    Tea::sleep($_backoffTime);
+                }
+            }
+            $_retryTimes = $_retryTimes + 1;
+
+            try {
+                $_request           = new Request();
+                $_request->protocol = Utils::defaultString($this->_protocol, $protocol);
+                $_request->method   = $method;
+                $_request->pathname = $pathname;
+                $_request->headers  = Tea::merge([
+                    'date'                    => Utils::getDateUTCString(),
+                    'host'                    => $this->_endpoint,
+                    'accept'                  => 'application/json',
+                    'x-acs-signature-nonce'   => Utils::getNonce(),
+                    'x-acs-signature-method'  => 'HMAC-SHA1',
+                    'x-acs-signature-version' => '1.0',
+                    'x-acs-version'           => $version,
+                    'x-acs-action'            => $action,
+                    'user-agent'              => Utils::getUserAgent($this->_userAgent),
+                ], $request->headers);
+                if (!Utils::isUnset($request->body)) {
+                    $_request->body                    = Utils::toJSONString($request->body);
+                    $_request->headers['content-type'] = 'application/json; charset=utf-8';
+                }
+                if (!Utils::isUnset($request->query)) {
+                    $_request->query = $request->query;
+                }
+                if (!Utils::equalString($authType, 'Anonymous')) {
+                    $accessKeyId     = $this->getAccessKeyId();
+                    $accessKeySecret = $this->getAccessKeySecret();
+                    $securityToken   = $this->getSecurityToken();
+                    if (!Utils::empty_($securityToken)) {
+                        $_request->headers['x-acs-accesskey-id']   = $accessKeyId;
+                        $_request->headers['x-acs-security-token'] = $securityToken;
+                    }
+                    $stringToSign                       = OpenApiUtilClient::getStringToSign($_request);
+                    $_request->headers['authorization'] = 'acs ' . $accessKeyId . ':' . OpenApiUtilClient::getROASignature($stringToSign, $accessKeySecret) . '';
+                }
+                $_lastRequest = $_request;
+                $_response    = Tea::send($_request, $_runtime);
+                if (Utils::equalNumber($_response->statusCode, 204)) {
+                    return [
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
+                    $_res      = Utils::readAsJSON($_response->body);
+                    $err       = Utils::assertAsMap($_res);
+                    $requestId = self::defaultAny(@$err['RequestId'], @$err['requestId']);
+                    $requestId = self::defaultAny($requestId, @$err['requestid']);
+
+                    throw new TeaError([
+                        'code'    => '' . (string) (self::defaultAny(@$err['Code'], @$err['code'])) . '',
+                        'message' => 'code: ' . (string) ($_response->statusCode) . ', ' . (string) (self::defaultAny(@$err['Message'], @$err['message'])) . ' request id: ' . (string) ($requestId) . '',
+                        'data'    => $err,
+                    ]);
+                }
+                if (Utils::equalString($bodyType, 'binary')) {
+                    $resp = [
+                        'body'    => $_response->body,
+                        'headers' => $_response->headers,
+                    ];
+
+                    return $resp;
+                }
+                if (Utils::equalString($bodyType, 'byte')) {
+                    $byt = Utils::readAsBytes($_response->body);
+
+                    return [
+                        'body'    => $byt,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'string')) {
+                    $str = Utils::readAsString($_response->body);
+
+                    return [
+                        'body'    => $str,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'json')) {
+                    $obj = Utils::readAsJSON($_response->body);
+                    $res = Utils::assertAsMap($obj);
+
+                    return [
+                        'body'    => $res,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'array')) {
+                    $arr = Utils::readAsJSON($_response->body);
+
+                    return [
+                        'body'    => $arr,
+                        'headers' => $_response->headers,
+                    ];
+                }
+
+                return [
+                    'headers' => $_response->headers,
+                ];
+            } catch (Exception $e) {
+                if (!($e instanceof TeaError)) {
+                    $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
+                }
+                if (Tea::isRetryable($e)) {
+                    $_lastException = $e;
+
+                    continue;
+                }
+
+                throw $e;
+            }
+        }
+
+        throw new TeaUnableRetryError($_lastRequest, $_lastException);
+    }
+
+    /**
+     * Encapsulate the request and invoke the network with form body.
+     *
+     * @param string         $action   api name
+     * @param string         $version  product version
+     * @param string         $protocol http or https
+     * @param string         $method   e.g. GET
+     * @param string         $authType authorization type e.g. AK
+     * @param string         $pathname pathname of every api
+     * @param string         $bodyType response body type e.g. String
+     * @param OpenApiRequest $request  object of OpenApiRequest
+     * @param RuntimeOptions $runtime  which controls some details of call api, such as retry times
+     *
+     * @throws TeaError
+     * @throws Exception
+     * @throws TeaUnableRetryError
+     *
+     * @return array the response
+     */
+    public function doROARequestWithForm($action, $version, $protocol, $method, $authType, $pathname, $bodyType, $request, $runtime)
+    {
+        $request->validate();
+        $runtime->validate();
+        $_runtime = [
+            'timeouted'      => 'retry',
+            'readTimeout'    => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
+            'connectTimeout' => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
+            'httpProxy'      => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
+            'httpsProxy'     => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
+            'noProxy'        => Utils::defaultString($runtime->noProxy, $this->_noProxy),
+            'maxIdleConns'   => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
+            'retry'          => [
+                'retryable'   => $runtime->autoretry,
+                'maxAttempts' => Utils::defaultNumber($runtime->maxAttempts, 3),
+            ],
+            'backoff' => [
+                'policy' => Utils::defaultString($runtime->backoffPolicy, 'no'),
+                'period' => Utils::defaultNumber($runtime->backoffPeriod, 1),
+            ],
+            'ignoreSSL' => $runtime->ignoreSSL,
+        ];
+        $_lastRequest   = null;
+        $_lastException = null;
+        $_now           = time();
+        $_retryTimes    = 0;
+        while (Tea::allowRetry(@$_runtime['retry'], $_retryTimes, $_now)) {
+            if ($_retryTimes > 0) {
+                $_backoffTime = Tea::getBackoffTime(@$_runtime['backoff'], $_retryTimes);
+                if ($_backoffTime > 0) {
+                    Tea::sleep($_backoffTime);
+                }
+            }
+            $_retryTimes = $_retryTimes + 1;
+
+            try {
+                $_request           = new Request();
+                $_request->protocol = Utils::defaultString($this->_protocol, $protocol);
+                $_request->method   = $method;
+                $_request->pathname = $pathname;
+                $_request->headers  = Tea::merge([
+                    'date'                    => Utils::getDateUTCString(),
+                    'host'                    => $this->_endpoint,
+                    'accept'                  => 'application/json',
+                    'x-acs-signature-nonce'   => Utils::getNonce(),
+                    'x-acs-signature-method'  => 'HMAC-SHA1',
+                    'x-acs-signature-version' => '1.0',
+                    'x-acs-version'           => $version,
+                    'x-acs-action'            => $action,
+                    'user-agent'              => Utils::getUserAgent($this->_userAgent),
+                ], $request->headers);
+                if (!Utils::isUnset($request->body)) {
+                    $m                                 = Utils::assertAsMap($request->body);
+                    $_request->body                    = OpenApiUtilClient::toForm($m);
+                    $_request->headers['content-type'] = 'application/x-www-form-urlencoded';
+                }
+                if (!Utils::isUnset($request->query)) {
+                    $_request->query = $request->query;
+                }
+                if (!Utils::equalString($authType, 'Anonymous')) {
+                    $accessKeyId     = $this->getAccessKeyId();
+                    $accessKeySecret = $this->getAccessKeySecret();
+                    $securityToken   = $this->getSecurityToken();
+                    if (!Utils::empty_($securityToken)) {
+                        $_request->headers['x-acs-accesskey-id']   = $accessKeyId;
+                        $_request->headers['x-acs-security-token'] = $securityToken;
+                    }
+                    $stringToSign                       = OpenApiUtilClient::getStringToSign($_request);
+                    $_request->headers['authorization'] = 'acs ' . $accessKeyId . ':' . OpenApiUtilClient::getROASignature($stringToSign, $accessKeySecret) . '';
+                }
+                $_lastRequest = $_request;
+                $_response    = Tea::send($_request, $_runtime);
+                if (Utils::equalNumber($_response->statusCode, 204)) {
+                    return [
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
+                    $_res = Utils::readAsJSON($_response->body);
+                    $err  = Utils::assertAsMap($_res);
+
+                    throw new TeaError([
+                        'code'    => '' . (string) (self::defaultAny(@$err['Code'], @$err['code'])) . '',
+                        'message' => 'code: ' . (string) ($_response->statusCode) . ', ' . (string) (self::defaultAny(@$err['Message'], @$err['message'])) . ' request id: ' . (string) (self::defaultAny(@$err['RequestId'], @$err['requestId'])) . '',
+                        'data'    => $err,
+                    ]);
+                }
+                if (Utils::equalString($bodyType, 'binary')) {
+                    $resp = [
+                        'body'    => $_response->body,
+                        'headers' => $_response->headers,
+                    ];
+
+                    return $resp;
+                }
+                if (Utils::equalString($bodyType, 'byte')) {
+                    $byt = Utils::readAsBytes($_response->body);
+
+                    return [
+                        'body'    => $byt,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'string')) {
+                    $str = Utils::readAsString($_response->body);
+
+                    return [
+                        'body'    => $str,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'json')) {
+                    $obj = Utils::readAsJSON($_response->body);
+                    $res = Utils::assertAsMap($obj);
+
+                    return [
+                        'body'    => $res,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($bodyType, 'array')) {
+                    $arr = Utils::readAsJSON($_response->body);
+
+                    return [
+                        'body'    => $arr,
+                        'headers' => $_response->headers,
+                    ];
+                }
+
+                return [
+                    'headers' => $_response->headers,
+                ];
+            } catch (Exception $e) {
+                if (!($e instanceof TeaError)) {
+                    $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
+                }
+                if (Tea::isRetryable($e)) {
+                    $_lastException = $e;
+
+                    continue;
+                }
+
+                throw $e;
+            }
+        }
+
+        throw new TeaUnableRetryError($_lastRequest, $_lastException);
+    }
+
+    /**
+     * Encapsulate the request and invoke the network.
+     *
+     * @param Params         $params
+     * @param OpenApiRequest $request object of OpenApiRequest
+     * @param RuntimeOptions $runtime which controls some details of call api, such as retry times
+     *
+     * @throws TeaError
+     * @throws Exception
+     * @throws TeaUnableRetryError
+     *
+     * @return array the response
+     */
+    public function doRequest($params, $request, $runtime)
+    {
+        $params->validate();
+        $request->validate();
+        $runtime->validate();
+        $_runtime = [
+            'timeouted'      => 'retry',
+            'readTimeout'    => Utils::defaultNumber($runtime->readTimeout, $this->_readTimeout),
+            'connectTimeout' => Utils::defaultNumber($runtime->connectTimeout, $this->_connectTimeout),
+            'httpProxy'      => Utils::defaultString($runtime->httpProxy, $this->_httpProxy),
+            'httpsProxy'     => Utils::defaultString($runtime->httpsProxy, $this->_httpsProxy),
+            'noProxy'        => Utils::defaultString($runtime->noProxy, $this->_noProxy),
+            'maxIdleConns'   => Utils::defaultNumber($runtime->maxIdleConns, $this->_maxIdleConns),
+            'retry'          => [
+                'retryable'   => $runtime->autoretry,
+                'maxAttempts' => Utils::defaultNumber($runtime->maxAttempts, 3),
+            ],
+            'backoff' => [
+                'policy' => Utils::defaultString($runtime->backoffPolicy, 'no'),
+                'period' => Utils::defaultNumber($runtime->backoffPeriod, 1),
+            ],
+            'ignoreSSL' => $runtime->ignoreSSL,
+        ];
+        $_lastRequest   = null;
+        $_lastException = null;
+        $_now           = time();
+        $_retryTimes    = 0;
+        while (Tea::allowRetry(@$_runtime['retry'], $_retryTimes, $_now)) {
+            if ($_retryTimes > 0) {
+                $_backoffTime = Tea::getBackoffTime(@$_runtime['backoff'], $_retryTimes);
+                if ($_backoffTime > 0) {
+                    Tea::sleep($_backoffTime);
+                }
+            }
+            $_retryTimes = $_retryTimes + 1;
+
+            try {
+                $_request           = new Request();
+                $_request->protocol = Utils::defaultString($this->_protocol, $params->protocol);
+                $_request->method   = $params->method;
+                $_request->pathname = $params->pathname;
+                $_request->query    = $request->query;
+                // endpoint is setted in product client
+                $_request->headers = Tea::merge([
+                    'host'                  => $this->_endpoint,
+                    'x-acs-version'         => $params->version,
+                    'x-acs-action'          => $params->action,
+                    'user-agent'            => $this->getUserAgent(),
+                    'x-acs-date'            => OpenApiUtilClient::getTimestamp(),
+                    'x-acs-signature-nonce' => Utils::getNonce(),
+                    'accept'                => 'application/json',
+                ], $request->headers);
+                $signatureAlgorithm   = Utils::defaultString($this->_signatureAlgorithm, 'ACS3-HMAC-SHA256');
+                $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash(Utils::toBytes(''), $signatureAlgorithm));
+                if (!Utils::isUnset($request->body)) {
+                    if (Utils::equalString($params->reqBodyType, 'json')) {
+                        $jsonObj              = Utils::toJSONString($request->body);
+                        $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash(Utils::toBytes($jsonObj), $signatureAlgorithm));
+                        $_request->body       = $jsonObj;
+                    } else {
+                        $m                                 = Utils::assertAsMap($request->body);
+                        $formObj                           = OpenApiUtilClient::toForm($m);
+                        $hashedRequestPayload              = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash(Utils::toBytes($formObj), $signatureAlgorithm));
+                        $_request->body                    = $formObj;
+                        $_request->headers['content-type'] = 'application/x-www-form-urlencoded';
+                    }
+                }
+                if (!Utils::isUnset($request->stream)) {
+                    $tmp                  = Utils::readAsBytes($request->stream);
+                    $hashedRequestPayload = OpenApiUtilClient::hexEncode(OpenApiUtilClient::hash($tmp, $signatureAlgorithm));
+                    $_request->body       = $tmp;
+                }
+                $_request->headers['x-acs-content-sha256'] = $hashedRequestPayload;
+                if (!Utils::equalString($params->authType, 'Anonymous')) {
+                    $accessKeyId     = $this->getAccessKeyId();
+                    $accessKeySecret = $this->getAccessKeySecret();
+                    $securityToken   = $this->getSecurityToken();
+                    if (!Utils::empty_($securityToken)) {
+                        $_request->headers['x-acs-security-token'] = $securityToken;
+                    }
+                    $_request->headers['Authorization'] = OpenApiUtilClient::getAuthorization($_request, $signatureAlgorithm, $hashedRequestPayload, $accessKeyId, $accessKeySecret);
+                }
+                $_lastRequest = $_request;
+                $_response    = Tea::send($_request, $_runtime);
+                if (Utils::is4xx($_response->statusCode) || Utils::is5xx($_response->statusCode)) {
+                    $_res = Utils::readAsJSON($_response->body);
+                    $err  = Utils::assertAsMap($_res);
+
+                    throw new TeaError([
+                        'code'    => '' . (string) (self::defaultAny(@$err['Code'], @$err['code'])) . '',
+                        'message' => 'code: ' . (string) ($_response->statusCode) . ', ' . (string) (self::defaultAny(@$err['Message'], @$err['message'])) . ' request id: ' . (string) (self::defaultAny(@$err['RequestId'], @$err['requestId'])) . '',
+                        'data'    => $err,
+                    ]);
+                }
+                if (Utils::equalString($params->bodyType, 'binary')) {
+                    $resp = [
+                        'body'    => $_response->body,
+                        'headers' => $_response->headers,
+                    ];
+
+                    return $resp;
+                }
+                if (Utils::equalString($params->bodyType, 'byte')) {
+                    $byt = Utils::readAsBytes($_response->body);
+
+                    return [
+                        'body'    => $byt,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($params->bodyType, 'string')) {
+                    $str = Utils::readAsString($_response->body);
+
+                    return [
+                        'body'    => $str,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($params->bodyType, 'json')) {
+                    $obj = Utils::readAsJSON($_response->body);
+                    $res = Utils::assertAsMap($obj);
+
+                    return [
+                        'body'    => $res,
+                        'headers' => $_response->headers,
+                    ];
+                }
+                if (Utils::equalString($params->bodyType, 'array')) {
+                    $arr = Utils::readAsJSON($_response->body);
+
+                    return [
+                        'body'    => $arr,
+                        'headers' => $_response->headers,
+                    ];
+                }
+
+                return [
+                    'headers' => $_response->headers,
+                ];
+            } catch (Exception $e) {
+                if (!($e instanceof TeaError)) {
+                    $e = new TeaError([], $e->getMessage(), $e->getCode(), $e);
+                }
+                if (Tea::isRetryable($e)) {
+                    $_lastException = $e;
+
+                    continue;
+                }
+
+                throw $e;
+            }
+        }
+
+        throw new TeaUnableRetryError($_lastRequest, $_lastException);
+    }
+
+    /**
+     * @param Params         $params
+     * @param OpenApiRequest $request
+     * @param RuntimeOptions $runtime
+     *
+     * @throws TeaError
+     *
+     * @return array
+     */
+    public function callApi($params, $request, $runtime)
+    {
+        if (Utils::isUnset($params)) {
+            throw new TeaError([
+                'code'    => 'ParameterMissing',
+                'message' => "'params' can not be unset",
+            ]);
+        }
+        if (Utils::isUnset($this->_signatureAlgorithm) || !Utils::equalString($this->_signatureAlgorithm, 'v2')) {
+            return $this->doRequest($params, $request, $runtime);
+        }
+        if (Utils::equalString($params->style, 'ROA') && Utils::equalString($params->reqBodyType, 'json')) {
+            return $this->doROARequest($params->action, $params->version, $params->protocol, $params->method, $params->authType, $params->pathname, $params->bodyType, $request, $runtime);
+        }
+        if (Utils::equalString($params->style, 'ROA')) {
+            return $this->doROARequestWithForm($params->action, $params->version, $params->protocol, $params->method, $params->authType, $params->pathname, $params->bodyType, $request, $runtime);
+        }
+
+        return $this->doRPCRequest($params->action, $params->version, $params->protocol, $params->method, $params->authType, $params->bodyType, $request, $runtime);
+    }
+
+    /**
+     * Get user agent.
+     *
+     * @return string user agent
+     */
+    public function getUserAgent()
+    {
+        return Utils::getUserAgent($this->_userAgent);
+    }
+
+    /**
+     * Get accesskey id by using credential.
+     *
+     * @return string accesskey id
+     */
+    public function getAccessKeyId()
+    {
+        if (Utils::isUnset($this->_credential)) {
+            return '';
+        }
+
+        return $this->_credential->getAccessKeyId();
+    }
+
+    /**
+     * Get accesskey secret by using credential.
+     *
+     * @return string accesskey secret
+     */
+    public function getAccessKeySecret()
+    {
+        if (Utils::isUnset($this->_credential)) {
+            return '';
+        }
+
+        return $this->_credential->getAccessKeySecret();
+    }
+
+    /**
+     * Get security token by using credential.
+     *
+     * @return string security token
+     */
+    public function getSecurityToken()
+    {
+        if (Utils::isUnset($this->_credential)) {
+            return '';
+        }
+
+        return $this->_credential->getSecurityToken();
+    }
+
+    /**
+     * If inputValue is not null, return it or return defaultValue.
+     *
+     * @param mixed $inputValue   users input value
+     * @param mixed $defaultValue default value
+     *
+     * @return any the final result
+     */
+    public static function defaultAny($inputValue, $defaultValue)
+    {
+        if (Utils::isUnset($inputValue)) {
+            return $defaultValue;
+        }
+
+        return $inputValue;
+    }
+
+    /**
+     * If the endpointRule and config.endpoint are empty, throw error.
+     *
+     * @param \Darabonba\OpenApi\Models\Config $config config contains the necessary information to create a client
+     *
+     * @throws TeaError
+     */
+    public function checkConfig($config)
+    {
+        if (Utils::empty_($this->_endpointRule) && Utils::empty_($config->endpoint)) {
+            throw new TeaError([
+                'code'    => 'ParameterMissing',
+                'message' => "'config.endpoint' can not be empty",
+            ]);
+        }
+    }
+
+    /**
+     * set RPC header for debug.
+     *
+     * @param string[] $headers headers for debug, this header can be used only once
+     */
+    public function setRpcHeaders($headers)
+    {
+        $this->_headers = $headers;
+    }
+
+    /**
+     * get RPC header for debug.
+     *
+     * @return array
+     */
+    public function getRpcHeaders()
+    {
+        $headers        = $this->_headers;
+        $this->_headers = null;
+
+        return $headers;
+    }
+}

+ 3 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/ChangeLog.md

@@ -0,0 +1,3 @@
+2020-12-30 Version: 1.0.0
+- AMP Version Change.
+

+ 35 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/README-CN.md

@@ -0,0 +1,35 @@
+[English](README.md) | 简体中文
+
+![](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
+
+# Alibaba Cloud Dyplsapi SDK for PHP
+
+## 安装
+
+### Composer
+
+```bash
+composer require alibabacloud/dyplsapi-20170525
+```
+
+## 问题
+
+[提交 Issue](https://github.com/aliyun/alibabacloud-php-sdk/issues/new),不符合指南的问题可能会立即关闭。
+
+## 使用说明
+
+[快速使用](https://github.com/aliyun/alibabacloud-php-sdk/blob/master/docs/0-Examples-CN.md#%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8)
+
+## 发行说明
+
+每个版本的详细更改记录在[发行说明](./ChangeLog.txt)中。
+
+## 相关
+
+* [最新源码](https://github.com/aliyun/alibabacloud-php-sdk/)
+
+## 许可证
+
+[Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.

+ 35 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/README.md

@@ -0,0 +1,35 @@
+English | [简体中文](README-CN.md)
+
+![](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
+
+# Alibaba Cloud Dyplsapi SDK for PHP
+
+## Installation
+
+### Composer
+
+```bash
+composer require alibabacloud/dyplsapi-20170525
+```
+
+## Issues
+
+[Opening an Issue](https://github.com/aliyun/alibabacloud-php-sdk/issues/new), Issues not conforming to the guidelines may be closed immediately.
+
+## Usage
+
+[Quick Examples](https://github.com/aliyun/alibabacloud-php-sdk/blob/master/docs/0-Examples-EN.md#quick-examples)
+
+## Changelog
+
+Detailed changes for each release are documented in the [release notes](./ChangeLog.txt).
+
+## References
+
+* [Latest Release](https://github.com/aliyun/alibabacloud-php-sdk/)
+
+## License
+
+[Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.

+ 17 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/autoload.php

@@ -0,0 +1,17 @@
+<?php
+
+if (file_exists(__DIR__ . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php')) {
+    require_once __DIR__ . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
+}
+
+spl_autoload_register(function ($class) {
+    $name = str_replace('AlibabaCloud\\SDK\\Dyplsapi\\V20170525\\', '', $class);
+    $file = __DIR__ . \DIRECTORY_SEPARATOR . 'src' . \DIRECTORY_SEPARATOR . str_replace('\\', \DIRECTORY_SEPARATOR, $name) . '.php';
+    if (file_exists($file)) {
+        require_once $file;
+
+        return true;
+    }
+
+    return false;
+});

+ 32 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/composer.json

@@ -0,0 +1,32 @@
+{
+  "name": "alibabacloud/dyplsapi-20170525",
+  "description": "Alibaba Cloud Dyplsapi (20170525) SDK Library for PHP",
+  "type": "library",
+  "license": "Apache-2.0",
+  "authors": [
+    {
+      "name": "Alibaba Cloud SDK",
+      "email": "sdk-team@alibabacloud.com"
+    }
+  ],
+  "require": {
+    "php": ">5.5",
+    "alibabacloud/tea-utils": "^0.2.0",
+    "alibabacloud/darabonba-openapi": "^0.1.0",
+    "alibabacloud/endpoint-util": "^0.1.0"
+  },
+  "autoload": {
+    "psr-4": {
+      "AlibabaCloud\\SDK\\Dyplsapi\\V20170525\\": "src"
+    }
+  },
+  "scripts": {
+    "fixer": "php-cs-fixer fix ./"
+  },
+  "config": {
+    "sort-packages": true,
+    "preferred-install": "dist",
+    "optimize-autoloader": true
+  },
+  "prefer-stable": true
+}

+ 975 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Dyplsapi.php

@@ -0,0 +1,975 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525;
+
+use AlibabaCloud\Endpoint\Endpoint;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\AddAxnTrackNoRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\AddAxnTrackNoResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\AddSecretBlacklistRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\AddSecretBlacklistResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxbRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxbResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxgRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxgResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnExtensionRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnExtensionResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BuySecretNoRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BuySecretNoResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\CreateAxgGroupRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\CreateAxgGroupResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\CreateSubscriptionRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\CreateSubscriptionResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\DeleteSecretBlacklistRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\DeleteSecretBlacklistResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetFaceVerifyRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetFaceVerifyResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetSecretAsrDetailRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetSecretAsrDetailResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetSubscriptionDetailRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetSubscriptionDetailResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetTotalPublicUrlRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\GetTotalPublicUrlResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\InitFaceVerifyRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\InitFaceVerifyResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\LockSecretNoRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\LockSecretNoResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\OperateAxgGroupRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\OperateAxgGroupResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\OperateBlackNoRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\OperateBlackNoResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QueryCallStatusRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QueryCallStatusResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QueryPhoneNoAByTrackNoRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QueryPhoneNoAByTrackNoResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QueryRecordFileDownloadUrlRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QueryRecordFileDownloadUrlResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QuerySecretNoRemainRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QuerySecretNoRemainResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QuerySubscriptionDetailRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QuerySubscriptionDetailResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QuerySubsIdRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\QuerySubsIdResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\ReleaseSecretNoRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\ReleaseSecretNoResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UnbindSubscriptionRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UnbindSubscriptionResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UnlockSecretNoRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UnlockSecretNoResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdateDefaultBRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdateDefaultBResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdatePhoneNumberRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdatePhoneNumberResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdatePhoneSwitchRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdatePhoneSwitchResponse;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdateSubscriptionRequest;
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\UpdateSubscriptionResponse;
+use AlibabaCloud\Tea\Utils\Utils;
+use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
+use Darabonba\OpenApi\Models\OpenApiRequest;
+use Darabonba\OpenApi\OpenApiClient;
+
+class Dyplsapi extends OpenApiClient
+{
+    public function __construct($config)
+    {
+        parent::__construct($config);
+        $this->_endpointRule = 'central';
+        $this->checkConfig($config);
+        $this->_endpoint = $this->getEndpoint('dyplsapi', $this->_regionId, $this->_endpointRule, $this->_network, $this->_suffix, $this->_endpointMap, $this->_endpoint);
+    }
+
+    /**
+     * @param string   $productId
+     * @param string   $regionId
+     * @param string   $endpointRule
+     * @param string   $network
+     * @param string   $suffix
+     * @param string[] $endpointMap
+     * @param string   $endpoint
+     *
+     * @return string
+     */
+    public function getEndpoint($productId, $regionId, $endpointRule, $network, $suffix, $endpointMap, $endpoint)
+    {
+        if (!Utils::empty_($endpoint)) {
+            return $endpoint;
+        }
+        if (!Utils::isUnset($endpointMap) && !Utils::empty_(@$endpointMap[$regionId])) {
+            return @$endpointMap[$regionId];
+        }
+
+        return Endpoint::getEndpointRules($productId, $regionId, $endpointRule, $network, $suffix);
+    }
+
+    /**
+     * @param AddAxnTrackNoRequest $request
+     * @param RuntimeOptions       $runtime
+     *
+     * @return AddAxnTrackNoResponse
+     */
+    public function addAxnTrackNoWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return AddAxnTrackNoResponse::fromMap($this->doRPCRequest('AddAxnTrackNo', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param AddAxnTrackNoRequest $request
+     *
+     * @return AddAxnTrackNoResponse
+     */
+    public function addAxnTrackNo($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->addAxnTrackNoWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param AddSecretBlacklistRequest $request
+     * @param RuntimeOptions            $runtime
+     *
+     * @return AddSecretBlacklistResponse
+     */
+    public function addSecretBlacklistWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return AddSecretBlacklistResponse::fromMap($this->doRPCRequest('AddSecretBlacklist', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param AddSecretBlacklistRequest $request
+     *
+     * @return AddSecretBlacklistResponse
+     */
+    public function addSecretBlacklist($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->addSecretBlacklistWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param BindAxbRequest $request
+     * @param RuntimeOptions $runtime
+     *
+     * @return BindAxbResponse
+     */
+    public function bindAxbWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return BindAxbResponse::fromMap($this->doRPCRequest('BindAxb', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param BindAxbRequest $request
+     *
+     * @return BindAxbResponse
+     */
+    public function bindAxb($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->bindAxbWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param BindAxgRequest $request
+     * @param RuntimeOptions $runtime
+     *
+     * @return BindAxgResponse
+     */
+    public function bindAxgWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return BindAxgResponse::fromMap($this->doRPCRequest('BindAxg', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param BindAxgRequest $request
+     *
+     * @return BindAxgResponse
+     */
+    public function bindAxg($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->bindAxgWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param BindAxnRequest $request
+     * @param RuntimeOptions $runtime
+     *
+     * @return BindAxnResponse
+     */
+    public function bindAxnWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return BindAxnResponse::fromMap($this->doRPCRequest('BindAxn', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param BindAxnRequest $request
+     *
+     * @return BindAxnResponse
+     */
+    public function bindAxn($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->bindAxnWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param BindAxnExtensionRequest $request
+     * @param RuntimeOptions          $runtime
+     *
+     * @return BindAxnExtensionResponse
+     */
+    public function bindAxnExtensionWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return BindAxnExtensionResponse::fromMap($this->doRPCRequest('BindAxnExtension', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param BindAxnExtensionRequest $request
+     *
+     * @return BindAxnExtensionResponse
+     */
+    public function bindAxnExtension($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->bindAxnExtensionWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param BuySecretNoRequest $request
+     * @param RuntimeOptions     $runtime
+     *
+     * @return BuySecretNoResponse
+     */
+    public function buySecretNoWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return BuySecretNoResponse::fromMap($this->doRPCRequest('BuySecretNo', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param BuySecretNoRequest $request
+     *
+     * @return BuySecretNoResponse
+     */
+    public function buySecretNo($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->buySecretNoWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param CreateAxgGroupRequest $request
+     * @param RuntimeOptions        $runtime
+     *
+     * @return CreateAxgGroupResponse
+     */
+    public function createAxgGroupWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return CreateAxgGroupResponse::fromMap($this->doRPCRequest('CreateAxgGroup', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param CreateAxgGroupRequest $request
+     *
+     * @return CreateAxgGroupResponse
+     */
+    public function createAxgGroup($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->createAxgGroupWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param CreateSubscriptionRequest $request
+     * @param RuntimeOptions            $runtime
+     *
+     * @return CreateSubscriptionResponse
+     */
+    public function createSubscriptionWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return CreateSubscriptionResponse::fromMap($this->doRPCRequest('CreateSubscription', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param CreateSubscriptionRequest $request
+     *
+     * @return CreateSubscriptionResponse
+     */
+    public function createSubscription($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->createSubscriptionWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param DeleteSecretBlacklistRequest $request
+     * @param RuntimeOptions               $runtime
+     *
+     * @return DeleteSecretBlacklistResponse
+     */
+    public function deleteSecretBlacklistWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return DeleteSecretBlacklistResponse::fromMap($this->doRPCRequest('DeleteSecretBlacklist', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param DeleteSecretBlacklistRequest $request
+     *
+     * @return DeleteSecretBlacklistResponse
+     */
+    public function deleteSecretBlacklist($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->deleteSecretBlacklistWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param GetFaceVerifyRequest $request
+     * @param RuntimeOptions       $runtime
+     *
+     * @return GetFaceVerifyResponse
+     */
+    public function getFaceVerifyWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return GetFaceVerifyResponse::fromMap($this->doRPCRequest('GetFaceVerify', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param GetFaceVerifyRequest $request
+     *
+     * @return GetFaceVerifyResponse
+     */
+    public function getFaceVerify($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->getFaceVerifyWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param GetSecretAsrDetailRequest $request
+     * @param RuntimeOptions            $runtime
+     *
+     * @return GetSecretAsrDetailResponse
+     */
+    public function getSecretAsrDetailWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return GetSecretAsrDetailResponse::fromMap($this->doRPCRequest('GetSecretAsrDetail', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param GetSecretAsrDetailRequest $request
+     *
+     * @return GetSecretAsrDetailResponse
+     */
+    public function getSecretAsrDetail($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->getSecretAsrDetailWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param GetSubscriptionDetailRequest $request
+     * @param RuntimeOptions               $runtime
+     *
+     * @return GetSubscriptionDetailResponse
+     */
+    public function getSubscriptionDetailWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return GetSubscriptionDetailResponse::fromMap($this->doRPCRequest('GetSubscriptionDetail', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param GetSubscriptionDetailRequest $request
+     *
+     * @return GetSubscriptionDetailResponse
+     */
+    public function getSubscriptionDetail($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->getSubscriptionDetailWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param GetTotalPublicUrlRequest $request
+     * @param RuntimeOptions           $runtime
+     *
+     * @return GetTotalPublicUrlResponse
+     */
+    public function getTotalPublicUrlWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return GetTotalPublicUrlResponse::fromMap($this->doRPCRequest('GetTotalPublicUrl', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param GetTotalPublicUrlRequest $request
+     *
+     * @return GetTotalPublicUrlResponse
+     */
+    public function getTotalPublicUrl($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->getTotalPublicUrlWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param InitFaceVerifyRequest $request
+     * @param RuntimeOptions        $runtime
+     *
+     * @return InitFaceVerifyResponse
+     */
+    public function initFaceVerifyWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return InitFaceVerifyResponse::fromMap($this->doRPCRequest('InitFaceVerify', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param InitFaceVerifyRequest $request
+     *
+     * @return InitFaceVerifyResponse
+     */
+    public function initFaceVerify($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->initFaceVerifyWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param LockSecretNoRequest $request
+     * @param RuntimeOptions      $runtime
+     *
+     * @return LockSecretNoResponse
+     */
+    public function lockSecretNoWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return LockSecretNoResponse::fromMap($this->doRPCRequest('LockSecretNo', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param LockSecretNoRequest $request
+     *
+     * @return LockSecretNoResponse
+     */
+    public function lockSecretNo($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->lockSecretNoWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param OperateAxgGroupRequest $request
+     * @param RuntimeOptions         $runtime
+     *
+     * @return OperateAxgGroupResponse
+     */
+    public function operateAxgGroupWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return OperateAxgGroupResponse::fromMap($this->doRPCRequest('OperateAxgGroup', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param OperateAxgGroupRequest $request
+     *
+     * @return OperateAxgGroupResponse
+     */
+    public function operateAxgGroup($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->operateAxgGroupWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param OperateBlackNoRequest $request
+     * @param RuntimeOptions        $runtime
+     *
+     * @return OperateBlackNoResponse
+     */
+    public function operateBlackNoWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return OperateBlackNoResponse::fromMap($this->doRPCRequest('OperateBlackNo', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param OperateBlackNoRequest $request
+     *
+     * @return OperateBlackNoResponse
+     */
+    public function operateBlackNo($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->operateBlackNoWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param QueryCallStatusRequest $request
+     * @param RuntimeOptions         $runtime
+     *
+     * @return QueryCallStatusResponse
+     */
+    public function queryCallStatusWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return QueryCallStatusResponse::fromMap($this->doRPCRequest('QueryCallStatus', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param QueryCallStatusRequest $request
+     *
+     * @return QueryCallStatusResponse
+     */
+    public function queryCallStatus($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->queryCallStatusWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param QueryPhoneNoAByTrackNoRequest $request
+     * @param RuntimeOptions                $runtime
+     *
+     * @return QueryPhoneNoAByTrackNoResponse
+     */
+    public function queryPhoneNoAByTrackNoWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return QueryPhoneNoAByTrackNoResponse::fromMap($this->doRPCRequest('QueryPhoneNoAByTrackNo', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param QueryPhoneNoAByTrackNoRequest $request
+     *
+     * @return QueryPhoneNoAByTrackNoResponse
+     */
+    public function queryPhoneNoAByTrackNo($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->queryPhoneNoAByTrackNoWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param QueryRecordFileDownloadUrlRequest $request
+     * @param RuntimeOptions                    $runtime
+     *
+     * @return QueryRecordFileDownloadUrlResponse
+     */
+    public function queryRecordFileDownloadUrlWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return QueryRecordFileDownloadUrlResponse::fromMap($this->doRPCRequest('QueryRecordFileDownloadUrl', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param QueryRecordFileDownloadUrlRequest $request
+     *
+     * @return QueryRecordFileDownloadUrlResponse
+     */
+    public function queryRecordFileDownloadUrl($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->queryRecordFileDownloadUrlWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param QuerySecretNoRemainRequest $request
+     * @param RuntimeOptions             $runtime
+     *
+     * @return QuerySecretNoRemainResponse
+     */
+    public function querySecretNoRemainWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return QuerySecretNoRemainResponse::fromMap($this->doRPCRequest('QuerySecretNoRemain', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param QuerySecretNoRemainRequest $request
+     *
+     * @return QuerySecretNoRemainResponse
+     */
+    public function querySecretNoRemain($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->querySecretNoRemainWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param QuerySubscriptionDetailRequest $request
+     * @param RuntimeOptions                 $runtime
+     *
+     * @return QuerySubscriptionDetailResponse
+     */
+    public function querySubscriptionDetailWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return QuerySubscriptionDetailResponse::fromMap($this->doRPCRequest('QuerySubscriptionDetail', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param QuerySubscriptionDetailRequest $request
+     *
+     * @return QuerySubscriptionDetailResponse
+     */
+    public function querySubscriptionDetail($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->querySubscriptionDetailWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param QuerySubsIdRequest $request
+     * @param RuntimeOptions     $runtime
+     *
+     * @return QuerySubsIdResponse
+     */
+    public function querySubsIdWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return QuerySubsIdResponse::fromMap($this->doRPCRequest('QuerySubsId', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param QuerySubsIdRequest $request
+     *
+     * @return QuerySubsIdResponse
+     */
+    public function querySubsId($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->querySubsIdWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param ReleaseSecretNoRequest $request
+     * @param RuntimeOptions         $runtime
+     *
+     * @return ReleaseSecretNoResponse
+     */
+    public function releaseSecretNoWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return ReleaseSecretNoResponse::fromMap($this->doRPCRequest('ReleaseSecretNo', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param ReleaseSecretNoRequest $request
+     *
+     * @return ReleaseSecretNoResponse
+     */
+    public function releaseSecretNo($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->releaseSecretNoWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param UnbindSubscriptionRequest $request
+     * @param RuntimeOptions            $runtime
+     *
+     * @return UnbindSubscriptionResponse
+     */
+    public function unbindSubscriptionWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return UnbindSubscriptionResponse::fromMap($this->doRPCRequest('UnbindSubscription', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param UnbindSubscriptionRequest $request
+     *
+     * @return UnbindSubscriptionResponse
+     */
+    public function unbindSubscription($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->unbindSubscriptionWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param UnlockSecretNoRequest $request
+     * @param RuntimeOptions        $runtime
+     *
+     * @return UnlockSecretNoResponse
+     */
+    public function unlockSecretNoWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return UnlockSecretNoResponse::fromMap($this->doRPCRequest('UnlockSecretNo', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param UnlockSecretNoRequest $request
+     *
+     * @return UnlockSecretNoResponse
+     */
+    public function unlockSecretNo($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->unlockSecretNoWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param UpdateDefaultBRequest $request
+     * @param RuntimeOptions        $runtime
+     *
+     * @return UpdateDefaultBResponse
+     */
+    public function updateDefaultBWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return UpdateDefaultBResponse::fromMap($this->doRPCRequest('UpdateDefaultB', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param UpdateDefaultBRequest $request
+     *
+     * @return UpdateDefaultBResponse
+     */
+    public function updateDefaultB($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->updateDefaultBWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param UpdatePhoneNumberRequest $request
+     * @param RuntimeOptions           $runtime
+     *
+     * @return UpdatePhoneNumberResponse
+     */
+    public function updatePhoneNumberWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return UpdatePhoneNumberResponse::fromMap($this->doRPCRequest('UpdatePhoneNumber', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param UpdatePhoneNumberRequest $request
+     *
+     * @return UpdatePhoneNumberResponse
+     */
+    public function updatePhoneNumber($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->updatePhoneNumberWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param UpdatePhoneSwitchRequest $request
+     * @param RuntimeOptions           $runtime
+     *
+     * @return UpdatePhoneSwitchResponse
+     */
+    public function updatePhoneSwitchWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return UpdatePhoneSwitchResponse::fromMap($this->doRPCRequest('UpdatePhoneSwitch', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param UpdatePhoneSwitchRequest $request
+     *
+     * @return UpdatePhoneSwitchResponse
+     */
+    public function updatePhoneSwitch($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->updatePhoneSwitchWithOptions($request, $runtime);
+    }
+
+    /**
+     * @param UpdateSubscriptionRequest $request
+     * @param RuntimeOptions            $runtime
+     *
+     * @return UpdateSubscriptionResponse
+     */
+    public function updateSubscriptionWithOptions($request, $runtime)
+    {
+        Utils::validateModel($request);
+        $req = new OpenApiRequest([
+            'body' => Utils::toMap($request),
+        ]);
+
+        return UpdateSubscriptionResponse::fromMap($this->doRPCRequest('UpdateSubscription', '2017-05-25', 'HTTPS', 'POST', 'AK', 'json', $req, $runtime));
+    }
+
+    /**
+     * @param UpdateSubscriptionRequest $request
+     *
+     * @return UpdateSubscriptionResponse
+     */
+    public function updateSubscription($request)
+    {
+        $runtime = new RuntimeOptions([]);
+
+        return $this->updateSubscriptionWithOptions($request, $runtime);
+    }
+}

+ 119 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddAxnTrackNoRequest.php

@@ -0,0 +1,119 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class AddAxnTrackNoRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $phoneNoX;
+
+    /**
+     * @var string
+     */
+    public $trackNo;
+
+    /**
+     * @var string
+     */
+    public $subsId;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'phoneNoX'             => 'PhoneNoX',
+        'trackNo'              => 'trackNo',
+        'subsId'               => 'SubsId',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->phoneNoX) {
+            $res['PhoneNoX'] = $this->phoneNoX;
+        }
+        if (null !== $this->trackNo) {
+            $res['trackNo'] = $this->trackNo;
+        }
+        if (null !== $this->subsId) {
+            $res['SubsId'] = $this->subsId;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return AddAxnTrackNoRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['PhoneNoX'])) {
+            $model->phoneNoX = $map['PhoneNoX'];
+        }
+        if (isset($map['trackNo'])) {
+            $model->trackNo = $map['trackNo'];
+        }
+        if (isset($map['SubsId'])) {
+            $model->subsId = $map['SubsId'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddAxnTrackNoResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class AddAxnTrackNoResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var AddAxnTrackNoResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return AddAxnTrackNoResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = AddAxnTrackNoResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 71 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddAxnTrackNoResponseBody.php

@@ -0,0 +1,71 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class AddAxnTrackNoResponseBody extends Model
+{
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var string
+     */
+    public $code;
+    protected $_name = [
+        'message'   => 'Message',
+        'requestId' => 'RequestId',
+        'code'      => 'Code',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return AddAxnTrackNoResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+
+        return $model;
+    }
+}

+ 131 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddSecretBlacklistRequest.php

@@ -0,0 +1,131 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class AddSecretBlacklistRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $blackNo;
+
+    /**
+     * @var string
+     */
+    public $remark;
+
+    /**
+     * @var string
+     */
+    public $blackType;
+
+    /**
+     * @var string
+     */
+    public $wayControl;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'blackNo'              => 'BlackNo',
+        'remark'               => 'Remark',
+        'blackType'            => 'BlackType',
+        'wayControl'           => 'WayControl',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->blackNo) {
+            $res['BlackNo'] = $this->blackNo;
+        }
+        if (null !== $this->remark) {
+            $res['Remark'] = $this->remark;
+        }
+        if (null !== $this->blackType) {
+            $res['BlackType'] = $this->blackType;
+        }
+        if (null !== $this->wayControl) {
+            $res['WayControl'] = $this->wayControl;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return AddSecretBlacklistRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['BlackNo'])) {
+            $model->blackNo = $map['BlackNo'];
+        }
+        if (isset($map['Remark'])) {
+            $model->remark = $map['Remark'];
+        }
+        if (isset($map['BlackType'])) {
+            $model->blackType = $map['BlackType'];
+        }
+        if (isset($map['WayControl'])) {
+            $model->wayControl = $map['WayControl'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddSecretBlacklistResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class AddSecretBlacklistResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var AddSecretBlacklistResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return AddSecretBlacklistResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = AddSecretBlacklistResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 71 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/AddSecretBlacklistResponseBody.php

@@ -0,0 +1,71 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class AddSecretBlacklistResponseBody extends Model
+{
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var string
+     */
+    public $code;
+    protected $_name = [
+        'message'   => 'Message',
+        'requestId' => 'RequestId',
+        'code'      => 'Code',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return AddSecretBlacklistResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+
+        return $model;
+    }
+}

+ 239 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbRequest.php

@@ -0,0 +1,239 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxbRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $phoneNoA;
+
+    /**
+     * @var string
+     */
+    public $phoneNoB;
+
+    /**
+     * @var string
+     */
+    public $phoneNoX;
+
+    /**
+     * @var string
+     */
+    public $expiration;
+
+    /**
+     * @var string
+     */
+    public $expectCity;
+
+    /**
+     * @var bool
+     */
+    public $isRecordingEnabled;
+
+    /**
+     * @var string
+     */
+    public $outId;
+
+    /**
+     * @var string
+     */
+    public $outOrderId;
+
+    /**
+     * @var string
+     */
+    public $callRestrict;
+
+    /**
+     * @var int
+     */
+    public $callDisplayType;
+
+    /**
+     * @var string
+     */
+    public $ringConfig;
+
+    /**
+     * @var bool
+     */
+    public $ASRStatus;
+
+    /**
+     * @var string
+     */
+    public $ASRModelId;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'phoneNoA'             => 'PhoneNoA',
+        'phoneNoB'             => 'PhoneNoB',
+        'phoneNoX'             => 'PhoneNoX',
+        'expiration'           => 'Expiration',
+        'expectCity'           => 'ExpectCity',
+        'isRecordingEnabled'   => 'IsRecordingEnabled',
+        'outId'                => 'OutId',
+        'outOrderId'           => 'OutOrderId',
+        'callRestrict'         => 'CallRestrict',
+        'callDisplayType'      => 'CallDisplayType',
+        'ringConfig'           => 'RingConfig',
+        'ASRStatus'            => 'ASRStatus',
+        'ASRModelId'           => 'ASRModelId',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->phoneNoA) {
+            $res['PhoneNoA'] = $this->phoneNoA;
+        }
+        if (null !== $this->phoneNoB) {
+            $res['PhoneNoB'] = $this->phoneNoB;
+        }
+        if (null !== $this->phoneNoX) {
+            $res['PhoneNoX'] = $this->phoneNoX;
+        }
+        if (null !== $this->expiration) {
+            $res['Expiration'] = $this->expiration;
+        }
+        if (null !== $this->expectCity) {
+            $res['ExpectCity'] = $this->expectCity;
+        }
+        if (null !== $this->isRecordingEnabled) {
+            $res['IsRecordingEnabled'] = $this->isRecordingEnabled;
+        }
+        if (null !== $this->outId) {
+            $res['OutId'] = $this->outId;
+        }
+        if (null !== $this->outOrderId) {
+            $res['OutOrderId'] = $this->outOrderId;
+        }
+        if (null !== $this->callRestrict) {
+            $res['CallRestrict'] = $this->callRestrict;
+        }
+        if (null !== $this->callDisplayType) {
+            $res['CallDisplayType'] = $this->callDisplayType;
+        }
+        if (null !== $this->ringConfig) {
+            $res['RingConfig'] = $this->ringConfig;
+        }
+        if (null !== $this->ASRStatus) {
+            $res['ASRStatus'] = $this->ASRStatus;
+        }
+        if (null !== $this->ASRModelId) {
+            $res['ASRModelId'] = $this->ASRModelId;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxbRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['PhoneNoA'])) {
+            $model->phoneNoA = $map['PhoneNoA'];
+        }
+        if (isset($map['PhoneNoB'])) {
+            $model->phoneNoB = $map['PhoneNoB'];
+        }
+        if (isset($map['PhoneNoX'])) {
+            $model->phoneNoX = $map['PhoneNoX'];
+        }
+        if (isset($map['Expiration'])) {
+            $model->expiration = $map['Expiration'];
+        }
+        if (isset($map['ExpectCity'])) {
+            $model->expectCity = $map['ExpectCity'];
+        }
+        if (isset($map['IsRecordingEnabled'])) {
+            $model->isRecordingEnabled = $map['IsRecordingEnabled'];
+        }
+        if (isset($map['OutId'])) {
+            $model->outId = $map['OutId'];
+        }
+        if (isset($map['OutOrderId'])) {
+            $model->outOrderId = $map['OutOrderId'];
+        }
+        if (isset($map['CallRestrict'])) {
+            $model->callRestrict = $map['CallRestrict'];
+        }
+        if (isset($map['CallDisplayType'])) {
+            $model->callDisplayType = $map['CallDisplayType'];
+        }
+        if (isset($map['RingConfig'])) {
+            $model->ringConfig = $map['RingConfig'];
+        }
+        if (isset($map['ASRStatus'])) {
+            $model->ASRStatus = $map['ASRStatus'];
+        }
+        if (isset($map['ASRModelId'])) {
+            $model->ASRModelId = $map['ASRModelId'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxbResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var BindAxbResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxbResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = BindAxbResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 84 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbResponseBody.php

@@ -0,0 +1,84 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxbResponseBody\secretBindDTO;
+use AlibabaCloud\Tea\Model;
+
+class BindAxbResponseBody extends Model
+{
+    /**
+     * @var secretBindDTO
+     */
+    public $secretBindDTO;
+
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var string
+     */
+    public $code;
+    protected $_name = [
+        'secretBindDTO' => 'SecretBindDTO',
+        'message'       => 'Message',
+        'requestId'     => 'RequestId',
+        'code'          => 'Code',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->secretBindDTO) {
+            $res['SecretBindDTO'] = null !== $this->secretBindDTO ? $this->secretBindDTO->toMap() : null;
+        }
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxbResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['SecretBindDTO'])) {
+            $model->secretBindDTO = secretBindDTO::fromMap($map['SecretBindDTO']);
+        }
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+
+        return $model;
+    }
+}

+ 71 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxbResponseBody/secretBindDTO.php

@@ -0,0 +1,71 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxbResponseBody;
+
+use AlibabaCloud\Tea\Model;
+
+class secretBindDTO extends Model
+{
+    /**
+     * @var string
+     */
+    public $extension;
+
+    /**
+     * @var string
+     */
+    public $subsId;
+
+    /**
+     * @var string
+     */
+    public $secretNo;
+    protected $_name = [
+        'extension' => 'Extension',
+        'subsId'    => 'SubsId',
+        'secretNo'  => 'SecretNo',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->extension) {
+            $res['Extension'] = $this->extension;
+        }
+        if (null !== $this->subsId) {
+            $res['SubsId'] = $this->subsId;
+        }
+        if (null !== $this->secretNo) {
+            $res['SecretNo'] = $this->secretNo;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return secretBindDTO
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Extension'])) {
+            $model->extension = $map['Extension'];
+        }
+        if (isset($map['SubsId'])) {
+            $model->subsId = $map['SubsId'];
+        }
+        if (isset($map['SecretNo'])) {
+            $model->secretNo = $map['SecretNo'];
+        }
+
+        return $model;
+    }
+}

+ 251 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgRequest.php

@@ -0,0 +1,251 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxgRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $phoneNoA;
+
+    /**
+     * @var string
+     */
+    public $groupId;
+
+    /**
+     * @var string
+     */
+    public $phoneNoB;
+
+    /**
+     * @var string
+     */
+    public $phoneNoX;
+
+    /**
+     * @var string
+     */
+    public $expiration;
+
+    /**
+     * @var string
+     */
+    public $expectCity;
+
+    /**
+     * @var bool
+     */
+    public $isRecordingEnabled;
+
+    /**
+     * @var string
+     */
+    public $outId;
+
+    /**
+     * @var string
+     */
+    public $outOrderId;
+
+    /**
+     * @var int
+     */
+    public $callDisplayType;
+
+    /**
+     * @var string
+     */
+    public $ringConfig;
+
+    /**
+     * @var bool
+     */
+    public $ASRStatus;
+
+    /**
+     * @var string
+     */
+    public $ASRModelId;
+
+    /**
+     * @var string
+     */
+    public $callRestrict;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'phoneNoA'             => 'PhoneNoA',
+        'groupId'              => 'GroupId',
+        'phoneNoB'             => 'PhoneNoB',
+        'phoneNoX'             => 'PhoneNoX',
+        'expiration'           => 'Expiration',
+        'expectCity'           => 'ExpectCity',
+        'isRecordingEnabled'   => 'IsRecordingEnabled',
+        'outId'                => 'OutId',
+        'outOrderId'           => 'OutOrderId',
+        'callDisplayType'      => 'CallDisplayType',
+        'ringConfig'           => 'RingConfig',
+        'ASRStatus'            => 'ASRStatus',
+        'ASRModelId'           => 'ASRModelId',
+        'callRestrict'         => 'CallRestrict',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->phoneNoA) {
+            $res['PhoneNoA'] = $this->phoneNoA;
+        }
+        if (null !== $this->groupId) {
+            $res['GroupId'] = $this->groupId;
+        }
+        if (null !== $this->phoneNoB) {
+            $res['PhoneNoB'] = $this->phoneNoB;
+        }
+        if (null !== $this->phoneNoX) {
+            $res['PhoneNoX'] = $this->phoneNoX;
+        }
+        if (null !== $this->expiration) {
+            $res['Expiration'] = $this->expiration;
+        }
+        if (null !== $this->expectCity) {
+            $res['ExpectCity'] = $this->expectCity;
+        }
+        if (null !== $this->isRecordingEnabled) {
+            $res['IsRecordingEnabled'] = $this->isRecordingEnabled;
+        }
+        if (null !== $this->outId) {
+            $res['OutId'] = $this->outId;
+        }
+        if (null !== $this->outOrderId) {
+            $res['OutOrderId'] = $this->outOrderId;
+        }
+        if (null !== $this->callDisplayType) {
+            $res['CallDisplayType'] = $this->callDisplayType;
+        }
+        if (null !== $this->ringConfig) {
+            $res['RingConfig'] = $this->ringConfig;
+        }
+        if (null !== $this->ASRStatus) {
+            $res['ASRStatus'] = $this->ASRStatus;
+        }
+        if (null !== $this->ASRModelId) {
+            $res['ASRModelId'] = $this->ASRModelId;
+        }
+        if (null !== $this->callRestrict) {
+            $res['CallRestrict'] = $this->callRestrict;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxgRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['PhoneNoA'])) {
+            $model->phoneNoA = $map['PhoneNoA'];
+        }
+        if (isset($map['GroupId'])) {
+            $model->groupId = $map['GroupId'];
+        }
+        if (isset($map['PhoneNoB'])) {
+            $model->phoneNoB = $map['PhoneNoB'];
+        }
+        if (isset($map['PhoneNoX'])) {
+            $model->phoneNoX = $map['PhoneNoX'];
+        }
+        if (isset($map['Expiration'])) {
+            $model->expiration = $map['Expiration'];
+        }
+        if (isset($map['ExpectCity'])) {
+            $model->expectCity = $map['ExpectCity'];
+        }
+        if (isset($map['IsRecordingEnabled'])) {
+            $model->isRecordingEnabled = $map['IsRecordingEnabled'];
+        }
+        if (isset($map['OutId'])) {
+            $model->outId = $map['OutId'];
+        }
+        if (isset($map['OutOrderId'])) {
+            $model->outOrderId = $map['OutOrderId'];
+        }
+        if (isset($map['CallDisplayType'])) {
+            $model->callDisplayType = $map['CallDisplayType'];
+        }
+        if (isset($map['RingConfig'])) {
+            $model->ringConfig = $map['RingConfig'];
+        }
+        if (isset($map['ASRStatus'])) {
+            $model->ASRStatus = $map['ASRStatus'];
+        }
+        if (isset($map['ASRModelId'])) {
+            $model->ASRModelId = $map['ASRModelId'];
+        }
+        if (isset($map['CallRestrict'])) {
+            $model->callRestrict = $map['CallRestrict'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxgResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var BindAxgResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxgResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = BindAxgResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 84 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgResponseBody.php

@@ -0,0 +1,84 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxgResponseBody\secretBindDTO;
+use AlibabaCloud\Tea\Model;
+
+class BindAxgResponseBody extends Model
+{
+    /**
+     * @var secretBindDTO
+     */
+    public $secretBindDTO;
+
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var string
+     */
+    public $code;
+    protected $_name = [
+        'secretBindDTO' => 'SecretBindDTO',
+        'message'       => 'Message',
+        'requestId'     => 'RequestId',
+        'code'          => 'Code',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->secretBindDTO) {
+            $res['SecretBindDTO'] = null !== $this->secretBindDTO ? $this->secretBindDTO->toMap() : null;
+        }
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxgResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['SecretBindDTO'])) {
+            $model->secretBindDTO = secretBindDTO::fromMap($map['SecretBindDTO']);
+        }
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+
+        return $model;
+    }
+}

+ 71 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxgResponseBody/secretBindDTO.php

@@ -0,0 +1,71 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxgResponseBody;
+
+use AlibabaCloud\Tea\Model;
+
+class secretBindDTO extends Model
+{
+    /**
+     * @var string
+     */
+    public $extension;
+
+    /**
+     * @var string
+     */
+    public $subsId;
+
+    /**
+     * @var string
+     */
+    public $secretNo;
+    protected $_name = [
+        'extension' => 'Extension',
+        'subsId'    => 'SubsId',
+        'secretNo'  => 'SecretNo',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->extension) {
+            $res['Extension'] = $this->extension;
+        }
+        if (null !== $this->subsId) {
+            $res['SubsId'] = $this->subsId;
+        }
+        if (null !== $this->secretNo) {
+            $res['SecretNo'] = $this->secretNo;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return secretBindDTO
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Extension'])) {
+            $model->extension = $map['Extension'];
+        }
+        if (isset($map['SubsId'])) {
+            $model->subsId = $map['SubsId'];
+        }
+        if (isset($map['SecretNo'])) {
+            $model->secretNo = $map['SecretNo'];
+        }
+
+        return $model;
+    }
+}

+ 251 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionRequest.php

@@ -0,0 +1,251 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxnExtensionRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $phoneNoA;
+
+    /**
+     * @var string
+     */
+    public $extension;
+
+    /**
+     * @var string
+     */
+    public $phoneNoB;
+
+    /**
+     * @var string
+     */
+    public $phoneNoX;
+
+    /**
+     * @var string
+     */
+    public $expiration;
+
+    /**
+     * @var string
+     */
+    public $expectCity;
+
+    /**
+     * @var bool
+     */
+    public $isRecordingEnabled;
+
+    /**
+     * @var string
+     */
+    public $outId;
+
+    /**
+     * @var string
+     */
+    public $outOrderId;
+
+    /**
+     * @var int
+     */
+    public $callDisplayType;
+
+    /**
+     * @var string
+     */
+    public $ringConfig;
+
+    /**
+     * @var bool
+     */
+    public $ASRStatus;
+
+    /**
+     * @var string
+     */
+    public $ASRModelId;
+
+    /**
+     * @var string
+     */
+    public $callRestrict;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'phoneNoA'             => 'PhoneNoA',
+        'extension'            => 'Extension',
+        'phoneNoB'             => 'PhoneNoB',
+        'phoneNoX'             => 'PhoneNoX',
+        'expiration'           => 'Expiration',
+        'expectCity'           => 'ExpectCity',
+        'isRecordingEnabled'   => 'IsRecordingEnabled',
+        'outId'                => 'OutId',
+        'outOrderId'           => 'OutOrderId',
+        'callDisplayType'      => 'CallDisplayType',
+        'ringConfig'           => 'RingConfig',
+        'ASRStatus'            => 'ASRStatus',
+        'ASRModelId'           => 'ASRModelId',
+        'callRestrict'         => 'CallRestrict',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->phoneNoA) {
+            $res['PhoneNoA'] = $this->phoneNoA;
+        }
+        if (null !== $this->extension) {
+            $res['Extension'] = $this->extension;
+        }
+        if (null !== $this->phoneNoB) {
+            $res['PhoneNoB'] = $this->phoneNoB;
+        }
+        if (null !== $this->phoneNoX) {
+            $res['PhoneNoX'] = $this->phoneNoX;
+        }
+        if (null !== $this->expiration) {
+            $res['Expiration'] = $this->expiration;
+        }
+        if (null !== $this->expectCity) {
+            $res['ExpectCity'] = $this->expectCity;
+        }
+        if (null !== $this->isRecordingEnabled) {
+            $res['IsRecordingEnabled'] = $this->isRecordingEnabled;
+        }
+        if (null !== $this->outId) {
+            $res['OutId'] = $this->outId;
+        }
+        if (null !== $this->outOrderId) {
+            $res['OutOrderId'] = $this->outOrderId;
+        }
+        if (null !== $this->callDisplayType) {
+            $res['CallDisplayType'] = $this->callDisplayType;
+        }
+        if (null !== $this->ringConfig) {
+            $res['RingConfig'] = $this->ringConfig;
+        }
+        if (null !== $this->ASRStatus) {
+            $res['ASRStatus'] = $this->ASRStatus;
+        }
+        if (null !== $this->ASRModelId) {
+            $res['ASRModelId'] = $this->ASRModelId;
+        }
+        if (null !== $this->callRestrict) {
+            $res['CallRestrict'] = $this->callRestrict;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxnExtensionRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['PhoneNoA'])) {
+            $model->phoneNoA = $map['PhoneNoA'];
+        }
+        if (isset($map['Extension'])) {
+            $model->extension = $map['Extension'];
+        }
+        if (isset($map['PhoneNoB'])) {
+            $model->phoneNoB = $map['PhoneNoB'];
+        }
+        if (isset($map['PhoneNoX'])) {
+            $model->phoneNoX = $map['PhoneNoX'];
+        }
+        if (isset($map['Expiration'])) {
+            $model->expiration = $map['Expiration'];
+        }
+        if (isset($map['ExpectCity'])) {
+            $model->expectCity = $map['ExpectCity'];
+        }
+        if (isset($map['IsRecordingEnabled'])) {
+            $model->isRecordingEnabled = $map['IsRecordingEnabled'];
+        }
+        if (isset($map['OutId'])) {
+            $model->outId = $map['OutId'];
+        }
+        if (isset($map['OutOrderId'])) {
+            $model->outOrderId = $map['OutOrderId'];
+        }
+        if (isset($map['CallDisplayType'])) {
+            $model->callDisplayType = $map['CallDisplayType'];
+        }
+        if (isset($map['RingConfig'])) {
+            $model->ringConfig = $map['RingConfig'];
+        }
+        if (isset($map['ASRStatus'])) {
+            $model->ASRStatus = $map['ASRStatus'];
+        }
+        if (isset($map['ASRModelId'])) {
+            $model->ASRModelId = $map['ASRModelId'];
+        }
+        if (isset($map['CallRestrict'])) {
+            $model->callRestrict = $map['CallRestrict'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxnExtensionResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var BindAxnExtensionResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxnExtensionResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = BindAxnExtensionResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 84 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionResponseBody.php

@@ -0,0 +1,84 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnExtensionResponseBody\secretBindDTO;
+use AlibabaCloud\Tea\Model;
+
+class BindAxnExtensionResponseBody extends Model
+{
+    /**
+     * @var secretBindDTO
+     */
+    public $secretBindDTO;
+
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var string
+     */
+    public $code;
+    protected $_name = [
+        'secretBindDTO' => 'SecretBindDTO',
+        'message'       => 'Message',
+        'requestId'     => 'RequestId',
+        'code'          => 'Code',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->secretBindDTO) {
+            $res['SecretBindDTO'] = null !== $this->secretBindDTO ? $this->secretBindDTO->toMap() : null;
+        }
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxnExtensionResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['SecretBindDTO'])) {
+            $model->secretBindDTO = secretBindDTO::fromMap($map['SecretBindDTO']);
+        }
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+
+        return $model;
+    }
+}

+ 71 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnExtensionResponseBody/secretBindDTO.php

@@ -0,0 +1,71 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnExtensionResponseBody;
+
+use AlibabaCloud\Tea\Model;
+
+class secretBindDTO extends Model
+{
+    /**
+     * @var string
+     */
+    public $extension;
+
+    /**
+     * @var string
+     */
+    public $subsId;
+
+    /**
+     * @var string
+     */
+    public $secretNo;
+    protected $_name = [
+        'extension' => 'Extension',
+        'subsId'    => 'SubsId',
+        'secretNo'  => 'SecretNo',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->extension) {
+            $res['Extension'] = $this->extension;
+        }
+        if (null !== $this->subsId) {
+            $res['SubsId'] = $this->subsId;
+        }
+        if (null !== $this->secretNo) {
+            $res['SecretNo'] = $this->secretNo;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return secretBindDTO
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Extension'])) {
+            $model->extension = $map['Extension'];
+        }
+        if (isset($map['SubsId'])) {
+            $model->subsId = $map['SubsId'];
+        }
+        if (isset($map['SecretNo'])) {
+            $model->secretNo = $map['SecretNo'];
+        }
+
+        return $model;
+    }
+}

+ 263 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnRequest.php

@@ -0,0 +1,263 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxnRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $phoneNoA;
+
+    /**
+     * @var string
+     */
+    public $phoneNoB;
+
+    /**
+     * @var string
+     */
+    public $phoneNoX;
+
+    /**
+     * @var string
+     */
+    public $expiration;
+
+    /**
+     * @var string
+     */
+    public $expectCity;
+
+    /**
+     * @var bool
+     */
+    public $isRecordingEnabled;
+
+    /**
+     * @var string
+     */
+    public $noType;
+
+    /**
+     * @var string
+     */
+    public $outId;
+
+    /**
+     * @var string
+     */
+    public $outOrderId;
+
+    /**
+     * @var int
+     */
+    public $callDisplayType;
+
+    /**
+     * @var string
+     */
+    public $ringConfig;
+
+    /**
+     * @var bool
+     */
+    public $ASRStatus;
+
+    /**
+     * @var string
+     */
+    public $ASRModelId;
+
+    /**
+     * @var int
+     */
+    public $callTimeout;
+
+    /**
+     * @var string
+     */
+    public $callRestrict;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'phoneNoA'             => 'PhoneNoA',
+        'phoneNoB'             => 'PhoneNoB',
+        'phoneNoX'             => 'PhoneNoX',
+        'expiration'           => 'Expiration',
+        'expectCity'           => 'ExpectCity',
+        'isRecordingEnabled'   => 'IsRecordingEnabled',
+        'noType'               => 'NoType',
+        'outId'                => 'OutId',
+        'outOrderId'           => 'OutOrderId',
+        'callDisplayType'      => 'CallDisplayType',
+        'ringConfig'           => 'RingConfig',
+        'ASRStatus'            => 'ASRStatus',
+        'ASRModelId'           => 'ASRModelId',
+        'callTimeout'          => 'CallTimeout',
+        'callRestrict'         => 'CallRestrict',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->phoneNoA) {
+            $res['PhoneNoA'] = $this->phoneNoA;
+        }
+        if (null !== $this->phoneNoB) {
+            $res['PhoneNoB'] = $this->phoneNoB;
+        }
+        if (null !== $this->phoneNoX) {
+            $res['PhoneNoX'] = $this->phoneNoX;
+        }
+        if (null !== $this->expiration) {
+            $res['Expiration'] = $this->expiration;
+        }
+        if (null !== $this->expectCity) {
+            $res['ExpectCity'] = $this->expectCity;
+        }
+        if (null !== $this->isRecordingEnabled) {
+            $res['IsRecordingEnabled'] = $this->isRecordingEnabled;
+        }
+        if (null !== $this->noType) {
+            $res['NoType'] = $this->noType;
+        }
+        if (null !== $this->outId) {
+            $res['OutId'] = $this->outId;
+        }
+        if (null !== $this->outOrderId) {
+            $res['OutOrderId'] = $this->outOrderId;
+        }
+        if (null !== $this->callDisplayType) {
+            $res['CallDisplayType'] = $this->callDisplayType;
+        }
+        if (null !== $this->ringConfig) {
+            $res['RingConfig'] = $this->ringConfig;
+        }
+        if (null !== $this->ASRStatus) {
+            $res['ASRStatus'] = $this->ASRStatus;
+        }
+        if (null !== $this->ASRModelId) {
+            $res['ASRModelId'] = $this->ASRModelId;
+        }
+        if (null !== $this->callTimeout) {
+            $res['CallTimeout'] = $this->callTimeout;
+        }
+        if (null !== $this->callRestrict) {
+            $res['CallRestrict'] = $this->callRestrict;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxnRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['PhoneNoA'])) {
+            $model->phoneNoA = $map['PhoneNoA'];
+        }
+        if (isset($map['PhoneNoB'])) {
+            $model->phoneNoB = $map['PhoneNoB'];
+        }
+        if (isset($map['PhoneNoX'])) {
+            $model->phoneNoX = $map['PhoneNoX'];
+        }
+        if (isset($map['Expiration'])) {
+            $model->expiration = $map['Expiration'];
+        }
+        if (isset($map['ExpectCity'])) {
+            $model->expectCity = $map['ExpectCity'];
+        }
+        if (isset($map['IsRecordingEnabled'])) {
+            $model->isRecordingEnabled = $map['IsRecordingEnabled'];
+        }
+        if (isset($map['NoType'])) {
+            $model->noType = $map['NoType'];
+        }
+        if (isset($map['OutId'])) {
+            $model->outId = $map['OutId'];
+        }
+        if (isset($map['OutOrderId'])) {
+            $model->outOrderId = $map['OutOrderId'];
+        }
+        if (isset($map['CallDisplayType'])) {
+            $model->callDisplayType = $map['CallDisplayType'];
+        }
+        if (isset($map['RingConfig'])) {
+            $model->ringConfig = $map['RingConfig'];
+        }
+        if (isset($map['ASRStatus'])) {
+            $model->ASRStatus = $map['ASRStatus'];
+        }
+        if (isset($map['ASRModelId'])) {
+            $model->ASRModelId = $map['ASRModelId'];
+        }
+        if (isset($map['CallTimeout'])) {
+            $model->callTimeout = $map['CallTimeout'];
+        }
+        if (isset($map['CallRestrict'])) {
+            $model->callRestrict = $map['CallRestrict'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BindAxnResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var BindAxnResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxnResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = BindAxnResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 84 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnResponseBody.php

@@ -0,0 +1,84 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnResponseBody\secretBindDTO;
+use AlibabaCloud\Tea\Model;
+
+class BindAxnResponseBody extends Model
+{
+    /**
+     * @var secretBindDTO
+     */
+    public $secretBindDTO;
+
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var string
+     */
+    public $code;
+    protected $_name = [
+        'secretBindDTO' => 'SecretBindDTO',
+        'message'       => 'Message',
+        'requestId'     => 'RequestId',
+        'code'          => 'Code',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->secretBindDTO) {
+            $res['SecretBindDTO'] = null !== $this->secretBindDTO ? $this->secretBindDTO->toMap() : null;
+        }
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BindAxnResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['SecretBindDTO'])) {
+            $model->secretBindDTO = secretBindDTO::fromMap($map['SecretBindDTO']);
+        }
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+
+        return $model;
+    }
+}

+ 71 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BindAxnResponseBody/secretBindDTO.php

@@ -0,0 +1,71 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BindAxnResponseBody;
+
+use AlibabaCloud\Tea\Model;
+
+class secretBindDTO extends Model
+{
+    /**
+     * @var string
+     */
+    public $extension;
+
+    /**
+     * @var string
+     */
+    public $subsId;
+
+    /**
+     * @var string
+     */
+    public $secretNo;
+    protected $_name = [
+        'extension' => 'Extension',
+        'subsId'    => 'SubsId',
+        'secretNo'  => 'SecretNo',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->extension) {
+            $res['Extension'] = $this->extension;
+        }
+        if (null !== $this->subsId) {
+            $res['SubsId'] = $this->subsId;
+        }
+        if (null !== $this->secretNo) {
+            $res['SecretNo'] = $this->secretNo;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return secretBindDTO
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Extension'])) {
+            $model->extension = $map['Extension'];
+        }
+        if (isset($map['SubsId'])) {
+            $model->subsId = $map['SubsId'];
+        }
+        if (isset($map['SecretNo'])) {
+            $model->secretNo = $map['SecretNo'];
+        }
+
+        return $model;
+    }
+}

+ 131 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoRequest.php

@@ -0,0 +1,131 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BuySecretNoRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var int
+     */
+    public $specId;
+
+    /**
+     * @var string
+     */
+    public $city;
+
+    /**
+     * @var string
+     */
+    public $secretNo;
+
+    /**
+     * @var bool
+     */
+    public $displayPool;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'specId'               => 'SpecId',
+        'city'                 => 'City',
+        'secretNo'             => 'SecretNo',
+        'displayPool'          => 'DisplayPool',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->specId) {
+            $res['SpecId'] = $this->specId;
+        }
+        if (null !== $this->city) {
+            $res['City'] = $this->city;
+        }
+        if (null !== $this->secretNo) {
+            $res['SecretNo'] = $this->secretNo;
+        }
+        if (null !== $this->displayPool) {
+            $res['DisplayPool'] = $this->displayPool;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BuySecretNoRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['SpecId'])) {
+            $model->specId = $map['SpecId'];
+        }
+        if (isset($map['City'])) {
+            $model->city = $map['City'];
+        }
+        if (isset($map['SecretNo'])) {
+            $model->secretNo = $map['SecretNo'];
+        }
+        if (isset($map['DisplayPool'])) {
+            $model->displayPool = $map['DisplayPool'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class BuySecretNoResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var BuySecretNoResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BuySecretNoResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = BuySecretNoResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 84 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoResponseBody.php

@@ -0,0 +1,84 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BuySecretNoResponseBody\secretBuyInfoDTO;
+use AlibabaCloud\Tea\Model;
+
+class BuySecretNoResponseBody extends Model
+{
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var secretBuyInfoDTO
+     */
+    public $secretBuyInfoDTO;
+
+    /**
+     * @var string
+     */
+    public $code;
+    protected $_name = [
+        'message'          => 'Message',
+        'requestId'        => 'RequestId',
+        'secretBuyInfoDTO' => 'SecretBuyInfoDTO',
+        'code'             => 'Code',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->secretBuyInfoDTO) {
+            $res['SecretBuyInfoDTO'] = null !== $this->secretBuyInfoDTO ? $this->secretBuyInfoDTO->toMap() : null;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return BuySecretNoResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['SecretBuyInfoDTO'])) {
+            $model->secretBuyInfoDTO = secretBuyInfoDTO::fromMap($map['SecretBuyInfoDTO']);
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+
+        return $model;
+    }
+}

+ 47 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/BuySecretNoResponseBody/secretBuyInfoDTO.php

@@ -0,0 +1,47 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models\BuySecretNoResponseBody;
+
+use AlibabaCloud\Tea\Model;
+
+class secretBuyInfoDTO extends Model
+{
+    /**
+     * @var string
+     */
+    public $secretNo;
+    protected $_name = [
+        'secretNo' => 'SecretNo',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->secretNo) {
+            $res['SecretNo'] = $this->secretNo;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return secretBuyInfoDTO
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['SecretNo'])) {
+            $model->secretNo = $map['SecretNo'];
+        }
+
+        return $model;
+    }
+}

+ 119 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateAxgGroupRequest.php

@@ -0,0 +1,119 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class CreateAxgGroupRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $name;
+
+    /**
+     * @var string
+     */
+    public $remark;
+
+    /**
+     * @var string
+     */
+    public $numbers;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'name'                 => 'Name',
+        'remark'               => 'Remark',
+        'numbers'              => 'Numbers',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->name) {
+            $res['Name'] = $this->name;
+        }
+        if (null !== $this->remark) {
+            $res['Remark'] = $this->remark;
+        }
+        if (null !== $this->numbers) {
+            $res['Numbers'] = $this->numbers;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return CreateAxgGroupRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['Name'])) {
+            $model->name = $map['Name'];
+        }
+        if (isset($map['Remark'])) {
+            $model->remark = $map['Remark'];
+        }
+        if (isset($map['Numbers'])) {
+            $model->numbers = $map['Numbers'];
+        }
+
+        return $model;
+    }
+}

+ 61 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateAxgGroupResponse.php

@@ -0,0 +1,61 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class CreateAxgGroupResponse extends Model
+{
+    /**
+     * @var string[]
+     */
+    public $headers;
+
+    /**
+     * @var CreateAxgGroupResponseBody
+     */
+    public $body;
+    protected $_name = [
+        'headers' => 'headers',
+        'body'    => 'body',
+    ];
+
+    public function validate()
+    {
+        Model::validateRequired('headers', $this->headers, true);
+        Model::validateRequired('body', $this->body, true);
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->headers) {
+            $res['headers'] = $this->headers;
+        }
+        if (null !== $this->body) {
+            $res['body'] = null !== $this->body ? $this->body->toMap() : null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return CreateAxgGroupResponse
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['headers'])) {
+            $model->headers = $map['headers'];
+        }
+        if (isset($map['body'])) {
+            $model->body = CreateAxgGroupResponseBody::fromMap($map['body']);
+        }
+
+        return $model;
+    }
+}

+ 83 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateAxgGroupResponseBody.php

@@ -0,0 +1,83 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class CreateAxgGroupResponseBody extends Model
+{
+    /**
+     * @var string
+     */
+    public $message;
+
+    /**
+     * @var string
+     */
+    public $requestId;
+
+    /**
+     * @var string
+     */
+    public $code;
+
+    /**
+     * @var int
+     */
+    public $groupId;
+    protected $_name = [
+        'message'   => 'Message',
+        'requestId' => 'RequestId',
+        'code'      => 'Code',
+        'groupId'   => 'GroupId',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->message) {
+            $res['Message'] = $this->message;
+        }
+        if (null !== $this->requestId) {
+            $res['RequestId'] = $this->requestId;
+        }
+        if (null !== $this->code) {
+            $res['Code'] = $this->code;
+        }
+        if (null !== $this->groupId) {
+            $res['GroupId'] = $this->groupId;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return CreateAxgGroupResponseBody
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['Message'])) {
+            $model->message = $map['Message'];
+        }
+        if (isset($map['RequestId'])) {
+            $model->requestId = $map['RequestId'];
+        }
+        if (isset($map['Code'])) {
+            $model->code = $map['Code'];
+        }
+        if (isset($map['GroupId'])) {
+            $model->groupId = $map['GroupId'];
+        }
+
+        return $model;
+    }
+}

+ 131 - 0
base/composer/vendor/alibabacloud/dyplsapi-20170525/src/Models/CreateSubscriptionRequest.php

@@ -0,0 +1,131 @@
+<?php
+
+// This file is auto-generated, don't edit it. Thanks.
+
+namespace AlibabaCloud\SDK\Dyplsapi\V20170525\Models;
+
+use AlibabaCloud\Tea\Model;
+
+class CreateSubscriptionRequest extends Model
+{
+    /**
+     * @var int
+     */
+    public $ownerId;
+
+    /**
+     * @var string
+     */
+    public $resourceOwnerAccount;
+
+    /**
+     * @var int
+     */
+    public $resourceOwnerId;
+
+    /**
+     * @var string
+     */
+    public $poolKey;
+
+    /**
+     * @var string
+     */
+    public $secretNo;
+
+    /**
+     * @var string
+     */
+    public $phoneNo;
+
+    /**
+     * @var string
+     */
+    public $bindToken;
+
+    /**
+     * @var string
+     */
+    public $prodCode;
+    protected $_name = [
+        'ownerId'              => 'OwnerId',
+        'resourceOwnerAccount' => 'ResourceOwnerAccount',
+        'resourceOwnerId'      => 'ResourceOwnerId',
+        'poolKey'              => 'PoolKey',
+        'secretNo'             => 'SecretNo',
+        'phoneNo'              => 'PhoneNo',
+        'bindToken'            => 'BindToken',
+        'prodCode'             => 'ProdCode',
+    ];
+
+    public function validate()
+    {
+    }
+
+    public function toMap()
+    {
+        $res = [];
+        if (null !== $this->ownerId) {
+            $res['OwnerId'] = $this->ownerId;
+        }
+        if (null !== $this->resourceOwnerAccount) {
+            $res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
+        }
+        if (null !== $this->resourceOwnerId) {
+            $res['ResourceOwnerId'] = $this->resourceOwnerId;
+        }
+        if (null !== $this->poolKey) {
+            $res['PoolKey'] = $this->poolKey;
+        }
+        if (null !== $this->secretNo) {
+            $res['SecretNo'] = $this->secretNo;
+        }
+        if (null !== $this->phoneNo) {
+            $res['PhoneNo'] = $this->phoneNo;
+        }
+        if (null !== $this->bindToken) {
+            $res['BindToken'] = $this->bindToken;
+        }
+        if (null !== $this->prodCode) {
+            $res['ProdCode'] = $this->prodCode;
+        }
+
+        return $res;
+    }
+
+    /**
+     * @param array $map
+     *
+     * @return CreateSubscriptionRequest
+     */
+    public static function fromMap($map = [])
+    {
+        $model = new self();
+        if (isset($map['OwnerId'])) {
+            $model->ownerId = $map['OwnerId'];
+        }
+        if (isset($map['ResourceOwnerAccount'])) {
+            $model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
+        }
+        if (isset($map['ResourceOwnerId'])) {
+            $model->resourceOwnerId = $map['ResourceOwnerId'];
+        }
+        if (isset($map['PoolKey'])) {
+            $model->poolKey = $map['PoolKey'];
+        }
+        if (isset($map['SecretNo'])) {
+            $model->secretNo = $map['SecretNo'];
+        }
+        if (isset($map['PhoneNo'])) {
+            $model->phoneNo = $map['PhoneNo'];
+        }
+        if (isset($map['BindToken'])) {
+            $model->bindToken = $map['BindToken'];
+        }
+        if (isset($map['ProdCode'])) {
+            $model->prodCode = $map['ProdCode'];
+        }
+
+        return $model;
+    }
+}

Some files were not shown because too many files changed in this diff