Sfoglia il codice sorgente

feature: 太和兼容

Walker 2 anni fa
parent
commit
840bbf68a0

+ 0 - 34
onemini-hospital-empty/src/main/java/com/ywt/alipaympapi/EmptyApplication.java

@@ -1,13 +1,5 @@
 package com.ywt.alipaympapi;
 
-import com.alipay.easysdk.factory.Factory;
-import com.alipay.easysdk.kernel.Config;
-import com.ywt.alipaympapi.core.utils.BizUtil;
-import com.ywt.alipaympapi.core.utils.Checker;
-import com.ywt.alipaympapi.models.Constants;
-import com.ywt.alipaympapi.models.auth.AlipayMpCfg;
-import com.ywt.alipaympapi.models.enums.TerminalEnum;
-import com.ywt.core.exception.AppMessageException;
 import com.ywt.rpc.core.RestServerStarter;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -22,32 +14,6 @@ public class EmptyApplication {
         String serviceName = "com.ywt.AlipayMpRestService";
         System.out.println("--- RegisterService: " + serviceName);
         RestServerStarter.build(null).registry(serviceName, null, "支付宝小程序服务");
-        initAlipayEasySdk();
     }
 
-    /**
-     * 初始化 alipay-easy-sdk
-     * TODO: 后续扩展多医院需要将 pk & apk 配置化
-     */
-    private static void initAlipayEasySdk() {
-        Config config = new Config();
-        config.protocol = "https";
-        config.gatewayHost = "openapi.alipay.com";
-        config.signType = "RSA2";
-
-        try {
-            AlipayMpCfg cfg = BizUtil.getCfg(TerminalEnum.NFYYBYFY_ALIPAY_MP.getValue());
-            config.appId = Checker.getStringValue(cfg.getAppId());
-            // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
-            config.merchantPrivateKey = Checker.getStringValue(cfg.getMerchantPrivateKey());
-            // 注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可
-            config.alipayPublicKey = Checker.getStringValue(cfg.getPublicKey());
-            Factory.setOptions(config);
-        } catch (AppMessageException e) {
-            System.out.println("EmptyApplication#initAlipayEasySdk(): 获取配置失败" + e.getMessage());
-            e.printStackTrace();
-        }
-
-
-    }
 }

+ 52 - 0
onemini-hospital-empty/src/main/java/com/ywt/alipaympapi/core/utils/BizUtil.java

@@ -1,5 +1,7 @@
 package com.ywt.alipaympapi.core.utils;
 
+import com.alipay.easysdk.factory.Factory;
+import com.alipay.easysdk.kernel.Config;
 import com.ywt.alipaympapi.core.ConstantDef;
 import com.ywt.alipaympapi.models.Constants;
 import com.ywt.alipaympapi.models.auth.AlipayMpCfg;
@@ -29,6 +31,8 @@ public final class BizUtil {
             case NFYYBYFY_ALIPAY_MP:
             case NFYYBYFY_WXAPP:
                 return Constants.HOSPITAL_ID_NFYYBYFY;
+            case TH_ALIPAY_MP:
+                return Constants.TAIHE_HOSPITAL_ID;
             default:
                 return 0;
         }
