瀏覽代碼

配置文件修改

lrj 3 月之前
父節點
當前提交
0502a60b14

+ 20 - 1
PCS/pom.xml

@@ -190,10 +190,29 @@
             <artifactId>UserAgentUtils</artifactId>
             <version>1.21</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.wechatpay-apiv3</groupId>
+            <artifactId>wechatpay-java</artifactId>
+            <version>0.2.12</version>
+        </dependency>
+
+        <!-- Feb, 2011 -->
+<!--        <dependency>-->
+<!--            <groupId>org.bouncycastle</groupId>-->
+<!--            <artifactId>bcpg-jdk16</artifactId>-->
+<!--            <version>1.46</version>-->
+<!--        </dependency>-->
+        <!-- Oct, 2019 -->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk15on</artifactId>
+            <version>1.65</version>
+        </dependency>
     </dependencies>
 
     <build>
-        <finalName>QIAOBI_PROD</finalName>
+        <finalName>QIAOBI_TEST</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>

+ 11 - 0
PCS/src/main/java/cn/cslg/permission/common/model/weixinpay/GetAuthorizationVO.java

@@ -0,0 +1,11 @@
+package cn.cslg.permission.common.model.weixinpay;
+
+import lombok.Data;
+
+@Data
+public class GetAuthorizationVO {
+    private String authorization;
+    private long timestamp;
+    private String signature;
+    private String nonceStr;
+}

+ 38 - 0
PCS/src/main/java/cn/cslg/permission/common/utils/BatchNoUtil.java

@@ -0,0 +1,38 @@
+package cn.cslg.permission.common.utils;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+public class BatchNoUtil {
+
+    public static String getBatchNo(){
+        // 批次号第一部分:时间
+        DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        String currentTimeStr = dateFormat.format(new Date());
+
+        // 批次号第二部分:随机数
+        Random random = new Random();
+        Integer cusCode = random.nextInt(900000) + 100000;
+        String cusCodeStr = cusCode.toString();
+
+        // 返回分配批次
+        return "PTX"+currentTimeStr + cusCodeStr;
+
+    }
+
+    public static String getOrderNo(){
+        // 批次号第一部分:时间
+        DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        String currentTimeStr = dateFormat.format(new Date());
+
+        // 批次号第二部分:随机数
+        Random random = new Random();
+        Integer cusCode = random.nextInt(900000) + 100000;
+        String cusCodeStr = cusCode.toString();
+
+        // 返回分配批次
+        return "ORT"+currentTimeStr + cusCodeStr;
+    }
+}

+ 148 - 0
PCS/src/main/java/cn/cslg/permission/service/weixinpay/AuthorizationService.java

@@ -0,0 +1,148 @@
+package cn.cslg.permission.service.weixinpay;
+
+import cn.cslg.permission.common.model.weixinpay.GetAuthorizationVO;
+import cn.cslg.permission.common.utils.RandomUtil;
+
+import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.openssl.PEMParser;
+import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.FileReader;
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+import java.security.Security;
+import java.security.Signature;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class AuthorizationService {
+    /**
+     * 商户号
+     */
+
+    public static String merchantId = "1718408246";
+    public static String appId = "wx18ac47eed86e5976";
+    /**
+     * 商户API私钥路径
+     */
+    @Value("${Keypath}")
+    public  String privateKeyPath ;
+
+    /**
+     * 商户证书序列号
+     */
+
+    public static String merchantSerialNumber = "3BBC0C2DA1D49F62CEAC3C3CC0472C1E2466EB63";
+
+    /**
+     * 商户APIV3密钥
+     */
+
+    public static String apiV3key = "wL3g4tAlOFe72gAd1THRqNPQsHIVxsYi";
+
+
+    public GetAuthorizationVO getAuthorization(String type, String url, String body) throws Exception {
+        GetAuthorizationVO getAuthorizationVO = new GetAuthorizationVO();
+        String re = "WECHATPAY2-SHA256-RSA2048 ";
+        re += "mchid=" + "\"" + merchantId + "\"";
+        String nonceStr = RandomUtil.generateRandomString(32);
+        long timestamp = System.currentTimeMillis() / 1000;
+        String message = buildMessage(type, url, timestamp, nonceStr, body);
+        String signature = sign(message.getBytes("utf-8"));
+        re += ",nonce_str=" + "\"" + nonceStr + "\"";
+        re += ",signature=" + "\"" + signature + "\"";
+        re += ",timestamp=" + "\"" + timestamp + "\"";
+        re += ",serial_no=" + "\"" + merchantSerialNumber + "\"";
+        getAuthorizationVO.setAuthorization(re);
+        getAuthorizationVO.setSignature(signature);
+        getAuthorizationVO.setTimestamp(timestamp);
+        getAuthorizationVO.setNonceStr(nonceStr);
+        return getAuthorizationVO;
+    }
+
+    String sign(byte[] message) throws Exception {
+
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        // 添加Bouncy Castle作为安全提供者
+        Security.addProvider(new BouncyCastleProvider());
+
+
+        // 使用PEMParser读取PEM文件
+        try (FileReader fileReader = new FileReader(privateKeyPath);
+             PEMParser pemParser = new PEMParser(fileReader)) {
+
+            // 使用JcaPEMKeyConverter将PEM对象转换为PrivateKey
+            JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
+            PrivateKey privateKey = converter.getPrivateKey((PrivateKeyInfo) pemParser.readObject());
+            sign.initSign(privateKey);
+
+            sign.update(message);
+
+            return Base64.getEncoder().encodeToString(sign.sign());
+
+        }
+    }
+
+    String buildMessage(String type, String url, long timestamp, String nonceStr, String body) {
+
+        String re = type + "\n"
+
+                + url + "\n"
+
+                + timestamp + "\n"
+
+                + nonceStr + "\n";
+        if (body != null) {
+            re += body;
+        }
+        re += "\n";
+        return re;
+    }
+
+
+    String buildFrontMessage(String prepayId, long timestamp, String nonceStr) {
+
+        String re = appId + "\n"
+
+                + timestamp + "\n"
+
+                + nonceStr + "\n"
+
+                + "prepay_id=" + prepayId + "\n";
+
+        return re;
+    }
+
+
+//    public GetAuthorizationVO getFrontAuthorization(String prepayId) throws Exception {
+//        GetAuthorizationVO getAuthorizationVO = new GetAuthorizationVO();
+//
+//        String nonceStr = RandomUtil.generateRandomString(32);
+//        long timestamp = System.currentTimeMillis() / 1000;
+//        String message = buildFrontMessage(prepayId, timestamp, nonceStr);
+//        String signature = sign(message.getBytes("utf-8"));
+//        getAuthorizationVO.setSignature(signature);
+//        getAuthorizationVO.setTimestamp(timestamp);
+//        getAuthorizationVO.setNonceStr(nonceStr);
+//        return getAuthorizationVO;
+//    }
+//
+//    public WeixinSuccessVO decryptMessage(String associatedData, String nonce, String ciphertext) throws Exception {
+//        Integer q = apiV3key.length();
+//        System.out.println(q);
+//        String key = "wL3g4tAlOFe72gAd1THRqNPQsHIVxsYi";
+//        AesUtil aesUtil = new AesUtil(key.getBytes(StandardCharsets.UTF_8));
+//        String d = aesUtil.decryptToString(associatedData.getBytes(StandardCharsets.UTF_8), nonce.getBytes(StandardCharsets.UTF_8), ciphertext);
+//
+//        WeixinSuccessVO weixinSuccessVO = JSONObject.parseObject(d, WeixinSuccessVO.class);
+//        return weixinSuccessVO;
+//
+//    }
+}

