544782275@qq.com hace 2 años
padre
commit
c08eabacd7
Se han modificado 100 ficheros con 11984 adiciones y 67 borrados
  1. 7 1
      thinkphp/README.md
  2. 5 7
      thinkphp/library/think/App.php
  3. 1 1
      thinkphp/library/think/Collection.php
  4. 50 0
      thinkphp/library/think/Container.php
  5. 36 27
      thinkphp/library/think/Model.php
  6. 1 1
      thinkphp/library/think/Request.php
  7. 2 0
      thinkphp/library/think/Route.php
  8. 2 0
      thinkphp/library/think/Validate.php
  9. 1 1
      thinkphp/library/think/cache/driver/Redis.php
  10. 1 1
      thinkphp/library/think/db/Builder.php
  11. 2 2
      thinkphp/library/think/db/Query.php
  12. 7 1
      thinkphp/library/think/db/builder/Mysql.php
  13. 8 8
      thinkphp/library/think/db/connector/Mysql.php
  14. 1 1
      thinkphp/library/think/facade/Route.php
  15. 16 0
      thinkphp/library/think/model/Collection.php
  16. 1 1
      thinkphp/library/think/model/concern/Conversion.php
  17. 27 0
      thinkphp/library/think/model/concern/RelationShip.php
  18. 4 0
      thinkphp/library/think/model/concern/SoftDelete.php
  19. 2 1
      thinkphp/library/think/model/relation/BelongsToMany.php
  20. 6 6
      thinkphp/library/think/model/relation/HasManyThrough.php
  21. 1 1
      thinkphp/library/think/model/relation/HasOne.php
  22. 9 1
      thinkphp/library/think/model/relation/MorphTo.php
  23. 8 6
      thinkphp/library/think/model/relation/OneToOne.php
  24. 1 0
      thinkphp/library/think/route/Domain.php
  25. 12 0
      vendor/alibabacloud/tea-fileform/.gitignore
  26. 65 0
      vendor/alibabacloud/tea-fileform/.php_cs.dist
  27. 31 0
      vendor/alibabacloud/tea-fileform/README-CN.md
  28. 31 0
      vendor/alibabacloud/tea-fileform/README.md
  29. 44 0
      vendor/alibabacloud/tea-fileform/composer.json
  30. 32 0
      vendor/alibabacloud/tea-fileform/phpunit.xml
  31. 16 0
      vendor/alibabacloud/tea-fileform/src/FileForm.php
  32. 22 0
      vendor/alibabacloud/tea-fileform/src/FileForm/FileField.php
  33. 321 0
      vendor/alibabacloud/tea-fileform/src/FileFormStream.php
  34. 81 0
      vendor/alibabacloud/tea-fileform/tests/FileFormTest.php
  35. 3 0
      vendor/alibabacloud/tea-fileform/tests/bootstrap.php
  36. 65 0
      vendor/alibabacloud/tea/.php_cs.dist
  37. 148 0
      vendor/alibabacloud/tea/CHANGELOG.md
  38. 13 0
      vendor/alibabacloud/tea/LICENSE.md
  39. 16 0
      vendor/alibabacloud/tea/README.md
  40. 80 0
      vendor/alibabacloud/tea/composer.json
  41. 47 0
      vendor/alibabacloud/tea/src/Exception/TeaError.php
  42. 21 0
      vendor/alibabacloud/tea/src/Exception/TeaRetryError.php
  43. 41 0
      vendor/alibabacloud/tea/src/Exception/TeaUnableRetryError.php
  44. 68 0
      vendor/alibabacloud/tea/src/Helper.php
  45. 114 0
      vendor/alibabacloud/tea/src/Model.php
  46. 49 0
      vendor/alibabacloud/tea/src/Parameter.php
  47. 119 0
      vendor/alibabacloud/tea/src/Request.php
  48. 366 0
      vendor/alibabacloud/tea/src/Response.php
  49. 281 0
      vendor/alibabacloud/tea/src/Tea.php
  50. 1 0
      vendor/alipaysdk/easysdk/.gitattributes
  51. 16 0
      vendor/alipaysdk/easysdk/.gitignore
  52. 822 0
      vendor/alipaysdk/easysdk/APIDoc.md
  53. 168 0
      vendor/alipaysdk/easysdk/CHANGELOG
  54. 21 0
      vendor/alipaysdk/easysdk/LICENSE
  55. 203 0
      vendor/alipaysdk/easysdk/README.md
  56. 56 0
      vendor/alipaysdk/easysdk/composer.json
  57. 23 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK.sln
  58. 32 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/AlipayEasySDK.csproj
  59. 324 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Image/Client.cs
  60. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Image/Models/AlipayOfflineMaterialImageUploadResponse.cs
  61. 528 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/OAuth/Client.cs
  62. 57 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/OAuth/Models/AlipaySystemOauthTokenResponse.cs
  63. 318 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Qrcode/Client.cs
  64. 41 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Qrcode/Models/AlipayOpenAppQrcodeCreateResponse.cs
  65. 324 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Video/Client.cs
  66. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Video/Models/AlipayOfflineMaterialImageUploadResponse.cs
  67. 244 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Factory/Factory.cs
  68. 1832 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Client.cs
  69. 37 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicLifeMsgRecallResponse.cs
  70. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageContentCreateResponse.cs
  71. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageContentModifyResponse.cs
  72. 37 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageSingleSendResponse.cs
  73. 41 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageTotalSendResponse.cs
  74. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicSettingCategoryQueryResponse.cs
  75. 37 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicTemplateMessageIndustryModifyResponse.cs
  76. 34 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Article.cs
  77. 42 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Context.cs
  78. 22 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Keyword.cs
  79. 22 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Template.cs
  80. 22 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Text.cs
  81. 964 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Client.cs
  82. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassInstanceAddResponse.cs
  83. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassInstanceUpdateResponse.cs
  84. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassTemplateAddResponse.cs
  85. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassTemplateUpdateResponse.cs
  86. 322 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/TemplateMessage/Client.cs
  87. 37 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/TemplateMessage/Models/AlipayOpenAppMiniTemplatemessageSendResponse.cs
  88. 562 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Client.cs
  89. 21 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/AlipayUserCertifyOpenCertifyResponse.cs
  90. 41 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/AlipayUserCertifyOpenInitializeResponse.cs
  91. 49 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/AlipayUserCertifyOpenQueryResponse.cs
  92. 30 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/IdentityParam.cs
  93. 18 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/MerchantConfig.cs
  94. 135 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/App/Client.cs
  95. 21 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/App/Models/AlipayTradeAppPayResponse.cs
  96. 1598 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Client.cs
  97. 41 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayDataDataserviceBillDownloadurlQueryResponse.cs
  98. 61 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayTradeCancelResponse.cs
  99. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayTradeCloseResponse.cs
  100. 45 0
      vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayTradeCreateResponse.cs

+ 7 - 1
thinkphp/README.md

@@ -35,7 +35,7 @@ ThinkPHP5.1对底层架构做了进一步的改进,减少依赖,其主要特
  + 内置控制器扩展类
  + 模型自动验证
 
-> ThinkPHP5.1的运行环境要求PHP5.6+。
+> ThinkPHP5.1的运行环境要求PHP5.6+ 兼容PHP8.0
 
 
 ## 安装