@@ -142,6 +146,7 @@ public final class BizUtil {
             case TAI_HE_INTERNET_HOSPITAL_DOCTOR_WX_OFFICIAL:
             case TaiheWxOfficial:
             case DOCTOR_MINI_PROGRAM:
+            case TH_ALIPAY_MP:
                 return ConstantDef.TAIHE_HOSPITAL_ID;
             default:
                 return 0;
@@ -155,6 +160,8 @@ public final class BizUtil {
         switch (hospitalId) {
             case Constants.HOSPITAL_ID_NFYYBYFY:
                 return TerminalEnum.NFYYBYFY_ALIPAY_MP.getValue();
+            case Constants.TAIHE_HOSPITAL_ID:
+                return TerminalEnum.TH_ALIPAY_MP.getValue();
             default:
                 return TerminalEnum.UNKNOWN.getValue();
         }
@@ -259,6 +266,9 @@ public final class BizUtil {
         if (TerminalEnum.valueOf(terminal) == TerminalEnum.NFYYBYFY_ALIPAY_MP) {
             return getCfg4Nfyybyfy();
         }
+        if (TerminalEnum.valueOf(terminal) == TerminalEnum.TH_ALIPAY_MP) {
+            return getCfg4Nfth();
+        }
         throw new AppMessageException(String.format("Unsupported terminal %d", terminal));
     }
 
@@ -266,9 +276,17 @@ public final class BizUtil {
     public static List<AlipayMpCfg> getAllCfgs() {
         List<AlipayMpCfg> list = new ArrayList<>();
         list.add(getCfg4Nfyybyfy());
+        list.add(getCfg4Nfth());
         return list;
     }
 
+    public static AlipayMpCfg getAlipayMpCfgByAppId(String appId) throws AppMessageException {
+        List<AlipayMpCfg> cfgs = BizUtil.getAllCfgs();
+        AlipayMpCfg cfg = cfgs.stream().filter(i -> Checker.getStringValue(i.getAppId()).equals(appId)).findFirst().orElse(null);
+        if (cfg == null) throw new AppMessageException("配置有误,找不到 appId " + appId);
+        return cfg;
+    }
+
     // 白云分院小程序配置数据
     private static AlipayMpCfg getCfg4Nfyybyfy() {
         AlipayMpCfg cfg = new AlipayMpCfg();
@@ -281,4 +299,38 @@ public final class BizUtil {
         cfg.setTerminal(TerminalEnum.NFYYBYFY_ALIPAY_MP.getValue());
         return cfg;
     }
+
+    // 太和分院小程序配置数据
+    private static AlipayMpCfg getCfg4Nfth() {
+        AlipayMpCfg cfg = new AlipayMpCfg();
+        cfg.setAppId(Constants.ALIPAYMP_APPID_NFTH);
+        cfg.setSaasSecurityKey(Constants.ALIPAYMP_SAAS_SEC_KEY_NFTH);
+        cfg.setIsvPid(Constants.ALIPAYMP_ISV_PID_NFTH);
+        cfg.setMerchantPrivateKey(Constants.MERCHANT_PRIVATE_KEY_NFTH);
+        cfg.setPublicKey(Constants.ALIPAY_PUBLIC_KEY_NFTH);
+        cfg.setHospitalId(Constants.TAIHE_HOSPITAL_ID);
+        cfg.setTerminal(TerminalEnum.TH_ALIPAY_MP.getValue());
+        return cfg;
+    }
+
+
+    /**
+     * 初始化 alipay-easy-sdk
+     * TODO: 后续扩展多医院需要将 pk & apk 配置化
+     * 为了节省服务器资源不分医院单独部署,每次调用 alipay-easy sdk 前需要初始化,目前看来性能没有影响
+     */
+    public static void initAlipayEasySdk(int terminal) throws AppMessageException {
+        Config config = new Config();
+        config.protocol = "https";
+        config.gatewayHost = "openapi.alipay.com";
+        config.signType = "RSA2";
+
+        AlipayMpCfg cfg = BizUtil.getCfg(terminal);
+        config.appId = Checker.getStringValue(cfg.getAppId());
+        // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
+        config.merchantPrivateKey = Checker.getStringValue(cfg.getMerchantPrivateKey());
+        // 注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可
+        config.alipayPublicKey = Checker.getStringValue(cfg.getPublicKey());
+        Factory.setOptions(config);
+    }
 }

+ 7 - 0
onemini-hospital-empty/src/main/java/com/ywt/alipaympapi/models/Constants.java

@@ -19,6 +19,13 @@ public class Constants {
     public static final String ALIPAY_PUBLIC_KEY_NFYYBYFY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtUtjYn+V60um6GVF0ezsI4NCI8QAiM8BT7SQda3RDzIssPbU5U3GJo/5bbu+k+pOpCOUlGVve2VoO+AXMWizCA8U/RleN7fNE09yw7RdLfLssNp6J4zGfBHQBWMiTrJvGZ4LzZHiwJgf28CGwcovjAK6M8bjF30k5ChQ8YIi+YYuer8yae7XfORLiSTByakglURlVUZF7QgbLph9i/OBk83HribZh+B/n97vavrAUyTjbDE3TMsINsAfMSY1omweXuvqjndYI+XmiBM4nBPHlPsXEeaF9TE8LuIqWm5mnRKWa/0I31RkE+W19tFUx5mF3oHw6SvyVuUQVx0HWGIPKQIDAQAB";
     public static final String ALIPAYMP_SAAS_SEC_KEY_NFYYBYFY = "LdYnclVYOKdN5NRDbTDVyXbQiBQiysOQ";
 
+    // 支付宝小程序配置常量(太和)
+    public static final String ALIPAYMP_APPID_NFTH = "2021003161601045";
+    public static final String ALIPAYMP_ISV_PID_NFTH = "2088541186374195";
+    public static final String MERCHANT_PRIVATE_KEY_NFTH = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDO42axAKPPJpNIQcaOi59EyR9VvvLDmKD+wnhhElOZL/6Zj46tBA1BgF+RipE/4YLQS4LtEejbJtUET+0jdB/bL7oem9eWVipzPmUJTJTC+FlEVowlYl9Ra0cWIE0A71MUgPZSKwgeRcKgkX1dV4809kisDSLbbtILzs59dzMPA5B1KQaf44EyT5Rk9Je7EL/3rdcbel7WzVTPLWP3wKc1g57IlU42xdY+XWSWsSt6od6Lf6chZtYv/I0TsqOq+Qfac/VpIJbhTOt6T0UuH21/ZasHfyoEumyA+/43+sxuYacxvklxhAfZUfR3nOLIo1c8f0j0PnUbWWnmDf0wXLPFAgMBAAECggEAfwO3KRX2e5f4NhVDvIHVnxpG5ZKcYh8TQDTOSPJCZrrDeS1cb7YcGUmh4q2KrQhbElw5nigvqFP31XToZqrFYAC2KFKPEdoGp8f3qbTdY7GqxDzKP61cTZUqCFh+TgOgIudl0l5e1o8HhSKtL6Aw6FgHl7Fc5BDuXZdyyC5lJ2Jx+ec/khoARCnZ9hDBG02cXFcfE99LAHhpBduMhu6wfISnRs9zB3i4x25g8Xl8EcKFvIfpq5MIXBRzsICtUustFsy9GXnuOgIzsT91EdgPK53lTux6BhO65O7S97G0Yb7WB63XbcQWW5jyHN7fLZjwig30tCSJ1eyvpFSViVxeBQKBgQD81VHEfvR1XMrfSF4Pn5mxKm3RKEuvgg00HudG9VUk0pISP+UyQ5bScvMpqkpnln0/Z0xUn2CUgWN8HPObXUfXgtr8iYzo/ah6I8XoP65eTE2Jac3bCVWsa4yxo6x/3vsYfdfRIV5Aw8FKKZnTAZOXgZziBKpiBq5pi+OAMBsjHwKBgQDResOyVMq2nLFt9YK3pf5rF4ST60pUziJJe+ZG76E4St90eVLt/KPc3FnrnuVITVa+Qrlk5i4p0KvC2Amy6dCewLwMx9Z2lFEdB8xXHTMgI5GtShORGUynv7Tk5Am1pG8d2H4VitIDU9jLM12LTGo32ZZVB+NxJiyxg0yCkzOQmwKBgFpkziopla8MMQApeG+viRx9Zevcs0qZfaz/y4JkHj/fBRh/Pat93MN7E5L27kkg1cDAZtrubHJL3Ey4cSQ/8nqLr02QxA9c+UpJ1e0WL3pJX4Ncj5vbN4VAonm0Ye0JxM5Z17pOastO8aFZRETbkHAfh/6K2nvXla3otLrU+C7TAoGAe0ox28ej946JrxoMcWI1N3qEATs+aGNaMr3FboKi9Kq8kaTGdmN3Xgoisla2w7MhFqHW09fV266BKRBVxQNwUb9F7o+/XdM1Wky4q5z39jZ5CvDKS2AEicZ/BShhvpKlA3/j1XH64RJ8SjxVFiNHcM+Td0BJUNMTAvcwFLnmY3kCgYEArrxNfcf69LLNFHmKGWCCfT7ONY9iR3cm+F5iuZ652GL35VJ+oQ4gd/lFHygZazYFM7I+olQEeSNjdd3ELGoudI7n0XlL7A0ssYZTJ2YM4z8i7At2+3GtEGTAsnHBufhQsL6sPE4QELBJMvAyY0vjkXDdbmCvbgfX8t5eKGaVh7A=";
+    public static final String ALIPAY_PUBLIC_KEY_NFTH = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhmMqq+uNaxIALbQy8v1JNZcV1aav8w8R2jX1l5cOtRPM4qncEv6Sb934wWcLAAk3l4zwsRcczObEV8AcQ+ecnR+3wRX6+UtgGamU9ahIPe/SQ5/a3cmx5LJsKoe/gGeciVenmeCXDBgRZbIl1JUk8Iaf39YURTAAyMcMJlEBQwRM7FMApogpdMQ6DNw35d1BnV/0Yz7lrCGs/NBRsgbFXLKpuMzioouwVe6Yt7ItLMs8f4a+rlUvMVCmtNqLsbI/UnPvikAS/Gj7grfVSQy4X5uOd9AYEqc+Tt9WSlb5+4ur0YjLT951zinB6Hd2B/2dP+ARe1ZKP0Lk6aAGHxcAuQIDAQAB";
+    public static final String ALIPAYMP_SAAS_SEC_KEY_NFTH = "OG5s0fhXVFEdbQitZLvNUJ9Wz2SNxkON";
+
     public static final String DOCTOR_AVATAR_URL = "http://ywt-image.oss-cn-shenzhen.aliyuncs.com/doctor/avatar/default.png?x-oss-process=image/resize,h_180,w_180";
 
     public static final String HIS_PAY_MODE_ALIPAY = "ALIPAY"; // 支付宝缴费传给 HIS 的支付标识

+ 1 - 0
onemini-hospital-empty/src/main/java/com/ywt/alipaympapi/models/enums/TerminalEnum.java

@@ -39,6 +39,7 @@ public enum TerminalEnum {
     NFYYBYFY_DOC_WX_OFFICIAL("南方医院白云分院医生版公众号", 22),
     NFYYBYFY_OPTICAL_SHOP_PAY_HELPER("白云视光中心支付助手", 23),
     NFYYBYFY_ALIPAY_MP("南方医院白云分院支付宝小程序", 24),
+    TH_ALIPAY_MP("南方医院太和分院支付宝小程序", 25),
     ;
 
     private final String displayName;

+ 3 - 0
onemini-hospital-empty/src/main/java/com/ywt/alipaympapi/service/impl/IsvRegisterServiceImpl.java

@@ -457,6 +457,9 @@ public class IsvRegisterServiceImpl implements IsvRegisterService {
             case NFYYBYFY_ALIPAY_MP:
                 source = TerminalEnum.NFYYBYFY_ALIPAY_MP.getValue();
                 break;
+            case TH_ALIPAY_MP:
+                source = TerminalEnum.TH_ALIPAY_MP.getValue();
+                break;
             default:
                 source = TerminalEnum.TaiheWxOfficial.getValue();
                 break;

+ 2 - 0
onemini-hospital-empty/src/main/java/com/ywt/alipaympapi/web/controller/AuthController.java

@@ -111,6 +111,8 @@ public class AuthController {
             // auth_code 和 access_token 的区别:https://opendocs.alipay.com/support/01rg6k
             // auth_code 作为换取 access_token 的票据,每次用户授权完成,回调地址中的 auth_code 将不一样,auth_code 只能使用一次,一天未被使用自动过期。
             String rk = String.format(Constants.RK_ACCESS_TOKEN, appId, alipayUid);
+            int terminal = BizUtil.getAlipayMpCfgByAppId(appId).getTerminal();
+            BizUtil.initAlipayEasySdk(terminal);
             AlipaySystemOauthTokenResponse response = Factory.Base.OAuth().getToken(authCode);
             log.info("AuthController#submitAuthCode(): {} 换取 token: {}", rk, JSON.toJSONString(response));
             String accessToken = response.getAccessToken();

+ 3 - 0
onemini-hospital-empty/src/main/java/com/ywt/alipaympapi/web/controller/DevController.java

@@ -82,6 +82,7 @@ public class DevController {
             bizParam.put("isv_pid", isvPid);
             bizParam.put("request_id", UUID.randomUUID().toString());
             log.info("DevController#uploadHospInfo Request: {}", bizParam);
+            BizUtil.initAlipayEasySdk(terminal);
             AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute("alipay.commerce.medical.industrydata.hospital.upload", null, bizParam);
             log.info("DevController#uploadHospInfo Response: {}", JSON.toJSONString(response));
             if (Constants.ALIPAY_SUCCESS_CODE.equals(response.getCode()))
@@ -141,6 +142,7 @@ public class DevController {
             bizParam.put("isv_pid", isvPid);
             bizParam.put("request_id", UUID.randomUUID().toString());
             log.info("DevController#uploadDeptInfo Request: {}", bizParam);
+            BizUtil.initAlipayEasySdk(terminal);
             AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute("alipay.commerce.medical.industrydata.department.upload", null, bizParam);
             log.info("DevController#uploadDeptInfo Response: {}", JSON.toJSONString(response));
             if (Constants.ALIPAY_SUCCESS_CODE.equals(response.getCode()))
@@ -202,6 +204,7 @@ public class DevController {
             bizParam.put("isv_pid", isvPid);
             bizParam.put("request_id", UUID.randomUUID().toString());
             log.info("DevController#uploadDoctorInfo Request: {}", bizParam);
+            BizUtil.initAlipayEasySdk(terminal);
             AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute("alipay.commerce.medical.industrydata.doctor.upload", null, bizParam);
             log.info("DevController#uploadDoctorInfo Response: {}", JSON.toJSONString(response));
             if (Constants.ALIPAY_SUCCESS_CODE.equals(response.getCode()))