xiongzhu 4 yıl önce
ebeveyn
işleme
6a6564683f

+ 6 - 0
pom.xml

@@ -328,6 +328,12 @@
             <artifactId>guava</artifactId>
             <version>20.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.16.57.ALL</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 21 - 0
src/main/java/com/izouma/nineth/config/AlipayConfig.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.config;
+
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@AllArgsConstructor
+@Configuration
+@EnableConfigurationProperties({AlipayProperties.class, AlipayProperties.class})
+public class AlipayConfig {
+    private final AlipayProperties properties;
+
+    @Bean
+    public AlipayClient alipayClient() {
+        return new DefaultAlipayClient(properties.getGateway(), properties.getAppId(), properties.getPrivateKey(),
+                "json", "UTF-8", properties.getAliPublicKey(), "RSA2");
+    }
+}

+ 20 - 0
src/main/java/com/izouma/nineth/config/AlipayProperties.java

@@ -0,0 +1,20 @@
+package com.izouma.nineth.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "alipay")
+public class AlipayProperties {
+    private String appId;
+    private String gateway;
+    private String privateKey;
+    private String appPublicKey;
+    private String aliPublicKey;
+    private String apiKey;
+    private String appCertPath;
+    private String aliPubCertPath;
+    private String rootCertPath;
+    private String notifyUrl;
+    private String returnUrl;
+}

+ 3 - 0
src/main/java/com/izouma/nineth/repo/OrderRepo.java

@@ -7,10 +7,13 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.util.Optional;
 
 public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
     @Query("update Order t set t.del = true where t.id = ?1")
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    Optional<Order> findByIdAndDelFalse(Long id);
 }

+ 1 - 0
src/main/java/com/izouma/nineth/security/WebSecurityConfig.java

@@ -77,6 +77,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers("/404").permitAll()
                 .antMatchers("/500").permitAll()
                 .antMatchers("/MP_verify*").permitAll()
+                .antMatchers("/order/notify/*").permitAll()
                 // all other requests need to be authenticated
                 .anyRequest().authenticated().and()
                 // make sure we use stateless session; session won't be used to

+ 54 - 4
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -1,11 +1,18 @@
 package com.izouma.nineth.service;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.request.AlipayTradeWapPayRequest;
+import com.izouma.nineth.config.AlipayProperties;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.Order;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.domain.UserAddress;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.OrderStatus;
+import com.izouma.nineth.enums.PayMethod;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.repo.OrderRepo;
@@ -13,21 +20,27 @@ import com.izouma.nineth.repo.UserAddressRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
+import org.springframework.core.env.Environment;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
 import javax.transaction.Transactional;
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Optional;
+import java.util.UUID;
 
 @Service
 @AllArgsConstructor
 public class OrderService {
 
-    private OrderRepo       orderRepo;
-    private CollectionRepo  collectionRepo;
-    private UserAddressRepo userAddressRepo;
-    private UserRepo        userRepo;
+    private OrderRepo        orderRepo;
+    private CollectionRepo   collectionRepo;
+    private UserAddressRepo  userAddressRepo;
+    private UserRepo         userRepo;
+    private Environment      env;
+    private AlipayClient     alipayClient;
+    private AlipayProperties alipayProperties;
 
     public Page<Order> all(PageQuery pageQuery) {
         return orderRepo.findAll(JpaUtils.toSpecification(pageQuery, Order.class), JpaUtils.toPageRequest(pageQuery));
@@ -76,4 +89,41 @@ public class OrderService {
         return orderRepo.save(order);
 
     }
+
+    public Object pay(Long id, PayMethod payMethod) throws AlipayApiException {
+        Order order = orderRepo.findByIdAndDelFalse(id).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+
+        if (payMethod == PayMethod.ALIPAY) {
+            JSONObject bizContent = new JSONObject();
+            bizContent.put("notifyUrl", alipayProperties.getNotifyUrl());
+            bizContent.put("returnUrl", alipayProperties.getReturnUrl());
+            bizContent.put("out_trade_no", UUID.randomUUID().toString());
+            bizContent.put("total_amount", order.getTotalPrice().stripTrailingZeros().toPlainString());
+            bizContent.put("disable_pay_channels", "pcredit,creditCard");
+            if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
+                // 测试环境设为1分
+                bizContent.put("total_amount", "0.01");
+            }
+            bizContent.put("subject", order.getName());
+            bizContent.put("product_code", "QUICK_WAP_PAY");
+            JSONObject body = new JSONObject();
+            body.put("action", "payOrder");
+            body.put("userId", order.getUserId());
+            body.put("orderId", order.getId());
+            bizContent.put("body", body.toJSONString());
+
+            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
+            alipayRequest.setReturnUrl(alipayProperties.getReturnUrl());
+            alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
+            alipayRequest.setBizContent(JSON.toJSONString(bizContent));
+
+            String html = alipayClient.pageExecute(alipayRequest).getBody();
+            return html;
+        }
+        return null;
+    }
+
 }

