ソースを参照

支付宝支付链接

xiongzhu 4 年 前
コミット
2b6222a34f

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

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

+ 23 - 9
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -19,10 +19,12 @@ import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.repo.UserAddressRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import org.springframework.core.env.Environment;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
+import org.springframework.ui.Model;
 
 import javax.transaction.Transactional;
 import java.math.BigDecimal;
@@ -90,17 +92,17 @@ public class OrderService {
 
     }
 
-    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("订单状态错误");
-        }
+    public void payOrderAlipay(Long id, Model model) {
+        try {
+            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("out_trade_no", String.valueOf(new SnowflakeIdWorker(0, 0).nextId()));
             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"))) {
@@ -120,9 +122,21 @@ public class OrderService {
             alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
             alipayRequest.setBizContent(JSON.toJSONString(bizContent));
 
-            String html = alipayClient.pageExecute(alipayRequest).getBody();
-            return html;
+            String form = alipayClient.pageExecute(alipayRequest).getBody();
+            model.addAttribute("form", form);
+        } catch (BusinessException err) {
+            model.addAttribute("errMsg", err.getError());
+        } catch (Exception e) {
+            model.addAttribute("errMsg", e.getMessage());
+        }
+    }
+
+    public Object payOrderWeixin(Long id) {
+        Order order = orderRepo.findByIdAndDelFalse(id).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
         }
+
         return null;
     }
 

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

@@ -66,9 +66,5 @@ public class OrderController extends BaseController {
         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);
-    }
 }
 

+ 39 - 0
src/main/java/com/izouma/nineth/web/OrderPayController.java

@@ -0,0 +1,39 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.service.OrderService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.regex.Pattern;
+
+@Controller
+@RequestMapping("/payOrder")
+@Slf4j
+@AllArgsConstructor
+public class OrderPayController {
+    private final OrderService orderService;
+
+    @RequestMapping(value = "/alipay", method = RequestMethod.GET)
+    public String payOrderAlipay(Long id, Model model, @RequestHeader(value = "User-Agent") String userAgent) {
+
+        boolean weixin = Pattern.matches(".*(micromessenger).*", userAgent.toLowerCase());
+        boolean ios = Pattern.matches(".*(ipad|iphone).*", userAgent.toLowerCase());
+        boolean android = Pattern.matches(".*(android).*", userAgent.toLowerCase());
+        model.addAttribute("weixin", weixin);
+        model.addAttribute("ios", ios);
+        model.addAttribute("android", android);
+        orderService.payOrderAlipay(id, model);
+        return "AlipayHtml";
+    }
+
+    @RequestMapping(value = "/weixin")
+    public Object payOrderWeixin(@RequestParam Long id) {
+        return orderService.payOrderWeixin(id);
+    }
+}

+ 15 - 15
src/main/resources/application.yaml

@@ -93,23 +93,11 @@ mychain:
     read-file-from-ext: false
     account: 9th_test
     kmsId: pf08UBzfPJCIVRRI1632647899655
-alipay:
-  app-id: 2021002187613003
-  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: 2021002186606637
+#  app-id: 2021002187613003
 #  gateway: https://openapi.alipay.com/gateway.do
-#  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
+#  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
@@ -117,6 +105,18 @@ alipay:
 #  rootCertPath: classpath:cert/alipayRootCert.crt
 #  notifyUrl: http://9th.izouma.com/alipay/notify/alipay
 #  returnUrl: http://9th.izouma.com/9th/orders
+alipay:
+  app-id: 2021002186606637
+  gateway: https://openapi.alipay.com/gateway.do
+  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://9th.izouma.com/alipay/notify/alipay
+  returnUrl: http://9th.izouma.com/9th/orders
 ---
 
 spring:

BIN
src/main/resources/img/icon_shouquan.png


BIN
src/main/resources/img/nav_icon_return.png


BIN
src/main/resources/img/zhifu_img_liulanqi_and.png


BIN
src/main/resources/img/zhifu_img_liulanqi_ios.png


+ 125 - 0
src/main/resources/static/aliAuthorize.css

