diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
index 65f8e1a..021d398 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
@@ -13,4 +13,6 @@
 @Repository
 public interface PaytypeConfigDao extends JpaRepository<TPaytypeConfig, TPaytypeConfigPK> {
     List<TPaytypeConfig> getByPaytype(String paytype);
+
+    TPaytypeConfig getByPaytypeAndAndConfigid(String paytype, String configid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
index 0313df1..eb9f3f4 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
@@ -2,22 +2,23 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.domain.TPaytype;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
 import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.system.service.ParamService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import com.supwisdom.dlpay.util.WebCheckException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 @Controller
@@ -95,8 +96,8 @@
   @PreAuthorize("hasPermission('/param/businesspara','')")
   @ResponseBody
   public PageResult<TBusinesspara> getBusinessDataList(@RequestParam("page") Integer pageNo,
-                                               @RequestParam("limit") Integer pageSize,
-                                               @RequestParam(value = "paraname", required = false) String paraname) {
+                                                       @RequestParam("limit") Integer pageSize,
+                                                       @RequestParam(value = "paraname", required = false) String paraname) {
     try {
       if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
       if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
@@ -200,7 +201,7 @@
 
   /**
    * ====================================================
-   *            APPID应用权限参数管理
+   * APPID应用权限参数管理
    * ====================================================
    */
   @GetMapping("/param/apiclientpara")
@@ -291,8 +292,8 @@
   @PreAuthorize("hasPermission('/param/updateapiclientpara','')")
   @ResponseBody
   public JsonResult updateApiclientSecret(@RequestParam("appid") String appid,
-                                         @RequestParam(value = "secret", required = false) String secret,
-                                         @RequestParam(value = "roles", required = false) String roles) {
+                                          @RequestParam(value = "secret", required = false) String secret,
+                                          @RequestParam(value = "roles", required = false) String roles) {
     if (StringUtil.isEmpty(appid) || (StringUtil.isEmpty(secret) && StringUtil.isEmpty(roles))) {
       return JsonResult.error("参数传递错误");
     }
@@ -322,7 +323,7 @@
   @PreAuthorize("hasPermission('/param/addapiclientpara','')")
   @ResponseBody
   public JsonResult addApiclientPara(@RequestParam("appid") String appid,
-                                         @RequestParam("roles") String roles) {
+                                     @RequestParam("roles") String roles) {
     if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(roles)) {
       return JsonResult.error("参数传递错误");
     }
@@ -349,7 +350,7 @@
 
   /**
    * ====================================================
-   *            支付能力配置
+   * 支付能力配置
    * ====================================================
    */
   @GetMapping("/param/paytype")
@@ -373,4 +374,181 @@
     }
   }
 
+  @GetMapping("/param/load4addpaytype")
+  @PreAuthorize("hasPermission('/param/load4addpaytype','')")
+  public String load4AddPaytype(Model model) {
+    return "system/param/paytypeform";
+  }
+
+  @PostMapping("/param/updatepaytypestate")
+  @PreAuthorize("hasPermission('/param/updatepaytypestate','')")
+  @ResponseBody
+  public JsonResult updatePaytypeState(@RequestParam("paytype") String paytype,
+                                       @RequestParam("state") String state,
+                                       @RequestParam(value = "optype", required = false) String optype) {
+    if (StringUtil.isEmpty(paytype) || (!ConstantUtil.ENABLE_YES.equals(state) && !ConstantUtil.ENABLE_NO.equals(state)) || (!StringUtil.isEmpty(optype) && !"charge".equals(optype) && !"consume".equals(optype) && !"anonymous".equals(optype))) {
+      return JsonResult.error("参数传递错误");
+    }
+    try {
+      TPaytype tPaytype = paramService.getPaytype(paytype);
+      if (null == tPaytype) {
+        return JsonResult.error("支付方式不存在！");
+      }
+      if ("charge".equals(optype)) {
+        if (state.equals(tPaytype.getChargeEnable())) {
+          return JsonResult.error("状态错误，请重新查询后操作");
+        }
+        tPaytype.setChargeEnable(state);
+      } else if ("consume".equals(optype)) {
+        if (state.equals(tPaytype.getConsumeEnable())) {
+          return JsonResult.error("状态错误，请重新查询后操作");
+        }
+        tPaytype.setConsumeEnable(state);
+      } else if ("anonymous".equals(optype)) {
+        if (state.equals(tPaytype.getAnonymousEnable())) {
+          return JsonResult.error("状态错误，请重新查询后操作");
+        }
+        tPaytype.setAnonymousEnable(state);
+      } else {
+        if (state.equals(tPaytype.getEnable())) {
+          return JsonResult.error("状态错误，请重新查询后操作");
+        }
+        tPaytype.setEnable(state); //默认切换主状态
+      }
+
+      if (paramService.saveOrUpdatePaytype(tPaytype)) {
+        return JsonResult.ok(ConstantUtil.ENABLE_YES.equals(state) ? "启用成功" : "关闭成功");
+      } else {
+        return JsonResult.error(ConstantUtil.ENABLE_YES.equals(state) ? "启用失败" : "关闭失败");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @PostMapping("/param/updatepaytypename")
+  @PreAuthorize("hasPermission('/param/updatepaytypename','')")
+  @ResponseBody
+  public JsonResult updatePaytypeName(@RequestParam("paytype") String paytype,
+                                      @RequestParam("paydesc") String paydesc) {
+    if (StringUtil.isEmpty(paytype) || StringUtil.isEmpty(paydesc)) {
+      return JsonResult.error("参数传递错误");
+    }
+    try {
+      TPaytype tPaytype = paramService.getPaytype(paytype);
+      if (null == tPaytype) {
+        return JsonResult.error("支付方式不存在！");
+      }
+      tPaytype.setPaydesc(paydesc.trim());
+      if (paramService.saveOrUpdatePaytype(tPaytype)) {
+        return JsonResult.ok("修改成功");
+      } else {
+        return JsonResult.error("修改失败");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @PostMapping("/param/deletepaytype")
+  @PreAuthorize("hasPermission('/param/deletepaytype','')")
+  @ResponseBody
+  public JsonResult deletePaytype(@RequestParam("paytype") String paytype) {
+    try {
+      TPaytype tPaytype = paramService.getPaytype(paytype);
+      if (null == tPaytype) {
+        return JsonResult.error("支付方式不存在！");
+      }
+      if (paramService.deletePaytype(tPaytype)) {
+        return JsonResult.ok("删除成功");
+      } else {
+        return JsonResult.error("删除失败");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @PostMapping("/param/addpaytype")
+  @PreAuthorize("hasPermission('/param/addpaytype','')")
+  @ResponseBody
+  public JsonResult addPaytype(@RequestParam("paytype") String paytype,
+                               @RequestParam(value = "enable",required = false,defaultValue = "no") String enable,
+                               @RequestParam(value = "chargeEnable",required = false,defaultValue = "no") String chargeEnable,
+                               @RequestParam(value = "consumeEnable",required = false,defaultValue = "no") String consumeEnable,
+                               @RequestParam(value = "anonymousEnable",required = false,defaultValue = "no") String anonymousEnable,
+                               @RequestParam("paydesc") String paydesc) {
+    try {
+      TPaytype tPaytype = paramService.getPaytype(paytype);
+      if (null != tPaytype) {
+        return JsonResult.error("支付方式已经存在");
+      }
+      tPaytype = new TPaytype();
+      tPaytype.setPaytype(paytype.trim());
+      if (StringUtil.isEmpty(paydesc)) return JsonResult.error("支付名称不能为空！");
+      tPaytype.setPaydesc(paydesc.trim());
+      tPaytype.setEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(enable) ? ConstantUtil.ENABLE_YES : ConstantUtil.ENABLE_NO);
+      tPaytype.setChargeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(chargeEnable) ? ConstantUtil.ENABLE_YES : ConstantUtil.ENABLE_NO);
+      tPaytype.setConsumeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(consumeEnable) ? ConstantUtil.ENABLE_YES : ConstantUtil.ENABLE_NO);
+      tPaytype.setAnonymousEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(anonymousEnable) ? ConstantUtil.ENABLE_YES : ConstantUtil.ENABLE_NO);
+      if (paramService.saveOrUpdatePaytype(tPaytype)) {
+        return JsonResult.ok("新增成功");
+      } else {
+        return JsonResult.error("新增失败");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @GetMapping("/param/checkpaytype")
+  @ResponseBody
+  public JsonResult checkPaytype(@RequestParam("paytype") String paytype) {
+    TPaytype tPaytype = paramService.getPaytype(paytype);
+    if (null != tPaytype) {
+      return JsonResult.error("支付方式已经存在");
+    } else {
+      return JsonResult.ok("可以使用");
+    }
+  }
+
+  @GetMapping("/param/load4paytypeconfig")
+  @PreAuthorize("hasPermission('/param/load4paytypeconfig','')")
+  public String load4PaytypeConfig(@RequestParam("paytype") String paytype, Model model) {
+    List<TPaytypeConfig> configList = paramService.getPaytypeConfigList(paytype);
+    model.addAttribute("configlist", configList);
+    model.addAttribute("paytype", paytype);
+    return "system/param/paytypeconfig";
+  }
+
+  @PostMapping("/param/addpaytypeconfig")
+  @PreAuthorize("hasPermission('/param/addpaytypeconfig','')")
+  @ResponseBody
+  public JsonResult addPaytypeConfig(@RequestBody Map<String,String> param){
+    String paytypeHtmlKey = "hid_paytype"; //页面上传来paytype的KEY
+    if(null==param || StringUtil.isEmpty(param.get(paytypeHtmlKey))){
+      return JsonResult.error("参数传递错误");
+    }
+
+    try {
+      String paytype = param.get(paytypeHtmlKey).trim();
+      param.remove(paytypeHtmlKey);
+      if (paramService.savePaytypeConfig(paytype, param)) {
+        return JsonResult.ok("配置成功");
+      } else {
+        return JsonResult.error("配置失败");
+      }
+    } catch (WebCheckException ex) {
+      return JsonResult.error(ex.getMessage());
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
index aa5f7ea..4dedc44 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
@@ -1,13 +1,18 @@
 package com.supwisdom.dlpay.system.service;
 
 import com.supwisdom.dlpay.api.domain.TPaytype;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
 import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.util.WebCheckException;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+import java.util.Map;
+
 
 public interface ParamService {
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
@@ -46,4 +51,21 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
   PageResult<TPaytype> getPaytypePage(String paytype, int pageNo, int pageSize);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  TPaytype getPaytype(String paytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean saveOrUpdatePaytype(TPaytype paytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean deletePaytype(TPaytype paytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  List<TPaytypeConfig> getPaytypeConfigList(String paytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean savePaytypeConfig(String paytype, Map<String, String> param) throws WebCheckException;
+
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
index 5ed8ca9..4fff8ce 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
@@ -1,7 +1,9 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.api.dao.PaytypeConfigDao;
 import com.supwisdom.dlpay.api.dao.PaytypeDao;
 import com.supwisdom.dlpay.api.domain.TPaytype;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
 import com.supwisdom.dlpay.framework.dao.ApiClientDao;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.dao.SysparaDao;
@@ -12,6 +14,7 @@
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.system.service.ParamService;
 import com.supwisdom.dlpay.util.ConstantUtil;
+import com.supwisdom.dlpay.util.WebCheckException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -26,6 +29,7 @@
 import javax.persistence.criteria.Root;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 
 @Service
@@ -38,6 +42,8 @@
   private ApiClientDao apiClientDao;
   @Autowired
   private PaytypeDao paytypeDao;
+  @Autowired
+  private PaytypeConfigDao paytypeConfigDao;
 
   @Override
   public PageResult<TSyspara> getSysparaPage(Integer paraid, String paraname, int pageNo, int pageSize) {
@@ -152,4 +158,56 @@
     return new PageResult<>(paytypeDao.findAll(pageable));
   }
 
+  @Override
+  public TPaytype getPaytype(String paytype) {
+    if (!StringUtil.isEmpty(paytype)) {
+      return paytypeDao.getByPaytype(paytype.trim());
+    }
+    return null;
+  }
+
+  @Override
+  public boolean saveOrUpdatePaytype(TPaytype paytype){
+    if(null!=paytype){
+      paytypeDao.save(paytype);
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public boolean deletePaytype(TPaytype paytype){
+    if(null!=paytype){
+      paytypeDao.delete(paytype);
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public List<TPaytypeConfig> getPaytypeConfigList(String paytype) {
+    if (!StringUtil.isEmpty(paytype)) {
+      List<TPaytypeConfig> list = paytypeConfigDao.getByPaytype(paytype.trim());
+      if (!StringUtil.isEmpty(list))
+        return list;
+    }
+    return new ArrayList<>(0);
+  }
+
+  @Override
+  public boolean savePaytypeConfig(String paytype, Map<String, String> param) throws WebCheckException {
+    TPaytype tPaytype = getPaytype(paytype);
+    if (null == tPaytype) throw new WebCheckException("支付能力[" + paytype + "]不存在");
+    for (String key : param.keySet()) {
+      String value = param.get(key);
+      TPaytypeConfig config = paytypeConfigDao.getByPaytypeAndAndConfigid(tPaytype.getPaytype(), key);
+      if (null == config) throw new WebCheckException("支付能力[" + tPaytype.getPaytype() + "]不存在配置项[" + key + "],请重新查询");
+      config.setConfigValue(StringUtil.isEmpty(value) ? null : value.trim());
+      paytypeConfigDao.save(config);
+    }
+    return true;
+  }
+
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/util/WebCheckException.java b/src/main/java/com/supwisdom/dlpay/util/WebCheckException.java
new file mode 100644
index 0000000..42e72d4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/WebCheckException.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.util;
+
+public class WebCheckException extends Exception {
+  public WebCheckException(String message) {
+    super(message);
+  }
+}
diff --git a/src/main/resources/templates/system/param/paytype.html b/src/main/resources/templates/system/param/paytype.html
index 8f9883a..63a0cee 100644
--- a/src/main/resources/templates/system/param/paytype.html
+++ b/src/main/resources/templates/system/param/paytype.html
@@ -13,38 +13,48 @@
                    placeholder="输入支付方式查询"/>
             <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
-            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
+            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增
+            </button>
+            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空
+            </button>
         </div>
         <table class="layui-table" id="paytypeTable" lay-filter="paytypeTable-filter"></table>
     </div>
 </div>
 
-<!-- 表格操作列 -->
-<script type="text/html" id="paytype-table-bar">
-    {{# if(d.paytype == 'balance') { }}
-        <span></span>
-    {{# }else{ }}
-        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
-    {{# } }}
-</script>
-
 <!-- 表格状态列 -->
 <script type="text/html" id="enable-tpl-state">
     <input type="checkbox" lay-filter="enable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
-           {{d.enable=='yes'?'checked':''}} />
+           {{d.enable=='yes'?'checked':''}}/>
 </script>
 <script type="text/html" id="chargeenable-tpl-state">
+    {{# if(d.enable =='yes'){ }}
     <input type="checkbox" lay-filter="chargeenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
-           {{(d.enable=='yes' && d.chargeEnable=='yes')?'checked':''}} />
+           {{(d.enable=='yes' && d.chargeEnable=='yes')?'checked':''}}/>
+    {{# }else{ }}
+    <input type="checkbox" lay-filter="chargeenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+           {{(d.enable=='yes' && d.chargeEnable=='yes')?'checked':''}} disabled/>
+    {{# } }}
 </script>
 <script type="text/html" id="consumeenable-tpl-state">
+    {{# if(d.enable =='yes'){ }}
     <input type="checkbox" lay-filter="consumeenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
-           {{(d.enable=='yes' && d.consumeEnable=='yes')?'checked':''}} />
+           {{(d.enable=='yes' && d.consumeEnable=='yes')?'checked':''}}/>
+    {{# }else{ }}
+    <input type="checkbox" lay-filter="consumeenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+           {{(d.enable=='yes' && d.consumeEnable=='yes')?'checked':''}} disabled/>
+    {{# } }}
 </script>
 <script type="text/html" id="anonymousenable-tpl-state">
-    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
-           {{(d.enable=='yes' && d.anonymousEnable=='yes')?'checked':''}} />
+    {{# if(d.enable =='yes' ){ }}
+    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.paytype}}" lay-skin="switch"
+           lay-text="启用|关闭"
+           {{(d.enable=='yes' && d.anonymousEnable=='yes')?'checked':''}}/>
+    {{# }else{ }}
+    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.paytype}}" lay-skin="switch"
+           lay-text="启用|关闭"
+           {{(d.enable=='yes' && d.anonymousEnable=='yes')?'checked':''}} disabled/>
+    {{# } }}
 </script>
 
 <script>
@@ -60,18 +70,37 @@
             cols: [
                 [
                     {field: 'paytype', title: '支付方式', width: 200, align: 'center', fixed: 'left', sort: true},
-                    {field: 'paydesc', title: '名称', align: 'center', sort: true},
-                    {field: 'enable', title: '状态', align: 'center', templet: '#enable-tpl-state',sort: true},
-                    {field: 'chargeEnable', title: '能否充值', align: 'center', templet: '#chargeenable-tpl-state',sort: true},
-                    {field: 'consumeEnable', title: '能否消费', align: 'center', templet: '#consumeenable-tpl-state',sort: true},
-                    {field: 'anonymousEnable', title: '匿名消费', align: 'center', templet: '#anonymousenable-tpl-state',sort: true},
-                    {align: 'center', title: '操作', width: 100, fixed: 'right', templet: function(item){
-                        if(item.paytype!='balance') {
-                           return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
-                        }else{
+                    {field: 'paydesc', title: '名称', align: 'center', sort: true, edit:'text'},
+                    {field: 'enable', title: '状态', align: 'center', templet: '#enable-tpl-state', sort: true},
+                    {
+                        field: 'chargeEnable',
+                        title: '能否充值',
+                        align: 'center',
+                        templet: '#chargeenable-tpl-state',
+                        sort: true
+                    },
+                    {
+                        field: 'consumeEnable',
+                        title: '能否消费',
+                        align: 'center',
+                        templet: '#consumeenable-tpl-state',
+                        sort: true
+                    },
+                    {
+                        field: 'anonymousEnable',
+                        title: '匿名消费',
+                        align: 'center',
+                        templet: '#anonymousenable-tpl-state',
+                        sort: true
+                    },
+                    {
+                        align: 'center', title: '操作', width: 150, fixed: 'right', templet: function (item) {
+                            if (item.paytype != 'balance') {
+                                return '<a class="layui-btn layui-btn-xs" lay-event="config">配置</a> <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+                            }
                             return '';
                         }
-                    }}
+                    }
                 ]
             ]
         });
@@ -82,110 +111,153 @@
         });
 
         $('#btn-add').click(function () {
-            showEditModel();
+            admin.popupCenter({
+                title: "新增支付能力",
+                path: '/param/load4addpaytype',
+                finish: function () {
+                    table.reload('paytypeTable');
+                }
+            });
         });
 
         $('#btn-reset').click(function () {
             $("#search-paytypeTable").val("");
         });
 
-        // function showEditModel(data) {
-        //     var title = data ? '修改角色' : '新增应用';
-        //     admin.putTempData('t_appclient', data);
-        //     admin.popupCenter({
-        //         title: title,
-        //         path: '/param/load4addapiclient',
-        //         finish: function () {
-        //             table.reload('apiClientTable');
-        //         }
-        //     });
-        // }
-        //
-        // // 修改user状态
-        // form.on('switch(api-tpl-state)', function (obj) {
-        //     var token = $("meta[name='_csrf_token']").attr("value");
-        //     admin.go('/param/updateapiclientstate', {
-        //         appid: obj.elem.value,
-        //         state: obj.elem.checked ? 'normal' : 'closed',
-        //         _csrf: token
-        //     }, function (data) {
-        //         if (data.code == 200) {
-        //             layer.msg(data.msg, {icon: 1});
-        //         } else if (data.code == 401) {
-        //             layer.msg(data.msg, {icon: 2, time: 1500}, function () {
-        //                 location.replace('/login');
-        //             }, 1000);
-        //             return;
-        //         } else {
-        //             layer.msg(data.msg, {icon: 2});
-        //             $(obj.elem).prop('checked', !obj.elem.checked);
-        //             form.render('checkbox');
-        //         }
-        //     },function () {
-        //         layer.msg('请求失败了，请稍后再试', {icon: 2});
-        //         $(obj.elem).prop('checked', !obj.elem.checked);
-        //         form.render('checkbox');
-        //     });
-        // });
-        //
-        // //监听单元格
-        // table.on('tool(apiClientTable-filter)', function (obj) {
-        //     var data = obj.data;
-        //     if('del' == obj.event){
-        //         if(confirm("确定要删除应用参数["+data.appid+"]吗？")){
-        //             layer.load(2);
-        //             admin.go('/param/deleteapiclient', {
-        //                 appid: data.appid,
-        //                 _csrf: $("meta[name='_csrf_token']").attr("value")
-        //             }, function (data) {
-        //                 console.log(data.code);
-        //                 layer.closeAll('loading');
-        //                 if (data.code == 200) {
-        //                     layer.msg(data.msg, {icon: 1});
-        //                 } else if (data.code == 401) {
-        //                     layer.msg(data.msg, {icon: 2, time: 1500}, function () {
-        //                         location.replace('/login');
-        //                     }, 1000);
-        //                     return;
-        //                 } else {
-        //                     layer.msg(data.msg, {icon: 2});
-        //                 }
-        //                 table.reload('apiClientTable');
-        //             }, function (ret) {
-        //                 console.log(ret);
-        //                 layer.closeAll('loading');
-        //                 layer.msg('请求失败了，请稍后再试', {icon: 2});
-        //             });
-        //         }
-        //     }else if('editRole' ==obj.event){
-        //         showEditModel(data);
-        //     }
-        // });
-        //
-        // table.on('edit(apiClientTable-filter)', function (obj) {
-        //     var row = obj.data; //得到所在行所有键值
-        //     var newval = obj.value; //得到修改后的值
-        //     admin.go('/param/updateapiclientpara', {
-        //         appid: row.appid,
-        //         secret: newval,
-        //         _csrf: $("meta[name='_csrf_token']").attr("value"),
-        //     }, function (data) {
-        //         if (data.code == 200) {
-        //             layer.msg("修改成功", {icon: 1});
-        //         } else if (data.code == 401) {
-        //             layer.msg(data.msg, {icon: 2, time: 1500}, function () {
-        //                 location.replace('/login');
-        //             }, 1000);
-        //             return;
-        //         } else {
-        //             layer.msg(data.msg, {icon: 2});
-        //             table.reload('apiClientTable');
-        //         }
-        //     },function () {
-        //         layer.msg('修改失败了，请稍后再试', {icon: 2});
-        //         table.reload('apiClientTable');
-        //     });
-        // })
+        // 修改总状态
+        form.on('switch(enable-tpl-state)', function (obj) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            admin.go('/param/updatepaytypestate', {
+                paytype: obj.elem.value,
+                state: obj.elem.checked ? 'yes' : 'no',
+                _csrf: token
+            }, function (data) {
+                if (data.code == 200) {
+                    layer.msg(data.msg, {icon: 1, time:1000});
+                    table.reload('paytypeTable');
+                } else if (data.code == 401) {
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                        location.replace('/login');
+                    }, 1000);
+                    return;
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            },function () {
+                layer.msg('请求失败了，请稍后再试', {icon: 2});
+                $(obj.elem).prop('checked', !obj.elem.checked);
+                form.render('checkbox');
+            });
+        });
 
+        form.on('switch(chargeenable-tpl-state)', function (obj) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            updatePaytypeState(obj, "charge", token);
+        });
+
+        form.on('switch(consumeenable-tpl-state)', function (obj) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            updatePaytypeState(obj, "consume", token);
+        });
+
+        form.on('switch(anonymousenable-tpl-state)', function (obj) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            updatePaytypeState(obj, "anonymous", token);
+        });
+
+
+        function updatePaytypeState(obj, optype, token) {
+            admin.go('/param/updatepaytypestate', {
+                paytype: obj.elem.value,
+                state: obj.elem.checked ? 'yes' : 'no',
+                optype: optype,
+                _csrf: token
+            }, function (data) {
+                if (data.code == 200) {
+                    layer.msg(data.msg, {icon: 1, time: 1000});
+                } else if (data.code == 401) {
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                        location.replace('/login');
+                    }, 1000);
+                    return;
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, function () {
+                layer.msg('请求失败了，请稍后再试', {icon: 2});
+                $(obj.elem).prop('checked', !obj.elem.checked);
+                form.render('checkbox');
+            });
+        }
+
+        table.on('edit(paytypeTable-filter)', function (obj) {
+            var row = obj.data; //得到所在行所有键值
+            var newval = obj.value; //得到修改后的值
+            admin.go('/param/updatepaytypename', {
+                paytype: row.paytype,
+                paydesc: newval,
+                _csrf: $("meta[name='_csrf_token']").attr("value"),
+            }, function (data) {
+                if (data.code == 200) {
+                    layer.msg("修改成功", {icon: 1, time: 1000});
+                } else if (data.code == 401) {
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                        location.replace('/login');
+                    }, 1000);
+                    return;
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    table.reload('paytypeTable');
+                }
+            },function () {
+                layer.msg('修改失败了，请稍后再试', {icon: 2});
+                table.reload('paytypeTable');
+            });
+        })
+
+        //监听单元格
+        table.on('tool(paytypeTable-filter)', function (obj) {
+            var data = obj.data;
+            if('del' == obj.event){
+                if (confirm("确定要删除支付方式[" + data.paytype + "_" + data.paydesc + "]吗？")) {
+                    layer.load(2);
+                    admin.go('/param/deletepaytype', {
+                        paytype: data.paytype,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, function (data) {
+                        console.log(data.code);
+                        layer.closeAll('loading');
+                        if (data.code == 200) {
+                            layer.msg(data.msg, {icon: 1, time: 1000});
+                        } else if (data.code == 401) {
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('/login');
+                            }, 1000);
+                            return;
+                        } else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                        table.reload('paytypeTable');
+                    }, function (ret) {
+                        console.log(ret);
+                        layer.closeAll('loading');
+                        layer.msg('请求失败了，请稍后再试', {icon: 2});
+                    });
+                }
+            }else if('config' ==obj.event){
+                admin.popupCenter({
+                    title: "配置参数【" + data.paytype + "_" + data.paydesc + "】",
+                    path: '/param/load4paytypeconfig?paytype='+data.paytype,
+                    area: '800px',
+                    finish: function () {
+                        table.reload('paytypeTable');
+                    }
+                });
+            }
+        });
     });
 </script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/param/paytypeconfig.html b/src/main/resources/templates/system/param/paytypeconfig.html
new file mode 100644
index 0000000..180e578
--- /dev/null
+++ b/src/main/resources/templates/system/param/paytypeconfig.html
@@ -0,0 +1,73 @@
+<form id="paytype-config-form" lay-filter="paytype-config-form" class="layui-form model-form">
+    <div class="layui-form-item" style="display: none;">
+        <input type="hidden" class="layui-input" id="hid_paytype" th:value="${paytype}"/>
+    </div>
+
+    <div class="layui-form-item" style="text-align: center;" th:if="${configlist.size()} le 0">
+        无配置项
+    </div>
+
+    <div class="layui-form-item" th:if="${configlist.size()} gt 0" th:each="config:${configlist}">
+        <label class="layui-form-label" th:text="${config.configid}">参数名</label>
+        <div class="layui-input-block">
+            <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+
+<script>
+    layui.use(['layer', 'admin', 'form'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            var vdata = data.field;
+            if(vdata.length <=0){
+                admin.finishPopupCenter();
+                return; //无配置项，直接关闭
+            }
+            var token=$("meta[name='_csrf_token']").attr("value");
+            vdata["hid_paytype"] = $("#hid_paytype").val();
+            debugger
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : '/param/addpaytypeconfig',
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data : JSON.stringify(vdata),
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/param/paytypeform.html b/src/main/resources/templates/system/param/paytypeform.html
new file mode 100644
index 0000000..705c9b2
--- /dev/null
+++ b/src/main/resources/templates/system/param/paytypeform.html
@@ -0,0 +1,115 @@
+<form id="paytype-form" lay-filter="form" class="layui-form model-form">
+    <div class="layui-form-item">
+        <label class="layui-form-label">支付方式</label>
+        <div class="layui-input-block">
+            <input name="paytype" placeholder="请输入支付方式代码" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required|paytype" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">名称</label>
+        <div class="layui-input-block">
+            <input name="paydesc" placeholder="请输入支付方式名称" type="text" class="layui-input" maxlength="30"
+                   lay-verify="required" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">状态</label>
+        <div class="layui-input-block">
+            <input name="enable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">能否充值</label>
+        <div class="layui-input-block">
+            <input name="chargeEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">能否消费</label>
+        <div class="layui-input-block">
+            <input name="consumeEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">匿名消费</label>
+        <div class="layui-input-block">
+            <input name="anonymousEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+
+<script>
+    layui.use(['layer', 'admin', 'form'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        form.render('checkbox');
+        form.verify({
+            "paytype": function (e) {
+                var msg = "";
+                $.ajax({
+                    type: "GET",
+                    url: '/param/checkpaytype',
+                    async: false,
+                    data: {
+                        paytype: e
+                    },
+                    success: function (result) {
+                        if (result.code != 200) {
+                            msg = result.msg;
+                        }
+                    },
+                    error: function (error) {
+                        msg = "请求服务器校验支付方式失败";
+                    }
+                });
+                if (msg != "") {
+                    return msg;
+                }
+            }
+        });
+
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            var vdata = data.field;
+            vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : '/param/addpaytype',
+                data : vdata,
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