+ 66 - 0
PCS/src/main/java/cn/cslg/permission/service/weixinpay/WeixinPayService.java

@@ -0,0 +1,66 @@
+package cn.cslg.permission.service.weixinpay;
+
+import cn.cslg.permission.common.model.weixinpay.GetAuthorizationVO;
+import cn.cslg.permission.common.utils.BatchNoUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Objects;
+
+@Service
+public class WeixinPayService {
+    @Autowired
+    private AuthorizationService authorizationService;
+
+    public void getPayTickets() {
+        String url = "https://api.mch.weixin.qq.com/v3/pay/transactions/native";
+        String tradeNo = BatchNoUtil.getOrderNo();
+        com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest prepayRequest = new com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest();
+        String appId = "wxe5f9b6e3d532e6c3";
+        String merchantId="1718408246";
+        String notifyUrl="https://xsip.cn/xiaoshi-weixinback/weixinpay/success";
+        prepayRequest.setAppid(appId);
+        prepayRequest.setMchid(merchantId);
+        prepayRequest.setOutTradeNo(tradeNo);
+        prepayRequest.setDescription("商品信息");
+        prepayRequest.setNotifyUrl(notifyUrl);
+        com.wechat.pay.java.service.payments.nativepay.model.Amount amount = new com.wechat.pay.java.service.payments.nativepay.model.Amount();
+        amount.setTotal(1);
+        amount.setCurrency("CNY");
+        prepayRequest.setAmount(amount);
+        String param = new Gson().toJson(prepayRequest);
+
+        // 发送请求获取响应
+        try {
+            GetAuthorizationVO authorizationVO = authorizationService.getAuthorization("POST", "/v3/pay/transactions/native", param);
+            String authorization = authorizationVO.getAuthorization();
+            // 调用下单方法,得到应答
+            RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
+            Request request = new Request.Builder()
+                    .addHeader("Authorization", authorization)
+                    .addHeader("Accept", "application/json")
+                    .addHeader("Content-Type", "application/json")
+
+                    .url(url)
+                    .post(requestBody)
+                    .build();
+            OkHttpClient okHttpClient = new OkHttpClient();
+            Response response = okHttpClient.newCall(request).execute();
+            // 判断请求是否成功
+//            if (response.isSuccessful()) {
+                // 打印服务端返回结果
+                String a = Objects.requireNonNull(response.body()).string();
+                JSONObject jsonObject = JSONObject.parseObject(a);
+
+//            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+}

+ 1 - 0
PCS/src/main/resources/application-dev.yml

@@ -50,3 +50,4 @@ SMS:
   secret: Y6Erboh5lEFiRPR4XK8oCPMvUzYGLN
 
 FMSUrl: http://192.168.2.24:8803
+Keypath: E:\账号密码\1718408246_20250606_cert\apiclient_key.pem