@@ -0,0 +1,125 @@
+#app {
+    font-family: -apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+    font-size: 14px;
+    font-weight: 400;
+    line-height: 1.6;
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    top: 0;
+    overflow: hidden;
+    width: 100%;
+    height: 100%;
+    background-color: #00A0E8;
+    flex-direction: column;
+    display: none;
+}
+
+#app.err {
+    background: black;
+    color: white;
+    justify-content: center;
+    padding: 0 40px;
+    box-sizing: border-box;
+}
+
+.err-msg {
+    border: 1px solid rgba(245, 108, 108, 1);
+    color: rgba(245, 108, 108, 1);
+    background: rgba(245, 108, 108, 0.25);
+    border-radius: 4px;
+    padding: 10px;
+    text-align: center;
+    font-size: 14px;
+    margin-bottom: 20px;
+}
+
+.err-back {
+    background: rgba(253, 251, 96, 1);
+    height: 40px;
+    text-align: center;
+    border-radius: 4px;
+    color: #333230;
+    font-weight: bold;
+    font-size: 14px;
+    line-height: 40px;
+}
+
+.err-back:active {
+    background: rgb(171, 169, 65);
+}
+
+.back {
+    width: 28px;
+    height: 28px;
+}
+
+.van-nav-bar__left {
+    display: flex;
+    align-items: center;
+    height: 100%;
+}
+
+.van-nav-bar__title {
+    color: #000;
+    font-weight: bold;
+}
+
+.container {
+    flex-grow: 1;
+    box-sizing: border-box;
+    overflow-x: hidden;
+    overflow-y: auto;
+    -webkit-overflow-scrolling: touch;
+    padding: 15px;
+}
+
+.overlay .overlay-img {
+    width: 186px;
+    height: 210px;
+    display: block;
+    margin: 13px 28px 0 161px;
+}
+
+.overlay .overlay-text1 {
+    width: 272px;
+    font-size: 16px;
+    font-weight: bold;
+    color: rgba(255, 255, 255, 1);
+    line-height: 22px;
+    margin: 15px auto 0;
+}
+
+.overlay .overlay-text2 {
+    width: 272px;
+    font-size: 13px;
+    color: rgba(255, 255, 255, 1);
+    line-height: 18px;
+    margin: 15px auto 0;
+}
+
+.icon {
+    display: block;
+    width: 100px;
+    height: 118px;
+    margin: 88px auto 0;
+}
+
+.text {
+    width: 176px;
+    height: 44px;
+    font-size: 16px;
+    font-weight: bold;
+    color: rgba(255, 255, 255, 1);
+    line-height: 22px;
+    text-align: center;
+    margin: 31px auto;
+}
+
+.van-button--normal {
+    font-size: 16px;
+    font-weight: bold;
+    color: rgba(0, 160, 232, 1);
+    line-height: 22px;
+}

+ 191 - 0
src/main/resources/static/css/alipay.css

@@ -0,0 +1,191 @@
+#app {
+    font-family: -apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+    font-size: 14px;
+    font-weight: 400;
+    line-height: 1.6;
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    top: 0;
+    overflow: hidden;
+    width: 100%;
+    height: 100%;
+    background-color: #f2f4f5;
+    flex-direction: column;
+    display: none;
+}
+
+.back {
+    width: 28px;
+    height: 28px;
+}
+
+.van-nav-bar__left {
+    display: flex;
+    align-items: center;
+    height: 100%;
+}
+
+.van-nav-bar__title {
+    color: #000;
+    font-weight: bold;
+}
+
+.container {
+    flex-grow: 1;
+    box-sizing: border-box;
+    overflow-x: hidden;
+    overflow-y: auto;
+    -webkit-overflow-scrolling: touch;
+    padding: 15px;
+}
+
+.overlay .overlay-img {
+    width: 186px;
+    height: 210px;
+    display: block;
+    margin: 13px 28px 0 161px;
+}
+
+.overlay .overlay-text1 {
+    width: 272px;
+    font-size: 16px;
+    font-weight: bold;
+    color: rgba(255, 255, 255, 1);
+    line-height: 22px;
+    margin: 15px auto 0;
+}
+
+.overlay .overlay-text2 {
+    width: 272px;
+    font-size: 13px;
+    color: rgba(255, 255, 255, 1);
+    line-height: 18px;
+    margin: 15px auto 0;
+}
+
+.info {
+    background: rgba(255, 255, 255, 1);
+    border-radius: 2px;
+    padding: 15px;
+}
+
+.info .time {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding-bottom: 15px;
+    border-bottom: 1px solid #f2f4f5;
+}
+
+.info .time .title {
+    font-size: 12px;
+    color: rgba(142, 142, 147, 1);
+    line-height: 17px;
+}
+
+.info .time .val {
+    font-size: 26px;
+    color: rgba(0, 0, 0, 1);
+    line-height: 37px;
+    margin-top: 5px;
+}
+
+.info .info-item {
+    margin-top: 15px;
+    display: flex;
+    align-items: center;
+}
+
+.info-item .title {
+    font-size: 13px;
+    color: rgba(56, 56, 56, 1);
+    line-height: 18px;
+    flex-grow: 1;
+}
+
+.info-item .val {
+    font-size: 14px;
+    font-weight: bold;
+    color: rgba(0, 0, 0, 1);
+    line-height: 20px;
+}
+
+.info-item .copy {
+    width: 32px;
+    height: 20px;
+    background: rgba(255, 143, 0, 0.2);
+    border-radius: 2px;
+    font-size: 12px;
+    color: rgba(255, 143, 0, 1);
+    line-height: 20px;
+    text-align: center;
+    margin-right: 8px;
+}
+
+.tips {
+    font-size: 12px;
+    color: rgba(255, 143, 0, 1);
+    line-height: 18px;
+    padding: 10px 0 10px 13px;
+    position: relative;
+}
+
+.tips::before {
+    content: "";
+    position: absolute;
+    width: 4px;
+    height: 14px;
+    background: rgba(255, 143, 0, 1);
+    left: 0;
+    top: 12px;
+}
+
+.pay-info {
+    padding: 0 15px;
+    background: rgba(255, 255, 255, 1);
+    border-radius: 2px;
+    overflow: hidden;
+}
+
+.pay-info .pay-top {
+    display: flex;
+    padding-top: 18px;
+}
+
+.pay-top .pay-icon {
+    width: 46px;
+    height: 46px;
+    display: block;
+}
+
+.pay-info .pay-top .pay-right {
+    flex-grow: 1;
+    margin-left: 8px;
+}
+
+.pay-info .pay-top .pay-right .text1 {
+    font-size: 18px;
+    color: rgba(3, 3, 3, 1);
+    line-height: 25px;
+    display: flex;
+    align-items: center;
+}
+
+.pay-info .pay-top .pay-right .text1 img {
+    width: 32px;
+    height: 14px;
+    margin-left: 8px;
+}
+
+.pay-info .code {
+    display: block;
+    margin: 20px auto;
+}
+
+.submit-btn {
+    margin-top: 43px;
+    position: sticky;
+    bottom: 0;
+}