@@ -70,6 +70,12 @@ composer update topthink/framework
 + [完全开发手册](https://www.kancloud.cn/manual/thinkphp5_1/content)
 + [升级指导](https://www.kancloud.cn/manual/thinkphp5_1/354155) 
 
+
+## 官方服务
+
++ [应用服务市场](https://market.topthink.com/)
++ [ThinkAPI——统一API服务](https://docs.topthink.com/think-api) 
+
 ## 命名规范
 
 `ThinkPHP5.1`遵循PSR-2命名规范和PSR-4自动加载规范。

+ 5 - 7
thinkphp/library/think/App.php

@@ -20,7 +20,7 @@ use think\route\Dispatch;
  */
 class App extends Container
 {
-    const VERSION = '5.1.39 LTS';
+    const VERSION = '5.1.41 LTS';
 
     /**
      * 当前模块路径
@@ -548,12 +548,10 @@ class App extends Container
     public function routeInit()
     {
         // 路由检测
-        $files = scandir($this->routePath);
-        foreach ($files as $file) {
-            if (strpos($file, '.php')) {
-                $filename = $this->routePath . $file;
-                // 导入路由配置
-                $rules = include $filename;
+        if (is_dir($this->routePath)) {
+            $files = glob($this->routePath . '*.php');
+            foreach ($files as $file) {
+                $rules = include $file;
                 if (is_array($rules)) {
                     $this->route->import($rules);
                 }

+ 1 - 1
thinkphp/library/think/Collection.php

@@ -400,7 +400,7 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
      */
     public function column($columnKey, $indexKey = null)
     {
-        return array_column($this->items, $columnKey, $indexKey);
+        return array_column($this->toArray(), $columnKey, $indexKey);
     }
 
     /**

+ 50 - 0
thinkphp/library/think/Container.php

@@ -461,6 +461,25 @@ class Container implements ArrayAccess, IteratorAggregate, Countable
         $type   = key($vars) === 0 ? 1 : 0;
         $params = $reflect->getParameters();
 
+        if (PHP_VERSION > 8.0) {
+            $args = $this->parseParamsForPHP8($params, $vars, $type);
+        } else {
+            $args = $this->parseParams($params, $vars, $type);
+        }
+
+        return $args;
+    }
+
+    /**
+     * 解析参数
+     * @access protected
+     * @param  array $params 参数列表
+     * @param  array $vars 参数数据
+     * @param  int   $type 参数类别
+     * @return array
+     */
+    protected function parseParams($params, $vars, $type)
+    {
         foreach ($params as $param) {
             $name      = $param->getName();
             $lowerName = Loader::parseName($name);
@@ -480,7 +499,38 @@ class Container implements ArrayAccess, IteratorAggregate, Countable
                 throw new InvalidArgumentException('method param miss:' . $name);
             }
         }
+        return $args;
+    }
+
+    /**
+     * 解析参数
+     * @access protected
+     * @param  array $params 参数列表
+     * @param  array $vars 参数数据
+     * @param  int   $type 参数类别
+     * @return array
+     */
+    protected function parseParamsForPHP8($params, $vars, $type)
+    {
+        foreach ($params as $param) {
+            $name           = $param->getName();
+            $lowerName      = Loader::parseName($name);
+            $reflectionType = $param->getType();
 
+            if ($reflectionType && $reflectionType->isBuiltin() === false) {
+                $args[] = $this->getObjectParam($reflectionType->getName(), $vars);
+            } elseif (1 == $type && !empty($vars)) {
+                $args[] = array_shift($vars);
+            } elseif (0 == $type && array_key_exists($name, $vars)) {
+                $args[] = $vars[$name];
+            } elseif (0 == $type && array_key_exists($lowerName, $vars)) {
+                $args[] = $vars[$lowerName];
+            } elseif ($param->isDefaultValueAvailable()) {
+                $args[] = $param->getDefaultValue();
+            } else {
+                throw new InvalidArgumentException('method param miss:' . $name);
+            }
+        }
         return $args;
     }
 

+ 36 - 27
thinkphp/library/think/Model.php

@@ -18,34 +18,43 @@ use think\db\Query;
  * Class Model
  * @package think
  * @mixin Query
- * @method Query where(mixed $field, string $op = null, mixed $condition = null) static 查询条件
- * @method Query whereRaw(string $where, array $bind = []) static 表达式查询
- * @method Query whereExp(string $field, string $condition, array $bind = []) static 字段表达式查询
- * @method Query when(mixed $condition, mixed $query, mixed $otherwise = null) static 条件查询
- * @method Query join(mixed $join, mixed $condition = null, string $type = 'INNER') static JOIN查询
- * @method Query view(mixed $join, mixed $field = null, mixed $on = null, string $type = 'INNER') static 视图查询
- * @method Query with(mixed $with) static 关联预载入
- * @method Query count(string $field) static Count统计查询
- * @method Query min(string $field) static Min统计查询
- * @method Query max(string $field) static Max统计查询
- * @method Query sum(string $field) static SUM统计查询
- * @method Query avg(string $field) static Avg统计查询
- * @method Query field(mixed $field, boolean $except = false) static 指定查询字段
- * @method Query fieldRaw(string $field, array $bind = []) static 指定查询字段
- * @method Query union(mixed $union, boolean $all = false) static UNION查询
- * @method Query limit(mixed $offset, integer $length = null) static 查询LIMIT
- * @method Query order(mixed $field, string $order = null) static 查询ORDER
- * @method Query orderRaw(string $field, array $bind = []) static 查询ORDER
- * @method Query cache(mixed $key = null , integer $expire = null) static 设置查询缓存
- * @method mixed value(string $field) static 获取某个字段的值
+ * @method $this scope(string|array $scope) static 查询范围
+ * @method $this where(mixed $field, string $op = null, mixed $condition = null) static 查询条件
+ * @method $this whereRaw(string $where, array $bind = [], string $logic = 'AND') static 表达式查询
+ * @method $this whereExp(string $field, string $condition, array $bind = [], string $logic = 'AND') static 字段表达式查询
+ * @method $this when(mixed $condition, mixed $query, mixed $otherwise = null) static 条件查询
+ * @method $this join(mixed $join, mixed $condition = null, string $type = 'INNER', array $bind = []) static JOIN查询
+ * @method $this view(mixed $join, mixed $field = null, mixed $on = null, string $type = 'INNER') static 视图查询
+ * @method $this with(mixed $with, callable $callback = null) static 关联预载入
+ * @method $this count(string $field = '*') static Count统计查询
+ * @method $this min(string $field, bool $force = true) static Min统计查询
+ * @method $this max(string $field, bool $force = true) static Max统计查询
+ * @method $this sum(string $field) static SUM统计查询
+ * @method $this avg(string $field) static Avg统计查询
+ * @method $this field(mixed $field, boolean $except = false, string $tableName = '', string $prefix = '', string $alias = '') static 指定查询字段
+ * @method $this fieldRaw(string $field) static 指定查询字段
+ * @method $this union(mixed $union, boolean $all = false) static UNION查询
+ * @method $this limit(mixed $offset, integer $length = null) static 查询LIMIT
+ * @method $this order(mixed $field, string $order = null) static 查询ORDER
+ * @method $this orderRaw(string $field, array $bind = []) static 查询ORDER
+ * @method $this cache(mixed $key = null , integer|\DateTime $expire = null, string $tag = null) static 设置查询缓存
+ * @method mixed value(string $field, mixed $default = null) static 获取某个字段的值
  * @method array column(string $field, string $key = '') static 获取某个列的值
- * @method mixed find(mixed $data = null) static 查询单个记录
- * @method mixed select(mixed $data = null) static 查询多个记录
- * @method mixed get(mixed $data = null,mixed $with =[],bool $cache= false) static 查询单个记录 支持关联预载入
- * @method mixed getOrFail(mixed $data = null,mixed $with =[],bool $cache= false) static 查询单个记录 不存在则抛出异常
- * @method mixed findOrEmpty(mixed $data = null,mixed $with =[],bool $cache= false) static 查询单个记录  不存在则返回空模型
- * @method mixed all(mixed $data = null,mixed $with =[],bool $cache= false) static 查询多个记录 支持关联预载入
- * @method \think\Model withAttr(array $name,\Closure $closure) 动态定义获取器
+ * @method $this find(mixed $data = null) static 查询单个记录
+ * @method $this findOrFail(mixed $data = null) 查询单个记录
+ * @method Collection|$this[] select(mixed $data = null) static 查询多个记录
+ * @method $this get(mixed $data = null,mixed $with = [],bool $cache = false, bool $failException = false) static 查询单个记录 支持关联预载入
+ * @method $this getOrFail(mixed $data = null,mixed $with = [],bool $cache = false) static 查询单个记录 不存在则抛出异常
+ * @method $this findOrEmpty(mixed $data = null) static 查询单个记录  不存在则返回空模型
+ * @method Collection|$this[] all(mixed $data = null,mixed $with = [],bool $cache = false) static 查询多个记录 支持关联预载入
+ * @method $this withAttr(array $name,\Closure $closure = null) static 动态定义获取器
+ * @method $this withJoin(string|array $with, string $joinType = '') static
+ * @method $this withCount(string|array $relation, bool $subQuery = true) static 关联统计
+ * @method $this withSum(string|array $relation, string $field, bool $subQuery = true) static 关联SUM统计
+ * @method $this withMax(string|array $relation, string $field, bool $subQuery = true) static 关联MAX统计
+ * @method $this withMin(string|array $relation, string $field, bool $subQuery = true) static 关联Min统计
+ * @method $this withAvg(string|array $relation, string $field, bool $subQuery = true) static 关联Avg统计
+ * @method Paginator|$this paginate() static 分页
  */
 abstract class Model implements \JsonSerializable, \ArrayAccess
 {

+ 1 - 1
thinkphp/library/think/Request.php

@@ -1800,7 +1800,7 @@ class Request
     public function host($strict = false)
     {
         if (!$this->host) {
-            $this->host = $this->server('HTTP_X_REAL_HOST') ?: $this->server('HTTP_HOST');
+            $this->host = $this->server('HTTP_X_REAL_HOST') ?: $this->server('HTTP_X_FORWARDED_HOST') ?: $this->server('HTTP_HOST');
         }
 
         return true === $strict && strpos($this->host, ':') ? strstr($this->host, ':', true) : $this->host;

+ 2 - 0
thinkphp/library/think/Route.php

@@ -13,9 +13,11 @@ namespace think;
 
 use think\exception\RouteNotFoundException;
 use think\route\AliasRule;
+use think\route\Dispatch;
 use think\route\dispatch\Url as UrlDispatch;
 use think\route\Domain;
 use think\route\Resource;
+use think\route\Rule;
 use think\route\RuleGroup;
 use think\route\RuleItem;
 

+ 2 - 0
thinkphp/library/think/Validate.php

@@ -408,6 +408,7 @@ class Validate
         foreach ($this->append as $key => $rule) {
             if (!isset($rules[$key])) {
                 $rules[$key] = $rule;
+                unset($this->append[$key]);
             }
         }
 
@@ -520,6 +521,7 @@ class Validate
         if (isset($this->append[$field])) {
             // 追加额外的验证规则
             $rules = array_unique(array_merge($rules, $this->append[$field]), SORT_REGULAR);
+            unset($this->append[$field]);
         }
 
         $i      = 0;

+ 1 - 1
thinkphp/library/think/cache/driver/Redis.php

@@ -90,7 +90,7 @@ class Redis extends Driver
      */
     public function has($name)
     {
-        return $this->handler->exists($this->getCacheKey($name));
+        return $this->handler->exists($this->getCacheKey($name)) ? true : false;
     }
 
     /**

+ 1 - 1
thinkphp/library/think/db/Builder.php

@@ -684,7 +684,7 @@ abstract class Builder
      */
     protected function parseClosure(Query $query, $call, $show = true)
     {
-        $newQuery = $query->newQuery()->setConnection($this->connection);
+        $newQuery = $query->newQuery()->removeOption();
         $call($newQuery);
 
         return $newQuery->buildSql($show);

+ 2 - 2
thinkphp/library/think/db/Query.php

@@ -1764,7 +1764,7 @@ class Query
      *                            var_page:分页变量,
      *                            list_rows:每页数量
      *                            type:分页类名
-     * @return \think\Paginator
+     * @return $this[]|\think\Paginator
      * @throws DbException
      */
     public function paginate($listRows = null, $simple = false, $config = [])
@@ -3464,7 +3464,7 @@ class Query
     }
 
     /**
-     * 查找单条记录 如果不存在则抛出异常
+     * 查找单条记录 不存在则返回空模型
      * @access public
      * @param  array|string|Query|\Closure $data
      * @return array|\PDOStatement|string|Model

+ 7 - 1
thinkphp/library/think/db/builder/Mysql.php

@@ -125,7 +125,13 @@ class Mysql extends Builder
 
         $key = trim($key);
 
-        if (strpos($key, '->') && false === strpos($key, '(')) {
+        if(strpos($key, '->>') && false === strpos($key, '(')){
+            // JSON字段支持
+            list($field, $name) = explode('->>', $key, 2);
+
+            return $this->parseKey($query, $field, true) . '->>\'$' . (strpos($name, '[') === 0 ? '' : '.') . str_replace('->>', '.', $name) . '\'';
+        }
+        elseif (strpos($key, '->') && false === strpos($key, '(')) {
             // JSON字段支持
             list($field, $name) = explode('->', $key, 2);
 

+ 8 - 8
thinkphp/library/think/db/connector/Mysql.php

@@ -97,10 +97,10 @@ class Mysql extends Connection
                 $info[$val['field']] = [
                     'name'    => $val['field'],
                     'type'    => $val['type'],
-                    'notnull' => (bool) ('' === $val['null']), // not null is empty, null is yes
+                    'notnull' => 'NO' == $val['null'],
                     'default' => $val['default'],
-                    'primary' => (strtolower($val['key']) == 'pri'),
-                    'autoinc' => (strtolower($val['extra']) == 'auto_increment'),
+                    'primary' => strtolower($val['key']) == 'pri',
+                    'autoinc' => strtolower($val['extra']) == 'auto_increment',
                 ];
             }
         }
@@ -187,7 +187,7 @@ class Mysql extends Connection
             return false;
         }
 
-        $this->execute("XA START '$xid'");
+        $this->linkID->exec("XA START '$xid'");
     }
 
     /**
@@ -199,8 +199,8 @@ class Mysql extends Connection
     public function prepareXa($xid)
     {
         $this->initConnect(true);
-        $this->execute("XA END '$xid'");
-        $this->execute("XA PREPARE '$xid'");
+        $this->linkID->exec("XA END '$xid'");
+        $this->linkID->exec("XA PREPARE '$xid'");
     }
 
     /**
@@ -212,7 +212,7 @@ class Mysql extends Connection
     public function commitXa($xid)
     {
         $this->initConnect(true);
-        $this->execute("XA COMMIT '$xid'");
+        $this->linkID->exec("XA COMMIT '$xid'");
     }
 
     /**
@@ -224,6 +224,6 @@ class Mysql extends Connection
     public function rollbackXa($xid)
     {
         $this->initConnect(true);
-        $this->execute("XA ROLLBACK '$xid'");
+        $this->linkID->exec("XA ROLLBACK '$xid'");
     }
 }

+ 1 - 1
thinkphp/library/think/facade/Route.php

@@ -27,7 +27,7 @@ use think\Facade;
  * @method void import(array $rules, string $type = '*') static 导入配置文件的路由规则
  * @method \think\route\RuleItem rule(string $rule, mixed $route, string $method = '*', array $option = [], array $pattern = []) static 注册路由规则
  * @method void rules(array $rules, string $method = '*', array $option = [], array $pattern = []) static 批量注册路由规则
- * @method \think\route\RuleGroup group(string|array $name, mixed $route, string $method = '*', array $option = [], array $pattern = []) static 注册路由分组
+ * @method \think\route\RuleGroup group(string|array $name, array|\Closure $route, array $method = '*', array $option = [], array $pattern = []) static 注册路由分组
  * @method \think\route\RuleItem any(string $rule, mixed $route, array $option = [], array $pattern = []) static 注册路由
  * @method \think\route\RuleItem get(string $rule, mixed $route, array $option = [], array $pattern = []) static 注册路由
  * @method \think\route\RuleItem post(string $rule, mixed $route, array $option = [], array $pattern = []) static 注册路由

+ 16 - 0
thinkphp/library/think/model/Collection.php

@@ -33,6 +33,22 @@ class Collection extends BaseCollection
     }
 
     /**
+     * 绑定(一对一)关联属性到当前模型
+     * @access protected
+     * @param  string $relation 关联名称
+     * @param  array  $attrs    绑定属性
+     * @return $this
+     */
+    public function bindAttr($relation, array $attrs = [])
+    {
+        $this->each(function (Model $model) use ($relation, $attrs) {
+            $model->bindAttr($relation, $attrs);
+        });
+
+        return $this;
+    }
+
+    /**
      * 设置需要隐藏的输出属性
      * @access public
      * @param  array $hidden   属性列表

+ 1 - 1
thinkphp/library/think/model/concern/Conversion.php

@@ -87,7 +87,7 @@ trait Conversion
                 if (isset($this->data[$key])) {
                     throw new Exception('bind attr has exists:' . $key);
                 } else {
-                    $this->data[$key] = $model->$attr;
+                    $this->data[$key] = $model->getAttr($attr);
                 }
             }
         }

+ 27 - 0
thinkphp/library/think/model/concern/RelationShip.php

@@ -13,6 +13,7 @@ namespace think\model\concern;
 
 use think\Collection;
 use think\db\Query;
+use think\Exception;
 use think\Loader;
 use think\Model;
 use think\model\Relation;
@@ -116,6 +117,32 @@ trait RelationShip
     }
 
     /**
+     * 绑定(一对一)关联属性到当前模型
+     * @access protected
+     * @param  string   $relation    关联名称
+     * @param  array    $attrs       绑定属性
+     * @return $this
+     * @throws Exception
+     */
+    public function bindAttr($relation, array $attrs = [])
+    {
+        $relation = $this->getRelation($relation);
+
+        foreach ($attrs as $key => $attr) {
+            $key   = is_numeric($key) ? $attr : $key;
+            $value = $this->getOrigin($key);
+
+            if (!is_null($value)) {
+                throw new Exception('bind attr has exists:' . $key);
+            }
+
+            $this->setAttr($key, $relation ? $relation->getAttr($attr) : null);
+        }
+
+        return $this;
+    }
+
+    /**
      * 关联数据写入
      * @access public
      * @param  array|string $relation 关联

+ 4 - 0
thinkphp/library/think/model/concern/SoftDelete.php

@@ -139,6 +139,10 @@ trait SoftDelete
      */
     public static function destroy($data, $force = false)
     {
+        // 传入空不执行删除,但是0可以删除
+        if (empty($data) && 0 !== $data) {
+            return false;
+        }
         // 包含软删除数据
         $query = (new static())->db(false);
 

+ 2 - 1
thinkphp/library/think/model/relation/BelongsToMany.php

@@ -19,6 +19,7 @@ use think\Loader;
 use think\Model;
 use think\model\Pivot;
 use think\model\Relation;
+use think\Paginator;
 
 class BelongsToMany extends Relation
 {
@@ -582,7 +583,7 @@ class BelongsToMany extends Relation
      * 判断是否存在关联数据
      * @access public
      * @param  mixed $data  数据 可以使用关联模型对象 或者 关联对象的主键
-     * @return Pivot
+     * @return Pivot|false
      * @throws Exception
      */
     public function attached($data)

+ 6 - 6
thinkphp/library/think/model/relation/HasManyThrough.php

@@ -81,7 +81,7 @@ class HasManyThrough extends Relation
      */
     public function has($operator = '>=', $count = 1, $id = '*', $joinType = 'INNER')
     {
-        $model         = App::parseName(App::classBaseName($this->parent));
+        $model         = Loader::parseName(basename(str_replace('\\', '/', get_class($this->parent))));
         $throughTable  = $this->through->getTable();
         $pk            = $this->throughPk;
         $throughKey    = $this->throughKey;
@@ -114,7 +114,7 @@ class HasManyThrough extends Relation
      */
     public function hasWhere($where = [], $fields = null)
     {
-        $model        = App::parseName(App::classBaseName($this->parent));
+        $model        = Loader::parseName(basename(str_replace('\\', '/', get_class($this->parent))));
         $throughTable = $this->through->getTable();
         $pk           = $this->throughPk;
         $throughKey   = $this->throughKey;
@@ -169,7 +169,7 @@ class HasManyThrough extends Relation
             ], $foreignKey, $relation, $subRelation, $closure);
 
             // 关联属性名
-            $attr = App::parseName($relation);
+            $attr = Loader::parseName($relation);
 
             // 关联数据封装
             foreach ($resultSet as $result) {
@@ -218,7 +218,7 @@ class HasManyThrough extends Relation
             $relationModel->setParent(clone $result);
         }
 
-        $result->setRelation(App::parseName($relation), $this->resultSetBuild($data[$pk]));
+        $result->setRelation(Loader::parseName($relation), $this->resultSetBuild($data[$pk]));
     }
 
     /**
@@ -279,7 +279,7 @@ class HasManyThrough extends Relation
             }
         }
 
-        $alias        = App::parseName(App::classBaseName($this->model));
+        $alias        = Loader::parseName(basename(str_replace('\\', '/', $this->model)));
         $throughTable = $this->through->getTable();
         $pk           = $this->throughPk;
         $throughKey   = $this->throughKey;
@@ -315,7 +315,7 @@ class HasManyThrough extends Relation
             }
         }
 
-        $alias        = App::parseName(App::classBaseName($this->model));
+        $alias        = Loader::parseName(basename(str_replace('\\', '/', $this->model)));
         $throughTable = $this->through->getTable();
         $pk           = $this->throughPk;
         $throughKey   = $this->throughKey;

+ 1 - 1
thinkphp/library/think/model/relation/HasOne.php

@@ -144,7 +144,7 @@ class HasOne extends OneToOne
 
         return $this->parent->db()
             ->alias($model)
-            ->whereExists(function ($query) use ($table, $model, $relation, $localKey, $foreignKey) {
+            ->whereExists(function ($query) use ($table, $model, $relation, $localKey, $foreignKey, $softDelete) {
                 $query->table([$table => $relation])
                     ->field($relation . '.' . $foreignKey)
                     ->whereExp($model . '.' . $localKey, '=' . $relation . '.' . $foreignKey)

+ 9 - 1
thinkphp/library/think/model/relation/MorphTo.php

@@ -186,8 +186,16 @@ class MorphTo extends Relation
             foreach ($range as $key => $val) {
                 // 多态类型映射
                 $model = $this->parseModel($key);
-                $obj   = new $model;
+                $obj   = (new $model)->db();
                 $pk    = $obj->getPk();
+                // 预载入关联查询 支持嵌套预载入
+                if ($closure instanceof \Closure) {
+                    $closure($obj);
+
+                    if ($field = $obj->getOptions('with_field')) {
+                        $obj->field($field)->removeOption('with_field');
+                    }
+                }
                 $list  = $obj->all($val, $subRelation);
                 $data  = [];
 

+ 8 - 6
thinkphp/library/think/model/relation/OneToOne.php

@@ -282,20 +282,22 @@ abstract class OneToOne extends Relation
     /**
      * 绑定关联属性到父模型
      * @access protected
-     * @param  Model $model    关联模型对象
-     * @param  Model $result   父模型对象
+     * @param  Model $result    关联模型对象
+     * @param  Model $model   父模型对象
      * @return void
      * @throws Exception
      */
     protected function bindAttr($model, &$result)
     {
         foreach ($this->bindAttr as $key => $attr) {
-            $key = is_numeric($key) ? $attr : $key;
-            if (isset($result->$key)) {
+            $key   = is_numeric($key) ? $attr : $key;
+            $value = $result->getOrigin($key);
+
+            if (!is_null($value)) {
                 throw new Exception('bind attr has exists:' . $key);
-            } else {
-                $result->setAttr($key, $model ? $model->$attr : null);
             }
+
+            $result->setAttr($key, $model ? $model->getAttr($attr) : null);
         }
     }
 

+ 1 - 0
thinkphp/library/think/route/Domain.php

@@ -13,6 +13,7 @@ namespace think\route;
 
 use think\Container;
 use think\Loader;
+use think\Request;
 use think\Route;
 use think\route\dispatch\Callback as CallbackDispatch;
 use think\route\dispatch\Controller as ControllerDispatch;

+ 12 - 0
vendor/alibabacloud/tea-fileform/.gitignore

@@ -0,0 +1,12 @@
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+composer.lock
+
+.idea
+.DS_Store
+
+cache/
+*.cache

+ 65 - 0
vendor/alibabacloud/tea-fileform/.php_cs.dist

@@ -0,0 +1,65 @@
+<?php
+/*
+ * This document has been generated with
+ * https://mlocati.github.io/php-cs-fixer-configurator/#version:2.15|configurator
+ * you can change this configuration by importing this file.
+ */
+
+return PhpCsFixer\Config::create()
+    ->setRiskyAllowed(true)
+    ->setIndent('    ')
+    ->setRules([
+        '@PSR2'                                       => true,
+        '@PhpCsFixer'                                 => true,
+        '@Symfony:risky'                              => true,
+        'concat_space'                                => ['spacing' => 'one'],
+        'array_syntax'                                => ['syntax' => 'short'],
+        'array_indentation'                           => true,
+        'combine_consecutive_unsets'                  => true,
+        'method_separation'                           => true,
+        'single_quote'                                => true,
+        'declare_equal_normalize'                     => true,
+        'function_typehint_space'                     => true,
+        'hash_to_slash_comment'                       => true,
+        'include'                                     => true,
+        'lowercase_cast'                              => true,
+        'no_multiline_whitespace_before_semicolons'   => true,
+        'no_leading_import_slash'                     => true,
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_spaces_around_offset'                     => true,
+        'no_unneeded_control_parentheses'             => true,
+        'no_unused_imports'                           => true,
+        'no_whitespace_before_comma_in_array'         => true,
+        'no_whitespace_in_blank_line'                 => true,
+        'object_operator_without_whitespace'          => true,
+        'single_blank_line_before_namespace'          => true,
+        'single_class_element_per_statement'          => true,
+        'space_after_semicolon'                       => true,
+        'standardize_not_equals'                      => true,
+        'ternary_operator_spaces'                     => true,
+        'trailing_comma_in_multiline_array'           => true,
+        'trim_array_spaces'                           => true,
+        'unary_operator_spaces'                       => true,
+        'whitespace_after_comma_in_array'             => true,
+        'no_extra_consecutive_blank_lines'            => [
+            'curly_brace_block',
+            'extra',
+            'parenthesis_brace_block',
+            'square_brace_block',
+            'throw',
+            'use',
+        ],
+        'binary_operator_spaces'       => [
+            'align_double_arrow' => true,
+            'align_equals'       => true,
+        ],
+        'braces'                                    => [
+            'allow_single_line_closure' => true,
+        ],
+    ])
+    ->setFinder(
+        PhpCsFixer\Finder::create()
+            ->exclude('vendor')
+            ->exclude('tests')
+            ->in(__DIR__)
+  );

+ 31 - 0
vendor/alibabacloud/tea-fileform/README-CN.md

@@ -0,0 +1,31 @@
+English | [简体中文](README-CN.md)
+
+![](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
+
+## Alibaba Cloud Tea File Library for PHP
+
+## Installation
+
+### Composer
+
+```bash
+composer require alibabacloud/tea-fileform
+```
+
+## Issues
+
+[Opening an Issue](https://github.com/aliyun/tea-fileform/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/tea-fileform)
+
+## License
+
+[Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.

+ 31 - 0
vendor/alibabacloud/tea-fileform/README.md

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

+ 44 - 0
vendor/alibabacloud/tea-fileform/composer.json

@@ -0,0 +1,44 @@
+{
+  "name": "alibabacloud/tea-fileform",
+  "description": "Alibaba Cloud Tea File 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": "^3.0"
+  },
+  "require-dev": {
+    "phpunit/phpunit": "^4.8.35|^5.4.3"
+  },
+  "autoload": {
+    "psr-4": {
+      "AlibabaCloud\\Tea\\FileForm\\": "src"
+    }
+  },
+  "autoload-dev": {
+    "psr-4": {
+      "AlibabaCloud\\Tea\\FileForm\\Tests\\": "tests"
+    }
+  },
+  "scripts": {
+    "fixer": "php-cs-fixer fix ./",
+    "test": [
+      "@clearCache",
+      "phpunit --colors=always"
+    ],
+    "clearCache": "rm -rf cache/*"
+  },
+  "config": {
+    "sort-packages": true,
+    "preferred-install": "dist",
+    "optimize-autoloader": true
+  },
+  "prefer-stable": true,
+  "minimum-stability": "dev"
+}

+ 32 - 0
vendor/alibabacloud/tea-fileform/phpunit.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit bootstrap="./tests/bootstrap.php" colors="true" processIsolation="false" stopOnFailure="false"
+         convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true"
+         testSuiteLoaderFile="phpunit/src/Runner/StandardTestSuiteLoader.php">
+
+    <testsuites>
+        <testsuite name="All">
+            <directory>tests</directory>
+        </testsuite>
+        <testsuite name="Unit">
+            <directory suffix="Test.php">./tests/Unit</directory>
+        </testsuite>
+    </testsuites>
+
+    <groups>
+        <exclude>
+            <group>integration</group>
+        </exclude>
+    </groups>
+
+    <logging>
+        <log type="coverage-html" target="cache/coverage" lowUpperBound="35" highLowerBound="70"/>
+        <log type="coverage-clover" target="cache/coverage.clover"/>
+    </logging>
+
+
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">./src</directory>
+        </whitelist>
+    </filter>
+</phpunit>

+ 16 - 0
vendor/alibabacloud/tea-fileform/src/FileForm.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace AlibabaCloud\Tea\FileForm;
+
+class FileForm
+{
+    public static function getBoundary()
+    {
+        return (string) (mt_rand(10000000000000, 99999999999999));
+    }
+
+    public static function toFileForm($map, $boundary)
+    {
+        return new FileFormStream($map, $boundary);
+    }
+}

+ 22 - 0
vendor/alibabacloud/tea-fileform/src/FileForm/FileField.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace AlibabaCloud\Tea\FileForm\FileForm;
+
+use AlibabaCloud\Tea\Model;
+
+class FileField extends Model
+{
+    public $filename;
+    public $contentType;
+    public $content;
+
+    public function __construct($config = [])
+    {
+        $this->_required = [
+            'filename'    => true,
+            'contentType' => true,
+            'content'     => true,
+        ];
+        parent::__construct($config);
+    }
+}

+ 321 - 0
vendor/alibabacloud/tea-fileform/src/FileFormStream.php

@@ -0,0 +1,321 @@
+<?php
+
+namespace AlibabaCloud\Tea\FileForm;
+
+use AlibabaCloud\Tea\FileForm\FileForm\FileField;
+use GuzzleHttp\Psr7\Stream;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * @internal
+ * @coversNothing
+ */
+class FileFormStream implements StreamInterface
+{
+    /**
+     * @var resource
+     */
+    private $stream;
+    private $index     = 0;
+    private $form      = [];
+    private $boundary  = '';
+    private $streaming = false;
+    private $keys      = [];
+
+    /**
+     * @var Stream
+     */
+    private $currStream;
+
+    private $size;
+    private $uri;
+    private $seekable;
+    private $readable = true;
+    private $writable = true;
+
+    public function __construct($map, $boundary)
+    {
+        $this->stream   = fopen('php://memory', 'a+');
+        $this->form     = $map;
+        $this->boundary = $boundary;
+        $this->keys     = array_keys($map);
+        do {
+            $read = $this->readForm(1024);
+        } while (null !== $read);
+        $meta           = stream_get_meta_data($this->stream);
+        $this->seekable = $meta['seekable'];
+        $this->uri      = $this->getMetadata('uri');
+        $this->seek(0);
+        $this->seek(0);
+    }
+
+    /**
+     * Closes the stream when the destructed.
+     */
+    public function __destruct()
+    {
+        $this->close();
+    }
+
+    public function __toString()
+    {
+        try {
+            $this->seek(0);
+
+            return (string) stream_get_contents($this->stream);
+        } catch (\Exception $e) {
+            return '';
+        }
+    }
+
+    /**
+     * @param int $length
+     *
+     * @return false|int|string
+     */
+    public function readForm($length)
+    {
+        if ($this->streaming) {
+            if (null !== $this->currStream) {
+                // @var string $content
+                $content = $this->currStream->read($length);
+                if (false !== $content && '' !== $content) {
+                    fwrite($this->stream, $content);
+
+                    return $content;
+                }
+
+                return $this->next("\r\n");
+            }
+
+            return $this->next();
+        }
+        $keysCount = \count($this->keys);
+        if ($this->index > $keysCount) {
+            return null;
+        }
+        if ($keysCount > 0) {
+            if ($this->index < $keysCount) {
+                $this->streaming = true;
+
+                $name  = $this->keys[$this->index];
+                $field = $this->form[$name];
+                if (!empty($field) && $field instanceof FileField) {
+                    if (!empty($field->content)) {
+                        $this->currStream = $field->content;
+
+                        $str = '--' . $this->boundary . "\r\n" .
+                            'Content-Disposition: form-data; name="' . $name . '"; filename="' . $field->filename . "\"\r\n" .
+                            'Content-Type: ' . $field->contentType . "\r\n\r\n";
+                        $this->write($str);
+
+                        return $str;
+                    }
+
+                    return $this->next();
+                }
+                $val = $field;
+                $str = '--' . $this->boundary . "\r\n" .
+                    'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n" .
+                    $val . "\r\n";
+                fwrite($this->stream, $str);
+
+                return $str;
+            }
+            if ($this->index == $keysCount) {
+                return $this->next('--' . $this->boundary . "--\r\n");
+            }
+
+            return null;
+        }
+
+        return null;
+    }
+
+    public function getContents()
+    {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+
+        $contents = stream_get_contents($this->stream);
+
+        if (false === $contents) {
+            throw new \RuntimeException('Unable to read stream contents');
+        }
+
+        return $contents;
+    }
+
+    public function close()
+    {
+        if (isset($this->stream)) {
+            if (\is_resource($this->stream)) {
+                fclose($this->stream);
+            }
+            $this->detach();
+        }
+    }
+
+    public function detach()
+    {
+        if (!isset($this->stream)) {
+            return null;
+        }
+
+        $result = $this->stream;
+        unset($this->stream);
+        $this->size = $this->uri = null;
+
+        return $result;
+    }
+
+    public function getSize()
+    {
+        if (null !== $this->size) {
+            return $this->size;
+        }
+
+        if (!isset($this->stream)) {
+            return null;
+        }
+
+        // Clear the stat cache if the stream has a URI
+        if ($this->uri) {
+            clearstatcache(true, $this->uri);
+        }
+
+        $stats = fstat($this->stream);
+        if (isset($stats['size'])) {
+            $this->size = $stats['size'];
+
+            return $this->size;
+        }
+
+        return null;
+    }
+
+    public function isReadable()
+    {
+        return $this->readable;
+    }
+
+    public function isWritable()
+    {
+        return $this->writable;
+    }
+
+    public function isSeekable()
+    {
+        return $this->seekable;
+    }
+
+    public function eof()
+    {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+
+        return feof($this->stream);
+    }
+
+    public function tell()
+    {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+
+        $result = ftell($this->stream);
+
+        if (false === $result) {
+            throw new \RuntimeException('Unable to determine stream position');
+        }
+
+        return $result;
+    }
+
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+
+    public function seek($offset, $whence = SEEK_SET)
+    {
+        $whence = (int) $whence;
+
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+        if (!$this->seekable) {
+            throw new \RuntimeException('Stream is not seekable');
+        }
+        if (-1 === fseek($this->stream, $offset, $whence)) {
+            throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . var_export($whence, true));
+        }
+    }
+
+    public function read($length)
+    {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+        if (!$this->readable) {
+            throw new \RuntimeException('Cannot read from non-readable stream');
+        }
+        if ($length < 0) {
+            throw new \RuntimeException('Length parameter cannot be negative');
+        }
+
+        if (0 === $length) {
+            return '';
+        }
+
+        $string = fread($this->stream, $length);
+        if (false === $string) {
+            throw new \RuntimeException('Unable to read from stream');
+        }
+
+        return $string;
+    }
+
+    public function write($string)
+    {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+        if (!$this->writable) {
+            throw new \RuntimeException('Cannot write to a non-writable stream');
+        }
+
+        // We can't know the size after writing anything
+        $this->size = null;
+        $result     = fwrite($this->stream, $string);
+
+        if (false === $result) {
+            throw new \RuntimeException('Unable to write to stream');
+        }
+
+        return $result;
+    }
+
+    public function getMetadata($key = null)
+    {
+        if (!isset($this->stream)) {
+            return $key ? null : [];
+        }
+
+        $meta = stream_get_meta_data($this->stream);
+
+        return isset($meta[$key]) ? $meta[$key] : null;
+    }
+
+    private function next($endStr = '')
+    {
+        $this->streaming = false;
+        ++$this->index;
+        $this->write($endStr);
+        $this->currStream = null;
+
+        return $endStr;
+    }
+}

+ 81 - 0
vendor/alibabacloud/tea-fileform/tests/FileFormTest.php

@@ -0,0 +1,81 @@
+<?php
+
+namespace AlibabaCloud\Tea\FileForm\Tests;
+
+use AlibabaCloud\Tea\FileForm\FileForm;
+use AlibabaCloud\Tea\FileForm\FileForm\FileField;
+use AlibabaCloud\Tea\FileForm\FileFormStream;
+use GuzzleHttp\Psr7\Stream;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @internal
+ * @coversNothing
+ */
+class FileFormTest extends TestCase
+{
+    public function testFileFromStream()
+    {
+        $boundary = FileForm::getBoundary();
+        $stream   = FileForm::toFileForm([], $boundary);
+        $this->assertTrue($stream instanceof FileFormStream);
+        $stream->write($boundary);
+        $this->assertTrue(\strlen($boundary) === $stream->getSize());
+    }
+
+    public function testSet()
+    {
+        $fileField = new FileField([
+            'filename'    => 'fake filename',
+            'contentType' => 'content type',
+            'content'     => null,
+        ]);
+
+        $this->assertEquals('fake filename', $fileField->filename);
+        $this->assertEquals('content type', $fileField->contentType);
+    }
+
+    public function testRead()
+    {
+        $fileField              = new FileField();
+        $fileField->filename    = 'haveContent';
+        $fileField->contentType = 'contentType';
+        $fileField->content     = new Stream(fopen('data://text/plain;base64,' . base64_encode('This is file test. This sentence must be long'), 'r'));
+
+        $fileFieldNoContent              = new FileField();
+        $fileFieldNoContent->filename    = 'noContent';
+        $fileFieldNoContent->contentType = 'contentType';
+        $fileFieldNoContent->content     = null;
+
+        $map = [
+            'key'      => 'value',
+            'testKey'  => 'testValue',
+            'haveFile' => $fileField,
+            'noFile'   => $fileFieldNoContent,
+        ];
+
+        $stream = FileForm::toFileForm($map, 'testBoundary');
+
+        $result = $stream->getContents();
+        $target = "--testBoundary\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\nvalue\r\n--testBoundary\r\nContent-Disposition: form-data; name=\"testKey\"\r\n\r\ntestValue\r\n--testBoundary\r\nContent-Disposition: form-data; name=\"haveFile\"; filename=\"haveContent\"\r\nContent-Type: contentType\r\n\r\nThis is file test. This sentence must be long\r\n--testBoundary--\r\n";
+
+        $this->assertEquals($target, $result);
+    }
+
+    public function testReadFile()
+    {
+        $fileField              = new FileField();
+        $fileField->filename    = 'composer.json';
+        $fileField->contentType = 'application/json';
+        $fileField->content     = new Stream(fopen(__DIR__ . '/../composer.json', 'r'));
+        $map                    = [
+            'name'      => 'json_file',
+            'type'      => 'application/json',
+            'json_file' => $fileField,
+        ];
+
+        $boundary   = FileForm::getBoundary();
+        $fileStream = FileForm::toFileForm($map, $boundary);
+        $this->assertTrue(false !== strpos($fileStream->getContents(), 'json_file'));
+    }
+}

+ 3 - 0
vendor/alibabacloud/tea-fileform/tests/bootstrap.php

@@ -0,0 +1,3 @@
+<?php
+
+require dirname(__DIR__) . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';

+ 65 - 0
vendor/alibabacloud/tea/.php_cs.dist

@@ -0,0 +1,65 @@
+<?php
+/*
+ * This document has been generated with
+ * https://mlocati.github.io/php-cs-fixer-configurator/#version:2.15|configurator
+ * you can change this configuration by importing this file.
+ */
+
+return PhpCsFixer\Config::create()
+    ->setRiskyAllowed(true)
+    ->setIndent('    ')
+    ->setRules([
+        '@PSR2'                                       => true,
+        '@PhpCsFixer'                                 => true,
+        '@Symfony:risky'                              => true,
+        'concat_space'                                => ['spacing' => 'one'],
+        'array_syntax'                                => ['syntax' => 'short'],
+        'array_indentation'                           => true,
+        'combine_consecutive_unsets'                  => true,
+        'method_separation'                           => true,
+        'single_quote'                                => true,
+        'declare_equal_normalize'                     => true,
+        'function_typehint_space'                     => true,
+        'hash_to_slash_comment'                       => true,
+        'include'                                     => true,
+        'lowercase_cast'                              => true,
+        'no_multiline_whitespace_before_semicolons'   => true,
+        'no_leading_import_slash'                     => true,
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_spaces_around_offset'                     => true,
+        'no_unneeded_control_parentheses'             => true,
+        'no_unused_imports'                           => true,
+        'no_whitespace_before_comma_in_array'         => true,
+        'no_whitespace_in_blank_line'                 => true,
+        'object_operator_without_whitespace'          => true,
+        'single_blank_line_before_namespace'          => true,
+        'single_class_element_per_statement'          => true,
+        'space_after_semicolon'                       => true,
+        'standardize_not_equals'                      => true,
+        'ternary_operator_spaces'                     => true,
+        'trailing_comma_in_multiline_array'           => true,
+        'trim_array_spaces'                           => true,
+        'unary_operator_spaces'                       => true,
+        'whitespace_after_comma_in_array'             => true,
+        'no_extra_consecutive_blank_lines'            => [
+            'curly_brace_block',
+            'extra',
+            'parenthesis_brace_block',
+            'square_brace_block',
+            'throw',
+            'use',
+        ],
+        'binary_operator_spaces'       => [
+            'align_double_arrow' => true,
+            'align_equals'       => true,
+        ],
+        'braces'                                    => [
+            'allow_single_line_closure' => true,
+        ],
+    ])
+    ->setFinder(
+        PhpCsFixer\Finder::create()
+            ->exclude('vendor')
+            ->exclude('tests')
+            ->in(__DIR__)
+  );

+ 148 - 0
vendor/alibabacloud/tea/CHANGELOG.md

@@ -0,0 +1,148 @@
+# CHANGELOG
+
+## 3.1.22 - 2021-05-11
+
+- Deprecate `stream_for` method.
+
+## 3.1.21 - 2021-03-15
+
+- Supported set proxy&timeout on request.
+
+## 3.1.20 - 2020-12-02
+
+- Fix the warning when the Tea::merge method received empty arguments.
+
+## 3.1.19 - 2020-10-09
+
+- Fix the error when the code value is a string.
+
+## 3.1.18 - 2020-09-28
+
+- Require Guzzle Version 7.0
+
+## 3.1.17 - 2020-09-24
+
+- TeaUnableRetryError support get error info.
+
+## 3.1.16 - 2020-08-31
+
+- Fix the Maximum function nesting level error when repeated network requests.
+
+## 3.1.15 - 2020-07-28
+
+- Improved validatePattern method.
+
+## 3.1.14 - 2020-07-03
+
+- Supported set properties of TeaError with `ErrorInfo`.
+
+## 3.1.13 - 2020-06-09
+
+- Reduce dependencies.
+
+## 3.1.12 - 2020-05-13
+
+- Add validate method.
+- Supported validate maximun&minimun of property.
+
+## 3.1.11 - 2020-05-07
+
+- Fixed error when class is undefined.
+
+## 3.1.10 - 2020-05-07
+
+- Fixed error when '$item' of array is null
+
+## 3.1.9 - 2020-04-13
+
+- TeaUnableRetryError add $lastException param.
+
+## 3.1.8 - 2020-04-02
+
+- Added some static methods of Model to validate fields of Model.
+
+## 3.1.7 - 2020-03-27
+
+- Improve Tea::isRetryable method.
+
+## 3.1.6 - 2020-03-25
+
+- Fixed bug when body is StreamInterface.
+
+## 3.1.5 - 2020-03-25
+
+- Improve Model.toMap method.
+- Improve Tea.merge method.
+- Fixed tests.
+
+## 3.1.4 - 2020-03-20
+
+- Added Tea::merge method.
+- Change Tea::isRetryable method.
+
+## 3.1.3 - 2020-03-20
+
+- Model: added toModel method.
+
+## 3.1.2 - 2020-03-19
+
+- Model constructor supported array type parameter.
+
+## 3.1.1 - 2020-03-18
+
+- Fixed bug : set method failed.
+- Fixed bug : get empty contents form body.
+
+## 3.1.0 - 2020-03-13
+
+- TeaUnableRetryError add 'lastRequest' property.
+- Change Tea.send() method return.
+- Fixed Tea. allowRetry() method.
+
+## 3.0.0 - 2020-02-14
+- Rename package name.
+
+## 2.0.3 - 2020-02-14
+- Improved Exception.
+
+## 2.0.2 - 2019-09-11
+- Supported `String`.
+
+## 2.0.1 - 2019-08-15
+- Supported `IteratorAggregate`.
+
+## 2.0.0 - 2019-08-14
+- Design `Request` as a standard `PsrRequest`.
+
+## 1.0.10 - 2019-08-12
+- Added `__toString` for `Response`.
+
+## 1.0.9 - 2019-08-01
+- Updated `Middleware`.
+
+## 1.0.8 - 2019-07-29
+- Supported `TransferStats`.
+
+## 1.0.7 - 2019-07-27
+- Improved request.
+
+## 1.0.6 - 2019-07-23
+- Trim key for parameter.
+
+## 1.0.5 - 2019-07-23
+- Supported default protocol.
+
+## 1.0.4 - 2019-07-22
+- Added `toArray()`.
+
+## 1.0.3 - 2019-05-02
+- Improved `Request`.
+
+## 1.0.2 - 2019-05-02
+- Added getHeader/getHeaders.
+
+## 1.0.1 - 2019-04-02
+- Improved design.
+
+## 1.0.0 - 2019-05-02
+- Initial release of the AlibabaCloud Tea Version 1.0.0 on Packagist See <https://github.com/aliyun/tea-php> for more information.

+ 13 - 0
vendor/alibabacloud/tea/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.

+ 16 - 0
vendor/alibabacloud/tea/README.md

@@ -0,0 +1,16 @@
+
+## Installation
+```
+composer require alibabacloud/tea --optimize-autoloader
+```
+> Some users may not be able to install due to network problems, you can try to switch the Composer mirror.
+
+
+## Changelog
+Detailed changes for each release are documented in the [release notes](CHANGELOG.md).
+
+
+## License
+[Apache-2.0](LICENSE.md)
+
+Copyright (c) 2009-present, Alibaba Cloud All rights reserved.

+ 80 - 0
vendor/alibabacloud/tea/composer.json

@@ -0,0 +1,80 @@
+{
+    "name": "alibabacloud/tea",
+    "homepage": "https://www.alibabacloud.com/",
+    "description": "Client of Tea for PHP",
+    "keywords": [
+        "tea",
+        "client",
+        "alibabacloud",
+        "cloud"
+    ],
+    "type": "library",
+    "license": "Apache-2.0",
+    "support": {
+        "source": "https://github.com/aliyun/tea-php",
+        "issues": "https://github.com/aliyun/tea-php/issues"
+    },
+    "authors": [
+        {
+            "name": "Alibaba Cloud SDK",
+            "email": "sdk-team@alibabacloud.com",
+            "homepage": "http://www.alibabacloud.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.5",
+        "ext-curl": "*",
+        "ext-json": "*",
+        "ext-libxml": "*",
+        "ext-mbstring": "*",
+        "ext-openssl": "*",
+        "ext-simplexml": "*",
+        "ext-xmlwriter": "*",
+        "guzzlehttp/guzzle": "^6.3|^7.0",
+        "adbario/php-dot-notation": "^2.2"
+    },
+    "require-dev": {
+        "symfony/dotenv": "^3.4",
+        "phpunit/phpunit": "*",
+        "symfony/var-dumper": "^3.4"
+    },
+    "suggest": {
+        "ext-sockets": "To use client-side monitoring"
+    },
+    "autoload": {
+        "psr-4": {
+            "AlibabaCloud\\Tea\\": "src"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "AlibabaCloud\\Tea\\Tests\\": "tests"
+        }
+    },
+    "config": {
+        "sort-packages": true,
+        "preferred-install": "dist",
+        "optimize-autoloader": true
+    },
+    "prefer-stable": true,
+    "minimum-stability": "dev",
+    "scripts": {
+        "cs": "phpcs --standard=PSR2 -n ./",
+        "cbf": "phpcbf --standard=PSR2 -n ./",
+        "fixer": "php-cs-fixer fix ./",
+        "test": [
+            "@clearCache",
+            "phpunit --colors=always"
+        ],
+        "unit": [
+            "@clearCache",
+            "phpunit --testsuite=Unit --colors=always"
+        ],
+        "feature": [
+            "@clearCache",
+            "phpunit --testsuite=Feature --colors=always"
+        ],
+        "clearCache": "rm -rf cache/*",
+        "coverage": "open cache/coverage/index.html"
+    }
+}

+ 47 - 0
vendor/alibabacloud/tea/src/Exception/TeaError.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace AlibabaCloud\Tea\Exception;
+
+use RuntimeException;
+
+/**
+ * Class TeaError.
+ */
+class TeaError extends RuntimeException
+{
+    public $message = '';
+    public $code    = 0;
+    public $data;
+    public $name    = '';
+    private $errorInfo;
+
+    /**
+     * TeaError constructor.
+     *
+     * @param array           $errorInfo
+     * @param string          $message
+     * @param int             $code
+     * @param null|\Throwable $previous
+     */
+    public function __construct($errorInfo = [], $message = '', $code = 0, $previous = null)
+    {
+        parent::__construct((string) $message, (int) $code, $previous);
+        $this->errorInfo = $errorInfo;
+        if (!empty($errorInfo)) {
+            $properties = ['name', 'message', 'code', 'data'];
+            foreach ($properties as $property) {
+                if (isset($errorInfo[$property])) {
+                    $this->{$property} = $errorInfo[$property];
+                }
+            }
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getErrorInfo()
+    {
+        return $this->errorInfo;
+    }
+}

+ 21 - 0
vendor/alibabacloud/tea/src/Exception/TeaRetryError.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace AlibabaCloud\Tea\Exception;
+
+/**
+ * Class TeaRetryError.
+ */
+class TeaRetryError extends TeaError
+{
+    /**
+     * TeaRetryError constructor.
+     *
+     * @param string          $message
+     * @param int             $code
+     * @param null|\Throwable $previous
+     */
+    public function __construct($message = '', $code = 0, $previous = null)
+    {
+        parent::__construct([], $message, $code, $previous);
+    }
+}

+ 41 - 0
vendor/alibabacloud/tea/src/Exception/TeaUnableRetryError.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace AlibabaCloud\Tea\Exception;
+
+use AlibabaCloud\Tea\Request;
+
+/**
+ * Class TeaUnableRetryError.
+ */
+class TeaUnableRetryError extends TeaError
+{
+    private $lastRequest;
+    private $lastException;
+
+    /**
+     * TeaUnableRetryError constructor.
+     *
+     * @param Request         $lastRequest
+     * @param null|\Exception $lastException
+     */
+    public function __construct($lastRequest, $lastException = null)
+    {
+        $error_info = [];
+        if (null !== $lastException && $lastException instanceof TeaError) {
+            $error_info = $lastException->getErrorInfo();
+        }
+        parent::__construct($error_info, $lastException->getMessage(), $lastException->getCode(), $lastException);
+        $this->lastRequest   = $lastRequest;
+        $this->lastException = $lastException;
+    }
+
+    public function getLastRequest()
+    {
+        return $this->lastRequest;
+    }
+
+    public function getLastException()
+    {
+        return $this->lastException;
+    }
+}

+ 68 - 0
vendor/alibabacloud/tea/src/Helper.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace AlibabaCloud\Tea;
+
+class Helper
+{
+    /**
+     * @param string   $content
+     * @param string   $prefix
+     * @param string   $end
+     * @param string[] $filter
+     *
+     * @return string|string[]
+     */
+    public static function findFromString($content, $prefix, $end, $filter = ['"', ' '])
+    {
+        $len = mb_strlen($prefix);
+        $pos = mb_strpos($content, $prefix);
+        if (false === $pos) {
+            return '';
+        }
+        $pos_end = mb_strpos($content, $end, $pos);
+        $str     = mb_substr($content, $pos + $len, $pos_end - $pos - $len);
+
+        return str_replace($filter, '', $str);
+    }
+
+    /**
+     * @param string $str
+     *
+     * @return bool
+     */
+    public static function isJson($str)
+    {
+        json_decode($str);
+
+        return \JSON_ERROR_NONE == json_last_error();
+    }
+
+    /**
+     * @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;
+    }
+}

+ 114 - 0
vendor/alibabacloud/tea/src/Model.php

@@ -0,0 +1,114 @@
+<?php
+
+namespace AlibabaCloud\Tea;
+
+class Model
+{
+    protected $_name     = [];
+    protected $_required = [];
+
+    public function __construct($config = [])
+    {
+        if (!empty($config)) {
+            foreach ($config as $k => $v) {
+                $this->{$k} = $v;
+            }
+        }
+    }
+
+    public function getName($name = null)
+    {
+        if (null === $name) {
+            return $this->_name;
+        }
+
+        return isset($this->_name[$name]) ? $this->_name[$name] : $name;
+    }
+
+    public function toMap()
+    {
+        $map = get_object_vars($this);
+        foreach ($map as $k => $m) {
+            if (0 === strpos($k, '_')) {
+                unset($map[$k]);
+            }
+        }
+        $res = [];
+        foreach ($map as $k => $v) {
+            $name       = isset($this->_name[$k]) ? $this->_name[$k] : $k;
+            $res[$name] = $v;
+        }
+
+        return $res;
+    }
+
+    public function validate()
+    {
+        $vars = get_object_vars($this);
+        foreach ($vars as $k => $v) {
+            if (isset($this->_required[$k]) && $this->_required[$k] && empty($v)) {
+                throw new \InvalidArgumentException("{$k} is required.");
+            }
+        }
+    }
+
+    public static function validateRequired($fieldName, $field, $val = null)
+    {
+        if (true === $val && null === $field) {
+            throw new \InvalidArgumentException($fieldName . ' is required');
+        }
+    }
+
+    public static function validateMaxLength($fieldName, $field, $val = null)
+    {
+        if (null !== $field && \strlen($field) > (int) $val) {
+            throw new \InvalidArgumentException($fieldName . ' is exceed max-length: ' . $val);
+        }
+    }
+
+    public static function validateMinLength($fieldName, $field, $val = null)
+    {
+        if (null !== $field && \strlen($field) < (int) $val) {
+            throw new \InvalidArgumentException($fieldName . ' is less than min-length: ' . $val);
+        }
+    }
+
+    public static function validatePattern($fieldName, $field, $regex = '')
+    {
+        if (null !== $field && '' !== $field && !preg_match("/^{$regex}$/", $field)) {
+            throw new \InvalidArgumentException($fieldName . ' is not match ' . $regex);
+        }
+    }
+
+    public static function validateMaximum($fieldName, $field, $val)
+    {
+        if (null !== $field && $field > $val) {
+            throw new \InvalidArgumentException($fieldName . ' cannot be greater than ' . $val);
+        }
+    }
+
+    public static function validateMinimum($fieldName, $field, $val)
+    {
+        if (null !== $field && $field < $val) {
+            throw new \InvalidArgumentException($fieldName . ' cannot be less than ' . $val);
+        }
+    }
+
+    /**
+     * @param array $map
+     * @param Model $model
+     *
+     * @return mixed
+     */
+    public static function toModel($map, $model)
+    {
+        $names = $model->getName();
+        $names = array_flip($names);
+        foreach ($map as $key => $value) {
+            $name           = isset($names[$key]) ? $names[$key] : $key;
+            $model->{$name} = $value;
+        }
+
+        return $model;
+    }
+}

+ 49 - 0
vendor/alibabacloud/tea/src/Parameter.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace AlibabaCloud\Tea;
+
+use ArrayIterator;
+use IteratorAggregate;
+use ReflectionObject;
+use Traversable;
+
+/**
+ * Class Parameter.
+ */
+abstract class Parameter implements IteratorAggregate
+{
+    /**
+     * @return ArrayIterator|Traversable
+     */
+    public function getIterator()
+    {
+        return new ArrayIterator($this->toArray());
+    }
+
+    /**
+     * @return array
+     */
+    public function getRealParameters()
+    {
+        $array      = [];
+        $obj        = new ReflectionObject($this);
+        $properties = $obj->getProperties();
+
+        foreach ($properties as $property) {
+            $docComment  = $property->getDocComment();
+            $key         = trim(Helper::findFromString($docComment, '@real', "\n"));
+            $value       = $property->getValue($this);
+            $array[$key] = $value;
+        }
+
+        return $array;
+    }
+
+    /**
+     * @return array
+     */
+    public function toArray()
+    {
+        return $this->getRealParameters();
+    }
+}

+ 119 - 0
vendor/alibabacloud/tea/src/Request.php

@@ -0,0 +1,119 @@
+<?php
+
+namespace AlibabaCloud\Tea;
+
+use GuzzleHttp\Psr7\Request as PsrRequest;
+use InvalidArgumentException;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Class Request.
+ */
+class Request extends PsrRequest
+{
+    /**
+     * @var string
+     */
+    public $protocol = 'https';
+
+    /**
+     * @var string
+     */
+    public $pathname = '/';
+
+    /**
+     * @var array
+     */
+    public $headers = [];
+
+    /**
+     * @var array
+     */
+    public $query = [];
+
+    /**
+     * @var string
+     */
+    public $body;
+
+    /**
+     * @var int
+     */
+    public $port;
+
+    public $method;
+
+    public function __construct($method = 'GET', $uri = '', array $headers = [], $body = null, $version = '1.1')
+    {
+        parent::__construct($method, $uri, $headers, $body, $version);
+        $this->method = $method;
+    }
+
+    /**
+     * These fields are compatible if you define other fields.
+     * Mainly for compatibility situations where the code generator cannot generate set properties.
+     *
+     * @return PsrRequest
+     */
+    public function getPsrRequest()
+    {
+        $this->assertQuery($this->query);
+
+        $request = clone $this;
+
+        $uri = $request->getUri();
+        if ($this->query) {
+            $uri = $uri->withQuery(http_build_query($this->query));
+        }
+
+        if ($this->port) {
+            $uri = $uri->withPort($this->port);
+        }
+
+        if ($this->protocol) {
+            $uri = $uri->withScheme($this->protocol);
+        }
+
+        if ($this->pathname) {
+            $uri = $uri->withPath($this->pathname);
+        }
+
+        if (isset($this->headers['host'])) {
+            $uri = $uri->withHost($this->headers['host']);
+        }
+
+        $request = $request->withUri($uri);
+        $request = $request->withMethod($this->method);
+
+        if ('' !== $this->body && null !== $this->body) {
+            if ($this->body instanceof StreamInterface) {
+                $request = $request->withBody($this->body);
+            } else {
+                if (\function_exists('\GuzzleHttp\Psr7\stream_for')) {
+                    // @deprecated stream_for will be removed in guzzlehttp/psr7:2.0
+                    $request = $request->withBody(\GuzzleHttp\Psr7\stream_for($this->body));
+                } else {
+                    $request = $request->withBody(\GuzzleHttp\Psr7\Utils::streamFor($this->body));
+                }
+            }
+        }
+
+        if ($this->headers) {
+            foreach ($this->headers as $key => $value) {
+                $request = $request->withHeader($key, $value);
+            }
+        }
+
+        return $request;
+    }
+
+    /**
+     * @param array $query
+     */
+    private function assertQuery($query)
+    {
+        if (!\is_array($query) && $query !== null) {
+            throw new InvalidArgumentException('Query must be array.');
+        }
+    }
+}

+ 366 - 0
vendor/alibabacloud/tea/src/Response.php

@@ -0,0 +1,366 @@
+<?php
+
+namespace AlibabaCloud\Tea;
+
+use Adbar\Dot;
+use ArrayAccess;
+use Countable;
+use GuzzleHttp\Psr7\Response as PsrResponse;
+use GuzzleHttp\TransferStats;
+use IteratorAggregate;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
+
+/**
+ * Class Response.
+ */
+class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Countable
+{
+    public $headers = [];
+    public $statusCode;
+    public $statusMessage = '';
+
+    /**
+     * @var TransferStats
+     */
+    public static $info;
+
+    /**
+     * @var StreamInterface
+     */
+    public $body;
+    /**
+     * Instance of the Dot.
+     *
+     * @var Dot
+     */
+    protected $dot;
+
+    /**
+     * Response constructor.
+     */
+    public function __construct(ResponseInterface $response)
+    {
+        parent::__construct(
+            $response->getStatusCode(),
+            $response->getHeaders(),
+            $response->getBody(),
+            $response->getProtocolVersion(),
+            $response->getReasonPhrase()
+        );
+        $this->headers    = $response->getHeaders();
+        $this->body       = $response->getBody();
+        $this->statusCode = $response->getStatusCode();
+        if ($this->body->isSeekable()) {
+            $this->body->seek(0);
+        }
+
+        if (Helper::isJson((string) $this->getBody())) {
+            $this->dot = new Dot($this->toArray());
+        } else {
+            $this->dot = new Dot();
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return (string) $this->getBody();
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return null|mixed
+     */
+    public function __get($name)
+    {
+        $data = $this->dot->all();
+        if (!isset($data[$name])) {
+            return null;
+        }
+
+        return json_decode(json_encode($data))->{$name};
+    }
+
+    /**
+     * @param string $name
+     * @param mixed  $value
+     */
+    public function __set($name, $value)
+    {
+        $this->dot->set($name, $value);
+    }
+
+    /**
+     * @param string $name
+     *
+     * @return bool
+     */
+    public function __isset($name)
+    {
+        return $this->dot->has($name);
+    }
+
+    /**
+     * @param $offset
+     */
+    public function __unset($offset)
+    {
+        $this->dot->delete($offset);
+    }
+
+    /**
+     * @return array
+     */
+    public function toArray()
+    {
+        return \GuzzleHttp\json_decode((string) $this->getBody(), true);
+    }
+
+    /**
+     * @param array|int|string $keys
+     * @param mixed            $value
+     */
+    public function add($keys, $value = null)
+    {
+        return $this->dot->add($keys, $value);
+    }
+
+    /**
+     * @return array
+     */
+    public function all()
+    {
+        return $this->dot->all();
+    }
+
+    /**
+     * @param null|array|int|string $keys
+     */
+    public function clear($keys = null)
+    {
+        return $this->dot->clear($keys);
+    }
+
+    /**
+     * @param array|int|string $keys
+     */
+    public function delete($keys)
+    {
+        return $this->dot->delete($keys);
+    }
+
+    /**
+     * @param string     $delimiter
+     * @param null|array $items
+     * @param string     $prepend
+     *
+     * @return array
+     */
+    public function flatten($delimiter = '.', $items = null, $prepend = '')
+    {
+        return $this->dot->flatten($delimiter, $items, $prepend);
+    }
+
+    /**
+     * @param null|int|string $key
+     * @param mixed           $default
+     *
+     * @return mixed
+     */
+    public function get($key = null, $default = null)
+    {
+        return $this->dot->get($key, $default);
+    }
+
+    /**
+     * @param array|int|string $keys
+     *
+     * @return bool
+     */
+    public function has($keys)
+    {
+        return $this->dot->has($keys);
+    }
+
+    /**
+     * @param null|array|int|string $keys
+     *
+     * @return bool
+     */
+    public function isEmpty($keys = null)
+    {
+        return $this->dot->isEmpty($keys);
+    }
+
+    /**
+     * @param array|self|string $key
+     * @param array|self        $value
+     */
+    public function merge($key, $value = [])
+    {
+        return $this->dot->merge($key, $value);
+    }
+
+    /**
+     * @param array|self|string $key
+     * @param array|self        $value
+     */
+    public function mergeRecursive($key, $value = [])
+    {
+        return $this->dot->mergeRecursive($key, $value);
+    }
+
+    /**
+     * @param array|self|string $key
+     * @param array|self        $value
+     */
+    public function mergeRecursiveDistinct($key, $value = [])
+    {
+        return $this->dot->mergeRecursiveDistinct($key, $value);
+    }
+
+    /**
+     * @param null|int|string $key
+     * @param mixed           $default
+     *
+     * @return mixed
+     */
+    public function pull($key = null, $default = null)
+    {
+        return $this->dot->pull($key, $default);
+    }
+
+    /**
+     * @param null|int|string $key
+     * @param mixed           $value
+     *
+     * @return mixed
+     */
+    public function push($key = null, $value = null)
+    {
+        return $this->dot->push($key, $value);
+    }
+
+    /**
+     * Replace all values or values within the given key
+     * with an array or Dot object.
+     *
+     * @param array|self|string $key
+     * @param array|self        $value
+     */
+    public function replace($key, $value = [])
+    {
+        return $this->dot->replace($key, $value);
+    }
+
+    /**
+     * Set a given key / value pair or pairs.
+     *
+     * @param array|int|string $keys
+     * @param mixed            $value
+     */
+    public function set($keys, $value = null)
+    {
+        return $this->dot->set($keys, $value);
+    }
+
+    /**
+     * Replace all items with a given array.
+     *
+     * @param mixed $items
+     */
+    public function setArray($items)
+    {
+        return $this->dot->setArray($items);
+    }
+
+    /**
+     * Replace all items with a given array as a reference.
+     */
+    public function setReference(array &$items)
+    {
+        return $this->dot->setReference($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)
+    {
+        return $this->dot->toJson($key, $options);
+    }
+
+    /**
+     * Retrieve an external iterator.
+     */
+    public function getIterator()
+    {
+        return $this->dot->getIterator();
+    }
+
+    /**
+     * Whether a offset exists.
+     *
+     * @param $offset
+     *
+     * @return bool
+     */
+    public function offsetExists($offset)
+    {
+        return $this->dot->offsetExists($offset);
+    }
+
+    /**
+     * Offset to retrieve.
+     *
+     * @param $offset
+     *
+     * @return mixed
+     */
+    public function offsetGet($offset)
+    {
+        return $this->dot->offsetGet($offset);
+    }
+
+    /**
+     * Offset to set.
+     *
+     * @param $offset
+     * @param $value
+     */
+    public function offsetSet($offset, $value)
+    {
+        $this->dot->offsetSet($offset, $value);
+    }
+
+    /**
+     * Offset to unset.
+     *
+     * @param $offset
+     */
+    public function offsetUnset($offset)
+    {
+        $this->dot->offsetUnset($offset);
+    }
+
+    /**
+     * Count elements of an object.
+     *
+     * @param null $key
+     *
+     * @return int
+     */
+    public function count($key = null)
+    {
+        return $this->dot->count($key);
+    }
+}

+ 281 - 0
vendor/alibabacloud/tea/src/Tea.php

@@ -0,0 +1,281 @@
+<?php
+
+namespace AlibabaCloud\Tea;
+
+use Adbar\Dot;
+use AlibabaCloud\Tea\Exception\TeaError;
+use GuzzleHttp\Client;
+use GuzzleHttp\Exception\GuzzleException;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Middleware;
+use GuzzleHttp\Promise\PromiseInterface;
+use GuzzleHttp\TransferStats;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Class Tea.
+ */
+class Tea
+{
+    /**
+     * @var array
+     */
+    private static $config = [];
+
+    public static function config(array $config)
+    {
+        self::$config = $config;
+    }
+
+    /**
+     * @throws GuzzleException
+     *
+     * @return Response
+     */
+    public static function send(Request $request, array $config = [])
+    {
+        if (method_exists($request, 'getPsrRequest')) {
+            $request = $request->getPsrRequest();
+        }
+
+        $config = self::resolveConfig($config);
+
+        $res = self::client()->send(
+            $request,
+            $config
+        );
+
+        return new Response($res);
+    }
+
+    /**
+     * @return PromiseInterface
+     */
+    public static function sendAsync(RequestInterface $request, array $config = [])
+    {
+        if (method_exists($request, 'getPsrRequest')) {
+            $request = $request->getPsrRequest();
+        }
+
+        $config = self::resolveConfig($config);
+
+        return self::client()->sendAsync(
+            $request,
+            $config
+        );
+    }
+
+    /**
+     * @return Client
+     */
+    public static function client(array $config = [])
+    {
+        if (isset(self::$config['handler'])) {
+            $stack = self::$config['handler'];
+        } else {
+            $stack = HandlerStack::create();
+            $stack->push(Middleware::mapResponse(static function (ResponseInterface $response) {
+                return new Response($response);
+            }));
+        }
+
+        self::$config['handler'] = $stack;
+
+        if (!isset(self::$config['on_stats'])) {
+            self::$config['on_stats'] = function (TransferStats $stats) {
+                Response::$info = $stats->getHandlerStats();
+            };
+        }
+
+        $new_config = Helper::merge([self::$config, $config]);
+
+        return new Client($new_config);
+    }
+
+    /**
+     * @param string              $method
+     * @param string|UriInterface $uri
+     * @param array               $options
+     *
+     * @throws GuzzleException
+     *
+     * @return ResponseInterface
+     */
+    public static function request($method, $uri, $options = [])
+    {
+        return self::client()->request($method, $uri, $options);
+    }
+
+    /**
+     * @param string $method
+     * @param string $uri
+     * @param array  $options
+     *
+     * @throws GuzzleException
+     *
+     * @return string
+     */
+    public static function string($method, $uri, $options = [])
+    {
+        return (string) self::client()->request($method, $uri, $options)
+            ->getBody();
+    }
+
+    /**
+     * @param string              $method
+     * @param string|UriInterface $uri
+     * @param array               $options
+     *
+     * @return PromiseInterface
+     */
+    public static function requestAsync($method, $uri, $options = [])
+    {
+        return self::client()->requestAsync($method, $uri, $options);
+    }
+
+    /**
+     * @param string|UriInterface $uri
+     * @param array               $options
+     *
+     * @throws GuzzleException
+     *
+     * @return null|mixed
+     */
+    public static function getHeaders($uri, $options = [])
+    {
+        return self::request('HEAD', $uri, $options)->getHeaders();
+    }
+
+    /**
+     * @param string|UriInterface $uri
+     * @param string              $key
+     * @param null|mixed          $default
+     *
+     * @throws GuzzleException
+     *
+     * @return null|mixed
+     */
+    public static function getHeader($uri, $key, $default = null)
+    {
+        $headers = self::getHeaders($uri);
+
+        return isset($headers[$key][0]) ? $headers[$key][0] : $default;
+    }
+
+    /**
+     * @param int   $retryTimes
+     * @param float $now
+     *
+     * @return bool
+     */
+    public static function allowRetry(array $runtime, $retryTimes, $now)
+    {
+        unset($now);
+        if (empty($runtime) || !isset($runtime['maxAttempts'])) {
+            return false;
+        }
+        $maxAttempts = $runtime['maxAttempts'];
+        $retry       = empty($maxAttempts) ? 0 : (int) $maxAttempts;
+
+        return $retry >= $retryTimes;
+    }
+
+    /**
+     * @param int $retryTimes
+     *
+     * @return int
+     */
+    public static function getBackoffTime(array $runtime, $retryTimes)
+    {
+        $backOffTime = 0;
+        $policy      = isset($runtime['policy']) ? $runtime['policy'] : '';
+
+        if (empty($policy) || 'no' == $policy) {
+            return $backOffTime;
+        }
+
+        $period = isset($runtime['period']) ? $runtime['period'] : '';
+        if (null !== $period && '' !== $period) {
+            $backOffTime = (int) $period;
+            if ($backOffTime <= 0) {
+                return $retryTimes;
+            }
+        }
+
+        return $backOffTime;
+    }
+
+    public static function sleep($time)
+    {
+        sleep($time);
+    }
+
+    public static function isRetryable($retry, $retryTimes = 0)
+    {
+        if ($retry instanceof TeaError) {
+            return true;
+        }
+        if (\is_array($retry)) {
+            $max = isset($retry['maxAttempts']) ? (int) ($retry['maxAttempts']) : 3;
+
+            return $retryTimes <= $max;
+        }
+
+        return false;
+    }
+
+    /**
+     * @param mixed|Model[] ...$item
+     *
+     * @return mixed
+     */
+    public static function merge(...$item)
+    {
+        $tmp = [];
+        $n   = 0;
+        foreach ($item as $i) {
+            if (\is_object($i)) {
+                if ($i instanceof Model) {
+                    $i = $i->toMap();
+                } else {
+                    $i = json_decode(json_encode($i), true);
+                }
+            }
+            if (null === $i) {
+                continue;
+            }
+            if (\is_array($i)) {
+                $tmp[$n++] = $i;
+            }
+        }
+
+        if (\count($tmp)) {
+            return \call_user_func_array('array_merge', $tmp);
+        }
+
+        return [];
+    }
+
+    private static function resolveConfig(array $config = [])
+    {
+        $options = new Dot(['http_errors' => false]);
+        if (isset($config['httpProxy']) && !empty($config['httpProxy'])) {
+            $options->set('proxy.http', $config['httpProxy']);
+        }
+        if (isset($config['httpsProxy']) && !empty($config['httpsProxy'])) {
+            $options->set('proxy.https', $config['httpsProxy']);
+        }
+        if (isset($config['noProxy']) && !empty($config['noProxy'])) {
+            $options->set('proxy.no', $config['noProxy']);
+        }
+        // readTimeout&connectTimeout unit is millisecond
+        $read_timeout = isset($config['readTimeout']) && !empty($config['readTimeout']) ? (int) $config['readTimeout'] : 0;
+        $con_timeout  = isset($config['connectTimeout']) && !empty($config['connectTimeout']) ? (int) $config['connectTimeout'] : 0;
+        // timeout unit is second
+        $options->set('timeout', ($read_timeout + $con_timeout) / 1000);
+
+        return $options->all();
+    }
+}

+ 1 - 0
vendor/alipaysdk/easysdk/.gitattributes

@@ -0,0 +1 @@
+*.* linguist-language=java

+ 16 - 0
vendor/alipaysdk/easysdk/.gitignore

@@ -0,0 +1,16 @@
+.DS_Store
+node_modules
+logs
+.libraries.json
+libraries
+
+.idea
+*.iml
+target
+dependency-reduced-pom.xml
+
+bin
+obj
+.vs
+
+publish/alipay-easysdk

+ 822 - 0
vendor/alipaysdk/easysdk/APIDoc.md

@@ -0,0 +1,822 @@
+# 基础能力 Base
+## 用户授权 OAuth
+### 获取授权访问令牌
+* API声明
+
+getToken(code: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| code | string | 是  |  授权码,用户对应用授权后得到  |
+
+* 出参说明
+
+可前往[alipay.system.oauth.token](https://docs.open.alipay.com/api_9/alipay.system.oauth.token)查看更加详细的参数说明。
+
+### 刷新授权访问令牌
+* API声明
+
+refreshToken(refreshToken: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| refreshToken | string | 是  |  刷新令牌,上次换取访问令牌时得到,见出参的refresh_token字段  |
+
+* 出参说明
+
+可前往[alipay.system.oauth.token](https://docs.open.alipay.com/api_9/alipay.system.oauth.token)查看更加详细的参数说明。
+
+---
+
+## 小程序二维码 Qrcode
+### 创建小程序二维码
+* API声明
+
+create(urlParam: string, queryParam: string, describe: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| urlParam | string | 是  |  小程序中能访问到的页面路径,例如:page/component/component-pages/view/view  |
+| queryParam | string | 是  |  小程序的启动参数,打开小程序的query ,在小程序 onLaunch的方法中获取  |
+| describe | string | 是  |  二维码描述  |
+
+* 出参说明
+
+可前往[alipay.open.app.qrcode.create](https://docs.open.alipay.com/api_5/alipay.open.app.qrcode.create)查看更加详细的参数说明。
+
+---
+
+## 图片 Image
+### 上传图片
+* API声明
+
+upload(imageName: string, imageFilePath: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| imageName | string | 是  |  图片名称  |
+| imageFilePath | string | 是  |  待上传的本地图片文件路径 |
+
+* 出参说明
+
+可前往[alipay.offline.material.image.upload](https://docs.open.alipay.com/api_3/alipay.offline.material.image.upload)查看更加详细的参数说明。
+
+---
+
+## 视频 Video
+### 上传视频
+* API声明
+
+upload(videoName: string, videoFilePath: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| videoName | string | 是  |  视频名称  |
+| videoFilePath | string | 是  |  待上传的本地视频文件路径 |
+
+* 出参说明
+
+可前往[alipay.offline.material.image.upload](https://docs.open.alipay.com/api_3/alipay.offline.material.image.upload)查看更加详细的参数说明。
+
+---
+
+# 营销能力 Marketing
+## 生活号 OpenLife
+### 创建图文消息内容
+* API声明
+
+createImageTextContent(title: string, cover: string, content: string, contentComment: string, ctype: string, benefit: string, extTags: string, loginIds: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| title | string | 是  |  标题  |
+| cover | string | 是  | 封面图URL, 尺寸为996*450,最大不超过3M,支持.jpg、.png格式,请先调用上传图片接口获得图片URL  |
+| content | string | 是  |  消息正文(支持富文本)  |
+| contentComment | string | 否  |  是否允许评论,T:允许,F:不允许,默认不允许  |
+| ctype | string | 否  |  图文类型:填activity表示活动图文,不填默认普通图文  |
+| benefit | string | 否  |  活动利益点,图文类型ctype为activity类型时才需要传,最多10个字符  |
+| extTags | string | 否  |  关键词列表,英文逗号分隔,最多不超过5个  |
+| loginIds | string | 否  |  可预览支付宝账号列表,需要预览时才填写, 英文逗号分隔,最多不超过10个  |
+
+* 出参说明
+
+可前往[alipay.open.public.message.content.create](https://docs.open.alipay.com/api_6/alipay.open.public.message.content.create)查看更加详细的参数说明。
+
+### 更新图文消息内容
+* API声明
+
+modifyImageTextContent(contentId: string, title: string, cover: string, content: string, couldComment: string, ctype: string, benefit: string, extTags: string, loginIds: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| contentId | string | 是  |  内容ID,通过创建图文内容消息接口返回  |
+| title | string | 是  |  标题  |
+| cover | string | 是  | 封面图URL, 尺寸为996*450,最大不超过3M,支持.jpg、.png格式,请先调用上传图片接口获得图片URL  |
+| content | string | 是  |  消息正文(支持富文本)  |
+| contentComment | string | 否  |  是否允许评论,T:允许,F:不允许,默认不允许  |
+| ctype | string | 否  |  图文类型:填activity表示活动图文,不填默认普通图文  |
+| benefit | string | 否  |  活动利益点,图文类型ctype为activity类型时才需要传,最多10个字符  |
+| extTags | string | 否  |  关键词列表,英文逗号分隔,最多不超过5个  |
+| loginIds | string | 否  |  可预览支付宝账号列表,需要预览时才填写, 英文逗号分隔,最多不超过10个  |
+
+* 出参说明
+
+可前往[alipay.open.public.message.content.modify](https://docs.open.alipay.com/api_6/alipay.open.public.message.content.modify)查看更加详细的参数说明。
+
+### 群发本文消息
+* API声明
+
+sendText(text: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| text | string | 是  |  文本消息内容  |
+
+* 出参说明
+
+可前往[alipay.open.public.message.total.send](https://docs.open.alipay.com/api_6/alipay.open.public.message.total.send)查看更加详细的参数说明。
+
+### 群发图文消息
+* API声明
+
+sendImageText(articles: [ Article ])
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| articles | Article数组 | 是  |  图文消息内容  |
+
+Article对象说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| title | string | 否  |   图文消息标题 |
+| desc | string | 是  |  图文消息描述   |
+| imageUrl | string | 特殊可选  |  图片链接,对于多条图文消息的第一条消息,该字段不能为空,请先调用上传图片接口获得图片URL  |
+| url | string | 是  |  点击图文消息跳转的链接  |
+| actionName | string | 否  |  链接文字   |
+
+* 出参说明
+
+可前往[alipay.open.public.message.total.send](https://docs.open.alipay.com/api_6/alipay.open.public.message.total.send)查看更加详细的参数说明。
+
+### 单发模板消息
+* API声明
+
+sendSingleMessage(toUserId: string, template: Template)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| toUserId | string | 是  |  消息接收用户的UserId  |
+| template | Template | 是  |  消息接收用户的UserId  |
+
+Template对象说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| templateId | string | 是  |  消息模板ID |
+| context | Context | 是  |  消息模板上下文,即模板中定义的参数及参数值 |
+
+Context对象说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| headColor | string | 是  |  顶部色条的色值,比如#85be53 |
+| url | string | 是  |  点击消息后承接页的地址 |
+| actionName | string | 是 |  底部链接描述文字,如:“查看详情”,最多能传8个汉字或16个英文字符 |
+| keyword1 | Keyword | 否  |  模板中占位符的值及文字颜色 |
+| keyword2 | Keyword | 否  |  模板中占位符的值及文字颜色 |
+| first | Keyword | 否  |  模板中占位符的值及文字颜色  |
+| remark | Keyword | 否  |  模板中占位符的值及文字颜色 |
+
+Keyword对象说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| color | string | 是  | 当前文字颜色,比如#85be53 |
+| value | string | 是  |  模板中占位符的值  |
+
+* 出参说明
+
+可前往[alipay.open.public.message.single.send](https://docs.open.alipay.com/api_6/alipay.open.public.message.single.send)查看更加详细的参数说明。
+
+### 生活号消息撤回
+* API声明
+
+recallMessage(messageId: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| messageId | string | 是  |  消息ID  |
+
+* 出参说明
+
+可前往[alipay.open.public.life.msg.recall](https://docs.open.alipay.com/api_6/alipay.open.public.life.msg.recall)查看更加详细的参数说明。
+
+### 模板消息行业设置
+* API声明
+
+setIndustry(primaryIndustryCode: string, primaryIndustryName: string, secondaryIndustryCode: string, secondaryIndustryName: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| primaryIndustryCode | string | 是  |  服务窗消息模板所属主行业一级编码,查看[行业信息](https://alipay.open.taobao.com/doc2/detail?treeId=197&docType=1&articleId=105043)  |
+| primaryIndustryName | string | 是  |  服务窗消息模板所属主行业一级名称  |
+| secondaryIndustryCode | string | 是  |  服务窗消息模板所属主行业二级编码 |
+| secondaryIndustryName | string | 是  |  服务窗消息模板所属主行业二级名称  |
+
+* 出参说明
+
+可前往[alipay.open.public.template.message.industry.modify](https://docs.open.alipay.com/api_6/alipay.open.public.template.message.industry.modify)查看更加详细的参数说明。
+
+### 生活号查询行业设置
+* API声明
+
+getIndustry()
+			
+* 入参说明
+
+无
+
+* 出参说明
+
+可前往[alipay.open.public.setting.category.query](https://docs.open.alipay.com/api_6/alipay.open.public.setting.category.query)查看更加详细的参数说明。
+
+---
+
+
+## 支付宝卡包 Pass
+### 卡券模板创建
+* API声明
+
+createTemplate(uniqueId: string, tplContent: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| uniqueId | string | 是  |  商户用于控制模版的唯一性(可以使用时间戳保证唯一性)  |
+| tplContent | string | 是  |  模板内容信息,遵循JSON规范,详情参见tpl_content[参数说明](https://doc.open.alipay.com/doc2/detail.htm?treeId=193&articleId=105249&docType=1#tpl_content)   |
+
+* 出参说明
+
+可前往[alipay.pass.template.add](https://docs.open.alipay.com/api_24/alipay.pass.template.add)查看更加详细的参数说明。
+
+### 卡券模板更新
+* API声明
+
+updateTemplate(uniqueId: string, tplContent: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| uniqueId | string | 是  |  商户用于控制模版的唯一性(可以使用时间戳保证唯一性)  |
+| tplContent | string | 是  |  模板内容信息,遵循JSON规范,详情参见tpl_content[参数说明](https://doc.open.alipay.com/doc2/detail.htm?treeId=193&articleId=105249&docType=1#tpl_content)   |
+
+* 出参说明
+
+可前往[alipay.pass.template.update](https://docs.open.alipay.com/api_24/alipay.pass.template.update)查看更加详细的参数说明。
+
+### 卡券实例发放
+* API声明
+
+addInstance(tplId: string, tplParams: string, recognitionType: string, recognitionInfo: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| tplId | string | 是  |  支付宝pass模版ID,即调用模板创建接口时返回的tpl_id  |
+| tplParams | string | 是  |  模版动态参数信息,对应模板中$变量名$的动态参数,见模板创建接口返回值中的tpl_params字段。示例:  |
+| recognitionType | string | 是  |  Alipass添加对象识别类型,填写“1”表示订单信息  |
+| recognitionInfo | string | 是  |  支付宝用户识别信息,参见[UID发券组件对接文档](https://docs.open.alipay.com/199/sy3hs4 ) |
+
+* 出参说明
+
+可前往[alipay.pass.instance.add](https://docs.open.alipay.com/api_24/alipay.pass.instance.add)查看更加详细的参数说明。
+
+### 卡券实例更新
+* API声明
+
+updateInstance(serialNumber: string, channelId: string, tplParams: string, status: string, verifyCode: string, verifyType: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| serialNumber | string | 是  |  商户指定卡券唯一值,卡券JSON模板中fileInfo->serialNumber字段对应的值  |
+| channelId | string | 是  |  代理商代替商户发放卡券后,再代替商户更新卡券时,此值为商户的PID/AppID  |
+| tplParams | string | 否  |  Alipass添加对象识别类型,填写“1”表示订单信息  |
+| status | string | 否  |  券状态,支持更新为USED、CLOSED两种状态 |
+| verifyCode | string | 否  |  核销码串值(当状态变更为USED时,建议传),该值正常为模板中核销区域(Operation)对应的message值 |
+| verifyType | string | 否  |  核销方式,该值正常为模板中核销区域(Operation)对应的format值,verifyCode和verifyType需同时传入 |
+
+* 出参说明
+
+可前往[alipay.pass.instance.update](https://docs.open.alipay.com/api_24/alipay.pass.instance.update)查看更加详细的参数说明。
+
+---
+
+
+## 小程序模板消息 TemplateMessage
+### 发送模板消息
+* API声明
+
+send(toUserId: string, formId: string, userTemplateId: string, page: string, data: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| toUserId | string | 是  |  发送消息的支付宝账号  |
+| formId | string | 是  |  用户发生的交易行为的交易号,或者用户在小程序产生表单提交的表单号,用于信息发送的校验  |
+| userTemplateId | string | 是  |  用户申请的模板id号,固定的模板id会发送固定的消息  |
+| page | string | 是  |  小程序的跳转页面,用于消息中心用户点击之后详细跳转的小程序页面,例如:page/component/index |
+| data | string | 是  |  开发者需要发送模板消息中的自定义部分来替换模板的占位符,例如:{"keyword1": {"value" : "12:00"},"keyword2": {"value" : "20180808"},"keyword3": {"value" : "支付宝"}}  |
+
+* 出参说明
+
+可前往[alipay.open.app.mini.templatemessage.send](https://docs.open.alipay.com/api_5/alipay.open.app.mini.templatemessage.send)查看更加详细的参数说明。
+
+---
+
+
+# 会员能力 Member
+## 支付宝身份认证 Identification
+### 身份认证初始化
+* API声明
+
+init(outerOrderNo: string, bizCode: string, identityParam: IdentityParam, merchantConfig: MerchantConfig)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| outerOrderNo | string | 是  |  商户请求的唯一标识,商户要保证其唯一性,值为32位长度的字母数字组合,建议前面几位字符是商户自定义的简称,中间可以使用一段时间,后段可以使用一个随机或递增序列  |
+| bizCode | string | 是  |  认证场景码,入参支持的认证场景码和商户签约的认证场景相关,可选值有如下,FACE:多因子人脸认证;CERT_PHOTO:多因子证照认证;CERT_PHOTO_FACE:多因子证照和人脸认证;SMART_FACE:多因子快捷认证  |
+| identityParam | IdentityParam | 是  |   需要验证的身份信息参数  |
+| merchantConfig | MerchantConfig | 是  |  商户个性化配置  |
+
+IdentityParam对象说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| identityType | string | 是  |  身份信息参数类型,必须传入CERT_INFO  |
+| certType | string | 是  |  证件类型,当前支持身份证,必须传入IDENTITY_CARD  |
+| certName | string | 是  |  真实姓名 |
+| certNo | string | 是  |  证件号码  |
+
+MerchantConfig对象说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| returnUrl | string | 是  |  需要回跳的目标URL地址,一般指定为商户业务页面  |
+
+* 出参说明
+
+可前往[alipay.user.certify.open.initialize](https://docs.open.alipay.com/api_2/alipay.user.certify.open.initialize)查看更加详细的参数说明。
+
+### 生成认证链接
+* API声明
+
+certify(certifyId: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| certifyId | string | 是  |  本次申请操作的唯一标识,由身份认证初始化接口调用后生成,后续的操作都需要用到  |
+
+* 出参说明
+
+可前往[alipay.user.certify.open.certify](https://docs.open.alipay.com/api_2/alipay.user.certify.open.certify)查看更加详细的参数说明。
+
+### 身份认证记录查询
+* API声明
+
+query(certifyId: string)
+			
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| certifyId | string | 是  |  身份认证操作的唯一标识,由身份认证初始化接口调用后生成  |
+
+* 出参说明
+
+可前往[alipay.user.certify.open.query](https://docs.open.alipay.com/api_2/alipay.user.certify.open.query)查看更加详细的参数说明。
+
+---
+
+
+# 支付能力 Payment
+## 通用接口 Common
+### 创建交易
+* API声明
+
+create(subject: string, outTradeNo: string, totalAmount: string, buyerId: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| subject | string | 是  |  订单标题  |
+| outTradeNo | string | 是  | 商户订单号,64个字符以内,可包含字母、数字、下划线,需保证在商户端不重复  |
+| totalAmount | string | 是  | 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]  |
+| buyerId | string | 是 | 买家的支付宝唯一用户号(2088开头的16位纯数字)  |
+
+* 出参说明
+
+可前往[alipay.trade.create](https://docs.open.alipay.com/api_1/alipay.trade.create)查看更加详细的参数说明。
+
+### 查询交易
+* API声明
+
+query(outTradeNo: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+
+* 出参说明
+
+可前往[alipay.trade.query](https://docs.open.alipay.com/api_1/alipay.trade.query)查看更加详细的参数说明。
+
+### 交易退款
+* API声明
+
+refund(outTradeNo: string, refundAmount: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+| refundAmount | string | 是  |  需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数  |
+
+* 出参说明
+
+可前往[alipay.trade.refund](https://docs.open.alipay.com/api_1/alipay.trade.refund)查看更加详细的参数说明。
+
+### 关闭交易
+* API声明
+
+close(outTradeNo: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+
+* 出参说明
+
+可前往[alipay.trade.close](https://docs.open.alipay.com/api_1/alipay.trade.close)查看更加详细的参数说明。
+
+### 撤销交易
+* API声明
+
+cancel(outTradeNo: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+
+* 出参说明
+
+可前往[alipay.trade.cancel](https://docs.open.alipay.com/api_1/alipay.trade.cancel)查看更加详细的参数说明。
+
+### 交易退款查询
+* API声明
+
+queryRefund(outTradeNo: string, outRequestNo: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+| outRequestNo | string | 是  |  请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号  |
+
+* 出参说明
+
+可前往[alipay.trade.fastpay.refund.query](https://opendocs.alipay.com/apis/api_1/alipay.trade.fastpay.refund.query)查看更加详细的参数说明。
+
+
+### 查询对账单下载地址
+* API声明
+
+downloadBill(billType: string, billDate: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| billType | string | 是  |  账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单  |
+| billDate | string | 是  |  账单时间:日账单格式为yyyy-MM-dd,最早可下载2016年1月1日开始的日账单;月账单格式为yyyy-MM,最早可下载2016年1月开始的月账单  |
+
+* 出参说明
+
+可前往[alipay.data.dataservice.bill.downloadurl.query](https://opendocs.alipay.com/apis/api_15/alipay.data.dataservice.bill.downloadurl.query)查看更加详细的参数说明。
+
+
+### 异步通知验签
+* API声明
+
+verifyNotify(parameters: map[string]string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| parameters | map[string]string | 是  |  异步通知中收到的待验签的所有参数 |
+
+---
+
+## 花呗分期 Huabei
+### 创建花呗分期交易
+* API声明
+
+create(subject: string, outTradeNo: string, totalAmount: string, buyerId: string, extendParams: HuabeiConfig)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| subject | string | 是  |  订单标题  |
+| outTradeNo | string | 是  | 商户订单号,64个字符以内,可包含字母、数字、下划线,需保证在商户端不重复  |
+| totalAmount | string | 是  | 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]  |
+| buyerId | string | 是 | 买家的支付宝用户ID,如果为空,会从传入的码值信息中获取买家ID  |
+| extendParams | HuabeiConfig | 是  |  花呗交易扩展参数  |
+
+HuabeiConfig对象说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| hbFqNum | string | 是  | 花呗分期数,仅支持传入3、6、12  |
+| hbFqSellerPercent | string | 是  | 代表卖家承担收费比例,商家承担手续费传入100,用户承担手续费传入0,仅支持传入100、0两种  |
+
+
+* 出参说明
+
+可前往[alipay.trade.create](https://docs.open.alipay.com/api_1/alipay.trade.create)查看更加详细的参数说明。
+
+--- 
+
+<a name="faceToFace"/>
+
+## 当面付 FaceToFace
+### 当面付交易付款
+* API声明
+
+pay(subject: string, outTradeNo: string, totalAmount: string, authCode: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| subject | string | 是  |  订单标题  |
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+| totalAmount | string | 是  |  订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]  |
+| authCode | string | 是  |  支付授权码,即买家的付款码数字  |
+
+* 出参说明
+
+可前往[alipay.trade.pay](https://docs.open.alipay.com/api_1/alipay.trade.pay)查看更加详细的参数说明。
+
+* 返佣说明
+
+ISV对接当面付产品需涉及返佣时,请先阅读[政策详情](https://opendocs.alipay.com/p/00fc2g)与[合作攻略](https://opendocs.alipay.com/open/300/taphxd)。
+
+
+**对接时必须在支付接口的extend_params参数中设置sys_service_provider_id返佣参数 ,参数值为签约返佣协议的PID**,示例代码如下(Java为例):
+
+```java
+Map<String, String> extendParams = new HashMap<>();
+extendParams.put("sys_service_provider_id", "<--请填写ISV签约协议的PID,比如:2088511833207846-->");
+AlipayTradePayResponse response = Factory.Payment.FaceToFace()
+	.agent("<--请填写商户应用授权后获取到的app_auth_token,比如:ca34ea491e7146cc87d25fca24c4cD11-->")
+	.optional("extend_params", extendParams)
+	.pay("iPhone6 16G", "64628156-f784-4572-9540-485b7c91b850", "0.01", "289821051157962364");
+```
+
+--- 
+### 交易预创建,生成正扫二维码
+* API声明
+
+precreate(subject: string, outTradeNo: string, totalAmount: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| subject | string | 是  |  订单标题  |
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+| totalAmount | string | 是  |  订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]  |
+
+* 出参说明
+
+可前往[alipay.trade.precreate](https://docs.open.alipay.com/api_1/alipay.trade.precreate)查看更加详细的参数说明。
+
+* 返佣说明
+
+ISV对接当面付产品需涉及返佣时,请先阅读[政策详情](https://opendocs.alipay.com/p/00fc2g)与[合作攻略](https://opendocs.alipay.com/open/300/taphxd)。
+
+
+**对接时必须在支付接口的extend_params参数中设置sys_service_provider_id返佣参数 ,参数值为签约返佣协议的PID**,示例代码如下(Java为例):
+
+```java
+Map<String, String> extendParams = new HashMap<>();
+extendParams.put("sys_service_provider_id", "<--请填写ISV签约协议的PID,比如:2088511833207846-->");
+AlipayTradePrecreateResponse response = Payment.FaceToFace()
+	.agent("<--请填写商户应用授权后获取到的app_auth_token,比如:ca34ea491e7146cc87d25fca24c4cD11-->")
+	.optional("extend_params", extendParams)
+	.preCreate("iPhone6 16G", "64628156-f784-4572-9540-485b7c91b850", "0.01");
+```
+
+--- 
+## 电脑网站 Page
+### 电脑网站支付
+* API声明
+
+pay(subject: string, outTradeNo: string, totalAmount: string, returnUrl: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| subject | string | 是  |  订单标题  |
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+| totalAmount | string | 是  |  订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]  |
+| returnUrl | string | 否  |  支付成功后同步跳转的页面,是一个http/https开头的字符串  |
+
+* 出参说明
+
+可前往[alipay.trade.page.pay](https://docs.open.alipay.com/api_1/alipay.trade.page.pay)查看更加详细的参数说明。
+
+--- 
+
+## 手机网站 Wap
+### 手机网站支付
+* API声明
+
+pay(subject: string, outTradeNo: string, totalAmount: string, quitUrl: string, returnUrl: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| subject | string | 是  |  订单标题  |
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+| totalAmount | string | 是  |  订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]  |
+| quitUrl | string | 是  |  用户付款中途退出返回商户网站的地址  |
+| returnUrl | string | 否 |  支付成功后同步跳转的页面,是一个http/https开头的字符串  |
+
+* 出参说明
+
+可前往[alipay.trade.wap.pay](https://docs.open.alipay.com/api_1/alipay.trade.wap.pay)查看更加详细的参数说明。
+
+--- 
+
+## App支付 App
+### 手机APP支付
+* API声明
+
+pay(subject: string, outTradeNo: string, totalAmount: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| subject | string | 是  |  订单标题  |
+| outTradeNo | string | 是  |  交易创建时传入的商户订单号  |
+| totalAmount | string | 是  |  订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]  |
+
+* 出参说明
+
+可前往[alipay.trade.app.pay](https://docs.open.alipay.com/api_1/alipay.trade.app.pay)查看更加详细的参数说明。
+
+---
+
+# 安全能力 Security
+## 文本风险识别 TextRisk
+### 检测内容风险
+* API声明
+
+detect(content: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| content | string | 是  |  待检测的文本内容 |
+
+* 出参说明
+
+可前往[alipay.security.risk.content.detect](https://docs.open.alipay.com/api_49/alipay.security.risk.content.detect)查看更加详细的参数说明。
+
+---
+
+# 辅助工具 Util
+
+
+## 加解密 AES
+### AES解密(常用于会员手机号解密)
+* API声明
+
+decrypt(cipherText: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| cipherText | string | 是  |  密文 |
+
+* 出参说明
+
+| 类型     |  说明 |
+|------|----|
+| string | 明文|
+
+### AES加密
+* API声明
+
+encrypt(plainText: string)
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| plainText | string | 是  |  明文 |
+
+* 出参说明
+
+| 类型     |  说明 |
+|------|----|
+| string | 密文|
+
+
+<a name="generic"/>
+
+## 通用接口 Generic
+### 执行OpenAPI调用
+* API声明
+
+execute(method: string, textParams: map[string]string, bizParams: map[string]any): AlipayOpenApiGenericResponse
+
+* 接口说明
+
+对于Alipay Easy SDK尚未支持的Open API,开发者可以通过调用此方法,通过自行拼装请求参数,完成大部分OpenAPI的调用,且调用时可按需设置所有可选参数。本接口同样会自动为您完成请求的加签和响应的验签工作。
+注:本接口不支持文件型字段的上传。
+
+* 入参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| method | string | 是  |  OpenAPI的名称,例如:alipay.trade.pay |
+| textParams | map[string]string | 否  |  **没有**包装在`biz_content`下的请求参数集合,例如`app_auth_token`等参数 |
+| bizParams | map[string]any | 否  |  被包装在`biz_content`下的请求参数集合 |
+
+* 出参说明
+
+| 字段名  | 类型     | 必填 | 说明 |
+|------|--------|----|----|
+| httpBody | string | 是  |  网关返回的HTTP响应,是一个JSON格式的字符串,开发者可按需从中解析出响应参数,响应示例:{"alipay_trade_create_response":{"code":"10000","msg":"Success","out_trade_no":"4ac9eac...","trade_no":"202003..."},"sign":"AUumfYgGSe7...02MA=="} |
+| code | string | 是  |  [网关返回码](https://docs.open.alipay.com/common/105806) |
+| msg | string | 是  |  [网关返回码描述](https://docs.open.alipay.com/common/105806) |
+| subCode | string | 否  |  业务返回码,参见具体的API接口文档 |
+| subMsg | string | 否  |  业务返回码描述,参见具体的API接口文档 |
+
+---
+
+
+
+

+ 168 - 0
vendor/alipaysdk/easysdk/CHANGELOG

@@ -0,0 +1,168 @@
+最新变更
+修复PHP7.4及其以上环境下,根证书解析报错的问题。
+
+Java版本
+2021-09-04 Version: 2.2.1
+1. 修复Okhttp Response没有主动关闭的问题。
+
+2021-01-18 Version: 2.2.0
+1. 增加sdkExecute功能。
+2. 增加fileExecute功能。
+3. 增加MultipleFactory多实例调用。
+
+2020-12-11 Version: 2.1.2
+1. 增加可设置ignoreSSL忽略SSL校验功能。
+
+2020-09-23 Version: 2.1.0
+1. 升级Tea版本,降低对OkHttp的特性依赖,提升环境兼容性。
+2. 提供Factory.getClient方法,用于调用SDK扩展包中的方法。
+
+2020-08-18 Version: 2.0.2
+1. 取消shade打包,便于排除冲突依赖。
+
+2020-07-06 Version: 2.0.1
+1. 私钥支持阿里云KMS。
+
+2020-06-09 Version: 2.0.0
+1. 支持可选业务参数的装配。
+2. 支持ISV代调用。
+3. 提供ResponseChecker辅助工具类,帮助校验响应是否成功。
+
+2020-05-06 Version: 1.2.1
+1. 手机网站支付、电脑网站支付接口支持设置return_url同步跳转地址。
+
+2020-04-15 Version: 1.2.0
+1. 扩展支持的支付类OpenAPI接口
+Factory.Payment.Common().queryRefund 查询退款信息
+Factory.Payment.Common().downloadBill 下载对账单
+Factory.Payment.FaceToFace().preCreate 交易预创建,生成正扫二维码
+Factory.Payment.Wap().pay 手机网站支付
+Factory.Payment.Page().pay 电脑网站支付
+Factory.Payment.App().pay 手机APP支付
+2. 支持支付的异步通知及其验签
+初始化Alipay Easy SDK的Config参数中新增notifyUrl参数,用户可以统一配置自己的回调地址。
+提供如下接口,完成支付类异步通知的验签。
+Factory.Payment.Common().verifyNotify
+3. AES加解密功能
+Factory.Util.AES().decrypt 支持会员手机号AES解密
+Factory.Util.AES().encrypt AES加密
+
+2020-03-31 Version: 1.1.3
+1. 去除SDK内置的logback.xml日志配置文件,以免意外覆盖开发者项目主体工程的日志配置。
+
+2020-03-27 Version: 1.1.2
+1. 修复返回的响应中存在数组类型字段时,反序列化成Response对象可能抛异常的问题。
+
+2020-03-16 Version: 1.1.1
+1. 修复证书路径不支持从CLASS_PATH中加载的问题。
+
+2020-03-10 Version: 1.1.0
+1. 添加兜底通用接口,支持通过自行拼接请求参数完成几乎所有OpenAPI的调用。
+
+2020-02-26 Version: 1.0.0
+1. 首次发布。
+
+
+
+C#版本
+2020-12-11 Version: 2.1.3
+1. 修复OpenAPI响应对象特殊情况下可能反序列化失败的异常。 
+
+2020-12-11 Version: 2.1.2
+1. 增加可设置ignoreSSL忽略SSL校验功能。
+
+2020-12-09 Version: 2.1.1
+1. 增加httpProxy功能。
+
+2020-09-23 Version: 2.1.0
+1. 升级Tea版本。
+2. 提供Factory.getClient方法,用于调用SDK扩展包中的方法。
+
+2020-08-18 Version: 2.0.1
+1. 修复证书模式下异步验签异常的问题。
+
+2020-06-09 Version: 2.0.0
+1. 支持可选业务参数的装配。
+2. 支持ISV代调用。
+3. 提供ResponseChecker辅助工具类,帮助校验响应是否成功。
+
+2020-05-06 Version: 1.2.1
+1. 手机网站支付、电脑网站支付接口支持设置return_url同步跳转地址。
+
+2020-04-15 Version: 1.2.0
+1. 扩展支持的支付类OpenAPI接口
+Factory.Payment.Common().QueryRefund 查询退款信息
+Factory.Payment.Common().DownloadBill 下载对账单
+Factory.Payment.FaceToFace().PreCreate 交易预创建,生成正扫二维码
+Factory.Payment.Wap().Pay 手机网站支付
+Factory.Payment.Page().Pay 电脑网站支付
+Factory.Payment.App().Pay 手机APP支付
+2. 支持支付的异步通知及其验签
+初始化Alipay Easy SDK的Config参数中新增notifyUrl参数,用户可以统一配置自己的回调地址。
+提供如下接口,完成支付类异步通知的验签。
+Factory.Payment.Common().verifyNotify
+3. AES加解密功能
+Factory.Util.AES().Decrypt 支持会员手机号AES解密
+Factory.Util.AES().Encrypt AES加密
+
+2020-03-10 Version: 1.1.0
+1. 添加兜底通用接口,支持通过自行拼接请求参数完成几乎所有OpenAPI的调用。
+
+2020-02-26 Version: 1.0.0
+1. 首次发布。
+
+
+
+PHP版本
+2021-01-18 Version: 2.2.0
+1. 增加sdkExecute功能。
+2. 增加fileExecute功能。
+3. 增加MultipleFactory多实例调用。
+
+
+2020-12-11 Version: 2.0.3
+1. 增加可设置ignoreSSL忽略SSL校验功能。
+
+2020-12-09 Version: 2.0.2
+1. 增加httpProxy功能。
+2. 修复agent不生效问题。
+
+2020-07-06 Version: 2.0.0
+1. 支持可选业务参数的装配。
+2. 支持ISV代调用。
+3. 提供ResponseChecker辅助工具类,帮助校验响应是否成功。
+
+2020-05-06 Version: 1.2.1
+1. 手机网站支付、电脑网站支付接口支持设置return_url同步跳转地址。
+
+2020-04-15 Version: 1.2.0
+1. 扩展支持的支付类OpenAPI接口
+Factory::payment()->common()->queryRefund 查询退款信息
+Factory::payment()->common()->downloadBill 下载对账单
+Factory::payment()->faceToFace()->preCreate 交易预创建,生成正扫二维码
+Factory::payment()->wap()->pay 手机网站支付
+Factory::payment()->page()->pay 电脑网站支付
+Factory::payment()->app()->pay 手机APP支付
+2. 支持支付的异步通知及其验签
+初始化Alipay Easy SDK的Config参数中新增notifyUrl参数,用户可以统一配置自己的回调地址。
+提供如下接口,完成支付类异步通知的验签。
+Factory::payment()->common()->verifyNotify
+3. AES加解密功能
+Factory::util()->aes()->decrypt 支持会员手机号AES解密
+Factory::util()->aes()->encrypt AES加密
+4. 重构api的respone模型,返回格式与Java、Net保持一致
+
+2020-03-27 Version: 1.1.0
+1. 修复大小写路径敏感问题。
+
+2020-03-20 Version: 1.0.0
+1. 首次发布。
+
+
+PHP版本
+2021-09-24 Version: 2.0.1
+1.修复PHP7.4及其以上环境下,根证书解析报错的问题。
+
+2021-01-18 Version: 1.0.0
+1. 首次发布。
+

+ 21 - 0
vendor/alipaysdk/easysdk/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Ant Small and Micro Financial Services Group Co., Ltd.
+
+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.

+ 203 - 0
vendor/alipaysdk/easysdk/README.md

@@ -0,0 +1,203 @@
+[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Falipay%2Falipay-easysdk.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Falipay%2Falipay-easysdk?ref=badge_shield)
+[![Maven Central](https://img.shields.io/maven-central/v/com.alipay.sdk/alipay-easysdk.svg)](https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk)
+[![NuGet](https://badge.fury.io/nu/AlipayEasySDK.svg)](https://badge.fury.io/nu/AlipayEasySDK)
+[![Packagist](https://poser.pugx.org/alipaysdk/easysdk/v/stable)](https://packagist.org/packages/alipaysdk/easysdk)
+
+欢迎使用 Alipay **Easy** SDK。
+
+打造**最好用**的支付宝开放平台**服务端SDK**,Alipay Easy SDK让您享受**极简编程**体验,快速访问支付宝开放平台开放的各项**核心能力**。
+
+## 设计理念
+不同于原有的Alipay SDK通用而全面的设计理念,Alipay Easy SDK对开放能力的API进行了更加贴近高频场景的精心设计与裁剪,简化了服务端调用方式,让调用API像使用语言内置的函数一样简便。
+
+同时,您也不必担心面向高频场景提炼的API可能无法完全契合自己的个性化场景,Alipay Easy SDK支持灵活的[动态扩展](#extension)方式,同样可以满足低频参数、低频API的使用需求。
+
+Alipay Easy SDK提供了与[能力地图](https://opendocs.alipay.com/mini/00am3f)相对应的代码组织结构,让开发者可以快速找到不同能力对应的API。
+
+Alipay Easy SDK主要目标是提升开发者在**服务端**集成支付宝开放平台开放的各类核心能力的效率。
+
+### 化繁为简
+
+| Alipay Easy SDK  | Alipay SDK                                                     |
+|------------------|----------------------------------------------------------------|
+| 极简代码风格,更贴近自然语言阅读习惯  | 传统代码风格,需要多行代码完成一个接口的调用 |
+| Factory单例全局任何地方都可直接引用 | AlipayClient实例需自行创建并在上下文中传递 |
+| API中只保留高频场景下的必备参数,同时提供低频可选参数的装配能力    | 没有区分高低频参数,单API最多可达数十个入参,对普通开发者的干扰较大 |
+
+
+* Alipay Easy SDK :smiley:
+
+```java
+Factory.Payment.Common().create("Iphone6 16G", "202003019443", "0.10", "2088002656718920");
+```
+
+* Alipay SDK :confused:
+
+```java
+AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
+
+AlipayTradeCreateModel model = new AlipayTradeCreateModel();
+model.setSubject("Iphone6 16G");
+model.setOutTradeNo("202003019443");
+model.setTotalAmount("0.10");
+model.setBuyerId("2088002656718920");
+...
+
+request.setBizModel(model);
+...
+
+alipayClient.execute(request);
+```
+
+### 如何切换
+* 无论是Alipay Easy SDK还是Alipay SDK,本质都是发送HTTP请求访问Open API网关,所以只需将原来通过Alipay SDK调用Open API的代码,替换为Alipay Easy SDK中对应API的调用即可。Alipay Easy SDK和Alipay SDK并无冲突,可以共存。
+
+* 如果您所需对接的开放平台能力,Alipay Easy SDK尚未提炼出API支持([已支持的API列表](#apiList)),您可以通过[通用接口](./APIDoc.md#generic)完成调用。
+
+* 我们会持续挖掘高频场景,不断丰富Alipay Easy SDK支持的API,让您在绝大多数常见场景下,都能享受Alipay Easy SDK带来的便捷。
+
+## 技术特点
+### 纯语言开发
+所有Alipay Easy SDK的具体编程语言的实现,均只采用纯编程语言进行开发,不引入任何重量级框架,减少潜在的框架冲突,让SDK可以自由集成进任何代码环境中。
+
+### 结构清晰
+我们按照能力类别和场景类别对API进行了归类,结构更加清晰,一目了然。
+> 更多信息请参见[API组织规范](#spec)。
+
+### 参数精简
+Alipay Easy SDK对每个API都精心打磨,剔除了`Open API`中不常用的可选参数,减少普通用户的无效选择,提升开发效率。
+
+<a name="extension"/>
+
+### 灵活扩展
+开发者可以通过Fluent风格的API链式调用,在为高频场景打造的API基础上,不断扩展自己的个性化场景需求。
+
+```java
+// 通过调用agent方法,扩展支持ISV代调用场景
+Factory.Payment.FaceToFace().agent("ca34ea491e7146cc87d25fca24c4cD11").preCreate(...)
+
+// 通过调用optional方法,扩展支持个性化可选参数
+Factory.Payment.FaceToFace().optional("extend_params", extendParams).preCreate(...)
+
+// 多种扩展可灵活搭配,不同扩展方法功能详细说明请前往各语言主页中的“快速开始-扩展调用”栏目中查看
+Factory.Payment.FaceToFace()
+	.agent(...)
+	.optionalArgs(...)
+	.auth(...)
+	.asyncNotify(...)
+	.preCreate(...)
+```
+
+### 测试/示例完备
+每个API都有对应的单元测试进行覆盖,良好的单元测试天生就是最好的示例。
+
+同时您也可以前往[API Doc](./APIDoc.md)查看每个API的详细使用说明。
+
+> 注:单元测试中使用到的私钥均进行了脱敏处理,会导致单元测试无法直接执行。您可以自行更改单元测试项目中的`TestAccout类`和`privateKey.json`文件中的相关账号与私钥配置后再执行单元测试。
+
+### 多语言
+Alipay Easy SDK基于阿里集团研发的[`Darabonba`](https://github.com/aliyun/darabonba)进行架构,通过DSL中间语言定义API模型,再基于DSL语言自动生成不同编程语言(Java、C#、PHP、TS等)实现的SDK,极大地提升了SDK能力的扩展效率和适用范围,同时也保证了相同的`Easy API`在不同语言生态中体验的一致性。
+
+API模型的DSL描述可以进入[tea](./tea)目录查看。
+
+### 快速集成
+各语言SDK均会在各自的中央仓库(Maven、NuGet、Composer、NPM etc.)中同步发布,让您使用各语言主流依赖管理工具即可一键安装集成SDK。
+
+## 语言支持情况
+Alipay Easy SDK首发暂只支持`Java`、`C#`、`PHP`编程语言,更多编程语言支持正在积极新增中,敬请期待。
+
+各语言具体的**使用说明**和**详细介绍**请点击如下链接进入各语言主目录查看。
+
+[Java](./java)
+
+[C#](./csharp)
+
+[PHP](./php)
+
+<a name="spec"/>
+
+## API组织规范
+
+在Alipay Easy SDK中,API的引用路径与能力地图的组织层次一致,遵循如下规范
+
+> Factory.能力类别.场景类别.接口方法名称( ... )
+
+比如,如果您想要使用[能力地图](https://opendocs.alipay.com/mini/00am3f)中`营销能力`下的`模板消息`场景中的`小程序发送模板消息`,只需按如下形式编写调用代码即可(不同编程语言的连接符号可能不同)。
+
+`Factory.Marketing.TemplateMessage().send( ... )`
+
+其中,接口方法名称通常是对其依赖的OpenAPI功能的一个最简概况,接口方法的出入参与OpenAPI中同名参数含义一致,可参照OpenAPI相关参数的使用说明。
+
+Alipay Easy SDK将致力于保持良好的API命名,以符合开发者的编程直觉。
+
+<a name="apiList"/>
+
+## 已支持的API列表
+
+| 能力类别      | 场景类别            | 接口方法名称                 | 调用的OpenAPI名称                                              |
+|-----------|-----------------|------------------------|-----------------------------------------------------------|
+| Base<br/>基础能力      | OAuth<br/>用户授权           | getToken<br/>获取授权访问令牌和用户user_id               | alipay\.system\.oauth\.token                              |
+| Base<br/>基础能力     | OAuth<br/>用户授权           | refreshToken<br/>刷新授权访问令牌           | alipay\.system\.oauth\.token                              |
+| Base<br/>基础能力      | Qrcode<br/>小程序二维码          | create<br/>创建小程序二维码                 | alipay\.open\.app\.qrcode\.create                         |
+| Base<br/>基础能力      | Image<br/>图片           | upload<br/>上传门店照片                 | alipay\.offline\.material\.image\.upload                  |
+| Base<br/>基础能力      | Video<br/>视频           | upload<br/>上传门店视频                 | alipay\.offline\.material\.image\.upload                  |
+| Member<br/>会员能力    | Identification<br/>支付宝身份认证  | init<br/>身份认证初始化                   | alipay\.user\.certify\.open\.initialize                   |
+| Member<br/>会员能力    | Identification<br/>支付宝身份认证  | certify<br/>生成认证链接                | alipay\.user\.certify\.open\.certify                      |
+| Member<br/>会员能力    | Identification<br/>支付宝身份认证  | query<br/>身份认证记录查询                  | alipay\.user\.certify\.open\.query                        |
+| Payment<br/>支付能力   | Common<br/>通用          | create<br/>创建交易                 | alipay\.trade\.create                                     |
+| Payment<br/>支付能力   | Common<br/>通用          | query<br/>查询交易                  | alipay\.trade\.query                                      |
+| Payment<br/>支付能力   | Common<br/>通用          | refund<br/>交易退款                 | alipay\.trade\.refund                                     |
+| Payment<br/>支付能力   | Common<br/>通用          | close<br/>关闭交易                  | alipay\.trade\.close                                      |
+| Payment<br/>支付能力   | Common<br/>通用          | cancel<br/>撤销交易                 | alipay\.trade\.cancel                                     |
+| Payment<br/>支付能力   | Common<br/>通用          | queryRefund<br/>交易退款查询            | alipay\.trade\.fastpay\.refund\.query                     |
+| Payment<br/>支付能力   | Common<br/>通用          | downloadBill<br/>查询对账单下载地址           | alipay\.data\.dataservice\.bill\.downloadurl\.query       |
+| Payment<br/>支付能力   | Common<br/>通用          | verifyNotify<br/>异步通知验签           | -                                                         |
+| Payment<br/>支付能力   | Huabei<br/>花呗分期          | create<br/>创建花呗分期交易                 | alipay\.trade\.create                                     |
+| Payment<br/>支付能力   | FaceToFace<br/>当面付      | pay<br/>扫用户出示的付款码,完成付款                    | alipay\.trade\.pay                                        |
+| Payment<br/>支付能力   | FaceToFace<br/>当面付      | precreate<br/>生成交易付款码,待用户扫码付款              | alipay\.trade\.precreate                                  |
+| Payment<br/>支付能力   | App<br/>手机APP             | pay<br/>生成订单串,再使用客户端 SDK 凭此串唤起支付宝收银台                    | alipay\.trade\.app\.pay                                   |
+| Payment<br/>支付能力   | Page<br/>电脑网站            | pay<br/>生成交易表单,渲染后自动跳转支付宝网站引导用户完成支付                    | alipay\.trade\.page\.pay                                  |
+| Payment<br/>支付能力   | Wap<br/>手机网站             | pay<br/>生成交易表单,渲染后自动跳转支付宝网站引导用户完成支付                    | alipay\.trade\.wap\.pay                                   |
+| Security<br/>安全能力  | TextRisk<br/>文本内容安全        | detect<br/>检测内容风险                 | alipay\.security\.risk\.content\.detect                   |
+| Marketing<br/>营销能力 | Pass<br/>支付宝卡包            | createTemplate<br/>卡券模板创建         | alipay\.pass\.template\.add                               |
+| Marketing<br/>营销能力 | Pass<br/>支付宝卡包            | updateTemplate<br/>卡券模板更新         | alipay\.pass\.template\.update                            |
+| Marketing<br/>营销能力 | Pass<br/>支付宝卡包            | addInstance<br/>卡券实例发放            | alipay\.pass\.instance\.add                               |
+| Marketing<br/>营销能力 | Pass<br/>支付宝卡包            | updateInstance<br/>卡券实例更新         | alipay\.pass\.instance\.update                            |
+| Marketing<br/>营销能力 | TemplateMessage<br/>小程序模板消息 | send <br/>发送模板消息| alipay\.open\.app\.mini\.templatemessage\.send            |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | createImageTextContent<br/>创建图文消息内容 | alipay\.open\.public\.message\.content\.create            |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | modifyImageTextContent<br/>更新图文消息内容 | alipay\.open\.public\.message\.content\.modify            |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | sendText<br/>群发本文消息               | alipay\.open\.public\.message\.total\.send                |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | sendImageText<br/>群发图文消息          | alipay\.open\.public\.message\.total\.send                |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | sendSingleMessage<br/>单发模板消息      | alipay\.open\.public\.message\.single\.send               |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | recallMessage<br/>生活号消息撤回          | alipay\.open\.public\.life\.msg\.recall                   |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | setIndustry<br/>模板消息行业设置            | alipay\.open\.public\.template\.message\.industry\.modify |
+| Marketing<br/>营销能力 | OpenLife<br/>生活号        | getIndustry<br/>生活号查询行业设置            | alipay\.open\.public\.setting\.category\.query            |
+| Util<br/>辅助工具      | AES<br/>加解密             | decrypt<br/>解密,常用于会员手机号解密                | -                                                         |
+| Util<br/>辅助工具      | AES<br/>加解密             | encrypt<br/>加密                | -                                                         |
+| Util<br/>辅助工具      | Generic<br/>通用接口         | execute<br/>自行拼接参数,执行OpenAPI调用                | -                                                         |
+
+> 注:更多高频场景的API持续更新中,敬请期待。
+
+您还可以前往[API Doc](./APIDoc.md)查看每个API的详细使用说明。
+
+# 变更日志
+每个版本的详细更改记录在[变更日志](./CHANGELOG)中。
+
+> 版本号最末一位修订号的增加(比如从`1.0.0`升级为`1.0.1`),意味着SDK的功能没有发生任何变化,仅仅是修复了部分Bug。该类升级可能不会记录在变更日志中。
+
+> 版本号中间一位次版本号的增加(比如从`1.0.0`升级为`1.1.0`),意味着SDK的功能发生了可向下兼容的新增或修改。
+
+> 版本号首位主版本号的增加(比如从`1.0.0`升级为`2.0.0`),意味着SDK的功能可能发生了不向下兼容的较大调整,升级主版本号后请注意做好相关的回归测试工作。
+
+# 相关
+* [支付宝开放平台](https://open.alipay.com/platform/home.htm)
+* [支付宝开放平台文档中心](https://docs.open.alipay.com/catalog)
+* [最新源码](https://github.com/alipay/alipay-easysdk)
+
+# 许可证
+[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Falipay%2Falipay-easysdk.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Falipay%2Falipay-easysdk?ref=badge_large)
+
+# 交流与技术支持
+不管您在使用Alipay Easy SDK的过程中遇到任何问题,欢迎前往 [支付宝开放社区](https://forum.alipay.com/mini-app/channel/1100001)  发帖与支付宝工作人员和其他开发者一起交流。
+
+注:为了提高开发者问题的响应时效,github本身的issue功能已关闭,支付宝开放社区中发帖的问题,通常会在2小时内响应。

+ 56 - 0
vendor/alipaysdk/easysdk/composer.json

@@ -0,0 +1,56 @@
+{
+	"name":"alipaysdk/easysdk",
+	"description":"支付宝官方 Alipay Easy SDK",
+	"type":"library",
+	"version":"2.2.1",
+	"authors":[
+		{
+			"name":"junying.wjy",
+			"email":"junying.wjy@antfin.com"
+		}
+	],
+	"autoload":{
+		"psr-4":{
+			"Alipay\\EasySDK\\":"php/src/"
+		}
+	},
+	"autoload-dev": {
+		"psr-4": {
+			"Alipay\\EasySDK\\Test\\": "php/test/"
+		}
+	},
+	"license":"Apache-2.0",
+	"minimum-stability":"dev",
+	"require":{
+		"php": ">=7.0",
+		"ext-curl":"*",
+		"ext-ctype":"*",
+		"ext-dom":"*",
+		"ext-fileinfo": "*",
+		"ext-json":"*",
+		"ext-libxml":"*",
+		"ext-simplexml":"*",
+		"ext-mbstring":"*",
+		"ext-openssl":"*",
+		"pimple/pimple": "^3.0",
+		"xin/container":"^2.0.1",
+		"guzzlehttp/guzzle":">=6.3",
+		"psr/log": "^1.1",
+		"ext-xmlwriter": "*",
+		"songshenzong/support": "^2.0",
+		"danielstjules/stringy": "^3.1",
+		"mtdowling/jmespath.php": "^2.4",
+		"adbario/php-dot-notation": "^2.2",
+		"alibabacloud/tea": "^3.1",
+		"alibabacloud/tea-fileform": "^0.3.2"
+    },
+	"require-dev": {
+		"phpunit/phpunit": "^7.5"
+	},
+	"repositories":{
+		"packagist":{
+			"type":"composer",
+			"url":"https://mirrors.aliyun.com/composer/"
+		}
+	}
+}

+ 23 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK.sln

@@ -0,0 +1,23 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AlipayEasySDK", "AlipayEasySDK\AlipayEasySDK.csproj", "{14B089B9-C61C-46E6-BD93-5DFBBB77E2B2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTest", "UnitTest\UnitTest.csproj", "{79DE080D-34C1-485E-996D-435A8515766D}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{14B089B9-C61C-46E6-BD93-5DFBBB77E2B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{14B089B9-C61C-46E6-BD93-5DFBBB77E2B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{14B089B9-C61C-46E6-BD93-5DFBBB77E2B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{14B089B9-C61C-46E6-BD93-5DFBBB77E2B2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{79DE080D-34C1-485E-996D-435A8515766D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{79DE080D-34C1-485E-996D-435A8515766D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{79DE080D-34C1-485E-996D-435A8515766D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{79DE080D-34C1-485E-996D-435A8515766D}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+EndGlobal

+ 32 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/AlipayEasySDK.csproj

@@ -0,0 +1,32 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
+    <PackOnBuild>true</PackOnBuild>
+    <PackageVersion>2.1.3</PackageVersion>
+    <Authors>antopen</Authors>
+    <NeutralLanguage>zh</NeutralLanguage>
+    <PackageLicenseUrl>https://github.com/alipay/alipay-easysdk/blob/master/LICENSE</PackageLicenseUrl>
+    <Description>Alipay Easy SDK for .NET allows you to enjoy a minimalist programming experience and quickly access the various high-frequency capabilities of the Alipay Open Platform.</Description>
+    <PackageId>AlipayEasySDK</PackageId>
+    <Owners>antopen</Owners>
+    <PackageProjectUrl>https://github.com/alipay/alipay-easysdk/tree/master/csharp</PackageProjectUrl>
+    <Summary>Alipay Easy SDK for .NET allows you to enjoy a minimalist programming experience and quickly access the various high-frequency capabilities of the Alipay Open Platform.</Summary>
+    <Title>Alipay Easy SDK</Title>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType></DebugType>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Remove="Class1.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Factory\" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="AlipayEasySDK.Kernel" Version="1.0.6" />
+  </ItemGroup>
+</Project>

+ 324 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Image/Client.cs

@@ -0,0 +1,324 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Base.Image.Models;
+
+namespace Alipay.EasySDK.Base.Image
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayOfflineMaterialImageUploadResponse Upload(string imageName, string imageFilePath)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 100000},
+                {"readTimeout", 100000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.offline.material.image.upload"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"image_type", "jpg"},
+                        {"image_name", imageName},
+                    };
+                    Dictionary<string, string> fileParams = new Dictionary<string, string>
+                    {
+                        {"image_content", imageFilePath},
+                    };
+                    string boundary = this._kernel.GetRandomBoundary();
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", this._kernel.ConcatStr("multipart/form-data;charset=utf-8;boundary=", boundary)},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams
+                    ));
+                    request_.Body = this._kernel.ToMultipartRequestBody(textParams, fileParams, boundary);
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.offline.material.image.upload");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOfflineMaterialImageUploadResponse> UploadAsync(string imageName, string imageFilePath)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 100000},
+                {"readTimeout", 100000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.offline.material.image.upload"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"image_type", "jpg"},
+                        {"image_name", imageName},
+                    };
+                    Dictionary<string, string> fileParams = new Dictionary<string, string>
+                    {
+                        {"image_content", imageFilePath},
+                    };
+                    string boundary = this._kernel.GetRandomBoundary();
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", this._kernel.ConcatStr("multipart/form-data;charset=utf-8;boundary=", boundary)},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams
+                    ));
+                    request_.Body = this._kernel.ToMultipartRequestBody(textParams, fileParams, boundary);
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.offline.material.image.upload");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Image/Models/AlipayOfflineMaterialImageUploadResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Base.Image.Models
+{
+    public class AlipayOfflineMaterialImageUploadResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("image_id")]
+        [Validation(Required=true)]
+        public string ImageId { get; set; }
+
+        [NameInMap("image_url")]
+        [Validation(Required=true)]
+        public string ImageUrl { get; set; }
+
+    }
+
+}

+ 528 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/OAuth/Client.cs

@@ -0,0 +1,528 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Base.OAuth.Models;
+
+namespace Alipay.EasySDK.Base.OAuth
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipaySystemOauthTokenResponse GetToken(string code)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.system.oauth.token"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"grant_type", "authorization_code"},
+                        {"code", code},
+                    };
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.system.oauth.token");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipaySystemOauthTokenResponse> GetTokenAsync(string code)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.system.oauth.token"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"grant_type", "authorization_code"},
+                        {"code", code},
+                    };
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.system.oauth.token");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipaySystemOauthTokenResponse RefreshToken(string refreshToken)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.system.oauth.token"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"grant_type", "refresh_token"},
+                        {"refresh_token", refreshToken},
+                    };
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.system.oauth.token");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipaySystemOauthTokenResponse> RefreshTokenAsync(string refreshToken)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.system.oauth.token"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"grant_type", "refresh_token"},
+                        {"refresh_token", refreshToken},
+                    };
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.system.oauth.token");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipaySystemOauthTokenResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 57 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/OAuth/Models/AlipaySystemOauthTokenResponse.cs

@@ -0,0 +1,57 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Base.OAuth.Models
+{
+    public class AlipaySystemOauthTokenResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("user_id")]
+        [Validation(Required=true)]
+        public string UserId { get; set; }
+
+        [NameInMap("access_token")]
+        [Validation(Required=true)]
+        public string AccessToken { get; set; }
+
+        [NameInMap("expires_in")]
+        [Validation(Required=true)]
+        public long ExpiresIn { get; set; }
+
+        [NameInMap("refresh_token")]
+        [Validation(Required=true)]
+        public string RefreshToken { get; set; }
+
+        [NameInMap("re_expires_in")]
+        [Validation(Required=true)]
+        public long ReExpiresIn { get; set; }
+
+    }
+
+}

+ 318 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Qrcode/Client.cs

@@ -0,0 +1,318 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Base.Qrcode.Models;
+
+namespace Alipay.EasySDK.Base.Qrcode
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayOpenAppQrcodeCreateResponse Create(string urlParam, string queryParam, string describe)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.app.qrcode.create"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"url_param", urlParam},
+                        {"query_param", queryParam},
+                        {"describe", describe},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.app.qrcode.create");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppQrcodeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppQrcodeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenAppQrcodeCreateResponse> CreateAsync(string urlParam, string queryParam, string describe)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.app.qrcode.create"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"url_param", urlParam},
+                        {"query_param", queryParam},
+                        {"describe", describe},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.app.qrcode.create");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppQrcodeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppQrcodeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 41 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Qrcode/Models/AlipayOpenAppQrcodeCreateResponse.cs

@@ -0,0 +1,41 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Base.Qrcode.Models
+{
+    public class AlipayOpenAppQrcodeCreateResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("qr_code_url")]
+        [Validation(Required=true)]
+        public string QrCodeUrl { get; set; }
+
+    }
+
+}

+ 324 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Video/Client.cs

@@ -0,0 +1,324 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Base.Video.Models;
+
+namespace Alipay.EasySDK.Base.Video
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayOfflineMaterialImageUploadResponse Upload(string videoName, string videoFilePath)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 100000},
+                {"readTimeout", 100000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.offline.material.image.upload"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"image_type", "mp4"},
+                        {"image_name", videoName},
+                    };
+                    Dictionary<string, string> fileParams = new Dictionary<string, string>
+                    {
+                        {"image_content", videoFilePath},
+                    };
+                    string boundary = this._kernel.GetRandomBoundary();
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", this._kernel.ConcatStr("multipart/form-data;charset=utf-8;boundary=", boundary)},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams
+                    ));
+                    request_.Body = this._kernel.ToMultipartRequestBody(textParams, fileParams, boundary);
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.offline.material.image.upload");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOfflineMaterialImageUploadResponse> UploadAsync(string videoName, string videoFilePath)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 100000},
+                {"readTimeout", 100000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.offline.material.image.upload"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>
+                    {
+                        {"image_type", "mp4"},
+                        {"image_name", videoName},
+                    };
+                    Dictionary<string, string> fileParams = new Dictionary<string, string>
+                    {
+                        {"image_content", videoFilePath},
+                    };
+                    string boundary = this._kernel.GetRandomBoundary();
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", this._kernel.ConcatStr("multipart/form-data;charset=utf-8;boundary=", boundary)},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams
+                    ));
+                    request_.Body = this._kernel.ToMultipartRequestBody(textParams, fileParams, boundary);
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.offline.material.image.upload");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOfflineMaterialImageUploadResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Base/Video/Models/AlipayOfflineMaterialImageUploadResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Base.Video.Models
+{
+    public class AlipayOfflineMaterialImageUploadResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("image_id")]
+        [Validation(Required=true)]
+        public string ImageId { get; set; }
+
+        [NameInMap("image_url")]
+        [Validation(Required=true)]
+        public string ImageUrl { get; set; }
+
+    }
+
+}

+ 244 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Factory/Factory.cs

@@ -0,0 +1,244 @@
+using System;
+using Alipay.EasySDK.Kernel;
+using System.Reflection;
+
+namespace Alipay.EasySDK.Factory
+{
+    /// <summary>
+    /// 客户端工厂,用于快速配置和访问各种场景下的API Client
+    ///
+    /// 注:该Factory获取的Client不可储存重复使用,请每次均通过Factory完成调用
+    /// </summary>
+    public static class Factory
+    {
+        public const string SDK_VERSION = "alipay-easysdk-net-2.1.0";
+
+        /// <summary>
+        /// 将一些初始化耗时较多的信息缓存在上下文中
+        /// </summary>
+        private static Context context;
+
+        /// <summary>
+        /// 设置客户端参数,只需设置一次,即可反复使用各种场景下的API Client
+        /// </summary>
+        /// <param name="options">客户端参数对象</param>
+        public static void SetOptions(Config options)
+        {
+            context = new Context(options, SDK_VERSION);
+        }
+
+        /// <summary>
+        /// 获取调用OpenAPI所需的客户端实例
+        /// 本方法用于调用SDK扩展包中的API Client下的方法
+        /// 
+        /// 注:返回的实例不可重复使用,只可用于单次调用
+        /// </summary>
+        /// <typeparam name="T">泛型参数</typeparam>
+        /// <param name="client">API Client的类型对象</param>
+        /// <returns>client实例,用于发起单次调用</returns>
+        public static T GetClient<T>()
+        {
+            Type type = typeof(T);
+            ConstructorInfo constructor = type.GetConstructor(new Type[] { typeof(Client) });
+            context.SdkVersion = GetSdkVersion(type);
+            return (T)constructor.Invoke(new object[] { new Client(context) });
+        }
+
+        private static string GetSdkVersion(Type client)
+        {
+            return context.SdkVersion + "-" + client.FullName
+                    .Replace("EasySDK.", "")
+                    .Replace(".Client", "")
+                    .Replace(".", "-");
+        }
+
+        /// <summary>
+        /// 基础能力相关
+        /// </summary>
+        public static class Base
+        {
+            /// <summary>
+            /// 获取图片相关API Client
+            /// </summary>
+            /// <returns>图片相关API Client</returns>
+            public static EasySDK.Base.Image.Client Image()
+            {
+                return new EasySDK.Base.Image.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取视频相关API Client
+            /// </summary>
+            /// <returns>视频相关API Client</returns>
+            public static EasySDK.Base.Video.Client Video()
+            {
+                return new EasySDK.Base.Video.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取OAuth认证相关API Client
+            /// </summary>
+            /// <returns>OAuth认证相关API Client</returns>
+            public static EasySDK.Base.OAuth.Client OAuth()
+            {
+                return new EasySDK.Base.OAuth.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取小程序二维码相关API Client
+            /// </summary>
+            /// <returns>小程序二维码相关API Client</returns>
+            public static EasySDK.Base.Qrcode.Client Qrcode()
+            {
+                return new EasySDK.Base.Qrcode.Client(new Client(context));
+            }
+        }
+
+        /// <summary>
+        /// 营销能力相关
+        /// </summary>
+        public static class Marketing
+        {
+            /// <summary>
+            /// 获取生活号相关API Client
+            /// </summary>
+            /// <returns>生活号相关API Client</returns>
+            public static EasySDK.Marketing.OpenLife.Client OpenLife()
+            {
+                return new EasySDK.Marketing.OpenLife.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取支付宝卡包相关API Client
+            /// </summary>
+            /// <returns>支付宝卡包相关API Client</returns>
+            public static EasySDK.Marketing.Pass.Client Pass()
+            {
+                return new EasySDK.Marketing.Pass.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取小程序模板消息相关API Client
+            /// </summary>
+            /// <returns>小程序模板消息相关API Client</returns>
+            public static EasySDK.Marketing.TemplateMessage.Client TemplateMessage()
+            {
+                return new EasySDK.Marketing.TemplateMessage.Client(new Client(context));
+            }
+        }
+
+        /// <summary>
+        /// 会员能力相关
+        /// </summary>
+        public static class Member
+        {
+            /// <summary>
+            /// 获取支付宝身份认证相关API Client
+            /// </summary>
+            /// <returns>支付宝身份认证相关API Client</returns>
+            public static EasySDK.Member.Identification.Client Identification()
+            {
+                return new EasySDK.Member.Identification.Client(new Client(context));
+            }
+        }
+
+        /// <summary>
+        /// 支付能力相关
+        /// </summary>
+        public static class Payment
+        {
+            /// <summary>
+            /// 获取支付通用API Client
+            /// </summary>
+            /// <returns>支付通用API Client</returns>
+            public static EasySDK.Payment.Common.Client Common()
+            {
+                return new EasySDK.Payment.Common.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取当面付API Client
+            /// </summary>
+            /// <returns>当面付API Client</returns>
+            public static EasySDK.Payment.FaceToFace.Client FaceToFace()
+            {
+                return new EasySDK.Payment.FaceToFace.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取花呗API Client
+            /// </summary>
+            /// <returns>花呗API Client</returns>
+            public static EasySDK.Payment.Huabei.Client Huabei()
+            {
+                return new EasySDK.Payment.Huabei.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取手机APP支付API Client
+            /// </summary>
+            /// <returns>手机APP支付API Client</returns>
+            public static EasySDK.Payment.App.Client App()
+            {
+                return new EasySDK.Payment.App.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取电脑网站支付API Client
+            /// </summary>
+            /// <returns>电脑网站支付API</returns>
+            public static EasySDK.Payment.Page.Client Page()
+            {
+                return new EasySDK.Payment.Page.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取手机网站支付API Client
+            /// </summary>
+            /// <returns>手机网站支付API</returns>
+            public static EasySDK.Payment.Wap.Client Wap()
+            {
+                return new EasySDK.Payment.Wap.Client(new Client(context));
+            }
+        }
+
+        /// <summary>
+        /// 安全能力相关
+        /// </summary>
+        public static class Security
+        {
+            /// <summary>
+            /// 获取文本风险识别相关API Client
+            /// </summary>
+            /// <returns>文本风险识别相关API Client</returns>
+            public static EasySDK.Security.TextRisk.Client TextRisk()
+            {
+                return new EasySDK.Security.TextRisk.Client(new Client(context));
+            }
+        }
+
+        /// <summary>
+        /// 辅助工具
+        /// </summary>
+        public static class Util
+        {
+            /// <summary>
+            /// 获取OpenAPI通用接口,可通过自行拼装参数,调用几乎所有OpenAPI
+            /// </summary>
+            /// <returns>OpenAPI通用接口</returns>
+            public static EasySDK.Util.Generic.Client Generic()
+            {
+                return new EasySDK.Util.Generic.Client(new Client(context));
+            }
+
+            /// <summary>
+            /// 获取AES128加解密相关API Client,常用于会员手机号的解密
+            /// </summary>
+            /// <returns>AES128加解密相关API Client</returns>
+            public static EasySDK.Util.AES.Client AES()
+            {
+                return new EasySDK.Util.AES.Client(new Client(context));
+            }
+        }
+    }
+}

+ 1832 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Client.cs

@@ -0,0 +1,1832 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Marketing.OpenLife.Models;
+
+namespace Alipay.EasySDK.Marketing.OpenLife
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayOpenPublicMessageContentCreateResponse CreateImageTextContent(string title, string cover, string content, string contentComment, string ctype, string benefit, string extTags, string loginIds)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.content.create"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"title", title},
+                        {"cover", cover},
+                        {"content", content},
+                        {"could_comment", contentComment},
+                        {"ctype", ctype},
+                        {"benefit", benefit},
+                        {"ext_tags", extTags},
+                        {"login_ids", loginIds},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.message.content.create");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicMessageContentCreateResponse> CreateImageTextContentAsync(string title, string cover, string content, string contentComment, string ctype, string benefit, string extTags, string loginIds)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.content.create"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"title", title},
+                        {"cover", cover},
+                        {"content", content},
+                        {"could_comment", contentComment},
+                        {"ctype", ctype},
+                        {"benefit", benefit},
+                        {"ext_tags", extTags},
+                        {"login_ids", loginIds},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.message.content.create");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayOpenPublicMessageContentModifyResponse ModifyImageTextContent(string contentId, string title, string cover, string content, string couldComment, string ctype, string benefit, string extTags, string loginIds)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.content.modify"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"content_id", contentId},
+                        {"title", title},
+                        {"cover", cover},
+                        {"content", content},
+                        {"could_comment", couldComment},
+                        {"ctype", ctype},
+                        {"benefit", benefit},
+                        {"ext_tags", extTags},
+                        {"login_ids", loginIds},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.message.content.modify");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicMessageContentModifyResponse> ModifyImageTextContentAsync(string contentId, string title, string cover, string content, string couldComment, string ctype, string benefit, string extTags, string loginIds)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.content.modify"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"content_id", contentId},
+                        {"title", title},
+                        {"cover", cover},
+                        {"content", content},
+                        {"could_comment", couldComment},
+                        {"ctype", ctype},
+                        {"benefit", benefit},
+                        {"ext_tags", extTags},
+                        {"login_ids", loginIds},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.message.content.modify");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageContentModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayOpenPublicMessageTotalSendResponse SendText(string text)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.total.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Text textObj = new Text
+                    {
+                        Title = "",
+                        Content = text,
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"msg_type", "text"},
+                        {"text", textObj},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.message.total.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicMessageTotalSendResponse> SendTextAsync(string text)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.total.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Text textObj = new Text
+                    {
+                        Title = "",
+                        Content = text,
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"msg_type", "text"},
+                        {"text", textObj},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.message.total.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayOpenPublicMessageTotalSendResponse SendImageText(List<Article> articles)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.total.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"msg_type", "image-text"},
+                        {"articles", articles},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.message.total.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicMessageTotalSendResponse> SendImageTextAsync(List<Article> articles)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.total.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"msg_type", "image-text"},
+                        {"articles", articles},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.message.total.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageTotalSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayOpenPublicMessageSingleSendResponse SendSingleMessage(string toUserId, Template template)
+        {
+            template.Validate();
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.single.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"to_user_id", toUserId},
+                        {"template", template},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.message.single.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageSingleSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageSingleSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicMessageSingleSendResponse> SendSingleMessageAsync(string toUserId, Template template)
+        {
+            template.Validate();
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.message.single.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"to_user_id", toUserId},
+                        {"template", template},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.message.single.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageSingleSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicMessageSingleSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayOpenPublicLifeMsgRecallResponse RecallMessage(string messageId)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.life.msg.recall"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"message_id", messageId},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.life.msg.recall");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicLifeMsgRecallResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicLifeMsgRecallResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicLifeMsgRecallResponse> RecallMessageAsync(string messageId)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.life.msg.recall"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"message_id", messageId},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.life.msg.recall");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicLifeMsgRecallResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicLifeMsgRecallResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayOpenPublicTemplateMessageIndustryModifyResponse SetIndustry(string primaryIndustryCode, string primaryIndustryName, string secondaryIndustryCode, string secondaryIndustryName)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.template.message.industry.modify"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"primary_industry_code", primaryIndustryCode},
+                        {"primary_industry_name", primaryIndustryName},
+                        {"secondary_industry_code", secondaryIndustryCode},
+                        {"secondary_industry_name", secondaryIndustryName},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.template.message.industry.modify");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicTemplateMessageIndustryModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicTemplateMessageIndustryModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicTemplateMessageIndustryModifyResponse> SetIndustryAsync(string primaryIndustryCode, string primaryIndustryName, string secondaryIndustryCode, string secondaryIndustryName)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.template.message.industry.modify"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"primary_industry_code", primaryIndustryCode},
+                        {"primary_industry_name", primaryIndustryName},
+                        {"secondary_industry_code", secondaryIndustryCode},
+                        {"secondary_industry_name", secondaryIndustryName},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.template.message.industry.modify");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicTemplateMessageIndustryModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicTemplateMessageIndustryModifyResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayOpenPublicSettingCategoryQueryResponse GetIndustry()
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.setting.category.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.public.setting.category.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicSettingCategoryQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicSettingCategoryQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenPublicSettingCategoryQueryResponse> GetIndustryAsync()
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.public.setting.category.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>(){};
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.public.setting.category.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicSettingCategoryQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenPublicSettingCategoryQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 37 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicLifeMsgRecallResponse.cs

@@ -0,0 +1,37 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class AlipayOpenPublicLifeMsgRecallResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageContentCreateResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class AlipayOpenPublicMessageContentCreateResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("content_id")]
+        [Validation(Required=true)]
+        public string ContentId { get; set; }
+
+        [NameInMap("content_url")]
+        [Validation(Required=true)]
+        public string ContentUrl { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageContentModifyResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class AlipayOpenPublicMessageContentModifyResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("content_id")]
+        [Validation(Required=true)]
+        public string ContentId { get; set; }
+
+        [NameInMap("content_url")]
+        [Validation(Required=true)]
+        public string ContentUrl { get; set; }
+
+    }
+
+}

+ 37 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageSingleSendResponse.cs

@@ -0,0 +1,37 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class AlipayOpenPublicMessageSingleSendResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+    }
+
+}

+ 41 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicMessageTotalSendResponse.cs

@@ -0,0 +1,41 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class AlipayOpenPublicMessageTotalSendResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("message_id")]
+        [Validation(Required=true)]
+        public string MessageId { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicSettingCategoryQueryResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class AlipayOpenPublicSettingCategoryQueryResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("primary_category")]
+        [Validation(Required=true)]
+        public string PrimaryCategory { get; set; }
+
+        [NameInMap("secondary_category")]
+        [Validation(Required=true)]
+        public string SecondaryCategory { get; set; }
+
+    }
+
+}

+ 37 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/AlipayOpenPublicTemplateMessageIndustryModifyResponse.cs

@@ -0,0 +1,37 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class AlipayOpenPublicTemplateMessageIndustryModifyResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+    }
+
+}

+ 34 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Article.cs

@@ -0,0 +1,34 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class Article : TeaModel {
+        [NameInMap("title")]
+        [Validation(Required=false)]
+        public string Title { get; set; }
+
+        [NameInMap("desc")]
+        [Validation(Required=true)]
+        public string Desc { get; set; }
+
+        [NameInMap("image_url")]
+        [Validation(Required=false)]
+        public string ImageUrl { get; set; }
+
+        [NameInMap("url")]
+        [Validation(Required=true)]
+        public string Url { get; set; }
+
+        [NameInMap("action_name")]
+        [Validation(Required=false)]
+        public string ActionName { get; set; }
+
+    }
+
+}

+ 42 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Context.cs

@@ -0,0 +1,42 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class Context : TeaModel {
+        [NameInMap("head_color")]
+        [Validation(Required=true)]
+        public string HeadColor { get; set; }
+
+        [NameInMap("url")]
+        [Validation(Required=true)]
+        public string Url { get; set; }
+
+        [NameInMap("action_name")]
+        [Validation(Required=true)]
+        public string ActionName { get; set; }
+
+        [NameInMap("keyword1")]
+        [Validation(Required=false)]
+        public Keyword Keyword1 { get; set; }
+
+        [NameInMap("keyword2")]
+        [Validation(Required=false)]
+        public Keyword Keyword2 { get; set; }
+
+        [NameInMap("first")]
+        [Validation(Required=false)]
+        public Keyword First { get; set; }
+
+        [NameInMap("remark")]
+        [Validation(Required=false)]
+        public Keyword Remark { get; set; }
+
+    }
+
+}

+ 22 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Keyword.cs

@@ -0,0 +1,22 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class Keyword : TeaModel {
+        [NameInMap("color")]
+        [Validation(Required=true)]
+        public string Color { get; set; }
+
+        [NameInMap("value")]
+        [Validation(Required=true)]
+        public string Value { get; set; }
+
+    }
+
+}

+ 22 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Template.cs

@@ -0,0 +1,22 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class Template : TeaModel {
+        [NameInMap("template_id")]
+        [Validation(Required=true)]
+        public string TemplateId { get; set; }
+
+        [NameInMap("context")]
+        [Validation(Required=true)]
+        public Context Context { get; set; }
+
+    }
+
+}

+ 22 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/OpenLife/Models/Text.cs

@@ -0,0 +1,22 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.OpenLife.Models
+{
+    public class Text : TeaModel {
+        [NameInMap("title")]
+        [Validation(Required=true)]
+        public string Title { get; set; }
+
+        [NameInMap("content")]
+        [Validation(Required=true)]
+        public string Content { get; set; }
+
+    }
+
+}

+ 964 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Client.cs

@@ -0,0 +1,964 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Marketing.Pass.Models;
+
+namespace Alipay.EasySDK.Marketing.Pass
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayPassTemplateAddResponse CreateTemplate(string uniqueId, string tplContent)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.template.add"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"unique_id", uniqueId},
+                        {"tpl_content", tplContent},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.pass.template.add");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayPassTemplateAddResponse> CreateTemplateAsync(string uniqueId, string tplContent)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.template.add"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"unique_id", uniqueId},
+                        {"tpl_content", tplContent},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.pass.template.add");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayPassTemplateUpdateResponse UpdateTemplate(string tplId, string tplContent)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.template.update"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"tpl_id", tplId},
+                        {"tpl_content", tplContent},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.pass.template.update");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayPassTemplateUpdateResponse> UpdateTemplateAsync(string tplId, string tplContent)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.template.update"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"tpl_id", tplId},
+                        {"tpl_content", tplContent},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.pass.template.update");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassTemplateUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayPassInstanceAddResponse AddInstance(string tplId, string tplParams, string recognitionType, string recognitionInfo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.instance.add"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"tpl_id", tplId},
+                        {"tpl_params", tplParams},
+                        {"recognition_type", recognitionType},
+                        {"recognition_info", recognitionInfo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.pass.instance.add");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayPassInstanceAddResponse> AddInstanceAsync(string tplId, string tplParams, string recognitionType, string recognitionInfo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.instance.add"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"tpl_id", tplId},
+                        {"tpl_params", tplParams},
+                        {"recognition_type", recognitionType},
+                        {"recognition_info", recognitionInfo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.pass.instance.add");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceAddResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayPassInstanceUpdateResponse UpdateInstance(string serialNumber, string channelId, string tplParams, string status, string verifyCode, string verifyType)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.instance.update"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"serial_number", serialNumber},
+                        {"channel_id", channelId},
+                        {"tpl_params", tplParams},
+                        {"status", status},
+                        {"verify_code", verifyCode},
+                        {"verify_type", verifyType},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.pass.instance.update");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayPassInstanceUpdateResponse> UpdateInstanceAsync(string serialNumber, string channelId, string tplParams, string status, string verifyCode, string verifyType)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.pass.instance.update"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"serial_number", serialNumber},
+                        {"channel_id", channelId},
+                        {"tpl_params", tplParams},
+                        {"status", status},
+                        {"verify_code", verifyCode},
+                        {"verify_type", verifyType},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.pass.instance.update");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayPassInstanceUpdateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassInstanceAddResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.Pass.Models
+{
+    public class AlipayPassInstanceAddResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("success")]
+        [Validation(Required=true)]
+        public bool? Success { get; set; }
+
+        [NameInMap("result")]
+        [Validation(Required=true)]
+        public string Result { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassInstanceUpdateResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.Pass.Models
+{
+    public class AlipayPassInstanceUpdateResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("success")]
+        [Validation(Required=true)]
+        public bool? Success { get; set; }
+
+        [NameInMap("result")]
+        [Validation(Required=true)]
+        public string Result { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassTemplateAddResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.Pass.Models
+{
+    public class AlipayPassTemplateAddResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("success")]
+        [Validation(Required=true)]
+        public bool? Success { get; set; }
+
+        [NameInMap("result")]
+        [Validation(Required=true)]
+        public string Result { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/Pass/Models/AlipayPassTemplateUpdateResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.Pass.Models
+{
+    public class AlipayPassTemplateUpdateResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("success")]
+        [Validation(Required=true)]
+        public bool? Success { get; set; }
+
+        [NameInMap("result")]
+        [Validation(Required=true)]
+        public string Result { get; set; }
+
+    }
+
+}

+ 322 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/TemplateMessage/Client.cs

@@ -0,0 +1,322 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Marketing.TemplateMessage.Models;
+
+namespace Alipay.EasySDK.Marketing.TemplateMessage
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayOpenAppMiniTemplatemessageSendResponse Send(string toUserId, string formId, string userTemplateId, string page, string data)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.app.mini.templatemessage.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"to_user_id", toUserId},
+                        {"form_id", formId},
+                        {"user_template_id", userTemplateId},
+                        {"page", page},
+                        {"data", data},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.open.app.mini.templatemessage.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppMiniTemplatemessageSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppMiniTemplatemessageSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayOpenAppMiniTemplatemessageSendResponse> SendAsync(string toUserId, string formId, string userTemplateId, string page, string data)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.open.app.mini.templatemessage.send"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"to_user_id", toUserId},
+                        {"form_id", formId},
+                        {"user_template_id", userTemplateId},
+                        {"page", page},
+                        {"data", data},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.open.app.mini.templatemessage.send");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppMiniTemplatemessageSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayOpenAppMiniTemplatemessageSendResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 37 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Marketing/TemplateMessage/Models/AlipayOpenAppMiniTemplatemessageSendResponse.cs

@@ -0,0 +1,37 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Marketing.TemplateMessage.Models
+{
+    public class AlipayOpenAppMiniTemplatemessageSendResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+    }
+
+}

+ 562 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Client.cs

@@ -0,0 +1,562 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Member.Identification.Models;
+
+namespace Alipay.EasySDK.Member.Identification
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayUserCertifyOpenInitializeResponse Init(string outerOrderNo, string bizCode, IdentityParam identityParam, MerchantConfig merchantConfig)
+        {
+            identityParam.Validate();
+            merchantConfig.Validate();
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.user.certify.open.initialize"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"outer_order_no", outerOrderNo},
+                        {"biz_code", bizCode},
+                        {"identity_param", identityParam},
+                        {"merchant_config", merchantConfig},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.user.certify.open.initialize");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenInitializeResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenInitializeResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayUserCertifyOpenInitializeResponse> InitAsync(string outerOrderNo, string bizCode, IdentityParam identityParam, MerchantConfig merchantConfig)
+        {
+            identityParam.Validate();
+            merchantConfig.Validate();
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.user.certify.open.initialize"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"outer_order_no", outerOrderNo},
+                        {"biz_code", bizCode},
+                        {"identity_param", identityParam},
+                        {"merchant_config", merchantConfig},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.user.certify.open.initialize");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenInitializeResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenInitializeResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayUserCertifyOpenQueryResponse Query(string certifyId)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.user.certify.open.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"certify_id", certifyId},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.user.certify.open.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayUserCertifyOpenQueryResponse> QueryAsync(string certifyId)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.user.certify.open.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"certify_id", certifyId},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.user.certify.open.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayUserCertifyOpenQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayUserCertifyOpenCertifyResponse Certify(string certifyId)
+        {
+            Dictionary<string, string> systemParams = new Dictionary<string, string>
+            {
+                {"method", "alipay.user.certify.open.certify"},
+                {"app_id", this._kernel.GetConfig("appId")},
+                {"timestamp", this._kernel.GetTimestamp()},
+                {"format", "json"},
+                {"version", "1.0"},
+                {"alipay_sdk", this._kernel.GetSdkVersion()},
+                {"charset", "UTF-8"},
+                {"sign_type", this._kernel.GetConfig("signType")},
+                {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+            };
+            Dictionary<string, object> bizParams = new Dictionary<string, object>
+            {
+                {"certify_id", certifyId},
+            };
+            Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+            string sign = this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"));
+            Dictionary<string, string> response = new Dictionary<string, string>
+            {
+                {"body", this._kernel.GeneratePage("GET", systemParams, bizParams, textParams, sign)},
+            };
+            return TeaModel.ToObject<AlipayUserCertifyOpenCertifyResponse>(response);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 21 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/AlipayUserCertifyOpenCertifyResponse.cs

@@ -0,0 +1,21 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Member.Identification.Models
+{
+    public class AlipayUserCertifyOpenCertifyResponse : TeaModel {
+        /// <summary>
+        /// 认证服务请求地址
+        /// </summary>
+        [NameInMap("body")]
+        [Validation(Required=true)]
+        public string Body { get; set; }
+
+    }
+
+}

+ 41 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/AlipayUserCertifyOpenInitializeResponse.cs

@@ -0,0 +1,41 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Member.Identification.Models
+{
+    public class AlipayUserCertifyOpenInitializeResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("certify_id")]
+        [Validation(Required=true)]
+        public string CertifyId { get; set; }
+
+    }
+
+}

+ 49 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/AlipayUserCertifyOpenQueryResponse.cs

@@ -0,0 +1,49 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Member.Identification.Models
+{
+    public class AlipayUserCertifyOpenQueryResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("passed")]
+        [Validation(Required=true)]
+        public string Passed { get; set; }
+
+        [NameInMap("identity_info")]
+        [Validation(Required=true)]
+        public string IdentityInfo { get; set; }
+
+        [NameInMap("material_info")]
+        [Validation(Required=true)]
+        public string MaterialInfo { get; set; }
+
+    }
+
+}

+ 30 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/IdentityParam.cs

@@ -0,0 +1,30 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Member.Identification.Models
+{
+    public class IdentityParam : TeaModel {
+        [NameInMap("identity_type")]
+        [Validation(Required=true)]
+        public string IdentityType { get; set; }
+
+        [NameInMap("cert_type")]
+        [Validation(Required=true)]
+        public string CertType { get; set; }
+
+        [NameInMap("cert_name")]
+        [Validation(Required=true)]
+        public string CertName { get; set; }
+
+        [NameInMap("cert_no")]
+        [Validation(Required=true)]
+        public string CertNo { get; set; }
+
+    }
+
+}

+ 18 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Member/Identification/Models/MerchantConfig.cs

@@ -0,0 +1,18 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Member.Identification.Models
+{
+    public class MerchantConfig : TeaModel {
+        [NameInMap("return_url")]
+        [Validation(Required=true)]
+        public string ReturnUrl { get; set; }
+
+    }
+
+}

+ 135 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/App/Client.cs

@@ -0,0 +1,135 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Payment.App.Models;
+
+namespace Alipay.EasySDK.Payment.App
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+
+        public AlipayTradeAppPayResponse Pay(string subject, string outTradeNo, string totalAmount)
+        {
+            Dictionary<string, string> systemParams = new Dictionary<string, string>
+            {
+                {"method", "alipay.trade.app.pay"},
+                {"app_id", this._kernel.GetConfig("appId")},
+                {"timestamp", this._kernel.GetTimestamp()},
+                {"format", "json"},
+                {"version", "1.0"},
+                {"alipay_sdk", this._kernel.GetSdkVersion()},
+                {"charset", "UTF-8"},
+                {"sign_type", this._kernel.GetConfig("signType")},
+                {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+            };
+            Dictionary<string, object> bizParams = new Dictionary<string, object>
+            {
+                {"subject", subject},
+                {"out_trade_no", outTradeNo},
+                {"total_amount", totalAmount},
+            };
+            Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+            string sign = this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"));
+            Dictionary<string, string> response = new Dictionary<string, string>
+            {
+                {"body", this._kernel.GenerateOrderString(systemParams, bizParams, textParams, sign)},
+            };
+            return TeaModel.ToObject<AlipayTradeAppPayResponse>(response);
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 21 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/App/Models/AlipayTradeAppPayResponse.cs

@@ -0,0 +1,21 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Payment.App.Models
+{
+    public class AlipayTradeAppPayResponse : TeaModel {
+        /// <summary>
+        /// 订单信息,字符串形式
+        /// </summary>
+        [NameInMap("body")]
+        [Validation(Required=true)]
+        public string Body { get; set; }
+
+    }
+
+}

+ 1598 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Client.cs

@@ -0,0 +1,1598 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+
+using Tea;
+using Tea.Utils;
+
+using Alipay.EasySDK.Payment.Common.Models;
+
+namespace Alipay.EasySDK.Payment.Common
+{
+    public class Client 
+    {
+        protected Alipay.EasySDK.Kernel.Client _kernel;
+
+        public Client(Alipay.EasySDK.Kernel.Client kernel)
+        {
+            this._kernel = kernel;
+        }
+
+        public AlipayTradeCreateResponse Create(string subject, string outTradeNo, string totalAmount, string buyerId)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.create"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"subject", subject},
+                        {"out_trade_no", outTradeNo},
+                        {"total_amount", totalAmount},
+                        {"buyer_id", buyerId},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.trade.create");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayTradeCreateResponse> CreateAsync(string subject, string outTradeNo, string totalAmount, string buyerId)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.create"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"subject", subject},
+                        {"out_trade_no", outTradeNo},
+                        {"total_amount", totalAmount},
+                        {"buyer_id", buyerId},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.trade.create");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCreateResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayTradeQueryResponse Query(string outTradeNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.trade.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayTradeQueryResponse> QueryAsync(string outTradeNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.trade.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayTradeRefundResponse Refund(string outTradeNo, string refundAmount)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.refund"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                        {"refund_amount", refundAmount},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.trade.refund");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeRefundResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeRefundResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayTradeRefundResponse> RefundAsync(string outTradeNo, string refundAmount)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.refund"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                        {"refund_amount", refundAmount},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.trade.refund");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeRefundResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeRefundResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayTradeCloseResponse Close(string outTradeNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.close"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.trade.close");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCloseResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCloseResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayTradeCloseResponse> CloseAsync(string outTradeNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.close"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.trade.close");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCloseResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCloseResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayTradeCancelResponse Cancel(string outTradeNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.cancel"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.trade.cancel");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCancelResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCancelResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayTradeCancelResponse> CancelAsync(string outTradeNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.cancel"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.trade.cancel");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCancelResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeCancelResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayTradeFastpayRefundQueryResponse QueryRefund(string outTradeNo, string outRequestNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.fastpay.refund.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                        {"out_request_no", outRequestNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.trade.fastpay.refund.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeFastpayRefundQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeFastpayRefundQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayTradeFastpayRefundQueryResponse> QueryRefundAsync(string outTradeNo, string outRequestNo)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.trade.fastpay.refund.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"out_trade_no", outTradeNo},
+                        {"out_request_no", outRequestNo},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.trade.fastpay.refund.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayTradeFastpayRefundQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayTradeFastpayRefundQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public AlipayDataDataserviceBillDownloadurlQueryResponse DownloadBill(string billType, string billDate)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.data.dataservice.bill.downloadurl.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"bill_type", billType},
+                        {"bill_date", billDate},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = TeaCore.DoAction(request_, runtime_);
+
+                    Dictionary<string, object> respMap = this._kernel.ReadAsJson(response_, "alipay.data.dataservice.bill.downloadurl.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayDataDataserviceBillDownloadurlQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayDataDataserviceBillDownloadurlQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public async Task<AlipayDataDataserviceBillDownloadurlQueryResponse> DownloadBillAsync(string billType, string billDate)
+        {
+            Dictionary<string, object> runtime_ = new Dictionary<string, object>
+            {
+                {"ignoreSSL", this._kernel.GetConfig("ignoreSSL")},
+                {"httpProxy", this._kernel.GetConfig("httpProxy")},
+                {"connectTimeout", 15000},
+                {"readTimeout", 15000},
+                {"retry", new Dictionary<string, int?>
+                {
+                    {"maxAttempts", 0},
+                }},
+            };
+
+            TeaRequest _lastRequest = null;
+            Exception _lastException = null;
+            long _now = System.DateTime.Now.Millisecond;
+            int _retryTimes = 0;
+            while (TeaCore.AllowRetry((IDictionary) runtime_["retry"], _retryTimes, _now))
+            {
+                if (_retryTimes > 0)
+                {
+                    int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes);
+                    if (backoffTime > 0)
+                    {
+                        TeaCore.Sleep(backoffTime);
+                    }
+                }
+                _retryTimes = _retryTimes + 1;
+                try
+                {
+                    TeaRequest request_ = new TeaRequest();
+                    Dictionary<string, string> systemParams = new Dictionary<string, string>
+                    {
+                        {"method", "alipay.data.dataservice.bill.downloadurl.query"},
+                        {"app_id", this._kernel.GetConfig("appId")},
+                        {"timestamp", this._kernel.GetTimestamp()},
+                        {"format", "json"},
+                        {"version", "1.0"},
+                        {"alipay_sdk", this._kernel.GetSdkVersion()},
+                        {"charset", "UTF-8"},
+                        {"sign_type", this._kernel.GetConfig("signType")},
+                        {"app_cert_sn", this._kernel.GetMerchantCertSN()},
+                        {"alipay_root_cert_sn", this._kernel.GetAlipayRootCertSN()},
+                    };
+                    Dictionary<string, object> bizParams = new Dictionary<string, object>
+                    {
+                        {"bill_type", billType},
+                        {"bill_date", billDate},
+                    };
+                    Dictionary<string, string> textParams = new Dictionary<string, string>(){};
+                    request_.Protocol = this._kernel.GetConfig("protocol");
+                    request_.Method = "POST";
+                    request_.Pathname = "/gateway.do";
+                    request_.Headers = new Dictionary<string, string>
+                    {
+                        {"host", this._kernel.GetConfig("gatewayHost")},
+                        {"content-type", "application/x-www-form-urlencoded;charset=utf-8"},
+                    };
+                    request_.Query = this._kernel.SortMap(TeaConverter.merge<string>
+                    (
+                        new Dictionary<string, string>()
+                        {
+                            {"sign", this._kernel.Sign(systemParams, bizParams, textParams, this._kernel.GetConfig("merchantPrivateKey"))},
+                        },
+                        systemParams,
+                        textParams
+                    ));
+                    request_.Body = TeaCore.BytesReadable(this._kernel.ToUrlEncodedRequestBody(bizParams));
+                    _lastRequest = request_;
+                    TeaResponse response_ = await TeaCore.DoActionAsync(request_, runtime_);
+
+                    Dictionary<string, object> respMap = await this._kernel.ReadAsJsonAsync(response_, "alipay.data.dataservice.bill.downloadurl.query");
+                    if (this._kernel.IsCertMode())
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.ExtractAlipayPublicKey(this._kernel.GetAlipayCertSN(respMap))))
+                        {
+                            return TeaModel.ToObject<AlipayDataDataserviceBillDownloadurlQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    else
+                    {
+                        if (this._kernel.Verify(respMap, this._kernel.GetConfig("alipayPublicKey")))
+                        {
+                            return TeaModel.ToObject<AlipayDataDataserviceBillDownloadurlQueryResponse>(this._kernel.ToRespModel(respMap));
+                        }
+                    }
+                    throw new TeaException(new Dictionary<string, string>
+                    {
+                        {"message", "验签失败,请检查支付宝公钥设置是否正确。"},
+                    });
+                }
+                catch (Exception e)
+                {
+                    if (TeaCore.IsRetryable(e))
+                    {
+                        _lastException = e;
+                        continue;
+                    }
+                    throw e;
+                }
+            }
+
+            throw new TeaUnretryableException(_lastRequest, _lastException);
+        }
+
+        public bool? VerifyNotify(Dictionary<string, string> parameters)
+        {
+            if (this._kernel.IsCertMode())
+            {
+                return this._kernel.VerifyParams(parameters, this._kernel.ExtractAlipayPublicKey(""));
+            }
+            else
+            {
+                return this._kernel.VerifyParams(parameters, this._kernel.GetConfig("alipayPublicKey"));
+            }
+        }
+
+        
+        /// <summary>
+        /// ISV代商户代用,指定appAuthToken
+        /// </summary>
+        /// <param name="appAuthToken">代调用token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Agent(string appAuthToken)
+        {
+            _kernel.InjectTextParam("app_auth_token", appAuthToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 用户授权调用,指定authToken
+        /// </summary>
+        /// <param name="authToken">用户授权token</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Auth(string authToken)
+        {
+            _kernel.InjectTextParam("auth_token", authToken);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置异步通知回调地址,此处设置将在本调用中覆盖Config中的全局配置
+        /// </summary>
+        /// <param name="url">异步通知回调地址,例如:https://www.test.com/callback </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client AsyncNotify(string url)
+        {
+            _kernel.InjectTextParam("notify_url", url);
+            return this;
+        }
+
+        /// <summary>
+        /// 将本次调用强制路由到后端系统的测试地址上,常用于线下环境内外联调,沙箱与线上环境设置无效
+        /// </summary>
+        /// <param name="testUrl">后端系统测试地址</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Route(string testUrl)
+        {
+            _kernel.InjectTextParam("ws_service_url", testUrl);
+            return this;
+        }
+
+        /// <summary>
+        /// 设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// </summary>
+        /// <param name="key">业务请求参数名称(biz_content下的字段名,比如timeout_express)</param>
+        /// <param name="value">
+        /// 业务请求参数的值,一个可以序列化成JSON的对象
+        /// 如果该字段是一个字符串类型(String、Price、Date在SDK中都是字符串),请使用string储存
+        /// 如果该字段是一个数值型类型(比如:Number),请使用long储存
+        /// 如果该字段是一个复杂类型,请使用嵌套的Dictionary指定各下级字段的值
+        /// 如果该字段是一个数组,请使用List储存各个值
+        /// 对于更复杂的情况,也支持Dictionary和List的各种组合嵌套,比如参数是值是个List,List中的每种类型是一个复杂对象
+        /// </param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client Optional(string key, object value)
+        {
+            _kernel.InjectBizParam(key, value);
+            return this;
+        }
+
+        /// <summary>
+        /// 批量设置API入参中没有的其他可选业务请求参数(biz_content下的字段)
+        /// optional方法的批量版本
+        /// </summary>
+        /// <param name="optionalArgs">可选参数集合,每个参数由key和value组成,key和value的格式请参见optional方法的注释</param>
+        /// <returns>本客户端,便于链式调用</returns>
+        public Client BatchOptional(Dictionary<string, object> optionalArgs)
+        {
+            foreach (var pair in optionalArgs)
+            {
+                _kernel.InjectBizParam(pair.Key, pair.Value);
+            }
+            return this;
+        }
+    }
+}

+ 41 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayDataDataserviceBillDownloadurlQueryResponse.cs

@@ -0,0 +1,41 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Payment.Common.Models
+{
+    public class AlipayDataDataserviceBillDownloadurlQueryResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("bill_download_url")]
+        [Validation(Required=true)]
+        public string BillDownloadUrl { get; set; }
+
+    }
+
+}

+ 61 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayTradeCancelResponse.cs

@@ -0,0 +1,61 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Payment.Common.Models
+{
+    public class AlipayTradeCancelResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("trade_no")]
+        [Validation(Required=true)]
+        public string TradeNo { get; set; }
+
+        [NameInMap("out_trade_no")]
+        [Validation(Required=true)]
+        public string OutTradeNo { get; set; }
+
+        [NameInMap("retry_flag")]
+        [Validation(Required=true)]
+        public string RetryFlag { get; set; }
+
+        [NameInMap("action")]
+        [Validation(Required=true)]
+        public string Action { get; set; }
+
+        [NameInMap("gmt_refund_pay")]
+        [Validation(Required=true)]
+        public string GmtRefundPay { get; set; }
+
+        [NameInMap("refund_settlement_id")]
+        [Validation(Required=true)]
+        public string RefundSettlementId { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayTradeCloseResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Payment.Common.Models
+{
+    public class AlipayTradeCloseResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("trade_no")]
+        [Validation(Required=true)]
+        public string TradeNo { get; set; }
+
+        [NameInMap("out_trade_no")]
+        [Validation(Required=true)]
+        public string OutTradeNo { get; set; }
+
+    }
+
+}

+ 45 - 0
vendor/alipaysdk/easysdk/csharp/AlipayEasySDK/Payment/Common/Models/AlipayTradeCreateResponse.cs

@@ -0,0 +1,45 @@
+// This file is auto-generated, don't edit it. Thanks.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+using Tea;
+
+namespace Alipay.EasySDK.Payment.Common.Models
+{
+    public class AlipayTradeCreateResponse : TeaModel {
+        /// <summary>
+        /// 响应原始字符串
+        /// </summary>
+        [NameInMap("http_body")]
+        [Validation(Required=true)]
+        public string HttpBody { get; set; }
+
+        [NameInMap("code")]
+        [Validation(Required=true)]
+        public string Code { get; set; }
+
+        [NameInMap("msg")]
+        [Validation(Required=true)]
+        public string Msg { get; set; }
+
+        [NameInMap("sub_code")]
+        [Validation(Required=true)]
+        public string SubCode { get; set; }
+
+        [NameInMap("sub_msg")]
+        [Validation(Required=true)]
+        public string SubMsg { get; set; }
+
+        [NameInMap("out_trade_no")]
+        [Validation(Required=true)]
+        public string OutTradeNo { get; set; }
+
+        [NameInMap("trade_no")]
+        [Validation(Required=true)]
+        public string TradeNo { get; set; }
+
+    }
+
+}

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio