From 342e552041b82871670eae89df4d01f980317c73 Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Mon, 8 Jul 2019 17:53:32 +0800 Subject: [PATCH] =?utf8?q?refactor:=20=E4=BC=98=E5=8C=96=E9=87=8D=E6=9E=84?= =?utf8?q?=20payapi-sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- payapi-sdk/build.gradle | 5 +++ .../dlpay/paysdk/ApiLoginHelper.java | 42 +++++++++++++++++++ .../paysdk/PayAPIRequestInterceptor.java | 5 +++ .../paysdk/bean/ApiLoginInitResponse.java | 12 ++++++ .../dlpay/paysdk/bean/ApiLoginResponse.java | 13 ++++++ .../dlpay/paysdk/bean/ApiResponse.java | 13 ++++++ .../paysdk/bean/CitizenPayInitResponse.java | 12 ++++++ .../paysdk/{ => proxy}/ApiLoginProxy.java | 20 ++++----- .../{ => proxy}/CitizenCardPayProxy.java | 10 ++--- .../paysdk/{ => proxy}/PayReverseProxy.java | 2 +- .../dlpay/paysdk/{ => proxy}/YktPayProxy.java | 2 +- .../dlpay/paysdk/utils/Constants.java | 1 + .../dlpay/paysdk/utils/JwtContext.java | 17 ++++++++ .../supwisdom/dlpay/paysdk/utils/Utils.java | 29 +++++++++++++ .../paysdktest/CitizenCardPayProxyTest.java | 28 +++++++++---- payapi/build.gradle | 10 ----- 16 files changed, 186 insertions(+), 35 deletions(-) create mode 100644 payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java create mode 100644 payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginInitResponse.java create mode 100644 payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginResponse.java create mode 100644 payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiResponse.java create mode 100644 payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/CitizenPayInitResponse.java rename payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/{ => proxy}/ApiLoginProxy.java (51%) rename payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/{ => proxy}/CitizenCardPayProxy.java (67%) rename payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/{ => proxy}/PayReverseProxy.java (94%) rename payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/{ => proxy}/YktPayProxy.java (94%) create mode 100644 payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/JwtContext.java create mode 100644 payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Utils.java diff --git a/payapi-sdk/build.gradle b/payapi-sdk/build.gradle index af9e76f6..3523c69b 100644 --- a/payapi-sdk/build.gradle +++ b/payapi-sdk/build.gradle @@ -57,10 +57,15 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:2.1.2.RELEASE' implementation 'javax.servlet:javax.servlet-api:4.0.1' + compileOnly 'org.projectlombok:lombok:1.18.8' + annotationProcessor 'org.projectlombok:lombok:1.18.8' testImplementation 'org.springframework:spring-test' testImplementation 'org.springframework.boot:spring-boot-test' testImplementation 'junit:junit:4.12' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.8' + testCompileOnly 'org.projectlombok:lombok:1.18.8' + testImplementation 'org.hamcrest:hamcrest:2.1' testImplementation project(':common') } \ No newline at end of file diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java new file mode 100644 index 00000000..d0956038 --- /dev/null +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginHelper.java @@ -0,0 +1,42 @@ +package com.supwisdom.dlpay.paysdk; + +import com.supwisdom.dlpay.paysdk.bean.ApiLoginInitResponse; +import com.supwisdom.dlpay.paysdk.bean.ApiLoginResponse; +import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy; +import com.supwisdom.dlpay.paysdk.utils.JwtContext; +import com.supwisdom.dlpay.paysdk.utils.Utils; + +public class ApiLoginHelper { + private ApiLoginProxy apiLoginProxy; + + public ApiLoginHelper(ApiLoginProxy apiLoginProxy) { + this.apiLoginProxy = apiLoginProxy; + } + + public void login(String appid, String secret) { + loginWithClientId(appid, null, secret); + } + + public void loginWithClientId(String appid, String clientId, String secret) { + ApiLoginInitResponse loginInit; + if (clientId != null) { + loginInit = apiLoginProxy.loginInitWithClientId(appid, clientId); + } else { + loginInit = apiLoginProxy.loginInit(appid); + } + if (loginInit.getRetcode() != 0) { + throw new RuntimeException("登录初始化错误: " + loginInit.getRetcode() + ", " + loginInit.getException()); + } + String token = Utils.sha256HMAC(loginInit.getToken(), secret); + ApiLoginResponse login; + if (clientId != null) { + login = apiLoginProxy.loginWithClientId(appid, token, clientId); + } else { + login = apiLoginProxy.login(appid, token); + } + if (login.getRetcode() != 0) { + throw new RuntimeException("登录错误: " + loginInit.getRetcode() + ", " + loginInit.getException()); + } + JwtContext.setJwt(login.getJwt()); + } +} diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java index 305c665d..1002d525 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java @@ -1,6 +1,7 @@ package com.supwisdom.dlpay.paysdk; import com.supwisdom.dlpay.paysdk.utils.Constants; +import com.supwisdom.dlpay.paysdk.utils.JwtContext; import feign.RequestInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -12,6 +13,10 @@ public class PayAPIRequestInterceptor { return requestTemplate -> { // 小示例,没什么卵用 requestTemplate.header(Constants.HEADER_TENANT_ID, "{tenantid}"); + String jwt = JwtContext.getJwt(); + if (jwt != null) { + requestTemplate.header(Constants.JWT_HEADER, "Bearer " + jwt); + } }; } } diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginInitResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginInitResponse.java new file mode 100644 index 00000000..405d4aed --- /dev/null +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginInitResponse.java @@ -0,0 +1,12 @@ +package com.supwisdom.dlpay.paysdk.bean; + + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ApiLoginInitResponse extends ApiResponse { + private String timestamp; + private String token; +} diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginResponse.java new file mode 100644 index 00000000..787fe908 --- /dev/null +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiLoginResponse.java @@ -0,0 +1,13 @@ +package com.supwisdom.dlpay.paysdk.bean; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ApiLoginResponse extends ApiResponse { + private String jwt; + private String appid; + private String expiredAt; + +} diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiResponse.java new file mode 100644 index 00000000..4b18413e --- /dev/null +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/ApiResponse.java @@ -0,0 +1,13 @@ +package com.supwisdom.dlpay.paysdk.bean; + + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ApiResponse { + private Integer retcode; + private String retmsg; + private String exception; +} diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/CitizenPayInitResponse.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/CitizenPayInitResponse.java new file mode 100644 index 00000000..cf28b8b2 --- /dev/null +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/bean/CitizenPayInitResponse.java @@ -0,0 +1,12 @@ +package com.supwisdom.dlpay.paysdk.bean; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CitizenPayInitResponse extends ApiResponse { + private String refno; + private String billno; + private Double amount; +} diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiLoginProxy.java similarity index 51% rename from payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginProxy.java rename to payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiLoginProxy.java index efb2afd9..f9e5a678 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/ApiLoginProxy.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ApiLoginProxy.java @@ -1,31 +1,31 @@ -package com.supwisdom.dlpay.paysdk; +package com.supwisdom.dlpay.paysdk.proxy; +import com.supwisdom.dlpay.paysdk.bean.ApiLoginInitResponse; +import com.supwisdom.dlpay.paysdk.bean.ApiLoginResponse; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; -import java.util.Map; @FeignClient(value = "apiLoginProxy", url = "${payapi.url}") public interface ApiLoginProxy { @RequestMapping(value = "/api/auth/gettoken", method = RequestMethod.GET) - ResponseEntity> loginInit(@RequestParam("appid") String appid); + ApiLoginInitResponse loginInit(@RequestParam("appid") String appid); @RequestMapping(value = "/api/auth/gettoken/{clientid}", method = RequestMethod.GET) - ResponseEntity> loginInitWithClientId(@RequestParam("appid") String appid, - @PathVariable(value = "clientid") String clientid); + ApiLoginInitResponse loginInitWithClientId(@RequestParam("appid") String appid, + @PathVariable(value = "clientid") String clientid); @RequestMapping(value = "/api/auth/authentication", method = RequestMethod.GET) - ResponseEntity> login(@RequestParam("appid") String appid, @RequestParam("secret") String secret); + ApiLoginResponse login(@RequestParam("appid") String appid, @RequestParam("secret") String secret); @RequestMapping(value = "/api/auth/authentication/{clientid}", method = RequestMethod.GET) - ResponseEntity> loginWithClientId(@RequestParam("appid") String appid, @RequestParam("secret") String secret, - @PathVariable(value = "clientid") String clientid); + ApiLoginResponse loginWithClientId(@RequestParam("appid") String appid, @RequestParam("secret") String secret, + @PathVariable(value = "clientid") String clientid); @RequestMapping(value = "/api/auth/refresh", method = RequestMethod.GET) - ResponseEntity> refresh(HttpServletRequest request); + ApiLoginResponse refresh(HttpServletRequest request); } diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/CitizenCardPayProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/CitizenCardPayProxy.java similarity index 67% rename from payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/CitizenCardPayProxy.java rename to payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/CitizenCardPayProxy.java index c5e38b1b..d2e758f5 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/CitizenCardPayProxy.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/CitizenCardPayProxy.java @@ -1,20 +1,18 @@ -package com.supwisdom.dlpay.paysdk; +package com.supwisdom.dlpay.paysdk.proxy; import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam; import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam; +import com.supwisdom.dlpay.paysdk.bean.CitizenPayInitResponse; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import java.util.Map; - @FeignClient(value = "citizenCardPay", url = "${payapi.url}") public interface CitizenCardPayProxy { @RequestMapping(value = "/api/consume/citizencard/payinit", method = RequestMethod.GET) - ResponseEntity> citizencardPayinit(@RequestBody CitizenCardPayinitParam param); + CitizenPayInitResponse citizencardPayinit(@RequestBody CitizenCardPayinitParam param); @RequestMapping(value = "/api/consume/citizencard/payfinish", method = RequestMethod.GET) - ResponseEntity> citizencardPayFinish(@RequestBody CitizenCardPayfinishParam param); + CitizenPayInitResponse citizencardPayFinish(@RequestBody CitizenCardPayfinishParam param); } diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayReverseProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/PayReverseProxy.java similarity index 94% rename from payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayReverseProxy.java rename to payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/PayReverseProxy.java index fc2ad657..827e685b 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayReverseProxy.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/PayReverseProxy.java @@ -1,4 +1,4 @@ -package com.supwisdom.dlpay.paysdk; +package com.supwisdom.dlpay.paysdk.proxy; import com.supwisdom.dlpay.api.bean.ConsumePayCancelParam; import com.supwisdom.dlpay.api.bean.ConsumePayRefundParam; diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/YktPayProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/YktPayProxy.java similarity index 94% rename from payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/YktPayProxy.java rename to payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/YktPayProxy.java index 238b008c..46d967ce 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/YktPayProxy.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/YktPayProxy.java @@ -1,4 +1,4 @@ -package com.supwisdom.dlpay.paysdk; +package com.supwisdom.dlpay.paysdk.proxy; import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam; import com.supwisdom.dlpay.api.bean.YktCardPayinitParam; diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Constants.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Constants.java index ba565ee2..f3dae033 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Constants.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Constants.java @@ -2,4 +2,5 @@ package com.supwisdom.dlpay.paysdk.utils; public class Constants { public static final String HEADER_TENANT_ID = "X-TENANT-ID"; + public static final String JWT_HEADER = "Authorization"; } diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/JwtContext.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/JwtContext.java new file mode 100644 index 00000000..0bd07efd --- /dev/null +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/JwtContext.java @@ -0,0 +1,17 @@ +package com.supwisdom.dlpay.paysdk.utils; + +public class JwtContext { + private static String jwt; + + public static String getJwt() { + synchronized (JwtContext.class) { + return jwt; + } + } + + public static void setJwt(String j) { + synchronized (JwtContext.class) { + jwt = j; + } + } +} diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Utils.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Utils.java new file mode 100644 index 00000000..791850d8 --- /dev/null +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/utils/Utils.java @@ -0,0 +1,29 @@ +package com.supwisdom.dlpay.paysdk.utils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +public class Utils { + public static String sha256HMAC(String message, String secret) { + String hash = ""; + try { + Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256"); + sha256_HMAC.init(secret_key); + byte[] bytes = sha256_HMAC.doFinal(message.getBytes()); + hash = byteArrayToHexString(bytes); + System.out.println(hash); + } catch (Exception e) { + System.out.println("Error HmacSHA256 ===========" + e.getMessage()); + } + return hash; + } + + private static String byteArrayToHexString(byte[] bytes) { + StringBuilder builder = new StringBuilder(); + for (byte b : bytes) { + builder.append(String.format("%02x", ((int) b) & 0xFF)); + } + return builder.toString(); + } +} diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java index 76407f5f..48389296 100644 --- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java +++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java @@ -1,8 +1,11 @@ package com.supwisdom.dlpay.paysdktest; -import com.supwisdom.dlpay.paysdk.ApiLoginProxy; -import com.supwisdom.dlpay.paysdk.CitizenCardPayProxy; +import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam; +import com.supwisdom.dlpay.paysdk.ApiLoginHelper; +import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy; +import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy; +import com.supwisdom.dlpay.paysdk.bean.CitizenPayInitResponse; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -13,9 +16,11 @@ import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration; import org.springframework.context.annotation.ComponentScan; -import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + @RunWith(SpringRunner.class) @SpringBootTest(properties = { @@ -28,8 +33,7 @@ import org.springframework.test.context.junit4.SpringRunner; @ComponentScan(basePackages = {"com.supwisdom.dlpay.paysdk"}) public class CitizenCardPayProxyTest { private final static String appid = "700001"; - - private final static String tenantId = "{tenant_id}"; + private final static String secret = "5f788ce433ec44f299351cdf7f137e81"; @Autowired private ApiLoginProxy apiLoginProxy; @@ -39,8 +43,18 @@ public class CitizenCardPayProxyTest { @org.junit.Test public void citizencardPayinit() { - ResponseEntity loginInit = apiLoginProxy.loginInit(appid); - System.out.println("Data " + loginInit.getBody()); + ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy); + helper.login(appid, secret); + + CitizenCardPayinitParam initParam = new CitizenCardPayinitParam(); + initParam.setBillno("20190708172756000001"); + initParam.setCardNo("1231231213"); + initParam.setAmount(100); + initParam.setTransdate("20190708"); + initParam.setTranstime("172713"); + CitizenPayInitResponse payInit = citizenCardPayProxy.citizencardPayinit(initParam); + assertThat("pay initialized " + payInit.getRetmsg() + payInit.getException(), + payInit.getRetcode(), equalTo(0)); } public static void main(String[] args) { diff --git a/payapi/build.gradle b/payapi/build.gradle index 33bca406..ac7c8cd1 100644 --- a/payapi/build.gradle +++ b/payapi/build.gradle @@ -19,16 +19,6 @@ sourceCompatibility = jdkVersion def startClass = 'com.supwisdom.dlpay.PayApiApplicationKt' println("Build version: $payapiVersion") -allprojects { - repositories { - jcenter() - mavenCentral() - } -} - -subprojects { - version = '1.0' -} bootJar { mainClassName = startClass -- 2.17.1