refactor: 重新整合API接口
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/annotation/IDNoCheck.java b/common/src/main/java/com/supwisdom/dlpay/api/annotation/IDNoCheck.java
index bf486db..1760452 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/annotation/IDNoCheck.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/annotation/IDNoCheck.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.api.annotation;
 
+import com.supwisdom.dlpay.api.util.IDTypes;
 import com.supwisdom.dlpay.api.validator.IDNoCheckValidator;
 
 import javax.validation.Constraint;
@@ -32,5 +33,5 @@
    *
    * @return
    */
-  String[] value();
+  IDTypes value();
 }
\ No newline at end of file
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiLoginInitResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiLoginInitResponse.java
new file mode 100644
index 0000000..5eb21d4
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiLoginInitResponse.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApiLoginInitResponse extends ApiResponse {
+  private String timestamp;
+  private String token;
+}
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiLoginResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiLoginResponse.java
new file mode 100644
index 0000000..1499408
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiLoginResponse.java
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApiLoginResponse extends ApiResponse {
+  private String jwt;
+  private String appid;
+  private String expiredAt;
+
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiResponse.java
similarity index 80%
rename from payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiResponse.java
rename to common/src/main/java/com/supwisdom/dlpay/api/bean/ApiResponse.java
index 4b18413..1f34e8c 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiResponse.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiResponse.java
@@ -1,4 +1,4 @@
-package com.supwisdom.dlpay.paysdk.bean;
+package com.supwisdom.dlpay.api.bean;
 
 
 import lombok.Getter;
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiVersionResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiVersionResponse.java
new file mode 100644
index 0000000..911777c
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/ApiVersionResponse.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApiVersionResponse extends ApiResponse {
+  private String version;
+}
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
new file mode 100644
index 0000000..c0b92e5
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenPayResponse.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class CitizenPayResponse extends ApiResponse {
+  private String refno;
+  private String billno;
+  private Double amount;
+}
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenShopParam.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenShopParam.java
index 4fc1ae1..3be30ad 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenShopParam.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenShopParam.java
@@ -1,9 +1,12 @@
 package com.supwisdom.dlpay.api.bean;
 
 import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.IDNoCheck;
+import com.supwisdom.dlpay.api.annotation.MobileNumber;
 import com.supwisdom.dlpay.api.annotation.Sign;
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
 import com.supwisdom.dlpay.api.annotation.ShopType;
+import com.supwisdom.dlpay.api.util.IDTypes;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -13,6 +16,7 @@
 
 @Getter
 @Setter
+@IDNoCheck(value = IDTypes.IDTYPE_LIST, idno = "idno", idtype = "idtype", message = "证件类型错误")
 public class OpenShopParam extends APIRequestParam {
   @Sign
   @NotEmpty(message = "商户唯一号不能为空")
@@ -33,6 +37,7 @@
   @Sign
   private String idno;
   @Sign
+  @MobileNumber
   private String mobile;
   @Sign
   @Email(message = "Email 格式错误")
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java
index 5ec9602..ceaae42 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/OpenUserParam.java
@@ -1,11 +1,13 @@
 package com.supwisdom.dlpay.api.bean;
 
 import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.IDNoCheck;
 import com.supwisdom.dlpay.api.annotation.MobileNumber;
 import com.supwisdom.dlpay.api.annotation.Sex;
 import com.supwisdom.dlpay.api.annotation.Sign;
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
 import com.supwisdom.dlpay.api.util.Constants;
+import com.supwisdom.dlpay.api.util.IDTypes;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.commons.lang3.StringUtils;
@@ -13,8 +15,10 @@
 import javax.validation.constraints.Email;
 import javax.validation.constraints.NotEmpty;
 
+
 @Setter
 @Getter
+@IDNoCheck(value = IDTypes.IDTYPE_LIST, idno = "idno", idtype = "idtype", message = "证件类型错误")
 public class OpenUserParam extends APIRequestParam {
   @Sign
   @NotEmpty(message = "用户唯一号不能为空")
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/PayReverseResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/PayReverseResponse.java
new file mode 100644
index 0000000..2c3c819
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/PayReverseResponse.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+@Setter
+public class PayReverseResponse extends ApiResponse {
+  private String refno;
+}
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/QueryTransDtlResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/QueryTransDtlResponse.java
new file mode 100644
index 0000000..118bd56
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/QueryTransDtlResponse.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class QueryTransDtlResponse extends ApiResponse {
+  private String refno;
+  private String outTradeNo;
+  private Double amount;
+  private String status;
+  private String sourceType;
+  private String payinfo;
+  private String reverseFlag;
+  private String transdesc;
+}
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/bean/ShopResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/ShopResponse.java
new file mode 100644
index 0000000..25dd194
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/ShopResponse.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ShopResponse extends ApiResponse {
+  private Integer shopid;
+  private String shopaccno;
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/UserResponse.java b/common/src/main/java/com/supwisdom/dlpay/api/bean/UserResponse.java
similarity index 69%
rename from payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/UserResponse.java
rename to common/src/main/java/com/supwisdom/dlpay/api/bean/UserResponse.java
index a646aed..1afe052 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/UserResponse.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/bean/UserResponse.java
@@ -1,10 +1,14 @@
-package com.supwisdom.dlpay.paysdk.bean;
+package com.supwisdom.dlpay.api.bean;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 @Getter
 @Setter
+@AllArgsConstructor
+@NoArgsConstructor
 public class UserResponse extends ApiResponse {
   private String userid;
   private String uid;
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/util/Constants.java b/common/src/main/java/com/supwisdom/dlpay/api/util/Constants.java
index da6d48f..3c4aebe 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/util/Constants.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/util/Constants.java
@@ -3,4 +3,5 @@
 public class Constants {
   public static final String SEX_MALE = "male";
   public static final String SEX_FEMALE = "female";
+
 }
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java b/common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java
new file mode 100644
index 0000000..999f37f
--- /dev/null
+++ b/common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.api.util;
+
+public enum IDTypes {
+  IDTYPE_IDCARD("idcard"), // 身份证
+  IDTYPE_PASSPORT("passport"), // 护照
+  IDTYPE_DRIVING_LICENSE("driving_license"), // 驾照
+  IDTYPE_HK_MACAU_PASS("hk_macau_pass"), // 港澳通行证
+  IDTYPE_STUDENT_IDCARD("student_idcard"), // 学生证
+  IDTYPE_OTHER("unknown"),
+  IDTYPE_LIST(new IDTypes[]{IDTYPE_IDCARD, IDTYPE_PASSPORT,
+      IDTYPE_DRIVING_LICENSE, IDTYPE_HK_MACAU_PASS, IDTYPE_STUDENT_IDCARD, IDTYPE_OTHER}); // 其它
+
+  IDTypes(Object data) {
+    this.data = data;
+  }
+
+  public String value() {
+    return this.data.toString();
+  }
+
+  public Object getData() {
+    return this.data;
+  }
+
+  private Object data;
+}
diff --git a/common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java b/common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java
index 5fba275..812ad55 100644
--- a/common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java
+++ b/common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java
@@ -1,18 +1,41 @@
 package com.supwisdom.dlpay.api.validator;
 
 import com.supwisdom.dlpay.api.annotation.IDNoCheck;
+import com.supwisdom.dlpay.api.util.IDTypes;
+import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
 
-public class IDNoCheckValidator implements ConstraintValidator<IDNoCheck, String> {
+public class IDNoCheckValidator implements ConstraintValidator<IDNoCheck, Object> {
   private String idnoField;
   private String idtypeField;
   private String[] idtypeList;
 
   @Override
-  public boolean isValid(String value, ConstraintValidatorContext context) {
+  public boolean isValid(Object value, ConstraintValidatorContext context) {
+    try {
+      String idtype = BeanUtils.getProperty(value, idtypeField);
+      if (idtype == null) {
+        return true;
+      }
+      if (!Arrays.asList(idtypeList).contains(idtype)) {
+        return false;
+      }
+      String idno = BeanUtils.getProperty(value, idnoField);
+      if (StringUtils.isEmpty(idno)) {
+        return false;
+      }
+    } catch (IllegalAccessException e) {
+      e.printStackTrace();
+    } catch (InvocationTargetException e) {
+      e.printStackTrace();
+    } catch (NoSuchMethodException e) {
+      e.printStackTrace();
+    }
     return false;
   }
 
@@ -23,6 +46,16 @@
     if (StringUtils.isEmpty(idnoField) || StringUtils.isEmpty(idtypeField)) {
       throw new IllegalArgumentException("IDNO 和 IDType 字段必须指定");
     }
-    idtypeList = constraintAnnotation.value();
+    Object value = constraintAnnotation.value().getData();
+    if (value instanceof IDTypes[]) {
+      idtypeList = new String[((IDTypes[]) value).length];
+      for (int i = 0; i < ((IDTypes[]) value).length; ++i) {
+        idtypeList[i] = ((IDTypes[]) value)[i].value();
+      }
+    } else if (value instanceof String) {
+      idtypeList = new String[]{(String) value};
+    } else {
+      throw new IllegalArgumentException("IDTypes 类型错误");
+    }
   }
 }
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java
index 3bb233c..ccd2a06 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java
@@ -1,7 +1,7 @@
 package com.supwisdom.dlpay.paysdk;
 
-import com.supwisdom.dlpay.paysdk.bean.ApiLoginInitResponse;
-import com.supwisdom.dlpay.paysdk.bean.ApiLoginResponse;
+import com.supwisdom.dlpay.api.bean.ApiLoginInitResponse;
+import com.supwisdom.dlpay.api.bean.ApiLoginResponse;
 import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
 import com.supwisdom.dlpay.paysdk.utils.JwtContext;
 import com.supwisdom.dlpay.paysdk.utils.Utils;
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginInitResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginInitResponse.java
deleted file mode 100644
index 405d4ae..0000000
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginInitResponse.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.supwisdom.dlpay.paysdk.bean;
-
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class ApiLoginInitResponse extends ApiResponse {
-  private String timestamp;
-  private String token;
-}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginResponse.java
deleted file mode 100644
index 787fe90..0000000
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginResponse.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.supwisdom.dlpay.paysdk.bean;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class ApiLoginResponse extends ApiResponse {
-  private String jwt;
-  private String appid;
-  private String expiredAt;
-
-}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/CitizenPayInitResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/CitizenPayInitResponse.java
deleted file mode 100644
index cf28b8b..0000000
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/CitizenPayInitResponse.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.supwisdom.dlpay.paysdk.bean;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class CitizenPayInitResponse extends ApiResponse {
-  private String refno;
-  private String billno;
-  private Double amount;
-}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ShopResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ShopResponse.java
deleted file mode 100644
index f4cec8c..0000000
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ShopResponse.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.supwisdom.dlpay.paysdk.bean;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class ShopResponse extends ApiResponse {
-  private Integer shopid;
-  private String shopaccno;
-}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiCommonProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiCommonProxy.java
new file mode 100644
index 0000000..47a8e53
--- /dev/null
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiCommonProxy.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.paysdk.proxy;
+
+import com.supwisdom.dlpay.api.bean.ApiVersionResponse;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@FeignClient(name = "apiCommonProxy", url = "${payapi.url}")
+public interface ApiCommonProxy {
+  @GetMapping(value = "/api/common/version")
+  ApiVersionResponse apiVersion();
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiLoginProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiLoginProxy.java
index 22d5427..f564a00 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiLoginProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiLoginProxy.java
@@ -1,15 +1,13 @@
 package com.supwisdom.dlpay.paysdk.proxy;
 
-import com.supwisdom.dlpay.paysdk.bean.ApiLoginInitResponse;
-import com.supwisdom.dlpay.paysdk.bean.ApiLoginResponse;
+import com.supwisdom.dlpay.api.bean.ApiLoginInitResponse;
+import com.supwisdom.dlpay.api.bean.ApiLoginResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 
-import javax.servlet.http.HttpServletRequest;
-
 @FeignClient(value = "apiLoginProxy", url = "${payapi.url}")
 public interface ApiLoginProxy {
   @RequestMapping(value = "/api/auth/gettoken", method = RequestMethod.GET)
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/CitizenCardPayProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/CitizenCardPayProxy.java
index d2e758f..e46d5f7 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/CitizenCardPayProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/CitizenCardPayProxy.java
@@ -2,7 +2,7 @@
 
 import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam;
 import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam;
-import com.supwisdom.dlpay.paysdk.bean.CitizenPayInitResponse;
+import com.supwisdom.dlpay.api.bean.CitizenPayResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -11,8 +11,8 @@
 @FeignClient(value = "citizenCardPay", url = "${payapi.url}")
 public interface CitizenCardPayProxy {
   @RequestMapping(value = "/api/consume/citizencard/payinit", method = RequestMethod.GET)
-  CitizenPayInitResponse citizencardPayinit(@RequestBody CitizenCardPayinitParam param);
+  CitizenPayResponse citizencardPayinit(@RequestBody CitizenCardPayinitParam param);
 
   @RequestMapping(value = "/api/consume/citizencard/payfinish", method = RequestMethod.GET)
-  CitizenPayInitResponse citizencardPayFinish(@RequestBody CitizenCardPayfinishParam param);
+  CitizenPayResponse citizencardPayFinish(@RequestBody CitizenCardPayfinishParam param);
 }
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/PayReverseProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/PayReverseProxy.java
deleted file mode 100644
index 827e685..0000000
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/PayReverseProxy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.supwisdom.dlpay.paysdk.proxy;
-
-import com.supwisdom.dlpay.api.bean.ConsumePayCancelParam;
-import com.supwisdom.dlpay.api.bean.ConsumePayRefundParam;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-
-import java.util.Map;
-
-@FeignClient(name = "payReverseProxy", url = "${payapi.url}")
-public interface PayReverseProxy {
-  @PostMapping("/api/consume/paycancel")
-  ResponseEntity<Map<String, String>> payCancel(@RequestBody ConsumePayCancelParam param);
-
-  @PostMapping("/api/consume/payrefund")
-  ResponseEntity<Map<String, String>> payRefund(@RequestBody ConsumePayRefundParam param);
-}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java
index e965ded..0184e91 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ShopProxy.java
@@ -2,7 +2,7 @@
 
 import com.supwisdom.dlpay.api.bean.OpenShopParam;
 import com.supwisdom.dlpay.api.bean.QueryShopParam;
-import com.supwisdom.dlpay.paysdk.bean.ShopResponse;
+import com.supwisdom.dlpay.api.bean.ShopResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/TransactionProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/TransactionProxy.java
new file mode 100644
index 0000000..570587a
--- /dev/null
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/TransactionProxy.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.paysdk.proxy;
+
+import com.supwisdom.dlpay.api.bean.*;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name = "payTransactionProxy", url = "${payapi.url}")
+public interface TransactionProxy {
+  @PostMapping("/api/consume/paycancel")
+  PayReverseResponse payCancel(@RequestBody ConsumePayCancelParam param);
+
+  @PostMapping("/api/consume/payrefund")
+  PayReverseResponse payRefund(@RequestBody ConsumePayRefundParam param);
+
+  @PostMapping("/api/consume/queryresult")
+  QueryTransDtlResponse queryDtlResult(@RequestBody QueryDtlResultParam param);
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
index 3420e6c..ddcf198 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
@@ -3,7 +3,7 @@
 import com.supwisdom.dlpay.api.bean.ModifyUserParam;
 import com.supwisdom.dlpay.api.bean.OpenUserParam;
 import com.supwisdom.dlpay.api.bean.QueryUserParam;
-import com.supwisdom.dlpay.paysdk.bean.UserResponse;
+import com.supwisdom.dlpay.api.bean.UserResponse;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index ff65c09..bd7f8d5 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -2,10 +2,10 @@
 
 
 import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam;
+import com.supwisdom.dlpay.api.bean.CitizenPayResponse;
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
 import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
 import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
-import com.supwisdom.dlpay.paysdk.bean.CitizenPayInitResponse;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
@@ -16,7 +16,6 @@
 import org.springframework.cloud.openfeign.FeignAutoConfiguration;
 import org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -53,7 +52,7 @@
     initParam.setAmount(100);
     initParam.setTransdate("20190708");
     initParam.setTranstime("172713");
-    CitizenPayInitResponse payInit = citizenCardPayProxy.citizencardPayinit(initParam);
+    CitizenPayResponse payInit = citizenCardPayProxy.citizencardPayinit(initParam);
     assertThat("pay initialized " + payInit.getRetmsg() + payInit.getException(),
         payInit.getRetcode(), equalTo(0));
   }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 4ecb7df..9479e50 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -42,15 +42,9 @@
     fun queryDtlResult(@RequestBody param: QueryDtlResultParam): ResponseEntity<Any> {
         consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", it.refno)
-                    .data("billno", it.outTradeNo)
-                    .data("amount", it.shopDtl.amount)
-                    .data("status", it.status)
-                    .data("sourcetype", it.personDtl.sourceType)
-                    .data("payinfo", it.personDtl.payinfo)
-                    .data("reverseflag", it.reverseFlag)
-                    .data("transdesc", it.shopDtl.transdesc)
-                    .success("查询成功"))
+                    .success(QueryTransDtlResponse(it.refno, it.outTradeNo, it.shopDtl.amount,
+                            it.status, it.sourceType, it.personDtl.payinfo, it.reverseFlag,
+                            it.shopDtl.transdesc), "查询成功"))
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
     }
@@ -188,10 +182,9 @@
                     }.init(transactionService)
 
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", transaction.refno)
-                    .data("billno", transaction.outTradeNo)
-                    .data("amount", transaction.shopDtl.amount)
-                    .success("交易初始化成功"))
+                    .success(CitizenPayResponse(transaction.refno,
+                            transaction.outTradeNo,
+                            transaction.shopDtl.amount), "交易初始化成功"))
         }
 
         return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -213,10 +206,9 @@
         if (code.retcode == "0") {
             transactionService.success(param.refno, "支付").let {
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", it.refno)
-                        .data("billno", it.outTradeNo)
-                        .data("amount", it.shopDtl.amount)
-                        .success("交易确认成功"))
+                        .success(CitizenPayResponse(it.refno,
+                                it.outTradeNo,
+                                it.shopDtl.amount), "交易确认成功"))
             }
 
         } else {
@@ -246,8 +238,7 @@
             }
             transactionService.success(cancelTrans.refno)
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", cancelTrans.refno)
-                    .success("交易确认成功"))
+                    .success(PayReverseResponse(cancelTrans.refno), "交易确认成功"))
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
     }
