From 03a858f2882bedeb5925b65cb045ccbbb1202329 Mon Sep 17 00:00:00 2001
From: wayne <wayne8692wayne8692@gmail.com>
Date: 星期三, 24 十一月 2021 16:01:04 +0800
Subject: [PATCH] [update] otp呼叫方式調整,並針對sit版本除錯

---
 pamapi/src/main/java/tw/com/softleader/otp/ws/package-info.java                      |    2 
 pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java                       |   58 
 pamapi/src/main/java/tw/com/softleader/otp/ws/StringArray.java                       |   69 +
 pamapi/.gitignore                                                                    |    1 
 pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWebService.java                     |   87 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMS.java                         |  141 +++
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmailResponse.java            |   62 +
 pamapi/src/main/resources/config/application-sit.yml                                 |    2 
 pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java                  |   45 
 pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java                  |   19 
 pamapi/src/main/java/tw/com/softleader/otp/ws/ObjectFactory.java                     |  483 ++++++++++
 pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java                        |   29 
 pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java                |   18 
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrderResponse.java         |   62 +
 pamapi/pom.xml                                                                       |    7 
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrder.java                 |  141 +++
 pamapi/src/main/resources/config/application-dev.yml                                 |    6 
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmail.java                    |  114 ++
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMS.java                      |  114 ++
 pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySms.java                         |  114 ++
 pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWeb.java                            |  173 +++
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSResponse.java                 |   62 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtp.java                         |  141 +++
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrderResponse.java            |   62 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtpResponse.java                 |   62 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySmsResponse.java                 |   62 +
 /dev/null                                                                            |    0 
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSResponse.java              |   62 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByCondition.java             |  114 ++
 pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogId.java         |   60 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByConditionResponse.java     |   62 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrder.java                    |  168 +++
 pamapi/src/main/java/tw/com/softleader/otp/ws/GetHelloResponse.java                  |   62 +
 pamapi/src/main/resources/config/application-uat.yml                                 |    4 
 pamapi/src/main/java/tw/com/softleader/otp/ws/GetHello.java                          |   60 +
 pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogIdResponse.java |   62 +
 36 files changed, 2,705 insertions(+), 85 deletions(-)

diff --git a/pamapi/.gitignore b/pamapi/.gitignore
index d9ec5f6..386768e 100644
--- a/pamapi/.gitignore
+++ b/pamapi/.gitignore
@@ -94,7 +94,6 @@
 *.war
 *.ear
 *.db
-!pcalife-otp.jar
 !spring-core-5.3.5.jar
 
 ######################
diff --git a/pamapi/pom.xml b/pamapi/pom.xml
index 76a25f6..d49b823 100644
--- a/pamapi/pom.xml
+++ b/pamapi/pom.xml
@@ -344,13 +344,6 @@
             <artifactId>wsdl4j</artifactId>
             <version>1.6.2</version>
         </dependency>
-        <dependency>
-            <groupId>com.pcalife.otp</groupId>
-            <artifactId>pollex</artifactId>
-            <version>1.1.0</version>
-            <scope>system</scope>
-            <systemPath>${project.basedir}/src/main/resources/WEB-INF/lib/pcalife-otp.jar</systemPath>
-        </dependency>
 
         <!--
 
diff --git a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java
index 68ed03f..6f79c28 100644
--- a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java
+++ b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java
@@ -16,6 +16,8 @@
     private String otpWebServicePassword;
     private String otpWebServiceSystemType;
     private String eServiceLoginUrl;
+    private String eServiceLoginFunc;
+    private String eServiceLoginSys;
 
     public boolean isMockLogin() {
         return mockLogin;
@@ -56,4 +58,20 @@
     public void seteServiceLoginUrl(String eServiceLoginUrl) {
         this.eServiceLoginUrl = eServiceLoginUrl;
     }
+
+    public String geteServiceLoginFunc() {
+        return eServiceLoginFunc;
+    }
+
+    public void seteServiceLoginFunc(String eServiceLoginFunc) {
+        this.eServiceLoginFunc = eServiceLoginFunc;
+    }
+
+    public String geteServiceLoginSys() {
+        return eServiceLoginSys;
+    }
+
+    public void seteServiceLoginSys(String eServiceLoginSys) {
+        this.eServiceLoginSys = eServiceLoginSys;
+    }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java b/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java
index 144e202..b61ef34 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/OtpWebService.java
@@ -6,11 +6,11 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import tw.com.softleader.otp.ws.OtpWebServiceLocator;
-import tw.com.softleader.otp.ws.OtpWebServicePortBindingStub;
+import tw.com.softleader.otp.ws.OtpWeb;
+import tw.com.softleader.otp.ws.StringArray;
 
-import javax.xml.rpc.ServiceException;
-import java.rmi.RemoteException;
+import java.net.MalformedURLException;
+import java.net.URL;
 
 @Service
 public class OtpWebService {
@@ -20,43 +20,47 @@
     @Autowired
     ApplicationProperties applicationProperty;
 
-    public OtpResponseDTO sendByPhone(String phone) throws ServiceException, RemoteException {
-        OtpWebServicePortBindingStub stub = getOtpWebServicePortBindingStub();
-        log.info("call OtpService sendOtpBySMS, url = {}, systemType = {}, service password = {}, phone = {}",
+    public OtpResponseDTO sendByPhone(String phone) {
+        OtpWeb otpWS = getOtpWebService();
+        log.debug("call OtpService sendOtpBySMS, url = {}, systemType = {}, service password = {}, phone = {}",
             applicationProperty.getOtpWebServiceUrl(), applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), phone);
 
-        String[] result =
-            stub.sendOtpBySMS(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), phone);
+        StringArray result =
+            otpWS.sendOtpBySMS(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), phone);
 
-        return new OtpResponseDTO(result);
+        return new OtpResponseDTO(result.getItem());
     }
 
-    public OtpResponseDTO sendByEmail(String email) throws ServiceException, RemoteException {
-        OtpWebServicePortBindingStub stub = getOtpWebServicePortBindingStub();
-        log.info("call OtpService sendByEmail, url = {}, systemType = {}, service password = {}, email = {}",
+    public OtpResponseDTO sendByEmail(String email) {
+        OtpWeb otpWS = getOtpWebService();
+        log.debug("call OtpService sendByEmail, url = {}, systemType = {}, service password = {}, email = {}",
             applicationProperty.getOtpWebServiceUrl(), applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), email);
 
-        String[] result =
-            stub.sendOtpByEmail(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), email);
+        StringArray result =
+            otpWS.sendOtpByEmail(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), email);
 
-        return new OtpResponseDTO(result);
+        return new OtpResponseDTO(result.getItem());
     }
 