+ 17 - 0
src/main/java/com/izouma/nineth/utils/UrlUtils.java

@@ -0,0 +1,17 @@
+package com.izouma.nineth.utils;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class UrlUtils {
+    public static String resolve(String base, String path) {
+        try {
+            URI uri = new URI(base);
+            uri = uri.resolve(new URI(path));
+            return uri.toString();
+        } catch (URISyntaxException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 7 - 0
src/main/java/com/izouma/nineth/web/OrderController.java

@@ -1,6 +1,8 @@
 package com.izouma.nineth.web;
 
+import com.alipay.api.AlipayApiException;
 import com.izouma.nineth.domain.Order;
+import com.izouma.nineth.enums.PayMethod;
 import com.izouma.nineth.service.OrderService;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
@@ -63,5 +65,10 @@ public class OrderController extends BaseController {
     public Order create(@RequestParam Long collectionId, @RequestParam int qty, @RequestParam(required = false) Long addressId) {
         return orderService.create(SecurityUtils.getAuthenticatedUser().getId(), collectionId, qty, addressId);
     }
+
+    @PostMapping("/pay")
+    public Object pay(@RequestParam Long id, @RequestParam PayMethod payMethod) throws AlipayApiException {
+        return orderService.pay(id, payMethod);
+    }
 }
 

+ 1 - 1
src/main/nine-space/vue.config.js

@@ -1,6 +1,6 @@
 const path = require("path");
 module.exports = {
-  publicPath: process.env.NODE_ENV === "production" ? "/web/" : "/",
+  publicPath: process.env.NODE_ENV === "production" ? "/9th/" : "/",
   devServer: {
     port: 8081,
     disableHostCheck: true,

+ 16 - 3
src/main/resources/application.yaml

@@ -93,17 +93,30 @@ mychain:
     read-file-from-ext: false
     account: 9th_test
     kmsId: pf08UBzfPJCIVRRI1632647899655
+#alipay:
+#  app-id: 2021002120645023
+#  gateway: https://openapi.alipay.com/gateway.do
+#  private-key: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCGOg3U1ZIzpyIDvClhIsXqxESGyPe1qyVGTNOzEnm5BaDBuziMfXCFCJmQulBOUIPCTe9nO13xejlBXJZv5ppLk5PWTlmKmBEfFMFBoRxr4X2jIfJY0Ch8RdKfGgaP5aMhAcpGtVSbDYsTQ7C9zTlVkd9KyfA+OkLO6sMN2ruV7zOO0vuov1Q6FsBVcddyUd3LkF7hiQUM57iXUBFXVClsp9kujVXcQNe2kfzZvyg9U/cy+j9iDzo+LTh2gmlUABIAPUFzFLRdtWwKatTo9upVxMT88GYUeoJ9j4qtz7mz/Ea5aUWknZX3M24+Fez+XWeR7QNog5Mh08nwA/anlchFAgMBAAECggEAVBdWxvouKBITK0fcnLBOUjA3xkFtfvED3zEOh+eRPqsZ9YU3fjywG4gxvQwcd5PVmAt/aqs0xa4O5LX+wYg1Lhf8zIw1aLCwOUqlcFphFe0k6ui/jYiLdJ/Bvk9twQTa2Djo4reDk8g+UwlbVu2Vd9h1jcNJsZKKfFtza+CXGOzdqdYKr34MiM335wBsdniJVIfnd6jn/h+/zR3L3JkNQ+wrNgaSIFR64mRoajrozLsXJn3rUNPLjKkjIjXP2xra3O9jvnm908oUv/KZ5kQJjq2Xa3RRJ2gRFnd/rAsNp4Dn+ijzg6XsysBx6aO6VzRwapc8PDtvmzMOeUX8P+mrWQKBgQDsjMfqy0DkBbi09qjlfE5hCdIyIeJfEEew7oV8VjRRh+o/JgLcsFLwrykYn2LweIPMn2x57ConqnpTLCfsBR/GgJSFMZZU0d6Q3eX7+jSP2mYWLnxlKpZ2ABN9QiBsBPFgRxZKjB30vHAItSoxEzBHqeLxUPTg8xvaza3rWX/ecwKBgQCRQ3BIb2cYD2Pjda2Z90eDaMKzlCpJHXXuXUyqKe78b/+clqor6c8H/p9n8kMPIXrIqcs864gK9HAk56I+DcClVcUwJFRCdM61s2zbEnYv0ShMwm78nPechGoR0CCfKQwTW4KrNUVN2Yz10GoeihQmNbsKxn2s3cIP2pFEl/WYZwKBgQCQ9+Y9OrtWAzuji9cObRQL3Fz5ZFK7N9r3z/X2sU32+XjRopX2cgkif/aLpIKaJQGBEeMFBXsAPDYjatg8iRdkK8DZr/4VlVj1J0ifGEPGNW6DAZIy3drADmPjS/dau9zByE8c+KoTJrjyXTSyRrQ79x2iDp9EjTjw60Q/C+aViQKBgHqVh4aJBF3odun3X6WjaGT7nfq/WSPUSbX6Y/zhYD0FIpb5Cef+6egcNlcYuQBmx1/Y8ZqaRHbCKnTqSB7Hqj+b7siej8B5JAtvu7fvj27wuWp1VgW1TLt3fq9DjJPjpr4bJlzmmnKE2RCDbVoSOci45PvF3z5m8SJB1v8koWuXAoGBALUWYKbz+L2rRiLRnrRKzPWZ3SAoiPl/xXNYRfB6VWwsTVaGPhrcZe/z/CxsKhwE+fyVoxmrTa5Uz3JYCnaFX3gBrEZ5JL86F4E/cdgSpcM7tUoBCs5n2/XL2kfmWXv/p91sR0sB1gMz+WLHJzHMglrw+MZGkxPJu3KaQMhtBNt4
+#  app-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhjoN1NWSM6ciA7wpYSLF6sREhsj3taslRkzTsxJ5uQWgwbs4jH1whQiZkLpQTlCDwk3vZztd8Xo5QVyWb+aaS5OT1k5ZipgRHxTBQaEca+F9oyHyWNAofEXSnxoGj+WjIQHKRrVUmw2LE0Owvc05VZHfSsnwPjpCzurDDdq7le8zjtL7qL9UOhbAVXHXclHdy5Be4YkFDOe4l1ARV1QpbKfZLo1V3EDXtpH82b8oPVP3Mvo/Yg86Pi04doJpVAASAD1BcxS0XbVsCmrU6PbqVcTE/PBmFHqCfY+Krc+5s/xGuWlFpJ2V9zNuPhXs/l1nke0DaIOTIdPJ8AP2p5XIRQIDAQAB
+#  ali-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2KS67bzs6FQ7+PYCm6Zp1gE06VVpuTpV9Mbqn7RqSKmzKZORbL0pG7UyN/Iu3dooNJLQIcxuUDZF6JNgOiX7nxRPyhLud45EXBBR+TUeJCfdSU/7kg2+XBgwD/zzLfj+cAR8SnlmYE5dA81hsM/l1MQrtLTryT/lAHR36eChb6QUnxAwwUZC8QiWDaFerlScJrJG0VJUEKQD6ANV2qP2fmU8IMxNZBT6WMvRvPIN34hCm9B8Kx2Tr8rOjZvwLwVwd1nR5a5mrbwG+kNY7olHW2ICYxJxIxXzypg4jTa5NyW7XR7tdgecRlAGJNxMeBqWwMRmN5l8G2ozV3iOIwhCMQIDAQAB
+#  apiKey: CRv5YFAOIEGY5PgVf14Y9g==
+#  appCertPath: classpath:cert/appCertPublicKey_2021002120645023.crt
+#  aliPubCertPath: classpath:cert/alipayCertPublicKey_RSA2.crt
+#  rootCertPath: classpath:cert/alipayRootCert.crt
+#  notifyUrl: http://9th.izouma.com/alipay/notify/alipay
+#  returnUrl: http://9th.izouma.com/9th/orders
 alipay:
   app-id: 2021002120645023
   gateway: https://openapi.alipay.com/gateway.do
-  private-key: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCGOg3U1ZIzpyIDvClhIsXqxESGyPe1qyVGTNOzEnm5BaDBuziMfXCFCJmQulBOUIPCTe9nO13xejlBXJZv5ppLk5PWTlmKmBEfFMFBoRxr4X2jIfJY0Ch8RdKfGgaP5aMhAcpGtVSbDYsTQ7C9zTlVkd9KyfA+OkLO6sMN2ruV7zOO0vuov1Q6FsBVcddyUd3LkF7hiQUM57iXUBFXVClsp9kujVXcQNe2kfzZvyg9U/cy+j9iDzo+LTh2gmlUABIAPUFzFLRdtWwKatTo9upVxMT88GYUeoJ9j4qtz7mz/Ea5aUWknZX3M24+Fez+XWeR7QNog5Mh08nwA/anlchFAgMBAAECggEAVBdWxvouKBITK0fcnLBOUjA3xkFtfvED3zEOh+eRPqsZ9YU3fjywG4gxvQwcd5PVmAt/aqs0xa4O5LX+wYg1Lhf8zIw1aLCwOUqlcFphFe0k6ui/jYiLdJ/Bvk9twQTa2Djo4reDk8g+UwlbVu2Vd9h1jcNJsZKKfFtza+CXGOzdqdYKr34MiM335wBsdniJVIfnd6jn/h+/zR3L3JkNQ+wrNgaSIFR64mRoajrozLsXJn3rUNPLjKkjIjXP2xra3O9jvnm908oUv/KZ5kQJjq2Xa3RRJ2gRFnd/rAsNp4Dn+ijzg6XsysBx6aO6VzRwapc8PDtvmzMOeUX8P+mrWQKBgQDsjMfqy0DkBbi09qjlfE5hCdIyIeJfEEew7oV8VjRRh+o/JgLcsFLwrykYn2LweIPMn2x57ConqnpTLCfsBR/GgJSFMZZU0d6Q3eX7+jSP2mYWLnxlKpZ2ABN9QiBsBPFgRxZKjB30vHAItSoxEzBHqeLxUPTg8xvaza3rWX/ecwKBgQCRQ3BIb2cYD2Pjda2Z90eDaMKzlCpJHXXuXUyqKe78b/+clqor6c8H/p9n8kMPIXrIqcs864gK9HAk56I+DcClVcUwJFRCdM61s2zbEnYv0ShMwm78nPechGoR0CCfKQwTW4KrNUVN2Yz10GoeihQmNbsKxn2s3cIP2pFEl/WYZwKBgQCQ9+Y9OrtWAzuji9cObRQL3Fz5ZFK7N9r3z/X2sU32+XjRopX2cgkif/aLpIKaJQGBEeMFBXsAPDYjatg8iRdkK8DZr/4VlVj1J0ifGEPGNW6DAZIy3drADmPjS/dau9zByE8c+KoTJrjyXTSyRrQ79x2iDp9EjTjw60Q/C+aViQKBgHqVh4aJBF3odun3X6WjaGT7nfq/WSPUSbX6Y/zhYD0FIpb5Cef+6egcNlcYuQBmx1/Y8ZqaRHbCKnTqSB7Hqj+b7siej8B5JAtvu7fvj27wuWp1VgW1TLt3fq9DjJPjpr4bJlzmmnKE2RCDbVoSOci45PvF3z5m8SJB1v8koWuXAoGBALUWYKbz+L2rRiLRnrRKzPWZ3SAoiPl/xXNYRfB6VWwsTVaGPhrcZe/z/CxsKhwE+fyVoxmrTa5Uz3JYCnaFX3gBrEZ5JL86F4E/cdgSpcM7tUoBCs5n2/XL2kfmWXv/p91sR0sB1gMz+WLHJzHMglrw+MZGkxPJu3KaQMhtBNt4
-  app-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhjoN1NWSM6ciA7wpYSLF6sREhsj3taslRkzTsxJ5uQWgwbs4jH1whQiZkLpQTlCDwk3vZztd8Xo5QVyWb+aaS5OT1k5ZipgRHxTBQaEca+F9oyHyWNAofEXSnxoGj+WjIQHKRrVUmw2LE0Owvc05VZHfSsnwPjpCzurDDdq7le8zjtL7qL9UOhbAVXHXclHdy5Be4YkFDOe4l1ARV1QpbKfZLo1V3EDXtpH82b8oPVP3Mvo/Yg86Pi04doJpVAASAD1BcxS0XbVsCmrU6PbqVcTE/PBmFHqCfY+Krc+5s/xGuWlFpJ2V9zNuPhXs/l1nke0DaIOTIdPJ8AP2p5XIRQIDAQAB
+  private-key: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDGPN0GkL4ISuFSgeqPAjC6VXTdvnkrC6EyYhRBAwurYLYVcHmI+ffx4pcxXLXrbveXwdxNj2GpUCvy56a5ACu9wiaWwxaF6moV3NILKmJa6c7D/4N3Cy4KG7RcLRyeWpdbRFP7OeM+Y8iRFRp0EhAv7btAqimny32ETvIXMyCSvZbI0hrmtwUFMgPW8ofpIoQ5VhMixdKn2niAyQs5TBL1QuVEP1Qe7WRWBrvtwMx1VmI01zkjgFkfehVJwG+BtHYhRwI1pcDrpQv3sDAHl6Qa2th+BkOX1Qtwmzc/SvUELeqJJCsZ+DVr9kTBNke1A4aR2DrlfTezZpl/sN/fJmlTAgMBAAECggEBAIks+K1gX3+RgVX8vHj1RQ7Lr7D56xLUW1ln8SgDmYGfzKANUqxsfRyOdZ0c0G34PbBv36hz/VqSNbdCgWYnLh2DSfytRtqoGXzDbz12uNS8Ue3i0+/+dn9cKHRYayNRAMeRAqQnrI4xskpi1glXrofb8+WNWoHYGCUEFBXltTaUbSNa4saIuvRQvy1i8qZMiAGu+rd/A5TaI+6C7MnHWmYtZ6fFFUeMnJAPRbn4CqNntKmPwF2IrSHaQlefgaQMY6Il56Ws7D9LuNAqn9xuD1duOiK2VrJTLONkEY001iXczZi6JqGzX83ZyDy3kcbQ4BoWRZ6ehwlfPTmovyuKysECgYEA+5QwUXOlStA3wvYbT5lwvva/y51Di/fi5PCnSL3wBEcTXGPkbAvaH6CV6x11nuJWOSgwD1fBMyzAVASDYd0oRQq2+NUBx2v1PFRc3PM4Yp85oZV3eNDyRV9SzhsT1dR/OfuWyJefuCuxJDsBGJpJV0t7e5lq2qqYgZjvpymZhKMCgYEAybizrkcexSnhlnSaY7ENa7fZsIP5l/y3xbtg/65JsARF1VNOLURj9QgbVEoi5FnCMHiYEal25mTZGEWIawCD+XWdkCu4orvxBXU4boIca6R9lfbzJuY3We3Ts3TEXOp1Tkmn5bMM8ImLU9teetufvQa3+Mq7qI21gB0vEXawI5ECgYAZnagh0wWkjXjwCAEV5Mi/GP7Ea7nh+ZaHux09YeGbfeUxxhYPDlHiYIaDTxeX2vHulfH2zfelD0xyAZejElK0XPfudDnfJVXuE6T09mrqV84VbtOgYJ4ahC85PzaQ0jc2HzDmMdIYfZJm3v8okyUel1f2aNOhejdXEsxsF+dCwwKBgQCuV8Zj/+/mNBZW9RxiwSl6SgIJf2b/J1qluRdSpA3n5Sl+AGv2z78cjg8gwJp7heBCCFhWG4M6CTtgsOgAowdtWWv+qOsBKzJapz9Is4dguWAZdsAchKiePuDTnz3/mFwed6Z27lNmqVoT9esogB0FQINMsduTCDcwLQj7LPt7IQKBgCcPiM5BXeOnIQBlQNA4MrP7th4NIltOEIF6uarqUfnzCy52blRJaXf2VTZNgnY4KovdBIl4JukRyk2Iwcg/Kt+IIv/uBQOLNpQm1cSqMpDs+YZlmKjeTfZiqShuUDueypjQ6t4kK8cHRBQs7FEuKfg842MjJHenNt97TNHAoT5P
+  app-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxjzdBpC+CErhUoHqjwIwulV03b55KwuhMmIUQQMLq2C2FXB5iPn38eKXMVy16273l8HcTY9hqVAr8uemuQArvcImlsMWhepqFdzSCypiWunOw/+DdwsuChu0XC0cnlqXW0RT+znjPmPIkRUadBIQL+27QKopp8t9hE7yFzMgkr2WyNIa5rcFBTID1vKH6SKEOVYTIsXSp9p4gMkLOUwS9ULlRD9UHu1kVga77cDMdVZiNNc5I4BZH3oVScBvgbR2IUcCNaXA66UL97AwB5ekGtrYfgZDl9ULcJs3P0r1BC3qiSQrGfg1a/ZEwTZHtQOGkdg65X03s2aZf7Df3yZpUwIDAQAB
   ali-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2KS67bzs6FQ7+PYCm6Zp1gE06VVpuTpV9Mbqn7RqSKmzKZORbL0pG7UyN/Iu3dooNJLQIcxuUDZF6JNgOiX7nxRPyhLud45EXBBR+TUeJCfdSU/7kg2+XBgwD/zzLfj+cAR8SnlmYE5dA81hsM/l1MQrtLTryT/lAHR36eChb6QUnxAwwUZC8QiWDaFerlScJrJG0VJUEKQD6ANV2qP2fmU8IMxNZBT6WMvRvPIN34hCm9B8Kx2Tr8rOjZvwLwVwd1nR5a5mrbwG+kNY7olHW2ICYxJxIxXzypg4jTa5NyW7XR7tdgecRlAGJNxMeBqWwMRmN5l8G2ozV3iOIwhCMQIDAQAB
   apiKey: CRv5YFAOIEGY5PgVf14Y9g==
   appCertPath: classpath:cert/appCertPublicKey_2021002120645023.crt
   aliPubCertPath: classpath:cert/alipayCertPublicKey_RSA2.crt
   rootCertPath: classpath:cert/alipayRootCert.crt
-  notifyUrl: http://xiongzhu.frp.izouma.com/alipay/payNotify
+  notifyUrl: http://9th.izouma.com/alipay/notify/alipay
+  returnUrl: http://9th.izouma.com/9th/orders
 ---
 
 spring:

+ 7 - 0
src/test/java/com/izouma/nineth/CommonTest.java

@@ -2,6 +2,7 @@ package com.izouma.nineth;
 
 import com.izouma.nineth.domain.BaseEntity;
 import com.izouma.nineth.domain.User;
+import com.izouma.nineth.utils.UrlUtils;
 import com.izouma.nineth.web.BaseController;
 import lombok.SneakyThrows;
 import org.apache.commons.lang3.RandomStringUtils;
@@ -30,6 +31,7 @@ import java.awt.geom.AffineTransform;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -176,4 +178,9 @@ public class CommonTest {
     public void base64() {
         System.out.println(Base64.decode("e6e6vQJYhGmIkcA1pfnsipTovp10wJ"));
     }
+
+    @Test
+    public void resolveUrl() {
+        System.out.println(UrlUtils.resolve("http://123123/", "/asdfsd/sdf"));
+    }
 }