@@ -272,8 +263,7 @@
             }
             transactionService.success(refundTrans.refno)
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", refundTrans.refno)
-                    .success("交易确认成功"))
+                    .success(PayReverseResponse(refundTrans.refno), "交易确认成功"))
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
     }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
index 3d2e5d2..a55845f 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.framework.controller
 
 import com.jcabi.manifests.Manifests
+import com.supwisdom.dlpay.api.bean.ApiVersionResponse
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.GetMapping
@@ -16,13 +17,11 @@
         return try {
             Manifests.read("Payapi-Version").let {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("version", it)
-                        .success())
+                        .success(ApiVersionResponse(it)))
             }
         } catch (e: IllegalArgumentException) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("version", "unknown")
-                    .success())
+                    .success(ApiVersionResponse("unknown")))
         }
     }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index 81f099d..84c0f8a 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.framework.controller
 
 import com.google.code.kaptcha.Producer
+import com.supwisdom.dlpay.api.bean.ApiLoginInitResponse
+import com.supwisdom.dlpay.api.bean.ApiLoginResponse
 import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.core.JwtConfig
@@ -99,9 +101,7 @@
                 apiClientRepository.save(it)
             }
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("token", token)
-                    .data("timestamp", now)
-                    .success())
+                    .success(ApiLoginInitResponse(token, now)))
         }
     }
 
