优化proxy, alipay 支持 proxy
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
index e256b06..1cc6089 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
@@ -27,7 +27,6 @@
 import org.springframework.data.redis.repository.configuration.EnableRedisRepositories
 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
 import org.springframework.data.redis.serializer.StringRedisSerializer
-import org.springframework.http.client.ClientHttpRequestFactory
 import org.springframework.http.client.SimpleClientHttpRequestFactory
 import org.springframework.scheduling.annotation.EnableScheduling
 import org.springframework.stereotype.Component
@@ -86,7 +85,7 @@
 class RestTemplateConfig {
     @Component
     @ConfigurationProperties("resttemplate.proxy")
-    class RestTemplateProxyConfig {
+    class RestTemplateProxyProperties {
         @Value("\${type:}")
         lateinit var type: String
         @Value("\${host:}")
@@ -96,17 +95,21 @@
     }
 
     @Bean
-    fun simpleClientHttpRequestFactory(proxyConfig: RestTemplateProxyConfig): SimpleClientHttpRequestFactory {
+    fun simpleClientHttpRequestFactory(proxyProperties: RestTemplateProxyProperties):
+            SimpleClientHttpRequestFactory {
         val factory = SimpleClientHttpRequestFactory()
         factory.setConnectTimeout(15000)
         factory.setReadTimeout(5000)
-        if (proxyConfig.type.isNotEmpty()) {
-            val proxyType = when (proxyConfig.type) {
+        if (proxyProperties.type.isNotEmpty()) {
+            val proxyType = when (proxyProperties.type) {
                 "http" -> Proxy.Type.HTTP
                 "socks5" -> Proxy.Type.SOCKS
                 else -> Proxy.Type.DIRECT
             }
-            factory.setProxy(Proxy(proxyType, InetSocketAddress(proxyConfig.host, proxyConfig.port)))
+            if (proxyType != Proxy.Type.DIRECT) {
+                factory.setProxy(Proxy(proxyType,
+                        InetSocketAddress(proxyProperties.host, proxyProperties.port)))
+            }
         }
         return factory
     }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
index ccae15f..2ca8fef 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
@@ -22,6 +22,7 @@
 import com.supwisdom.dlpay.agent.DtlStatus
 import com.alipay.api.domain.AlipayTradeQueryModel
 import com.alipay.api.domain.AlipayTradeRefundModel
+import com.supwisdom.dlpay.RestTemplateConfig
 import com.supwisdom.dlpay.api.bean.BaseResp
 
 
@@ -29,7 +30,9 @@
 class AlipayServiceImpl(val sourceTypeService: SourceTypeService,
                         val agentServiceProxy: AgentServiceProxy,
                         val consumePayService: ConsumePayService,
-                        val transactionService: TransactionServiceProxy) : AlipayService {
+                        val transactionService: TransactionServiceProxy,
+                        val restTemplateProxyProperties: RestTemplateConfig.RestTemplateProxyProperties)
+    : AlipayService {
     val logger = KotlinLogging.logger { }
 
     fun checkCfg(config: Map<String, String?>, resp: AgentResponse): Boolean {
@@ -45,16 +48,36 @@
         return true
     }
 
-    override fun doQrcodepay(transaction: TTransactionMain): AgentResponse {
-        var qrcodePayTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
-        val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, qrcodePayTrans.isAnonymous, false)
-        var agentResponse = AgentResponse()
-        if (checkCfg(config, agentResponse)) {
-            var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
-            if (payurl.isNullOrEmpty()) {
-                payurl = "https://openapi.alipay.com/gateway.do"
+    private fun createAlipayClient(config: Map<String, String?>): DefaultAlipayClient {
+        val payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL].let {
+            if (it.isNullOrEmpty()) {
+                "https://openapi.alipay.com/gateway.do"
+            } else {
+                it
             }
-            val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+        }
+        return DefaultAlipayClient.builder(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID],
+                config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY])
+                .charset("UTF-8")
+                .format("json")
+                .alipayPublicKey(config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY])
+                .signType("RSA2")
+                .also {
+                    if (restTemplateProxyProperties.type == "http") {
+                        it.proxyHost(restTemplateProxyProperties.host)
+                                .proxyPort(restTemplateProxyProperties.port)
+                    }
+                }.build()
+    }
+
+    override fun doQrcodepay(transaction: TTransactionMain): AgentResponse {
+        val qrcodePayTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
+        val config = sourceTypeService.getConsumePaytypeConfig(
+                TradeDict.PAYTYPE_ALIPAY,
+                transaction.shopDtl.shopaccno,
+                qrcodePayTrans.isAnonymous, false)
+        val agentResponse = AgentResponse()
+        if (checkCfg(config, agentResponse)) {
             val request = AlipayTradePayRequest()
             request.bizModel = AlipayTradePayModel().apply {
                 this.authCode = qrcodePayTrans.qrcode
@@ -63,6 +86,7 @@
                 this.totalAmount = transaction.shopDtl.amount.toString()
             }
             try {
+                val alipayClient = createAlipayClient(config)
                 val response = alipayClient.execute(request)
                 if ("10000" == response.code) {
                     if (response.isSuccess) {
@@ -100,8 +124,10 @@
     }
 
     override fun doPrepay(transaction: TTransactionMain): AgentResponse {
-        val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
-        var agentResponse = AgentResponse()
+        val config = sourceTypeService.getConsumePaytypeConfig(
+                TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno,
+                false, false)
+        val agentResponse = AgentResponse()
         if (checkCfg(config, agentResponse)) {
             if (config[PaytypeUtil.CFG_ALIPAY_NOTIFY].isNullOrEmpty()) {
                 agentResponse.code = AgentCode.CONFIG_ERROR
@@ -109,13 +135,9 @@
                 agentResponse.agentMsg = "支付宝相关配置为空"
                 logger.error { "支付宝异步通知地址未配置:${PaytypeUtil.CFG_ALIPAY_NOTIFY}" }
             }
-            var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
-            if (payurl.isNullOrEmpty()) {
-                payurl = "https://openapi.alipay.com/gateway.do"
-            }
-            val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+            val alipayClient = createAlipayClient(config)
             val request = AlipayTradeAppPayRequest()
-            var productCode = ""
+            val productCode = ""
             //判断是否为H5
             //productCode = "QUICK_WAP_WAY"
             request.bizModel = AlipayTradePayModel().apply {
@@ -154,14 +176,12 @@
     }
 
     override fun doRefund(transaction: TTransactionMain): AgentResponse {
-        var agentResponse = AgentResponse()
-        val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
+        val agentResponse = AgentResponse()
+        val config = sourceTypeService.getConsumePaytypeConfig(
+                TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno,
+                false, false)
         if (checkCfg(config, agentResponse)) {
-            var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
-            if (payurl.isNullOrEmpty()) {
-                payurl = "https://openapi.alipay.com/gateway.do"
-            }
-            val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+            val alipayClient = createAlipayClient(config)
             val request = AlipayTradeQueryRequest()
             request.bizModel = AlipayTradeRefundModel().apply {
                 this.outTradeNo = transaction.refno
@@ -183,14 +203,11 @@
     }
 
     override fun doQuery(transaction: TTransactionMain): AgentResponse {
-        var agentResponse = AgentResponse()
-        val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
+        val agentResponse = AgentResponse()
+        val config = sourceTypeService.getConsumePaytypeConfig(
+                TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
         if (checkCfg(config, agentResponse)) {
-            var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
-            if (payurl.isNullOrEmpty()) {
-                payurl = "https://openapi.alipay.com/gateway.do"
-            }
-            val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+            val alipayClient = createAlipayClient(config)
             val request = AlipayTradeQueryRequest()
             request.bizModel = AlipayTradeQueryModel().apply {
                 this.outTradeNo = transaction.refno
@@ -216,13 +233,13 @@
     }
 
     override fun doNotify(param: Map<String, String>): AgentResponse {
-        var refno = param["out_trade_no"]
-        var agentResponse = AgentResponse()
+        val refno = param["out_trade_no"]
+        val agentResponse = AgentResponse()
         if (refno.isNullOrEmpty()) {
             agentResponse.code = AgentCode.FAIL
             return agentResponse
         }
-        var transaction = consumePayService.getTransactionMainDtl(refno, null, null)
+        val transaction = consumePayService.getTransactionMainDtl(refno, null, null)
         if (transaction == null) {
             agentResponse.code = AgentCode.REFNO_NOT_EXISTS
             return agentResponse
@@ -231,16 +248,17 @@
             agentResponse.code = AgentCode.SUCCESS
             return agentResponse
         }
-        val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
+        val config = sourceTypeService.getConsumePaytypeConfig(
+                TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
         if (config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY].isNullOrEmpty()) {
             agentResponse.code = AgentCode.CONFIG_ERROR
             return agentResponse
         }
-        var flag = AlipaySignature.rsaCheckV1(param, config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "UTF-8", "RSA2")
-        return when (flag) {
+        return when (AlipaySignature.rsaCheckV1(param,
+                config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "UTF-8", "RSA2")) {
             true -> {
                 //total amt 校验 map["total_amount"]
-                var tradeno = param["trade_no"]
+                val tradeno = param["trade_no"]
                 if (tradeno.isNullOrEmpty()) {
                     transactionService.success(transaction.refno)
                 } else {