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
*/