@@ -137,10 +137,8 @@
                 }
 
                 ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("jwt", token.jwtToken)
-                        .data("appid", appid)
-                        .data("expiredAt", DateUtil.getUTCTime(token.expiration.valueInMillis))
-                        .success())
+                        .success(ApiLoginResponse(token.jwtToken,
+                                appid, DateUtil.getUTCTime(token.expiration.valueInMillis))))
             } else {
                 ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
             }
@@ -173,10 +171,8 @@
                 }
 
                 ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("jwt", token.jwtToken)
-                        .data("appid", appid)
-                        .data("expiredAt", DateUtil.getUTCTime(token.expiration.valueInMillis))
-                        .success())
+                        .success(ApiLoginResponse(token.jwtToken,
+                                appid, DateUtil.getUTCTime(token.expiration.valueInMillis))))
             } else {
                 ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
             }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
index b25a725..1f63e38 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.framework
 
 import com.google.gson.Gson
+import com.supwisdom.dlpay.api.APIRequestParam
+import com.supwisdom.dlpay.api.bean.ApiResponse
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.exception.TransactionException
@@ -36,6 +38,12 @@
         return build()
     }
 
+    fun success(bean: ApiResponse, msg: String? = null): ApiResponse {
+        bean.retcode = 0
+        bean.retmsg = msg ?: "成功"
+        return bean
+    }
+
     fun fail(code: Int, msg: String): Map<String, Any> {
         if (code == 0) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "错误码未正确定义")
