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