-    public OtpResponseDTO verifyOTP(String indexKey, String otpCode) throws ServiceException, RemoteException {
-        OtpWebServicePortBindingStub stub = getOtpWebServicePortBindingStub();
-        log.info("call OtpService verifyOTP, url = {}, systemType = {}, service password = {}, indexKey = {}, otpCode = {}",
+    public OtpResponseDTO verifyOTP(String indexKey, String otpCode) {
+        OtpWeb otpWS = getOtpWebService();
+        log.debug("call OtpService verifyOTP, url = {}, systemType = {}, service password = {}, indexKey = {}, otpCode = {}",
             applicationProperty.getOtpWebServiceUrl(), applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), indexKey, otpCode);
 
-        String[] result =
-            stub.verifyOtp(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), indexKey, otpCode);
+        StringArray result =
+            otpWS.verifyOtp(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), indexKey, otpCode);
 
-        return new OtpResponseDTO(result);
+        return new OtpResponseDTO(result.getItem());
     }
 
-    public OtpWebServicePortBindingStub getOtpWebServicePortBindingStub() throws ServiceException {
-        OtpWebServiceLocator locator = new OtpWebServiceLocator();
-        locator.setOtpWebServicePortEndpointAddress(applicationProperty.getOtpWebServiceUrl());
-
-        return (OtpWebServicePortBindingStub) locator.getOtpWebServicePort();
+    public OtpWeb getOtpWebService() {
+        final String wsUrl = applicationProperty.getOtpWebServiceUrl();
+        try {
+            tw.com.softleader.otp.ws.OtpWebService locator
+                = new tw.com.softleader.otp.ws.OtpWebService(new URL(wsUrl));
+            return locator.getOtpWebPort();
+        } catch (MalformedURLException e) {
+            throw new IllegalArgumentException("Invalid url: " + wsUrl, e);
+        }
     }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java b/pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java
index 758001a..1919516 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/dto/OtpResponseDTO.java
@@ -1,5 +1,8 @@
 package com.pollex.pam.service.dto;
 
+import java.util.Arrays;
+import java.util.List;
+
 public class OtpResponseDTO {
     private final String indexKey;
     private final boolean success;
@@ -7,14 +10,18 @@
     private final String failReason;
 
     public OtpResponseDTO(String[] strings) {
-        if(strings.length == 4) {
-            this.indexKey = strings[0];
-            this.success = "0".equals(strings[1]);
-            this.failCode = strings[2];
-            this.failReason = strings[3];
+        this(Arrays.asList(strings));
+    }
+
+    public OtpResponseDTO(List<String> strings) {
+        if(strings.size() == 4) {
+            this.indexKey = strings.get(0);
+            this.success = "0".equals(strings.get(1));
+            this.failCode = strings.get(2);
+            this.failReason = strings.get(3);
         }
         else {
-            throw new RuntimeException("the otp response can't format");
+            throw new IllegalArgumentException("the otp response can't format: " + strings);
         }
     }
 
diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java
index 6308dac..65abd26 100644
--- a/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java
+++ b/pamapi/src/main/java/com/pollex/pam/web/rest/OtpResource.java
@@ -21,6 +21,7 @@
 
 import javax.xml.rpc.ServiceException;
 import java.rmi.RemoteException;
+import java.util.Arrays;
 import java.util.UUID;
 
 @RestController
@@ -43,22 +44,18 @@
 
     @PostMapping("/sendOtp")
     public ResponseEntity<Object> sendOtp(@RequestBody OtpLoginVM login) {
-        try {
-            if(applicationProperty.isMockLogin()) {
-                return new ResponseEntity<>(getMockSendOtpResponse(), HttpStatus.OK);
-            }
-
-            if(login.getLoginType() == OtpLoginTypeEnum.SMS) {
-                return new ResponseEntity<>(otpWebService.sendByPhone(login.getAccount()), HttpStatus.OK);
-            }
-            else if(login.getLoginType() == OtpLoginTypeEnum.EMAIL) {
-                return new ResponseEntity<>(otpWebService.sendByEmail(login.getAccount()), HttpStatus.OK);
-            }
-
-            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("can not support this login type, loginType = " + login.getLoginType().name());
-        } catch (ServiceException | RemoteException e) {
-            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("connecting otp web service error");
+        if(applicationProperty.isMockLogin()) {
+            return new ResponseEntity<>(getMockSendOtpResponse(), HttpStatus.OK);
         }
+
+        if(login.getLoginType() == OtpLoginTypeEnum.SMS) {
+            return new ResponseEntity<>(otpWebService.sendByPhone(login.getAccount()), HttpStatus.OK);
+        }
+        else if(login.getLoginType() == OtpLoginTypeEnum.EMAIL) {
+            return new ResponseEntity<>(otpWebService.sendByEmail(login.getAccount()), HttpStatus.OK);
+        }
+
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("can not support this login type, loginType = " + login.getLoginType().name());
     }
 
     @PostMapping("/verify")
@@ -79,6 +76,6 @@
 
     private OtpResponseDTO getMockSendOtpResponse() {
         String indexKey = UUID.randomUUID().toString().substring(0, 8);
-        return new OtpResponseDTO(new String[]{indexKey, "0", "", ""});
+        return new OtpResponseDTO(Arrays.asList(indexKey, "0", "", ""));
     }
 }
diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java
index f9b11dc..d4286dc 100644
--- a/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java
+++ b/pamapi/src/main/java/com/pollex/pam/web/rest/TestLoginResource.java
@@ -29,11 +29,9 @@
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestTemplate;
-import tw.com.softleader.otp.ws.OtpWebServicePortBindingStub;
+import org.springframework.web.util.UriComponentsBuilder;
 
 import javax.net.ssl.SSLContext;
-import javax.xml.rpc.ServiceException;
-import java.rmi.RemoteException;
 import java.security.KeyManagementException;
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
@@ -41,6 +39,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
 
 
 // todo嚗����login�靘蹂蝙��get��撘�嚗��歇��OtpResource��ServiceResource嚗蜓閬�����
@@ -67,48 +66,44 @@
     TokenProvider tokenProvider;
 
     @GetMapping("/bySMS")
-    public ResponseEntity<OtpResponseDTO> sendOtpBySMS(@RequestParam("phone") String phone) throws ServiceException, RemoteException {
+    public ResponseEntity<OtpResponseDTO> sendOtpBySMS(@RequestParam("phone") String phone) {
         final OtpResponseDTO otpResponseDTO = otpWebService.sendByPhone(phone);
         return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
     }
 
     @GetMapping("/byEmail")
-    public ResponseEntity<OtpResponseDTO> sendOtpByEmail(@RequestParam("email") String email) throws RemoteException, ServiceException {
+    public ResponseEntity<OtpResponseDTO> sendOtpByEmail(@RequestParam("email") String email) {
         final OtpResponseDTO otpResponseDTO = otpWebService.sendByEmail(email);
         return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
     }
 
     @GetMapping("/verifyOtp")
-    public ResponseEntity<OtpResponseDTO> verifyOtp(@RequestParam("account") String account, @RequestParam("indexKey") String indexKey, @RequestParam("otpCode") String otpCode) throws ServiceException, RemoteException {
-        OtpWebServicePortBindingStub stub = otpWebService.getOtpWebServicePortBindingStub();
-        log.info("call OtpService verifyOTP, systemType = {}, service password = {}, indexKey = {}, paxxword = {}",
-            applicationProperty.getOtpWebServiceSystemType(), applicationProperty.getOtpWebServicePassword(), indexKey, otpCode);
-
-        String[] result =
-            stub.verifyOtp(applicationProperty.getOtpWebServicePassword(), applicationProperty.getOtpWebServiceSystemType(), indexKey, otpCode);
-
-        return new ResponseEntity<>(new OtpResponseDTO(result), HttpStatus.OK);
+    public ResponseEntity<OtpResponseDTO> verifyOtp(@RequestParam("account") String account, @RequestParam("indexKey") String indexKey, @RequestParam("otpCode") String otpCode) {
+        final OtpResponseDTO otpResponseDTO = otpWebService.verifyOTP(indexKey, otpCode);
+        return new ResponseEntity<>(otpResponseDTO, HttpStatus.OK);
     }
 
     @GetMapping("/byEService")
     public ResponseEntity<EServiceResponse> loginByEService(@RequestParam("account") String account, @RequestParam("password") String password) throws Exception {
-        EServiceRequest dto = new EServiceRequest();
-        dto.setFunc("ValidateUserLogin");
-        dto.setId(account);
-        dto.setPin(password);
-        dto.setPwd(password);
-        dto.setSys("epos");
-
-        String dtoJson = new ObjectMapper().writeValueAsString(dto);
-
         RestTemplate restTemplate = getTrustAllRestTemplate();
         settingMessageConvertesToSpecifyType(restTemplate, MediaType.ALL);
+
+        String urlTemplate = UriComponentsBuilder.fromHttpUrl(applicationProperty.geteServiceLoginUrl())
+            .queryParam("func", applicationProperty.geteServiceLoginFunc())
+            .queryParam("id", account)
+            .queryParam("pin", password)
+            .queryParam("pwd", password)
+            .queryParam("sys", applicationProperty.geteServiceLoginSys())
+            .queryParam("transactionId", UUID.randomUUID().toString())
+            .encode().toUriString();
+
+        log.debug("http get loginByEService, url = {}", urlTemplate);
 
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
 
-        HttpEntity<String> entity = new HttpEntity<>(dtoJson, headers);
-        return restTemplate.exchange(applicationProperty.geteServiceLoginUrl(), HttpMethod.POST, entity, EServiceResponse.class);
+        HttpEntity<String> entity = new HttpEntity<>(headers);
+        return restTemplate.exchange(urlTemplate, HttpMethod.GET, entity, EServiceResponse.class);
     }
 
     private void settingMessageConvertesToSpecifyType(RestTemplate restTemplate, MediaType mediaType) {
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByCondition.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByCondition.java
new file mode 100644
index 0000000..8b237a9
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByCondition.java
@@ -0,0 +1,114 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>findOtpLogByCondition complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="findOtpLogByCondition"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "findOtpLogByCondition", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2"
+})
+public class FindOtpLogByCondition {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByConditionResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByConditionResponse.java
new file mode 100644
index 0000000..051fece
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogByConditionResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>findOtpLogByConditionResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="findOtpLogByConditionResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "findOtpLogByConditionResponse", propOrder = {
+    "_return"
+})
+public class FindOtpLogByConditionResponse {
+
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogId.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogId.java
new file mode 100644
index 0000000..47b8a10
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogId.java
@@ -0,0 +1,60 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>findOtpLogTraceByOtpLogId complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="findOtpLogTraceByOtpLogId"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "findOtpLogTraceByOtpLogId", propOrder = {
+    "arg0"
+})
+public class FindOtpLogTraceByOtpLogId {
+
+    protected String arg0;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogIdResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogIdResponse.java
new file mode 100644
index 0000000..9dc96e7
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/FindOtpLogTraceByOtpLogIdResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>findOtpLogTraceByOtpLogIdResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="findOtpLogTraceByOtpLogIdResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "findOtpLogTraceByOtpLogIdResponse", propOrder = {
+    "_return"
+})
+public class FindOtpLogTraceByOtpLogIdResponse {
+
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/GetHello.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/GetHello.java
new file mode 100644
index 0000000..dd1bb58
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/GetHello.java
@@ -0,0 +1,60 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>getHello complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="getHello"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "getHello", propOrder = {
+    "arg0"
+})
+public class GetHello {
+
+    protected String arg0;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/GetHelloResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/GetHelloResponse.java
new file mode 100644
index 0000000..bd4ce51
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/GetHelloResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>getHelloResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="getHelloResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "getHelloResponse", propOrder = {
+    "_return"
+})
+public class GetHelloResponse {
+
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/ObjectFactory.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/ObjectFactory.java
new file mode 100644
index 0000000..b9c6142
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/ObjectFactory.java
@@ -0,0 +1,483 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each 
+ * Java content interface and Java element interface 
+ * generated in the tw.com.softleader.otp.ws package. 
+ * <p>An ObjectFactory allows you to programatically 
+ * construct new instances of the Java representation 
+ * for XML content. The Java representation of XML 
+ * content can consist of schema derived interfaces 
+ * and classes representing the binding of schema 
+ * type definitions, element declarations and model 
+ * groups.  Factory methods for each of these are 
+ * provided in this class.
+ * 
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+    private final static QName _FindOtpLogByCondition_QNAME = new QName("http://ws.otp.softleader.com.tw/", "findOtpLogByCondition");
+    private final static QName _FindOtpLogByConditionResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "findOtpLogByConditionResponse");
+    private final static QName _FindOtpLogTraceByOtpLogId_QNAME = new QName("http://ws.otp.softleader.com.tw/", "findOtpLogTraceByOtpLogId");
+    private final static QName _FindOtpLogTraceByOtpLogIdResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "findOtpLogTraceByOtpLogIdResponse");
+    private final static QName _GetHello_QNAME = new QName("http://ws.otp.softleader.com.tw/", "getHello");
+    private final static QName _GetHelloResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "getHelloResponse");
+    private final static QName _SendBySMS_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendBySMS");
+    private final static QName _SendBySMSOrder_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendBySMSOrder");
+    private final static QName _SendBySMSOrderResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendBySMSOrderResponse");
+    private final static QName _SendBySMSResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendBySMSResponse");
+    private final static QName _SendOtpByEmail_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendOtpByEmail");
+    private final static QName _SendOtpByEmailResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendOtpByEmailResponse");
+    private final static QName _SendOtpBySMS_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendOtpBySMS");
+    private final static QName _SendOtpBySMSOrder_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendOtpBySMSOrder");
+    private final static QName _SendOtpBySMSOrderResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendOtpBySMSOrderResponse");
+    private final static QName _SendOtpBySMSResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "sendOtpBySMSResponse");
+    private final static QName _VerifyOtp_QNAME = new QName("http://ws.otp.softleader.com.tw/", "verifyOtp");
+    private final static QName _VerifyOtpResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "verifyOtpResponse");
+    private final static QName _VerifySms_QNAME = new QName("http://ws.otp.softleader.com.tw/", "verifySms");
+    private final static QName _VerifySmsResponse_QNAME = new QName("http://ws.otp.softleader.com.tw/", "verifySmsResponse");
+
+    /**
+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: tw.com.softleader.otp.ws
+     * 
+     */
+    public ObjectFactory() {
+    }
+
+    /**
+     * Create an instance of {@link FindOtpLogByCondition }
+     * 
+     */
+    public FindOtpLogByCondition createFindOtpLogByCondition() {
+        return new FindOtpLogByCondition();
+    }
+
+    /**
+     * Create an instance of {@link FindOtpLogByConditionResponse }
+     * 
+     */
+    public FindOtpLogByConditionResponse createFindOtpLogByConditionResponse() {
+        return new FindOtpLogByConditionResponse();
+    }
+
+    /**
+     * Create an instance of {@link FindOtpLogTraceByOtpLogId }
+     * 
+     */
+    public FindOtpLogTraceByOtpLogId createFindOtpLogTraceByOtpLogId() {
+        return new FindOtpLogTraceByOtpLogId();
+    }
+
+    /**
+     * Create an instance of {@link FindOtpLogTraceByOtpLogIdResponse }
+     * 
+     */
+    public FindOtpLogTraceByOtpLogIdResponse createFindOtpLogTraceByOtpLogIdResponse() {
+        return new FindOtpLogTraceByOtpLogIdResponse();
+    }
+
+    /**
+     * Create an instance of {@link GetHello }
+     * 
+     */
+    public GetHello createGetHello() {
+        return new GetHello();
+    }
+
+    /**
+     * Create an instance of {@link GetHelloResponse }
+     * 
+     */
+    public GetHelloResponse createGetHelloResponse() {
+        return new GetHelloResponse();
+    }
+
+    /**
+     * Create an instance of {@link SendBySMS }
+     * 
+     */
+    public SendBySMS createSendBySMS() {
+        return new SendBySMS();
+    }
+
+    /**
+     * Create an instance of {@link SendBySMSOrder }
+     * 
+     */
+    public SendBySMSOrder createSendBySMSOrder() {
+        return new SendBySMSOrder();
+    }
+
+    /**
+     * Create an instance of {@link SendBySMSOrderResponse }
+     * 
+     */
+    public SendBySMSOrderResponse createSendBySMSOrderResponse() {
+        return new SendBySMSOrderResponse();
+    }
+
+    /**
+     * Create an instance of {@link SendBySMSResponse }
+     * 
+     */
+    public SendBySMSResponse createSendBySMSResponse() {
+        return new SendBySMSResponse();
+    }
+
+    /**
+     * Create an instance of {@link SendOtpByEmail }
+     * 
+     */
+    public SendOtpByEmail createSendOtpByEmail() {
+        return new SendOtpByEmail();
+    }
+
+    /**
+     * Create an instance of {@link SendOtpByEmailResponse }
+     * 
+     */
+    public SendOtpByEmailResponse createSendOtpByEmailResponse() {
+        return new SendOtpByEmailResponse();
+    }
+
+    /**
+     * Create an instance of {@link SendOtpBySMS }
+     * 
+     */
+    public SendOtpBySMS createSendOtpBySMS() {
+        return new SendOtpBySMS();
+    }
+
+    /**
+     * Create an instance of {@link SendOtpBySMSOrder }
+     * 
+     */
+    public SendOtpBySMSOrder createSendOtpBySMSOrder() {
+        return new SendOtpBySMSOrder();
+    }
+
+    /**
+     * Create an instance of {@link SendOtpBySMSOrderResponse }
+     * 
+     */
+    public SendOtpBySMSOrderResponse createSendOtpBySMSOrderResponse() {
+        return new SendOtpBySMSOrderResponse();
+    }
+
+    /**
+     * Create an instance of {@link SendOtpBySMSResponse }
+     * 
+     */
+    public SendOtpBySMSResponse createSendOtpBySMSResponse() {
+        return new SendOtpBySMSResponse();
+    }
+
+    /**
+     * Create an instance of {@link VerifyOtp }
+     * 
+     */
+    public VerifyOtp createVerifyOtp() {
+        return new VerifyOtp();
+    }
+
+    /**
+     * Create an instance of {@link VerifyOtpResponse }
+     * 
+     */
+    public VerifyOtpResponse createVerifyOtpResponse() {
+        return new VerifyOtpResponse();
+    }
+
+    /**
+     * Create an instance of {@link VerifySms }
+     * 
+     */
+    public VerifySms createVerifySms() {
+        return new VerifySms();
+    }
+
+    /**
+     * Create an instance of {@link VerifySmsResponse }
+     * 
+     */
+    public VerifySmsResponse createVerifySmsResponse() {
+        return new VerifySmsResponse();
+    }
+
+    /**
+     * Create an instance of {@link StringArray }
+     * 
+     */
+    public StringArray createStringArray() {
+        return new StringArray();
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link FindOtpLogByCondition }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link FindOtpLogByCondition }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "findOtpLogByCondition")
+    public JAXBElement<FindOtpLogByCondition> createFindOtpLogByCondition(FindOtpLogByCondition value) {
+        return new JAXBElement<FindOtpLogByCondition>(_FindOtpLogByCondition_QNAME, FindOtpLogByCondition.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link FindOtpLogByConditionResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link FindOtpLogByConditionResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "findOtpLogByConditionResponse")
+    public JAXBElement<FindOtpLogByConditionResponse> createFindOtpLogByConditionResponse(FindOtpLogByConditionResponse value) {
+        return new JAXBElement<FindOtpLogByConditionResponse>(_FindOtpLogByConditionResponse_QNAME, FindOtpLogByConditionResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link FindOtpLogTraceByOtpLogId }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link FindOtpLogTraceByOtpLogId }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "findOtpLogTraceByOtpLogId")
+    public JAXBElement<FindOtpLogTraceByOtpLogId> createFindOtpLogTraceByOtpLogId(FindOtpLogTraceByOtpLogId value) {
+        return new JAXBElement<FindOtpLogTraceByOtpLogId>(_FindOtpLogTraceByOtpLogId_QNAME, FindOtpLogTraceByOtpLogId.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link FindOtpLogTraceByOtpLogIdResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link FindOtpLogTraceByOtpLogIdResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "findOtpLogTraceByOtpLogIdResponse")
+    public JAXBElement<FindOtpLogTraceByOtpLogIdResponse> createFindOtpLogTraceByOtpLogIdResponse(FindOtpLogTraceByOtpLogIdResponse value) {
+        return new JAXBElement<FindOtpLogTraceByOtpLogIdResponse>(_FindOtpLogTraceByOtpLogIdResponse_QNAME, FindOtpLogTraceByOtpLogIdResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link GetHello }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link GetHello }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "getHello")
+    public JAXBElement<GetHello> createGetHello(GetHello value) {
+        return new JAXBElement<GetHello>(_GetHello_QNAME, GetHello.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link GetHelloResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link GetHelloResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "getHelloResponse")
+    public JAXBElement<GetHelloResponse> createGetHelloResponse(GetHelloResponse value) {
+        return new JAXBElement<GetHelloResponse>(_GetHelloResponse_QNAME, GetHelloResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendBySMS }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendBySMS }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendBySMS")
+    public JAXBElement<SendBySMS> createSendBySMS(SendBySMS value) {
+        return new JAXBElement<SendBySMS>(_SendBySMS_QNAME, SendBySMS.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendBySMSOrder }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendBySMSOrder }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendBySMSOrder")
+    public JAXBElement<SendBySMSOrder> createSendBySMSOrder(SendBySMSOrder value) {
+        return new JAXBElement<SendBySMSOrder>(_SendBySMSOrder_QNAME, SendBySMSOrder.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendBySMSOrderResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendBySMSOrderResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendBySMSOrderResponse")
+    public JAXBElement<SendBySMSOrderResponse> createSendBySMSOrderResponse(SendBySMSOrderResponse value) {
+        return new JAXBElement<SendBySMSOrderResponse>(_SendBySMSOrderResponse_QNAME, SendBySMSOrderResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendBySMSResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendBySMSResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendBySMSResponse")
+    public JAXBElement<SendBySMSResponse> createSendBySMSResponse(SendBySMSResponse value) {
+        return new JAXBElement<SendBySMSResponse>(_SendBySMSResponse_QNAME, SendBySMSResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendOtpByEmail }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendOtpByEmail }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendOtpByEmail")
+    public JAXBElement<SendOtpByEmail> createSendOtpByEmail(SendOtpByEmail value) {
+        return new JAXBElement<SendOtpByEmail>(_SendOtpByEmail_QNAME, SendOtpByEmail.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendOtpByEmailResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendOtpByEmailResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendOtpByEmailResponse")
+    public JAXBElement<SendOtpByEmailResponse> createSendOtpByEmailResponse(SendOtpByEmailResponse value) {
+        return new JAXBElement<SendOtpByEmailResponse>(_SendOtpByEmailResponse_QNAME, SendOtpByEmailResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendOtpBySMS }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendOtpBySMS }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendOtpBySMS")
+    public JAXBElement<SendOtpBySMS> createSendOtpBySMS(SendOtpBySMS value) {
+        return new JAXBElement<SendOtpBySMS>(_SendOtpBySMS_QNAME, SendOtpBySMS.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendOtpBySMSOrder }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendOtpBySMSOrder }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendOtpBySMSOrder")
+    public JAXBElement<SendOtpBySMSOrder> createSendOtpBySMSOrder(SendOtpBySMSOrder value) {
+        return new JAXBElement<SendOtpBySMSOrder>(_SendOtpBySMSOrder_QNAME, SendOtpBySMSOrder.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendOtpBySMSOrderResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendOtpBySMSOrderResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendOtpBySMSOrderResponse")
+    public JAXBElement<SendOtpBySMSOrderResponse> createSendOtpBySMSOrderResponse(SendOtpBySMSOrderResponse value) {
+        return new JAXBElement<SendOtpBySMSOrderResponse>(_SendOtpBySMSOrderResponse_QNAME, SendOtpBySMSOrderResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link SendOtpBySMSResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link SendOtpBySMSResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "sendOtpBySMSResponse")
+    public JAXBElement<SendOtpBySMSResponse> createSendOtpBySMSResponse(SendOtpBySMSResponse value) {
+        return new JAXBElement<SendOtpBySMSResponse>(_SendOtpBySMSResponse_QNAME, SendOtpBySMSResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link VerifyOtp }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link VerifyOtp }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "verifyOtp")
+    public JAXBElement<VerifyOtp> createVerifyOtp(VerifyOtp value) {
+        return new JAXBElement<VerifyOtp>(_VerifyOtp_QNAME, VerifyOtp.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link VerifyOtpResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link VerifyOtpResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "verifyOtpResponse")
+    public JAXBElement<VerifyOtpResponse> createVerifyOtpResponse(VerifyOtpResponse value) {
+        return new JAXBElement<VerifyOtpResponse>(_VerifyOtpResponse_QNAME, VerifyOtpResponse.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link VerifySms }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link VerifySms }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "verifySms")
+    public JAXBElement<VerifySms> createVerifySms(VerifySms value) {
+        return new JAXBElement<VerifySms>(_VerifySms_QNAME, VerifySms.class, null, value);
+    }
+
+    /**
+     * Create an instance of {@link JAXBElement }{@code <}{@link VerifySmsResponse }{@code >}
+     * 
+     * @param value
+     *     Java instance representing xml element's value.
+     * @return
+     *     the new instance of {@link JAXBElement }{@code <}{@link VerifySmsResponse }{@code >}
+     */
+    @XmlElementDecl(namespace = "http://ws.otp.softleader.com.tw/", name = "verifySmsResponse")
+    public JAXBElement<VerifySmsResponse> createVerifySmsResponse(VerifySmsResponse value) {
+        return new JAXBElement<VerifySmsResponse>(_VerifySmsResponse_QNAME, VerifySmsResponse.class, null, value);
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWeb.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWeb.java
new file mode 100644
index 0000000..66f163b
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWeb.java
@@ -0,0 +1,173 @@
+package tw.com.softleader.otp.ws;
+
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebResult;
+import javax.jws.WebService;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import javax.xml.ws.Action;
+import javax.xml.ws.RequestWrapper;
+import javax.xml.ws.ResponseWrapper;
+
+/**
+ * This class was generated by Apache CXF 3.4.4
+ * 2021-09-13T18:34:27.007+08:00
+ * Generated source version: 3.4.4
+ *
+ */
+@WebService(targetNamespace = "http://ws.otp.softleader.com.tw/", name = "OtpWebService")
+@XmlSeeAlso({ObjectFactory.class})
+public interface OtpWeb {
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/sendOtpByEmailRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/sendOtpByEmailResponse")
+    @RequestWrapper(localName = "sendOtpByEmail", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendOtpByEmail")
+    @ResponseWrapper(localName = "sendOtpByEmailResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendOtpByEmailResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public StringArray sendOtpByEmail(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/sendBySMSOrderRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/sendBySMSOrderResponse")
+    @RequestWrapper(localName = "sendBySMSOrder", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendBySMSOrder")
+    @ResponseWrapper(localName = "sendBySMSOrderResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendBySMSOrderResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public String sendBySMSOrder(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2,
+        @WebParam(name = "arg3", targetNamespace = "")
+        String arg3,
+        @WebParam(name = "arg4", targetNamespace = "")
+        String arg4
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/findOtpLogByConditionRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/findOtpLogByConditionResponse")
+    @RequestWrapper(localName = "findOtpLogByCondition", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.FindOtpLogByCondition")
+    @ResponseWrapper(localName = "findOtpLogByConditionResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.FindOtpLogByConditionResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public String findOtpLogByCondition(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/sendOtpBySMSRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/sendOtpBySMSResponse")
+    @RequestWrapper(localName = "sendOtpBySMS", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendOtpBySMS")
+    @ResponseWrapper(localName = "sendOtpBySMSResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendOtpBySMSResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public StringArray sendOtpBySMS(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/sendOtpBySMSOrderRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/sendOtpBySMSOrderResponse")
+    @RequestWrapper(localName = "sendOtpBySMSOrder", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendOtpBySMSOrder")
+    @ResponseWrapper(localName = "sendOtpBySMSOrderResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendOtpBySMSOrderResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public String sendOtpBySMSOrder(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2,
+        @WebParam(name = "arg3", targetNamespace = "")
+        String arg3
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/findOtpLogTraceByOtpLogIdRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/findOtpLogTraceByOtpLogIdResponse")
+    @RequestWrapper(localName = "findOtpLogTraceByOtpLogId", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.FindOtpLogTraceByOtpLogId")
+    @ResponseWrapper(localName = "findOtpLogTraceByOtpLogIdResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.FindOtpLogTraceByOtpLogIdResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public String findOtpLogTraceByOtpLogId(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/verifyOtpRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/verifyOtpResponse")
+    @RequestWrapper(localName = "verifyOtp", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.VerifyOtp")
+    @ResponseWrapper(localName = "verifyOtpResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.VerifyOtpResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public StringArray verifyOtp(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2,
+        @WebParam(name = "arg3", targetNamespace = "")
+        String arg3
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/getHelloRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/getHelloResponse")
+    @RequestWrapper(localName = "getHello", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.GetHello")
+    @ResponseWrapper(localName = "getHelloResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.GetHelloResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public String getHello(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/sendBySMSRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/sendBySMSResponse")
+    @RequestWrapper(localName = "sendBySMS", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendBySMS")
+    @ResponseWrapper(localName = "sendBySMSResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.SendBySMSResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public String sendBySMS(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2,
+        @WebParam(name = "arg3", targetNamespace = "")
+        String arg3
+    );
+
+    @WebMethod
+    @Action(input = "http://ws.otp.softleader.com.tw/otpWeb/verifySmsRequest", output = "http://ws.otp.softleader.com.tw/otpWeb/verifySmsResponse")
+    @RequestWrapper(localName = "verifySms", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.VerifySms")
+    @ResponseWrapper(localName = "verifySmsResponse", targetNamespace = "http://ws.otp.softleader.com.tw/", className = "tw.com.softleader.otp.ws.VerifySmsResponse")
+    @WebResult(name = "return", targetNamespace = "")
+    public String verifySms(
+
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2
+    );
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWebService.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWebService.java
new file mode 100644
index 0000000..1fb339b
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/OtpWebService.java
@@ -0,0 +1,87 @@
+package tw.com.softleader.otp.ws;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.xml.namespace.QName;
+import javax.xml.ws.WebEndpoint;
+import javax.xml.ws.WebServiceClient;
+import javax.xml.ws.WebServiceFeature;
+import javax.xml.ws.Service;
+
+/**
+ * This class was generated by Apache CXF 3.4.4
+ * 2021-09-13T18:34:27.058+08:00
+ * Generated source version: 3.4.4
+ *
+ */
+@WebServiceClient(name = "otpWebService",
+                  wsdlLocation = "https://vtwlifeopensyssit.pru.intranet.asia:443/pcalife-otp/ws/otpWebService?wsdl",
+                  targetNamespace = "http://ws.otp.softleader.com.tw/")
+public class OtpWebService extends Service {
+
+    public final static URL WSDL_LOCATION;
+
+    public final static QName SERVICE = new QName("http://ws.otp.softleader.com.tw/", "otpWebService");
+    public final static QName OtpWebPort = new QName("http://ws.otp.softleader.com.tw/", "OtpWebServicePort");
+    static {
+        URL url = null;
+        try {
+        	url = new URL("https://vtwlifeopensyssit.pru.intranet.asia:443/pcalife-otp/ws/otpWebService?wsdl");
+        } catch (MalformedURLException e) {
+            java.util.logging.Logger.getLogger(OtpWebService.class.getName())
+                .log(java.util.logging.Level.INFO,
+                     "Can not initialize the default wsdl from {0}", "https://vtwlifeopensyssit.pru.intranet.asia:443/pcalife-otp/ws/otpWebService?wsdl");
+                    }
+        WSDL_LOCATION = url;
+    }
+
+    public OtpWebService(URL wsdlLocation) {
+        super(wsdlLocation, SERVICE);
+    }
+
+    public OtpWebService(URL wsdlLocation, QName serviceName) {
+        super(wsdlLocation, serviceName);
+    }
+
+    public OtpWebService() {
+        super(WSDL_LOCATION, SERVICE);
+    }
+
+    public OtpWebService(WebServiceFeature ... features) {
+        super(WSDL_LOCATION, SERVICE, features);
+    }
+
+    public OtpWebService(URL wsdlLocation, WebServiceFeature ... features) {
+        super(wsdlLocation, SERVICE, features);
+    }
+
+    public OtpWebService(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) {
+        super(wsdlLocation, serviceName, features);
+    }
+
+
+
+
+    /**
+     *
+     * @return
+     *     returns OtpWeb
+     */
+    @WebEndpoint(name = "otpWebPort")
+    public OtpWeb getOtpWebPort() {
+        return super.getPort(OtpWebPort, OtpWeb.class);
+    }
+
+    /**
+     *
+     * @param features
+     *     A list of {@link WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
+     * @return
+     *     returns OtpWeb
+     */
+    @WebEndpoint(name = "otpWebPort")
+    public OtpWeb getOtpWebPort(WebServiceFeature... features) {
+        return super.getPort(OtpWebPort, OtpWeb.class, features);
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMS.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMS.java
new file mode 100644
index 0000000..8e4d540
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMS.java
@@ -0,0 +1,141 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendBySMS complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendBySMS"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg3" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendBySMS", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2",
+    "arg3"
+})
+public class SendBySMS {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+    protected String arg3;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+    /**
+     * ���� arg3 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg3() {
+        return arg3;
+    }
+
+    /**
+     * 閮剖�� arg3 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg3(String value) {
+        this.arg3 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrder.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrder.java
new file mode 100644
index 0000000..51cb4f7
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrder.java
@@ -0,0 +1,168 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendBySMSOrder complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendBySMSOrder"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg3" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg4" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendBySMSOrder", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2",
+    "arg3",
+    "arg4"
+})
+public class SendBySMSOrder {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+    protected String arg3;
+    protected String arg4;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+    /**
+     * ���� arg3 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg3() {
+        return arg3;
+    }
+
+    /**
+     * 閮剖�� arg3 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg3(String value) {
+        this.arg3 = value;
+    }
+
+    /**
+     * ���� arg4 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg4() {
+        return arg4;
+    }
+
+    /**
+     * 閮剖�� arg4 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg4(String value) {
+        this.arg4 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrderResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrderResponse.java
new file mode 100644
index 0000000..2e499a2
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSOrderResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendBySMSOrderResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendBySMSOrderResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendBySMSOrderResponse", propOrder = {
+    "_return"
+})
+public class SendBySMSOrderResponse {
+
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSResponse.java
new file mode 100644
index 0000000..af099bc
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendBySMSResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendBySMSResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendBySMSResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendBySMSResponse", propOrder = {
+    "_return"
+})
+public class SendBySMSResponse {
+
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmail.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmail.java
new file mode 100644
index 0000000..dbff5b8
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmail.java
@@ -0,0 +1,114 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendOtpByEmail complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendOtpByEmail"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendOtpByEmail", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2"
+})
+public class SendOtpByEmail {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmailResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmailResponse.java
new file mode 100644
index 0000000..f6fe424
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpByEmailResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendOtpByEmailResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendOtpByEmailResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://ws.otp.softleader.com.tw/}stringArray" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendOtpByEmailResponse", propOrder = {
+    "_return"
+})
+public class SendOtpByEmailResponse {
+
+    @XmlElement(name = "return")
+    protected StringArray _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link StringArray }
+     *     
+     */
+    public StringArray getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link StringArray }
+     *     
+     */
+    public void setReturn(StringArray value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMS.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMS.java
new file mode 100644
index 0000000..22f71ce
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMS.java
@@ -0,0 +1,114 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendOtpBySMS complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendOtpBySMS"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendOtpBySMS", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2"
+})
+public class SendOtpBySMS {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrder.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrder.java
new file mode 100644
index 0000000..13d867f
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrder.java
@@ -0,0 +1,141 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendOtpBySMSOrder complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendOtpBySMSOrder"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg3" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendOtpBySMSOrder", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2",
+    "arg3"
+})
+public class SendOtpBySMSOrder {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+    protected String arg3;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+    /**
+     * ���� arg3 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg3() {
+        return arg3;
+    }
+
+    /**
+     * 閮剖�� arg3 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg3(String value) {
+        this.arg3 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrderResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrderResponse.java
new file mode 100644
index 0000000..5203783
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSOrderResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendOtpBySMSOrderResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendOtpBySMSOrderResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendOtpBySMSOrderResponse", propOrder = {
+    "_return"
+})
+public class SendOtpBySMSOrderResponse {
+
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSResponse.java
new file mode 100644
index 0000000..dac2a9a
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/SendOtpBySMSResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>sendOtpBySMSResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="sendOtpBySMSResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://ws.otp.softleader.com.tw/}stringArray" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "sendOtpBySMSResponse", propOrder = {
+    "_return"
+})
+public class SendOtpBySMSResponse {
+
+    @XmlElement(name = "return")
+    protected StringArray _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link StringArray }
+     *     
+     */
+    public StringArray getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link StringArray }
+     *     
+     */
+    public void setReturn(StringArray value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/StringArray.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/StringArray.java
new file mode 100644
index 0000000..900a0e9
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/StringArray.java
@@ -0,0 +1,69 @@
+
+package tw.com.softleader.otp.ws;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>stringArray complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="stringArray"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="item" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "stringArray", propOrder = {
+    "item"
+})
+public class StringArray {
+
+    @XmlElement(nillable = true)
+    protected List<String> item;
+
+    /**
+     * Gets the value of the item property.
+     * 
+     * <p>
+     * This accessor method returns a reference to the live list,
+     * not a snapshot. Therefore any modification you make to the
+     * returned list will be present inside the JAXB object.
+     * This is why there is not a <CODE>set</CODE> method for the item property.
+     * 
+     * <p>
+     * For example, to add a new item, do as follows:
+     * <pre>
+     *    getItem().add(newItem);
+     * </pre>
+     * 
+     * 
+     * <p>
+     * Objects of the following type(s) are allowed in the list
+     * {@link String }
+     * 
+     * 
+     */
+    public List<String> getItem() {
+        if (item == null) {
+            item = new ArrayList<String>();
+        }
+        return this.item;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtp.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtp.java
new file mode 100644
index 0000000..e41b13b
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtp.java
@@ -0,0 +1,141 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>verifyOtp complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="verifyOtp"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg3" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "verifyOtp", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2",
+    "arg3"
+})
+public class VerifyOtp {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+    protected String arg3;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+    /**
+     * ���� arg3 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg3() {
+        return arg3;
+    }
+
+    /**
+     * 閮剖�� arg3 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg3(String value) {
+        this.arg3 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtpResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtpResponse.java
new file mode 100644
index 0000000..41dc081
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifyOtpResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>verifyOtpResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="verifyOtpResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://ws.otp.softleader.com.tw/}stringArray" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "verifyOtpResponse", propOrder = {
+    "_return"
+})
+public class VerifyOtpResponse {
+
+    @XmlElement(name = "return")
+    protected StringArray _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link StringArray }
+     *     
+     */
+    public StringArray getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link StringArray }
+     *     
+     */
+    public void setReturn(StringArray value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySms.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySms.java
new file mode 100644
index 0000000..9612407
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySms.java
@@ -0,0 +1,114 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>verifySms complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="verifySms"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "verifySms", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2"
+})
+public class VerifySms {
+
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+
+    /**
+     * ���� arg0 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * 閮剖�� arg0 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * ���� arg1 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * 閮剖�� arg1 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * ���� arg2 ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * 閮剖�� arg2 ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySmsResponse.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySmsResponse.java
new file mode 100644
index 0000000..86e48d1
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/VerifySmsResponse.java
@@ -0,0 +1,62 @@
+
+package tw.com.softleader.otp.ws;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * <p>verifySmsResponse complex type ��� Java 憿.
+ * 
+ * <p>銝�雇閬�挾����迨憿銝剖�����摰�.
+ * 
+ * <pre>
+ * &lt;complexType name="verifySmsResponse"&gt;
+ *   &lt;complexContent&gt;
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
+ *       &lt;sequence&gt;
+ *         &lt;element name="return" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&gt;
+ *       &lt;/sequence&gt;
+ *     &lt;/restriction&gt;
+ *   &lt;/complexContent&gt;
+ * &lt;/complexType&gt;
+ * </pre>
+ * 
+ * 
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "verifySmsResponse", propOrder = {
+    "_return"
+})
+public class VerifySmsResponse {
+
+    @XmlElement(name = "return")
+    protected String _return;
+
+    /**
+     * ���� return ��抒���.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getReturn() {
+        return _return;
+    }
+
+    /**
+     * 閮剖�� return ��抒���.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setReturn(String value) {
+        this._return = value;
+    }
+
+}
diff --git a/pamapi/src/main/java/tw/com/softleader/otp/ws/package-info.java b/pamapi/src/main/java/tw/com/softleader/otp/ws/package-info.java
new file mode 100644
index 0000000..d272a25
--- /dev/null
+++ b/pamapi/src/main/java/tw/com/softleader/otp/ws/package-info.java
@@ -0,0 +1,2 @@
+@javax.xml.bind.annotation.XmlSchema(namespace = "http://ws.otp.softleader.com.tw/")
+package tw.com.softleader.otp.ws;
diff --git a/pamapi/src/main/resources/WEB-INF/lib/pcalife-otp.jar b/pamapi/src/main/resources/WEB-INF/lib/pcalife-otp.jar
deleted file mode 100644
index 6e2076e..0000000
--- a/pamapi/src/main/resources/WEB-INF/lib/pcalife-otp.jar
+++ /dev/null
Binary files differ
diff --git a/pamapi/src/main/resources/config/application-dev.yml b/pamapi/src/main/resources/config/application-dev.yml
index 450ab2a..007c7b4 100644
--- a/pamapi/src/main/resources/config/application-dev.yml
+++ b/pamapi/src/main/resources/config/application-dev.yml
@@ -32,7 +32,7 @@
       indent-output: true
   datasource:
     type: com.zaxxer.hikari.HikariDataSource
-    url: jdbc:postgresql://dev.pollex.com.tw:5433/pam
+    url: jdbc:postgresql://localhost:5432/pam
     username: pamadmin
     password: pamadmin
     hikari:
@@ -115,4 +115,6 @@
   otp-web-service-url: https://vtwlifeopensyssit.pru.intranet.asia:443/pcalife-otp/ws/otpWebService
   otp-web-service-password: es20!%Pass
   otp-web-service-system-type: epos
-  e-service-login-url: https://ssotwsit.eservice.pcalife.com.tw/sso/acctValidate
+  e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate
+  e-service-login-func: ValidateUsrLogin
+  e-service-login-sys: epos
diff --git a/pamapi/src/main/resources/config/application-sit.yml b/pamapi/src/main/resources/config/application-sit.yml
index 9f0db70..dca151c 100644
--- a/pamapi/src/main/resources/config/application-sit.yml
+++ b/pamapi/src/main/resources/config/application-sit.yml
@@ -116,3 +116,5 @@
   otp-web-service-password: es20!%Pass
   otp-web-service-system-type: epos
   e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate
+  e-service-login-func: ValidateUsrLogin
+  e-service-login-sys: epos
diff --git a/pamapi/src/main/resources/config/application-uat.yml b/pamapi/src/main/resources/config/application-uat.yml
index e5ddb97..9563803 100644
--- a/pamapi/src/main/resources/config/application-uat.yml
+++ b/pamapi/src/main/resources/config/application-uat.yml
@@ -115,4 +115,6 @@
   otp-web-service-url: https://vtwlifeopensyssit.pru.intranet.asia:443/pcalife-otp/ws/otpWebService
   otp-web-service-password: es20!%Pass
   otp-web-service-system-type: epos
-  e-service-login-url: https://ssotwsit.eservice.pcalife.com.tw/sso/acctValidate
+  e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate
+  e-service-login-func: ValidateUsrLogin
+  e-service-login-sys: epos

--
Gitblit v1.8.0