@@ -44,6 +52,15 @@
         return build()
     }
 
+    fun fail(bean: ApiResponse, code: Int, msg: String): ApiResponse {
+        if (code == 0) {
+            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "错误码未正确定义")
+        }
+        bean.retcode = code
+        bean.retmsg = msg
+        return bean
+    }
+
     fun exception(code: Int, exception: Exception, msg: String? = null): Map<String, Any> {
         data("exception", exception.message ?: "$exception")
         result(code, msg)
@@ -56,18 +73,39 @@
         return build()
     }
 
+    fun exception(bean: ApiResponse, code: Int, cause: Throwable?, msg: String? = null): ApiResponse {
+        bean.retcode = code
+        bean.retmsg = msg ?: "失败"
+        bean.exception = cause?.message ?: "unknown exception"
+        return bean
+    }
+
     fun transException(exception: TransactionException, msg: String): Map<String, Any> {
         data("exception", exception.message!!)
         result(exception.code(), "$msg - [${exception.message}]")
         return build()
     }
 
+    fun transException(bean: ApiResponse, exception: TransactionException, msg: String): ApiResponse {
+        bean.retcode = exception.code()
+        bean.retmsg = "$msg - [${exception.message}]"
+        bean.exception = "$exception"
+        return bean
+    }
+
     fun requestException(exception: RequestParamCheckException, msg: String): Map<String, Any> {
         data("exception", exception.message!!)
         result(exception.errCode, "$msg - [${exception.message}]")
         return build()
     }
 
+    fun requestException(bean: ApiResponse, exception: RequestParamCheckException, msg: String): ApiResponse {
+        bean.retcode = exception.errCode
+        bean.retmsg = "$msg - [${exception.message}]"
+        bean.exception = "$exception"
+        return bean
+    }
+
     fun data(name: String, value: Any): ResponseBodyBuilder {
         if (name in RESERVED_KEY) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "返回值 <$name> 为保留值,不能使用")