From 082896aabc60088a9057ff19b157f4e54f3b36f1 Mon Sep 17 00:00:00 2001 From: liuyingfang <1357764963@qq.com> Date: Thu, 20 Apr 2023 15:29:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86,=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=8E=A8=E9=80=81=E4=BA=8B=E4=BB=B6=EF=BC=8Clkl?= =?UTF-8?q?=E7=9A=84=E9=83=A8=E5=88=86=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/config/ParameterConfig.java | 3 + .../pluss/platform/util/ParametersUtil.java | 4 + .../java/cn/pluss/platform/util/RSAUtils.java | 2 +- .../java/cn/pluss/platform/util/SM4Util.java | 161 ++++++++++++++++++ .../cn/pluss/platform/wechat/WxConstants.java | 4 +- .../resources/config/application-common.yml | 2 + .../main/resources/config/application-lkl.yml | 2 + .../main/resources/config/application-ys.yml | 6 +- .../java/cn/pluss/platform/klk/LklConfig.java | 14 ++ .../platform/klk/entity/ReqKlkEntity.java | 59 +++++++ .../platform/klk/entity/RespKlkEntity.java | 31 ++++ .../platform/klk/service/KlkService.java | 51 ++++++ .../impl/MerchantMenberServiceImpl.java | 3 +- .../cn/pluss/platform/utils/WechatUtils.java | 4 + .../controller/home/WechantController.java | 40 +++-- 15 files changed, 361 insertions(+), 25 deletions(-) create mode 100644 pluss-common-bundle/src/main/java/cn/pluss/platform/util/SM4Util.java create mode 100644 pluss-common-bundle/src/main/resources/config/application-lkl.yml create mode 100644 pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LklConfig.java create mode 100644 pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/ReqKlkEntity.java create mode 100644 pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/RespKlkEntity.java create mode 100644 pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/KlkService.java diff --git a/pluss-common-bundle/src/main/java/cn/pluss/platform/config/ParameterConfig.java b/pluss-common-bundle/src/main/java/cn/pluss/platform/config/ParameterConfig.java index b54d8e0..581781d 100644 --- a/pluss-common-bundle/src/main/java/cn/pluss/platform/config/ParameterConfig.java +++ b/pluss-common-bundle/src/main/java/cn/pluss/platform/config/ParameterConfig.java @@ -89,6 +89,8 @@ public class ParameterConfig { */ @Value("${parameter.APPLETS_APPID}") public String APPLETS_APPID; + @Value("${parameter.APPLETS_SECRET}") + public String APPLETS_SECRET; /** * AppSecret */ @@ -272,6 +274,7 @@ public class ParameterConfig { ParametersUtil.WECHAT_RATE = WECHAT_RATE; ParametersUtil.APPID = APPID; ParametersUtil.APPLETS_APPID = APPLETS_APPID; + ParametersUtil.APPLETS_SECRET = APPLETS_SECRET; ParametersUtil.APPSECRET = APPSECRET; ParametersUtil.PID = PID; ParametersUtil.KEY = KEY; diff --git a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/ParametersUtil.java b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/ParametersUtil.java index 5d5f12a..759d13f 100644 --- a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/ParametersUtil.java +++ b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/ParametersUtil.java @@ -45,6 +45,10 @@ public class ParametersUtil { * 小程序付款的appid */ public static String APPLETS_APPID; + /** + * 小程序密钥 + */ + public static String APPLETS_SECRET; /** * AppSecret */ diff --git a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/RSAUtils.java b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/RSAUtils.java index 817fb6c..8b1f404 100644 --- a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/RSAUtils.java +++ b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/RSAUtils.java @@ -113,7 +113,7 @@ public class RSAUtils { public static PrivateKey getPrivateKey(String key) throws Exception { byte[] keyBytes; - keyBytes = Base64.getDecoder().decode(key); + keyBytes = Base64.getMimeDecoder().decode(key); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(RSA); return keyFactory.generatePrivate(keySpec); diff --git a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/SM4Util.java b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/SM4Util.java new file mode 100644 index 0000000..f25989d --- /dev/null +++ b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/SM4Util.java @@ -0,0 +1,161 @@ +package cn.pluss.platform.util; + + +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.SecureRandom; +import java.security.Security; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; + +import cn.pluss.platform.exception.MsgException; +import org.bouncycastle.crypto.CryptoException; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.util.encoders.Base64; + +import static org.bouncycastle.util.encoders.Base64.toBase64String; + +//import com.lakala.zf.idry.yzt.exception.CryptoException; + + +public class SM4Util { + + public static final String ALGORITHM_NAME = "SM4"; + public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding"; + + // SM4算法目前只支持128位(即密钥16字节) + public static final int DEFAULT_KEY_SIZE = 128; + + public static final String ENCODING = "UTF-8"; + + + static { + Security.addProvider(new BouncyCastleProvider()); + } + + /** + * 生成Base64编码的密钥 + * + * @return Base64编码的密钥 + * @throws CryptoException + */ + public static String generateKeyToBase64() throws CryptoException { + return toBase64String(generateKey()); + } + + public static byte[] generateKey() throws CryptoException { + return generateKey(DEFAULT_KEY_SIZE); + } + + /** + * 生成Base64编码的密钥 + * + * @param keySize 密钥长度 单位为bit + * @return Base64编码的密钥 + * @throws CryptoException + */ + public static String generateKeyToBase64(int keySize) throws CryptoException { + return toBase64String(generateKey(keySize)); + } + + public static byte[] generateKey(int keySize) throws CryptoException { + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME); + } catch (Exception e) { + throw new CryptoException("SM4Util generateKey error:", e); + } + kg.init(keySize, new SecureRandom()); + return kg.generateKey().getEncoded(); + } + + + public static byte[] encrypt_ECB_Padding(byte[] key, byte[] data) throws CryptoException { + try { + Cipher cipher = generateECBCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key); + return cipher.doFinal(data); + } catch (Exception e) { + throw new CryptoException("SM4Util encrypt_ECB_Padding error:", e); + } + } + + /** + * ECB_PKCS5Padding 加密,返回Base64编码后的密文 + * + * @param key base64 + * @param data 正常明文数据 + * @return + * @throws MsgException + */ + public static String encrypt(String key, String data) throws CryptoException { + try { + Cipher cipher = generateECBCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, Base64.decode(key)); + byte[] enData =cipher.doFinal(data.getBytes(ENCODING)); + return Base64.toBase64String(enData); + } catch (Exception e) { + throw new CryptoException("SM4Util encrypt_ECB_Padding error:", e); + } + } + + /** + * ECB_PKCS5Padding 解密 ,返回正常明文数据 + * + * @param key base64 + * @param cipherText 返回Base64编码后的密文 + * @return + * @throws Exception + */ + public static String decrypt(String key, String cipherText) throws CryptoException { + try { + Cipher cipher = generateECBCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, Base64.decode(key)); + byte[] data =cipher.doFinal(Base64.decode(cipherText)); + return new String(data,ENCODING); + } catch (Exception e) { + throw new CryptoException("SM4Util decrypt_ECB_Padding error:", e); + } + } + + + public static byte[] decrypt_ECB_Padding(byte[] key, byte[] cipherText) throws CryptoException { + try { + Cipher cipher = generateECBCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key); + return cipher.doFinal(cipherText); + } catch (Exception e) { + throw new CryptoException("SM4Util decrypt_ECB_Padding error:", e); + } + } + + private static Cipher generateECBCipher(String algorithmName, int mode, byte[] key) + throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, + InvalidKeyException { + Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME); + Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME); + cipher.init(mode, sm4Key); + return cipher; + } + + public static void main(String[] args) throws Exception { + try { + String key = "dRzPaYd7z6vYn9sL/JTZ3A=="; + + String data = "阿萨德哈的哦已我居然挤公交大幅度AAAADDF"; + + String cipherText = encrypt(key, data); + + System.out.println("cipherText " + cipherText); + + String deData = decrypt(key, cipherText); + + System.out.println("deData " + deData); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/pluss-common-bundle/src/main/java/cn/pluss/platform/wechat/WxConstants.java b/pluss-common-bundle/src/main/java/cn/pluss/platform/wechat/WxConstants.java index 8b7fc5e..f818c41 100644 --- a/pluss-common-bundle/src/main/java/cn/pluss/platform/wechat/WxConstants.java +++ b/pluss-common-bundle/src/main/java/cn/pluss/platform/wechat/WxConstants.java @@ -84,13 +84,13 @@ public class WxConstants { public static final Integer RESULT_SUCCESS_CODE = 0; - public static final Integer QR_EXPIRE_SECONDS = 2592000; + public static final Integer QR_EXPIRE_SECONDS = 25920000; /** * 微信会员开卡通知模板ID * @date: 2021/12/9 18:17 */ - public static final String VIP_CARD_SUCCESS_TEMPLATE_ID = "Hf_WLVwVAc0HD4KV2_zLD0vTgiw4jpZ-OkcN4lIffUA"; + public static final String VIP_CARD_SUCCESS_TEMPLATE_ID = "AEEmXqtyvSIppWOX-RWglgU8Wc8DxSNDi4xXq7iles0"; /** * 会员卡余额变动通知模板ID diff --git a/pluss-common-bundle/src/main/resources/config/application-common.yml b/pluss-common-bundle/src/main/resources/config/application-common.yml index aa34061..1d3dec6 100644 --- a/pluss-common-bundle/src/main/resources/config/application-common.yml +++ b/pluss-common-bundle/src/main/resources/config/application-common.yml @@ -101,6 +101,8 @@ parameter: # wxfffc7bff64c7a11e #小程序付款APPID APPLETS_APPID: wxc2bb94c0ddda1032 + #小程序密钥 + APPLETS_SECRET: 625cbce8772629312e42e8278a8d6889 APPSECRET: 4e00bbf3fc75a1ff68ce866fd13f2bcc # b84ee0efaa0d9a649746ac65525f8e10 KEY: 微信原生加密用的KEY diff --git a/pluss-common-bundle/src/main/resources/config/application-lkl.yml b/pluss-common-bundle/src/main/resources/config/application-lkl.yml new file mode 100644 index 0000000..508390d --- /dev/null +++ b/pluss-common-bundle/src/main/resources/config/application-lkl.yml @@ -0,0 +1,2 @@ +lkl: + private_key: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvDBZyHUDndAGxrIcsCV2njhNO3vCEZotTaWYSYwtDvkcAb1EjsBFabXZaKigpqFXk5XXNI3NIHP9M8XKzIgGvc65NpLAfRjVql8JiTvLyYd1gIUcOXMInabu+oX7dQSI1mS8XzqaoVRhDZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbWdhZ+NHwitnQwAJTLBFvfk28INM39G7XOsXdVLfsooFdglVTOHpNuRiQAj9gShCCNrpGsNQxDiJIxE43qRsNsRwigyo6DPJk/klgDJa417E2wgP8VrwiXparO4FMzOGK15quuoD7DAgMBAAECggEBANhmWOt1EAx3OBFf3f4/fEjylQgRSiqRqg8Ymw6KGuh4mE4Md6eW/B6geUOmZjVP7nIIR1wte28M0REWgn8nid8LGf+v1sB5DmIwgAf+8G/7qCwd8/VMg3aqgQtRp0ckb5OV2Mv0h2pbnltkWHR8LDIMwymyh5uCApbn/aTrCAZKNXcPOyAn9tM8Bu3FHk3Pf24Er3SN+bnGxgpzDrFjsDSHjDFT9UMIc2WdA3tuMv9X3DDn0bRCsHnsIw3WrwY6HQ8mumdbURk+2Ey3eRFfMYxyS96kOgBC2hqZOlDwVPAKTPtS4hoq+cQ0sRaJQ4T0UALJrBVHa+EESgRaTvrXqAECgYEA+WKmy9hcvp6IWZlk9Q1JZ+dgIVxrO65zylK2FnD1/vcTx2JMn73WKtQb6vdvTuk+Ruv9hY9PEsf7S8gHSTTmzHOUgo5x0F8yCxXFnfji2juoUnDdpkjtQK5KySDcpQb5kcCJWEVi9v+zObM0Zr1Nu5/NreE8EqUl3+7MtHOu1TMCgYEA9WM9P6m4frHPW7h4gs/GISA9LuOdtjLvAtgCK4cW2mhtGNAMttD8zOBQrRuafcbFAyU9de6nhGwetOhkW9YSV+xRNa7HWTeIRgXJuJBrluq5e1QGTIwZU/GujpNaR4Qiu0B8TodM/FME7htsyxjmCwEfT6SDYlkeMzTbMa9Q0DECgYBqsR/2+dvD2YMwAgZFKKgNAdoIq8dcwyfamUQ5mZ5EtGQL2yw48zibHh/LiIxgUD1Kjk/qQgNsX45NP4iOc0mCkrgomtRqdy+rumbPTNmQ0BEVJCBPscd+8pIgNiTvnWpMRvj7gMP0NDTzLI3wnnCRIq8WAtR2jZ0Ejt+ZHBziLQKBgQDibEe/zqNmhDuJrpXEXmO7fTv3YB/OVwEj5p1Z/LSho2nHU3Hn3r7lbLYEhUvwctCnLl2fzC7Wic1rsGOqOcWDS5NDrZpUQGGF+yE/JEOiZcPwgH+vcjaMtp0TAfRzuQEzNzV8YGwxB4mtC7E/ViIuVULHAk4ZGZI8PbFkDxjKgQKBgG8jEuLTI1tsP3kyaF3jAylnw7SkBc4gfe9knsYlw44YlrDSKr8AOp/zSgwvMYvqT+fygaJ3yf9uIBdrIilqCHKXccZ9uA/bT5JfIi6jbg3EoE9YhB0+1aGAS1O2dBvUiD8tJ+BjAT4OB0UDpmM6QsFLQgFyXgvDnzr/o+hQJelW diff --git a/pluss-common-bundle/src/main/resources/config/application-ys.yml b/pluss-common-bundle/src/main/resources/config/application-ys.yml index f940049..ce8ea13 100644 --- a/pluss-common-bundle/src/main/resources/config/application-ys.yml +++ b/pluss-common-bundle/src/main/resources/config/application-ys.yml @@ -24,13 +24,13 @@ ys: ## 进件URL前缀v2 auditDomainV2: https://ouser.ysepay.com:6443/ ## 机构号ID - src: 3520000052 + src: 3520000064 ## 代理商编号 - agentNoV2: 801521000002UUS + agentNoV2: 801521000002WJW ## 进件私钥v2 priKeyV2: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD2J82Gg79Tk8HZ9Zl7EOeLwvUn41c4ktUg6jveIhYLhT/PW5hpPAtgKXd9BvhtpfXhzbK6U9UURKhBgFIkQ+oIJQNfbB/F2jdVK9ke3IYi0/TXHMnY63x43qxciLeAOt+LxdhHn6ZImV4MsRkPjF/zLsaJrPOPWbc2m4T1yvinfzkrxhZaWn1dj4+IdyO3tA/juXCjydQqKR2kSqJlo6gdT9N3RIJ+ETda2UUahZyYXBfjyxFQEaOXthm6krZH1zBHs510Og6bQJQHjMmTskkslWvj38qPDfsuC4tq0Hgbu3LcyiX9vGYzQoGOaGhDEiNPObdDlOuh5gn0slRmg+PxAgMBAAECggEAJRvrCBRki50C5HD6Kmtp/M/vVYwYYhcAum2ViO9qk2ILNJ+CYpsCvASEVvzuBtm2L8xq3Vw2C1AubXGC8KSsa33o/EG4qIM1REnP+a8VKbr6dlOIuoMFyNMI+QpDX7mAafnxmRqgXuGAJDmupYFsFaU/mRHRxhKoZDsd2FA5HEbuDI9SJp86keE72NHsxyqfDIZyIk3Z8k7HZY2wg3FW+YaOKQBHVA9JYvhfZMeaQ1ymrA0IAqWpUqjLkqAa2Qa6xUsbj+QhvrkBCE48i8duamXKDSOaLfkqTb8IyxOM9eTsFwLVGEuZQrkhrLxdrg5aBPvu81pIJME6SgrquJJ84QKBgQD/MAFLiWU0wDJ4Hqf2jKa5vgrBmCqOsANBc079s8gDXM4zbsG/TjMHPDmiOGZxtDG8937twjYzRv9XpnqyITMArlhWWMhTOJ3r3CTVr/OISgeZKPGjfp+MbeDsOK4OggTVKZmNLx3nKiuc94IlTDOcz5qArVBTxKadWg56f1UGswKBgQD28G+haXxneMhRZozoHPjcfdgtDoZJaVa8XTXw8nvQala5ioU9yesbIAdtD/VR/eWwuMtO4rK1IFxtNZQ/MtSXwqlnKLf1xDJQPuj3kY5mC7H7sn4HGeFDP50VFnPgIaUnB5VwgyYFm8l19AW06OBjlnoBv0dnl1s5u+DgpzQcywKBgQCfeWSVzBtPR/1CTAYzcdqPoVAfg/S0jxK5yFHJAp0wXMMQKVszLq99CgoKcqyyyiV7LkBIXWJ50RipsgRjZZP2DP5vl7Q5LdyjFUR/tiG/PmRZNtkrj2ot3Ez/0rwTnPVgMUsgjB1n5Va0FYljvadTi/nGCIl2kCJ/m1QJAaIlOQKBgGV8TwRxS9ViiEEb+lDyhzxm488wpvPIvQLQ8/hAT65J5bZ/PV81etA9C5BA/Ltjs2A7siKLfJJ/6DxhxrlqdICiWeixjVkN9vePw0LrqTA7IjylELJuamuu2yntflXgvfUaYspIu/mWGufFEAtXodCL6TyKlhf21mEV28e4L+ydAoGAItgCUGbot95QNT1z+9QFN+18AvMnWCNvqanrC4qsk0phjYX9FFwfSCqWVeVm0Q0+2tUrRNcUEcbmlbQToBZq/hSu0nPcZIPvnNxLfW/NY7eVCXIcI5eNPjUIgbRCVMc6w5ukYMxPidOBuRXIt1iq2+iV20/FMbA58sY7AgOiaMw= ## 进件公钥v2 - pubKeyV2: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7SPkmIUf2auwkgbVchMyfeCDgICuA1GKrSwRbDI24UMVhzDgcIxCUmFG5/DfcPJz0d3oV9Ggkd4/7NmteRvmNnOOGNOnmR6AGEKafDpL1mAdpndmpkAZ0f6OVo3Py5JDg2wt8d+u3dF0AFWwd2rrrqscWvxJVB55DnuZfXl2CyQIDAQAB + pubKeyV2: MIGfMA0GCSGqSIb3DQEBAQUAA4GNADCBiQKBgQC7SPkmIUf2auwkgbVchMyfeCDgICuA1GKrSwRbDI24UMVhzDgcIxCUmFG5/DfcPJz0d3oV9Ggkd4/7NmteRvmNnOOGNOnmR6AGEKafDpL1mAdpndmpkAZ0f6OVo3Py5JDg2wt8d+u3dF0AFWwd2rrrqscWvxJVB55DnuZfXl2CyQIDAQAB ## 加密密钥 encryptPwd: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD2J82Gg79Tk8HZ9Zl7EOeLwvUn41c4ktUg6jveIhYLhT oldPayV2: diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LklConfig.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LklConfig.java new file mode 100644 index 0000000..bbb4fdd --- /dev/null +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LklConfig.java @@ -0,0 +1,14 @@ +package cn.pluss.platform.klk; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "lkl") +public class LklConfig { + @Value("private_key") + private String privateKey; +} diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/ReqKlkEntity.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/ReqKlkEntity.java new file mode 100644 index 0000000..72a4e56 --- /dev/null +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/ReqKlkEntity.java @@ -0,0 +1,59 @@ +package cn.pluss.platform.klk.entity; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import cn.pluss.platform.yinsheng.ReqEntity; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Date; + +/**请求参数 + * @author lyf + */ +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ReqKlkEntity { + /** + * 接入方交易请求发起的系统时间(秒) long timestamp = System.currentTimeMillis()/1000【必传】 + */ + private String timestamp; + + private final String appid = "OP00000354"; + /** + * 12个字符的随机字符串【必传】 + */ + private final String nonceStr = "qazwsxedc987"; + + private String charset = "utf-8"; + + private String sign; + /** + * 加签用的证书序列号 + */ + private final String serialNo = "00dfba8194c41b84cf"; + + private String version = "3.0"; + + + + public static ReqKlkEntity get(String jsonString) { + ReqKlkEntity entity = new ReqKlkEntity(); + entity.timestamp = String.valueOf(System.currentTimeMillis() / 1000); + String format = "appid"+"\n"+"serialNo"+"\n"+"timeStamp"+"\n"+"nonceStr"+"\n"+"body"+"\n"; + entity.sign = format.replace("appid", entity.appid).replace("serialNo", entity.serialNo) + .replace("timeStamp", entity.timestamp).replace("nonceStr",entity.nonceStr) + .replace("body",jsonString); + return entity; + } + + public static void main(String[] args) { + System.out.println(get("req_data\": {\n" + + " \"member_id\": \"AAA200154561278\",\n" + + " \"mer_order_id\": \"202112030923011\"\n" + + " }\n")); + } +} \ No newline at end of file diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/RespKlkEntity.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/RespKlkEntity.java new file mode 100644 index 0000000..ff68d2a --- /dev/null +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/entity/RespKlkEntity.java @@ -0,0 +1,31 @@ +package cn.pluss.platform.klk.entity; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @author lyf + */ +@Setter +@Getter +public class RespKlkEntity { + /** + * 网关响应码 + */ + private String code; + + /** + * 网关响应码描述 + */ + private String msg; + /** + * 响应时间 + */ + private String resp_time; + /** + * 响应参数 + */ + private Object resp_data; +} diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/KlkService.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/KlkService.java new file mode 100644 index 0000000..c3dc505 --- /dev/null +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/KlkService.java @@ -0,0 +1,51 @@ +package cn.pluss.platform.klk.service; + +import cn.pluss.platform.exception.MsgException; +import cn.pluss.platform.klk.LklConfig; +import cn.pluss.platform.klk.entity.ReqKlkEntity; +import cn.pluss.platform.klk.entity.RespKlkEntity; +import cn.pluss.platform.util.RSAUtils; +import cn.pluss.platform.util.SM4Util; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; + +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * @author lyf + */ +@Slf4j +@Service("KlkService") +public class KlkService { + @Autowired + private LklConfig lklConfig; + public void reqKlk()throws Exception{ + String data = "req_data\": {\n" + + " \"member_id\": \"AAA200154561278\",\n" + + " \"mer_order_id\": \"202112030923011\"\n" + + " }\n"; + String key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvDBZyHUDndAGxrIcsCV2njhNO3vCEZotTaWYSYwtDvkcAb1EjsBFabXZaKigpqFXk5XXNI3NIHP9M8XKzIgGvc65NpLAfRjVql8JiTvLyYd1gIUcOXMInabu+oX7dQSI1mS8XzqaoVRhDZQWhXcJW9bxMulgnzvk0Ggw07AjGF7si+hP/Va8SJmN7EJwfQq6TpSxR+WdIHpbWdhZ+NHwitnQwAJTLBFvfk28INM39G7XOsXdVLfsooFdglVTOHpNuRiQAj9gShCCNrpGsNQxDiJIxE43qRsNsRwigyo6DPJk/klgDJa417E2wgP8VrwiXparO4FMzOGK15quuoD7DAgMBAAECggEBANhmWOt1EAx3OBFf3f4/fEjylQgRSiqRqg8Ymw6KGuh4mE4Md6eW/B6geUOmZjVP7nIIR1wte28M0REWgn8nid8LGf+v1sB5DmIwgAf+8G/7qCwd8/VMg3aqgQtRp0ckb5OV2Mv0h2pbnltkWHR8LDIMwymyh5uCApbn/aTrCAZKNXcPOyAn9tM8Bu3FHk3Pf24Er3SN+bnGxgpzDrFjsDSHjDFT9UMIc2WdA3tuMv9X3DDn0bRCsHnsIw3WrwY6HQ8mumdbURk+2Ey3eRFfMYxyS96kOgBC2hqZOlDwVPAKTPtS4hoq+cQ0sRaJQ4T0UALJrBVHa+EESgRaTvrXqAECgYEA+WKmy9hcvp6IWZlk9Q1JZ+dgIVxrO65zylK2FnD1/vcTx2JMn73WKtQb6vdvTuk+Ruv9hY9PEsf7S8gHSTTmzHOUgo5x0F8yCxXFnfji2juoUnDdpkjtQK5KySDcpQb5kcCJWEVi9v+zObM0Zr1Nu5/NreE8EqUl3+7MtHOu1TMCgYEA9WM9P6m4frHPW7h4gs/GISA9LuOdtjLvAtgCK4cW2mhtGNAMttD8zOBQrRuafcbFAyU9de6nhGwetOhkW9YSV+xRNa7HWTeIRgXJuJBrluq5e1QGTIwZU/GujpNaR4Qiu0B8TodM/FME7htsyxjmCwEfT6SDYlkeMzTbMa9Q0DECgYBqsR/2+dvD2YMwAgZFKKgNAdoIq8dcwyfamUQ5mZ5EtGQL2yw48zibHh/LiIxgUD1Kjk/qQgNsX45NP4iOc0mCkrgomtRqdy+rumbPTNmQ0BEVJCBPscd+8pIgNiTvnWpMRvj7gMP0NDTzLI3wnnCRIq8WAtR2jZ0Ejt+ZHBziLQKBgQDibEe/zqNmhDuJrpXEXmO7fTv3YB/OVwEj5p1Z/LSho2nHU3Hn3r7lbLYEhUvwctCnLl2fzC7Wic1rsGOqOcWDS5NDrZpUQGGF+yE/JEOiZcPwgH+vcjaMtp0TAfRzuQEzNzV8YGwxB4mtC7E/ViIuVULHAk4ZGZI8PbFkDxjKgQKBgG8jEuLTI1tsP3kyaF3jAylnw7SkBc4gfe9knsYlw44YlrDSKr8AOp/zSgwvMYvqT+fygaJ3yf9uIBdrIilqCHKXccZ9uA/bT5JfIi6jbg3EoE9YhB0+1aGAS1O2dBvUiD8tJ+BjAT4OB0UDpmM6QsFLQgFyXgvDnzr/o+hQJelW"; + ReqKlkEntity reqKlkEntity = ReqKlkEntity.get(data); + System.out.println("signFormat++++++++++++++"+reqKlkEntity.getSign()); + String sign = RSAUtils.signSHA256(key, reqKlkEntity.getSign()); + System.out.println("sign++++++++++++++++++"+sign); + //设置Authorization + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(APPLICATION_JSON); + headers.set("Authorization", "LKLAPI-SHA256withRSA"); + String finalSign = "Content-Type: application/json"+"\n"+"Authorization:LKLAPI-SHA256withRSA"+" "+"appid="+reqKlkEntity.getAppid()+","+"serial_no="+reqKlkEntity.getSerialNo()+","+ + reqKlkEntity.getTimestamp()+","+"nonce_str="+reqKlkEntity.getNonceStr()+","+ + "signature="+sign; + System.out.println(finalSign); + } + +// public String signEncrypt(String sign){ +// SM4Util +// } + +} diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantMenber/impl/MerchantMenberServiceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantMenber/impl/MerchantMenberServiceImpl.java index df6e876..a8f28dd 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantMenber/impl/MerchantMenberServiceImpl.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantMenber/impl/MerchantMenberServiceImpl.java @@ -149,7 +149,8 @@ public class MerchantMenberServiceImpl extends ServiceImpl - * - * + * + * * @author Administrator * @param userId * @return @@ -124,10 +124,10 @@ public class WechantController { } /** - * + * * jumpUrl:(乐刷支付完成后的跳转地址).
- * - * + * + * * @author Administrator * @param orderNumber * @param @@ -185,10 +185,10 @@ public class WechantController { // } /** - * + * * getMerchantInfo:(得到商户名称,门店名称).
- * - * + * + * * @author Administrator * @param merchantCode * @param storeId @@ -223,7 +223,7 @@ public class WechantController { /** * 从request中获取请求方IP - * + * * @param request * @return */ @@ -257,10 +257,10 @@ public class WechantController { } /** - * + * * wechatCallBack:(设备订单微信回调通知).
- * - * + * + * * @author Administrator * @param request * @param response @@ -302,7 +302,7 @@ public class WechantController { * * wechatCallBack:(设备订单微信回调通知).
* - * + * * @author Administrator * @param request * @param response @@ -367,7 +367,7 @@ public class WechantController { backMsgXml.append(""); backMsgXml.append(""+System.currentTimeMillis()+""); backMsgXml.append(""); - backMsgXml.append(""); + backMsgXml.append(""); backMsgXml.append(""); response.setContentType("text/xml; charset=utf-8"); response.setCharacterEncoding("UTF-8"); @@ -396,16 +396,19 @@ public class WechantController { merchantMenber.setMerchantCode(merchantCode); List queryMerchantMenberList = merchantMenberService.queryMerchantMenberList(merchantMenber); if(queryMerchantMenberList!=null&&queryMerchantMenberList.size()>0) { + System.out.println("queryMerchantMenberList++++++++++++++++++"); merchantMenber = queryMerchantMenberList.get(0); if(StringUtil.isBlank(merchantMenber.getOpenid())){ merchantMenber.setOpenid(openId); if(wxUserInfo != null){ + System.out.println("wxUserInfo++++++++++++++++++"+wxUserInfo); wxUserInfo.buildMember(merchantMenber,null); } merchantMenberService.updateMerchantMenber(merchantMenber); + System.out.println("更新完成++++++++++++++++++++++++++"); try { MerchantStore store = merchantStoreService.getStoreByMerchantCode(merchantMenber.getMerchantCode()); - + System.out.println("模板消息++++++++++++++++++++++++++++++"); JSONObject miniprogram = new JSONObject(); miniprogram.put("appid",ParametersUtil.APPLETS_APPID); miniprogram.put("pagepath","pages/card/index?storeId="+store.getId()+"&phone="+merchantMenber.getPhone()); @@ -415,7 +418,7 @@ public class WechantController { double usableGiveFee = merchantMenber.getUsableGiveFee() == null ? 0 : StringUtil.bigDecimal(merchantMenber.getUsableGiveFee()); String useFee = BigDecimal.valueOf(usableRechargeFee + usableGiveFee).setScale(2,BigDecimal.ROUND_HALF_DOWN).toString(); String[] array = {store.getStoreName(),merchantMenber.getPhone(),store.getStoreName()+"会员卡",useFee+"元"}; - WxTemolateRequest tempRequest = new WxTemolateRequest(openId,WxConstants.VIP_CARD_SUCCESS_TEMPLATE_ID,null,miniprogram) + WxTemolateRequest tempRequest = new WxTemolateRequest(openId,WxConstants.VIP_CARD_SUCCESS_TEMPLATE_ID,null,null) .buildData(first,remark,array); //发送开卡成功消息模板 wxCommonService.sendTemplateMsg(tempRequest,tokenRequest); @@ -443,9 +446,10 @@ public class WechantController { response.getWriter().write(backMsgXml.toString()); } } + /** * 读取request数据 - * + * * @param request * @return */