From b1ab565909e471dde643755e93633cb84872733b Mon Sep 17 00:00:00 2001
From: tj <1378534974@qq.com>
Date: 星期五, 28 三月 2025 14:54:18 +0800
Subject: [PATCH] 1.支付宝支付

---
 src/main/java/com/mzl/flower/web/supplier/SupplierController.java     |   10 
 src/main/java/com/mzl/flower/config/pay/AlipayProperties.java         |   37 +++
 src/main/java/com/mzl/flower/config/pay/AlipayClientConfigurator.java |   28 ++
 src/main/java/com/mzl/flower/web/payment/SettlementController.java    |    2 
 src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java         |  210 +++++++++++++++++++++
 src/main/java/com/mzl/flower/utils/alipay/OrderInfoUtil2_0.java       |  217 +++++++++++++++++++++
 pom.xml                                                               |    7 
 src/main/java/com/mzl/flower/utils/alipay/SignUtils.java              |   45 ++++
 src/main/resources/application.yml                                    |   17 +
 9 files changed, 565 insertions(+), 8 deletions(-)

diff --git a/pom.xml b/pom.xml
index 700cf89..148e6e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -281,6 +281,13 @@
             <version>3.1.0</version>
         </dependency>
 
+        <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.40.82.ALL</version>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/mzl/flower/config/pay/AlipayClientConfigurator.java b/src/main/java/com/mzl/flower/config/pay/AlipayClientConfigurator.java
new file mode 100644
index 0000000..99c4ba4
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/pay/AlipayClientConfigurator.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.config.pay;
+
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AlipayClientConfigurator {
+
+    @Autowired
+    private AlipayProperties alipayProperties;
+
+    @Bean
+    public AlipayClient alipayClient() {
+        String url= alipayProperties.getGatewayUrl();
+        String sandboxUrl= alipayProperties.getSandboxGatewayUrl();
+        return new DefaultAlipayClient(
+                url,
+                alipayProperties.getAppId(),
+                alipayProperties.getPrivateKey(),
+                "json",
+                alipayProperties.getCharset(),
+                alipayProperties.getPublicKey(),
+                "RSA2");
+    }
+}
diff --git a/src/main/java/com/mzl/flower/config/pay/AlipayProperties.java b/src/main/java/com/mzl/flower/config/pay/AlipayProperties.java
new file mode 100644
index 0000000..780c3e6
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/pay/AlipayProperties.java
@@ -0,0 +1,37 @@
+package com.mzl.flower.config.pay;
+
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "alipay")
+public class AlipayProperties {
+
+    private String appId;
+
+    private String method;
+
+    private String format;
+
+    private String charset;
+
+    private String signType;
+
+    private String version;
+
+    private String notifyUrl;
+
+    private String privateKey;
+
+    private String publicKey;
+
+    private String gatewayUrl;
+
+    private String sandboxGatewayUrl;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/utils/alipay/OrderInfoUtil2_0.java b/src/main/java/com/mzl/flower/utils/alipay/OrderInfoUtil2_0.java
new file mode 100644
index 0000000..32c2867
--- /dev/null
+++ b/src/main/java/com/mzl/flower/utils/alipay/OrderInfoUtil2_0.java
@@ -0,0 +1,217 @@
+package com.mzl.flower.utils.alipay;
+
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 2.0 订单串本地签名逻辑
+ * 注意:本 Demo 仅作为展示用途,实际项目中不能将 RSA_PRIVATE 和签名逻辑放在客户端进行!
+ */
+
+public class OrderInfoUtil2_0 {
+
+    // 获取当前时间并格式化
+    static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
+
+    /**
+     * 构造授权参数列表
+     *
+     * @param pid
+     * @param app_id
+     * @param target_id
+     * @return
+     */
+    public static Map<String, String> buildAuthInfoMap(String pid, String app_id, String target_id, boolean rsa2) {
+        Map<String, String> keyValues = new HashMap<String, String>();
+
+        // 商户签约拿到的app_id,如:2013081700024223
+        keyValues.put("app_id", app_id);
+
+        // 商户签约拿到的pid,如:2088102123816631
+        keyValues.put("pid", pid);
+
+        // 服务接口名称, 固定值
+        keyValues.put("apiname", "com.alipay.account.auth");
+
+        // 服务接口名称, 固定值
+        keyValues.put("methodname", "alipay.open.auth.sdk.code.get");
+
+        // 商户类型标识, 固定值
+        keyValues.put("app_name", "mc");
+
+        // 业务类型, 固定值
+        keyValues.put("biz_type", "openservice");
+
+        // 产品码, 固定值
+        keyValues.put("product_id", "APP_FAST_LOGIN");
+
+        // 授权范围, 固定值
+        keyValues.put("scope", "kuaijie");
+
+        // 商户唯一标识,如:kkkkk091125
+        keyValues.put("target_id", target_id);
+
+        // 授权类型, 固定值
+        keyValues.put("auth_type", "AUTHACCOUNT");
+
+        // 签名类型
+        keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");
+
+        return keyValues;
+    }
+
+    /**
+     * 构造支付订单参数列表
+     */
+    public static Map<String, String> buildOrderParamMapTest(String app_id, boolean rsa2) {
+        String timestamp = format.format(new Date());
+
+        Map<String, String> keyValues = new TreeMap<>();
+
+        keyValues.put("app_id", app_id);
+
+        keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() +  "\"}");
+
+        keyValues.put("charset", "utf-8");
+
+        keyValues.put("method", "alipay.trade.app.pay");
+
+        keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");
+
+        keyValues.put("timestamp", timestamp);
+
+        keyValues.put("version", "1.0");
+
+        return keyValues;
+    }
+
+    /**
+     * 构造支付订单参数列表
+     */
+    public static Map<String, String> buildOrderParamMap(String app_id, boolean rsa2, String bizContent) {
+
+        String timestamp = format.format(new Date());
+
+        Map<String, String> keyValues = new TreeMap<String, String>();
+
+        keyValues.put("app_id", app_id);
+
+        keyValues.put("biz_content", bizContent);
+
+        keyValues.put("charset", "utf-8");
+
+        keyValues.put("method", "alipay.trade.app.pay");
+
+        keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");
+
+        keyValues.put("timestamp", timestamp);
+
+        keyValues.put("version", "1.0");
+
+        return keyValues;
+    }
+
+    /**
+     * 构造支付订单参数信息
+     *
+     * @param map
+     * 支付订单参数
+     * @return
+     */
+    public static String buildOrderParam(Map<String, String> map) {
+        List<String> keys = new ArrayList<String>(map.keySet());
+
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < keys.size() - 1; i++) {
+            String key = keys.get(i);
+            String value = map.get(key);
+            sb.append(buildKeyValue(key, value, true));
+            sb.append("&");
+        }
+
+        String tailKey = keys.get(keys.size() - 1);
+        String tailValue = map.get(tailKey);
+        sb.append(buildKeyValue(tailKey, tailValue, true));
+
+        return sb.toString();
+    }
+
+    /**
+     * 拼接键值对
+     *
+     * @param key
+     * @param value
+     * @param isEncode
+     * @return
+     */
+    private static String buildKeyValue(String key, String value, boolean isEncode) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(key);
+        sb.append("=");
+        if (isEncode) {
+            try {
+                sb.append(URLEncoder.encode(value, "UTF-8"));
+            } catch (UnsupportedEncodingException e) {
+                sb.append(value);
+            }
+        } else {
+            sb.append(value);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 对支付参数信息进行签名
+     *
+     * @param map
+     *            待签名授权信息
+     *
+     * @return
+     */
+    public static String getSign(Map<String, String> map, String rsaKey, boolean rsa2) {
+        List<String> keys = new ArrayList<String>(map.keySet());
+        // key排序
+        Collections.sort(keys);
+
+        StringBuilder authInfo = new StringBuilder();
+        for (int i = 0; i < keys.size() - 1; i++) {
+            String key = keys.get(i);
+            String value = map.get(key);
+            authInfo.append(buildKeyValue(key, value, false));
+            authInfo.append("&");
+        }
+
+        String tailKey = keys.get(keys.size() - 1);
+        String tailValue = map.get(tailKey);
+        authInfo.append(buildKeyValue(tailKey, tailValue, false));
+
+        String oriSign = SignUtils.sign(authInfo.toString(), rsaKey, rsa2);
+        String encodedSign = "";
+
+        try {
+            encodedSign = URLEncoder.encode(oriSign, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return "sign=" + encodedSign;
+    }
+
+    /**
+     * 要求外部订单号必须唯一。
+     * @return
+     */
+    public static String getOutTradeNo() {
+        SimpleDateFormat format = new SimpleDateFormat("YYYYMMddHHmmss", Locale.getDefault());
+        Date date = new Date();
+        String key = format.format(date);
+
+        Random r = new Random();
+        key = key + r.nextInt();
+        key = key.substring(0, 15);
+        return key;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/utils/alipay/SignUtils.java b/src/main/java/com/mzl/flower/utils/alipay/SignUtils.java
new file mode 100644
index 0000000..eb99e69
--- /dev/null
+++ b/src/main/java/com/mzl/flower/utils/alipay/SignUtils.java
@@ -0,0 +1,45 @@
+package com.mzl.flower.utils.alipay;
+
+
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
+
+
+public class SignUtils {
+
+    private static final String ALGORITHM = "RSA";
+
+    private static final String SIGN_ALGORITHMS = "SHA1WithRSA";
+
+    private static final String SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA";
+
+    private static final String DEFAULT_CHARSET = "UTF-8";
+
+    private static String getAlgorithms(boolean rsa2) {
+        return rsa2 ? SIGN_SHA256RSA_ALGORITHMS : SIGN_ALGORITHMS;
+    }
+
+    public static String sign(String content, String privateKey, boolean rsa2) {
+        try {
+            PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
+                    Base64.getDecoder().decode(privateKey));
+            KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);
+            PrivateKey priKey = keyf.generatePrivate(priPKCS8);
+
+            java.security.Signature signature = java.security.Signature
+                    .getInstance(getAlgorithms(rsa2));
+
+            signature.initSign(priKey);
+            signature.update(content.getBytes(DEFAULT_CHARSET));
+
+            byte[] signed = signature.sign();
+            return Base64.getEncoder().encodeToString(signed);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/web/payment/SettlementController.java b/src/main/java/com/mzl/flower/web/payment/SettlementController.java
index 196d9f3..0ea1434 100644
--- a/src/main/java/com/mzl/flower/web/payment/SettlementController.java
+++ b/src/main/java/com/mzl/flower/web/payment/SettlementController.java
@@ -72,7 +72,7 @@
     @GetMapping("/do")
     @ApiOperation(value = "手动结算")
     public ResponseEntity<ReturnDataDTO<?>> doSettlement(){
-        scheduleService.doSettlement();
+//        scheduleService.doSettlement();
         return returnData(R.SUCCESS.getCode(), null);
     }
 }
diff --git a/src/main/java/com/mzl/flower/web/supplier/SupplierController.java b/src/main/java/com/mzl/flower/web/supplier/SupplierController.java
index 79c4d87..59aa78c 100644
--- a/src/main/java/com/mzl/flower/web/supplier/SupplierController.java
+++ b/src/main/java/com/mzl/flower/web/supplier/SupplierController.java
@@ -33,7 +33,7 @@
 @Slf4j
 public class SupplierController extends BaseController {
 
-    private static final R ALLOWED_CONTENT_TYPES = R.valueOf("jpg");
+//    private static final R ALLOWED_CONTENT_TYPES = R.valueOf("jpg");
     private final SupplierService supplierService;
 
     public SupplierController(SupplierService supplierService) {
@@ -73,10 +73,10 @@
                 }
 
                 // 2. 检查文件类型
-                String contentType = avatar.getContentType();
-                if (!ALLOWED_CONTENT_TYPES.contains(contentType)) {
-                    throw new ValidationException("不支持的文件类型");
-                }
+//                String contentType = avatar.getContentType();
+//                if (!ALLOWED_CONTENT_TYPES.contains(contentType)) {
+//                    throw new ValidationException("不支持的文件类型");
+//                }
 
                 // 3. 生成文件名
                 String fileName = "avatar/" + UUID.randomUUID().toString() +
diff --git a/src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java b/src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java
new file mode 100644
index 0000000..d4b73a0
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/pay/AlipayController.java
@@ -0,0 +1,210 @@
+package com.mzl.flower.web.v2.pay;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.response.AlipayTradeAppPayResponse;
+
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.config.pay.AlipayProperties;
+import com.mzl.flower.utils.alipay.OrderInfoUtil2_0;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+
+/**
+ * @author taojie 20250321
+ */
+@RestController
+@RequestMapping(value = "/v2/alipay")
+@Api(tags = {"支付宝支付相关"})
+public class AlipayController extends BaseController {
+
+    private Logger logger = LoggerFactory.getLogger(AlipayController.class);
+
+    @Autowired
+    private AlipayProperties alipayProperties;
+
+    @Autowired
+    AlipayClient alipayClient;
+
+    /**
+     * 获取订单支付请求参数
+     * @param
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/pay-order-info")
+    @ApiOperation(value = "获取订单支付请求参数")
+    public ResponseEntity getPayOrderInfo() throws Exception {
+
+        String orderId=" ";
+        String totalAmount="0.01";
+        String subject="测试支付";
+        String body="我是测试支付";
+//        创建订单
+//        createAlipayOrder(orderId,totalAmount,subject);
+
+        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
+        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
+        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
+        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
+        model.setBody("我是测试数据");
+        model.setSubject("App支付测试Java");
+        model.setOutTradeNo(OrderInfoUtil2_0.getOutTradeNo());
+//        model.setOutTradeNo(orderId);
+        model.setTimeoutExpress("30m");
+        model.setTotalAmount("0.01");
+        model.setProductCode("QUICK_MSECURITY_PAY");
+        request.setBizModel(model);
+        request.setNotifyUrl(alipayProperties.getNotifyUrl());
+        try {
+            //这里和普通的接口调用不同,使用的是sdkExecute
+            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
+            System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
+            String result=response.getBody();
+            return returnData(R.SUCCESS.getCode(), result);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+            return returnData(R.RUNTIME_EXCEPTION.getCode(), "",e.getMessage());
+        }
+    }
+
+    /**
+     * 支付宝回调url
+     * @param request
+     * @return
+     * @throws Exception
+     */
+    @PostMapping(value = "/notify")
+    @ApiOperation(value = "支付宝回调url")
+    public String notify(HttpServletRequest request) throws Exception{
+
+        //获取支付宝POST过来反馈信息
+        Map<String,String> params = new HashMap<String,String>();
+        Map requestParams = request.getParameterMap();
+        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext ();) {
+            String name =  ( String )iter.next();
+            String[] values = (String[])requestParams.get(name);
+            String valueStr="";
+            for(int i = 0;i < values.length; i++){
+                valueStr = (i== values.length-1)?valueStr+values[i]:valueStr+values[i] + ",";
+            }
+            //乱码解决,这段代码在出现乱码时使用。没有乱码不要用,否则验签失败
+//            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
+            params.put(name,valueStr);
+        }
+
+        boolean rsa2 = AlipaySignature.rsaCheckV1(params, alipayProperties.getPublicKey(), alipayProperties.getCharset(), alipayProperties.getSignType());
+
+        // 查看验签结果
+        System.out.println(rsa2);
+        if(rsa2){
+            return "success";
+        }
+
+        return "fail";
+    }
+
+
+
+    private void createAlipayOrder(String orderId,String totalAmount,String subject) throws AlipayApiException {
+        // 初始化SDK
+
+        // 构造请求参数以调用接口
+        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
+        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
+
+        // 设置商户订单号
+        model.setOutTradeNo(orderId);
+
+        // 设置订单总金额
+        model.setTotalAmount(totalAmount);
+
+        // 设置订单标题
+        model.setSubject(subject);
+
+        // 设置产品码
+        model.setProductCode("QUICK_MSECURITY_PAY");
+
+        // 设置订单包含的商品列表信息
+//        List<GoodsDetail> goodsDetail = new ArrayList<GoodsDetail>();
+//        GoodsDetail goodsDetail0 = new GoodsDetail();
+//        goodsDetail0.setGoodsName("ipad");
+//        goodsDetail0.setAlipayGoodsId("20010001");
+//        goodsDetail0.setQuantity(1L);
+//        goodsDetail0.setPrice("2000");
+//        goodsDetail0.setGoodsId("apple-01");
+//        goodsDetail0.setGoodsCategory("34543238");
+//        goodsDetail0.setCategoriesTree("124868003|126232002|126252004");
+//        goodsDetail0.setShowUrl("http://www.alipay.com/xxx.jpg");
+//        goodsDetail.add(goodsDetail0);
+//        model.setGoodsDetail(goodsDetail);
+
+        // 设置订单绝对超时时间
+//        model.setTimeExpire("2016-12-31 10:05:00");
+
+//        // 设置业务扩展参数
+//        ExtendParams extendParams = new ExtendParams();
+//        extendParams.setSysServiceProviderId("2088511833207846");
+//        extendParams.setHbFqSellerPercent("100");
+//        extendParams.setHbFqNum("3");
+//        extendParams.setIndustryRefluxInfo("{\"scene_code\":\"metro_tradeorder\",\"channel\":\"xxxx\",\"scene_data\":{\"asset_name\":\"ALIPAY\"}}");
+//        extendParams.setRoyaltyFreeze("true");
+//        extendParams.setCardType("S0JP0000");
+//        model.setExtendParams(extendParams);
+
+        // 设置公用回传参数
+//        model.setPassbackParams("merchantBizType%3d3C%26merchantBizNo%3d2016010101111");
+
+        // 设置商户的原始订单号
+//        model.setMerchantOrderNo("20161008001");
+
+        // 设置外部指定买家
+//        ExtUserInfo extUserInfo = new ExtUserInfo();
+//        extUserInfo.setCertType("IDENTITY_CARD");
+//        extUserInfo.setCertNo("362334768769238881");
+//        extUserInfo.setName("李明");
+//        extUserInfo.setMobile("16587658765");
+//        extUserInfo.setMinAge("18");
+//        extUserInfo.setNeedCheckInfo("F");
+//        extUserInfo.setIdentityHash("27bfcd1dee4f22c8fe8a2374af9b660419d1361b1c207e9b41a754a113f38fcc");
+//        model.setExtUserInfo(extUserInfo);
+
+        // 设置通知参数选项
+        List<String> queryOptions = new ArrayList<String>();
+        queryOptions.add("hyb_amount");
+        queryOptions.add("enterprise_pay_info");
+        model.setQueryOptions(queryOptions);
+
+        request.setBizModel(model);
+        // 第三方代调用模式下请设置app_auth_token
+        // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
+
+        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
+        String orderStr = response.getBody();
+        System.out.println(orderStr);
+
+        if (response.isSuccess()) {
+            System.out.println("调用成功");
+        } else {
+            System.out.println("调用失败");
+            // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
+            // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
+            // System.out.println(diagnosisUrl);
+        }
+    }
+
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 3094aba..234aa83 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,7 +1,7 @@
 server:
   port: 8080
   servlet:
-    context-path: /flower
+    context-path: /smart_message
 
 spring:
   application:
@@ -98,4 +98,17 @@
   gaode:
     apiKey: 19b8a6e7325089d484fcee00076746fa
     # 新政区划接口url
-    administrative_divisions_url: https://restapi.amap.com/v3/config/district?key=${map.gaode.apiKey}&subdistrict=3&subdistrict=3&extensions=base
\ No newline at end of file
+    administrative_divisions_url: https://restapi.amap.com/v3/config/district?key=${map.gaode.apiKey}&subdistrict=3&subdistrict=3&extensions=base
+
+alipay:
+  appId: 2021005131620323
+  method: alipay.trade.app.pay
+  format: JSON
+  charset: utf-8
+  signType: RSA2
+  version: 1.0
+  privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCkLUDzBE5pT6dvcG4pLsvDUcq106aHgOZ70Ju6C+6H8DJ56j9OuJ9Hy1A83D+3eTGQSIb4jjxf0pzCeW46wyooIZKLMxeBYgxnPc2bgwStJDhsH2bAUcDMfPUF2PHiS/es2W9+7QVNkjPSG1MYF+uwjit81qsyKVWFQJpUrOQ0jDUmik8UX+zJxLYi9zVFUK+qkAs195TCmABCRYrq6ApN+6lCuCfX7yyiC/kvJmUfUHzf4fTlPvQnQepOvO3x3ZCxErEaIjE+V0dYWDxZE9gpFX5tt7HkKDblwIJjC2kDlj6jXj8TRHq8GvBgVK0SVcau4vP9oPVCejBo81hf7nTRAgMBAAECggEAWq9EePef+DuvWLbZopXep3y+Y8EM8zwYE7weyJ1enGfo+b6SSYFhOd7r6zIdX9LptbDaHOE0KBnFzQYWBQ9YceJZd9o42Za3Ey/oKkYshxbCs7aEoyaFQG6lSR2UPlOH80oHdCyoCTkAtsWxGFXeMh/VlZdd6M88FeahWLRHOV51ObFgezZL0enj56mm6R9nx4adNcQwX/y8YzPu7PExiBd/dn26g0u15gIxJOohu8l+bAnj6pVyqgyQuMBXWVq9dCQJIs+h/YTWmRqVforWKH9ZW9QeqGYmrIIk2B8HjXuGIqhGzPP9VlxGV5Fh3aeIy4sOSmwoNfW+tC1unKogAQKBgQDizkevsxujSOLQVoNyGqBBZ6y6+lNEt7pmw2IjHo9Ml1gI8GDKyDOc3Iy1lp8siiLRXBsAb4ZyvvuBQDMKG1SFL0muKQLFtSxhiUb959qH5/zndX5StkdB9vUL5nYqCmqYWq5iHxKz4m/3h+R9VcS6oLkr0ZBkKyU+HXSOntb/kQKBgQC5Tzfbp+/iesnebtaqMp8czSrnQZKBO5jGIikIojKe3waxBn6egtFkFW+2R2CImAp3B+7lmwzgrrdB0CEc92PwwU7UY5/Pd3fPXQEvyBBDgF0zmiiNMu+6suBiyF2UMwZI5GQ2avs5AEwBs1PGoLjUejGFCTKMqdFgqIf9ctgBQQKBgQDcpGjA2LFubB2bKE6/1n9IoZ88VwJiu4ovJqx2Fei6ThFqwM6o95Kea0DH9zvqjIfKvJvYFKbrQjhSSS5eCrBy0MoRD/yOce43BOF3aPMDfABg+8Bknsc7uRAy/4S86V1B0hYLhscfEI50dFMoSyQTmwAJTNn3WLHmd6lIheYKwQKBgHF4QpnsMYWa7nWXpTa+nJOERhspGc6scZYRYNL6jsidhHltoqbpL9J7FdalykSZ5P6SCwTpdm82TNyt1zjne3j2xZBkGH1viBuftZROizbqKSfp457ia80Er0WNr0+KFvUXdQ2lYIO83M3FwyzDSapB0ITH5v4fFih7yhm18vKBAoGARocpeWlxQYLjWn0zsqCcetx8ocrIp/Q6xcY7TgdMeFN7nQ5VTceQ/2dy0Nhi9gpUqTT1rxPC1ULG3QrPFCqAOTRwpoZ4y7jnbKyCykhjWh+JomtsNyGxi5xRqEqGCk98VnPa/Efk8s+g0/WRGf6kTK9EIVPNp1s0mG5zCDRMPqo=
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoXlmlW2TI0DmYm/eZqGxHSPEdzULsrCTFPW2B4VrMk5gj8afPS/nq/cXEOIjsCrTP0dJsdbDqk+YlVRGEHCxgkl6nZGgRtZmzHJxwWw+YEMejI/fP0Sr8nKSEa/+otcX6LO7ktl4vVcvAU0Q9RVEGLpz62djkkwrJMMds6wSRsJI1GDwT+5Ra4s06+lVN4ISU0IUx6E2m2NaZBimMiB+buy7ZPXg6eDE5B2oXOQ5qdL2E18Q7hm7XI+DYAQslLXGr2pjLGLRZ01/b4XyIPzZmusNF+vNp4qKji38a23MjO33ONWqBj/JlWkPW5Vl1AiL5vg6HuqEEfHdBq9mVuZBEwIDAQAB
+  gatewayUrl: https://openapi.alipay.com/gateway.do
+  sandboxGatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
+  notifyUrl: http://azcbit.natappfree.cc/jshERP-boot/alipay/notify
\ No newline at end of file

--
Gitblit v1.9.3