ファイルの差分が大きいため隠しています
+ 0 - 0
src/main/resources/static/css/vant.css


BIN
src/main/resources/static/img/icon_shouquan.png


BIN
src/main/resources/static/img/iocn_tuijian.png


BIN
src/main/resources/static/img/nav_icon_return.png


BIN
src/main/resources/static/img/pay_icon.png


BIN
src/main/resources/static/img/share_img.png


BIN
src/main/resources/static/img/zhifu_img_liulanqi_and.png


BIN
src/main/resources/static/img/zhifu_img_liulanqi_ios.png


ファイルの差分が大きいため隠しています
+ 0 - 0
src/main/resources/static/js/vant.min.js


ファイルの差分が大きいため隠しています
+ 5 - 0
src/main/resources/static/js/vue.min.js


+ 96 - 0
src/main/resources/templates/AlipayHtml.ftlh

@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <title>支付</title>
+    <!-- 引入样式文件 -->
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.4/lib/index.css">
+    <link rel="stylesheet" href="/static/aliAuthorize.css">
+</head>
+
+<body>
+<#if errMsg??>
+    <div id="app" class="err">
+        <div class="err-msg"> ${errMsg}</div>
+        <div class="err-back" @click="onClickLeft">返回</div>
+    </div>
+<#else>
+    <div id="app">
+
+        <#if weixin>
+            <van-nav-bar title="收银台" @click-left="onClickLeft" style="min-height: 46px">
+                <img class="back" src="/static/img/nav_icon_return.png" slot="left" alt/>
+            </van-nav-bar>
+        </#if>
+
+
+        <div class="container">
+            <img src="/static/img/icon_shouquan.png" alt="" class="icon">
+            <div class="text">正在跳转到支付宝</div>
+
+            <#--        <div class="btn">-->
+            <#--            <van-button type="default" block>点击跳转到支付宝</van-button>-->
+            <#--        </div>-->
+        </div>
+
+        <#if weixin>
+            <van-overlay class="overlay" show>
+                <#if android>
+                    <img class="overlay-img" src="/static/img/zhifu_img_liulanqi_and.png" alt=""/>
+                <#elseif ios>
+                    <img class="overlay-img" src="/static/img/zhifu_img_liulanqi_ios.png" alt=""/>
+                <#else>
+                    <img class="overlay-img" src="/static/img/zhifu_img_liulanqi_and.png" alt=""/>
+                </#if>
+                <#if ios>
+                    <div class="overlay-text1">请点击右上角,选择“在Safari中打开”然后继续完成支付</div>
+                <#else>
+                    <div class="overlay-text1">请点击右上角,选择“在浏览器中打开”然后继续完成支付</div>
+                </#if>
+                <div class="overlay-text2">注:由于微信限制,需要在浏览器中打开才可以完成支付宝支付</div>
+            </van-overlay>
+        </#if>
+    </div>
+</#if>
+<#if !weixin && form??>
+    ${form?no_esc}
+</#if>
+<!-- 引入 Vue 和 Vant 的 JS 文件 -->
+<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
+<script src="https://cdn.jsdelivr.net/npm/vant@2.4/lib/vant.min.js"></script>
+
+<script>
+    // 在 #app 标签下渲染一个按钮组件
+
+    function GetQueryString(name) {
+        var after = window.location.href.split("?")[1];
+        if (after) {
+            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+            var r = after.match(reg);
+            if (r != null) {
+                return decodeURIComponent(r[2]);
+            } else {
+                return null;
+            }
+        }
+    }
+
+    new Vue({
+        el: '#app',
+        data: {},
+        mounted() {
+            document.getElementById('app').style.display = 'flex';
+        },
+        methods: {
+            onClickLeft: function () {
+                history.back();
+            }
+        }
+    });
+</script>
+</body>
+
+</html>

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません