From 79f8fc87c9c9e4866a477dfe4485eedda5976209 Mon Sep 17 00:00:00 2001 From: jiangqs <jiangqs> Date: 星期二, 18 七月 2023 19:41:20 +0800 Subject: [PATCH] bug和企业微信同步 --- ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java | 178 +++++++++++++++++++++++----------------------------------- 1 files changed, 71 insertions(+), 107 deletions(-) diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java index 97e9a57..010581b 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java @@ -6,12 +6,15 @@ import com.ruoyi.shop.util.dto.IdCardInfo; import com.ruoyi.shop.util.dto.SubmitInfo; import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; -import com.wechat.pay.contrib.apache.httpclient.auth.*; -import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager; +import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier; +import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; import com.wechat.pay.contrib.apache.httpclient.exception.HttpCodeException; import com.wechat.pay.contrib.apache.httpclient.exception.NotFoundException; import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; @@ -19,7 +22,6 @@ import javax.crypto.Cipher; import java.io.ByteArrayInputStream; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -40,84 +42,57 @@ public class WxShopUtils { - public void ApplymentSubMch() throws Exception { + private final static String PRIVATE_KEY = ""; + + private final static String MCH_ID = ""; + + private final static String MCH_SERIAL_NO = ""; + + private final static String API_V3_KEY = ""; + + + /** + * @description 创建httpClient + * @author jqs + * @date 2023/6/19 12:50 + * @param + * @return CloseableHttpClient + */ + private static CloseableHttpClient createHttpClient() throws NotFoundException, IOException, GeneralSecurityException, HttpCodeException { + + String privateKey = PRIVATE_KEY; + String mchId = MCH_ID; + String mchSerialNo = MCH_SERIAL_NO; + String apiV3Key = API_V3_KEY; + // 加载商户私钥(privateKey:私钥字符串) + PrivateKey merchantPrivateKey = PemUtil + .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8"))); + + // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥) + AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier( + new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8")); + + // 初始化httpClient + CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create() + .withMerchant(mchId, mchSerialNo, merchantPrivateKey) + .withValidator(new WechatPay2Validator(verifier)).build(); + return httpClient; + } + + public static void ApplymentSubMch(SubmitInfo submitInfo) throws Exception { // 初始化httpClient CloseableHttpClient httpClient = createHttpClient(); //请求URL - HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/"); + HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/ecommerce/applyments/"); // 请求body参数 - String reqdata = "{" - + "\"business_info\": {" - + "\"merchant_shortname\":\"上海XXX有限公司\"," - + "\"service_phone\":\"139XXXX\"," - + "\"sales_info\": {" - + "\"mini_program_info\": {" - + "\"mini_program_pics\": [" - + "\"0\":\"F8O5MNAOlYZyxZcLnWXkyk72coZ3CVX3XobPZng-xepKPTrcH_XMfrGGYLi1XFogMG9P25LSUX6gjXU5iPI74YqiRUDfORyw2d76wK3vzuQ\"" - + "]," - + "\"mini_program_sub_appid\":\"wx76c3f74c108876c2\"" - + "}," - + "\"mp_info\": {" - + "\"mp_pics\": [" - + "\"0\":\"F8O5MNAOlYZyxZcLnWXkys5TBxf0dyfesnyfNuquBMArHRfgCq8hDRdscDpblCcEgvgV5MkVch9IBEX7aatZCmI8k5Wdb_M8a4bYcmlg6V8\"" - + "]," - + "\"mp_sub_appid\":\"wx85c88c63bd22651f\"" - + "}," - + "\"sales_scenes_type\": [" - + "\"0\":\"SALES_SCENES_MP\"," - + "\"1\":\"SALES_SCENES_MINI_PROGRAM\"" - + "]" - + "}" - + "}," - + "\"subject_info\": {" - + "\"business_license_info\": {" - + "\"legal_person\":\"江XX\"," - + "\"license_copy\":\"F8O5MNAOlYZyxZcLnWXkysZ5xo8fE3SHJ1pHUe6OJKmNIWtqUVyv4aY2-JLTgjDOSovWaKkBu3AbkjGuQXhesDzREu2pT_Yf_hxlFKPJMwQ\"," - + "\"merchant_name\":\"上海XXX有限公司\"," - + "\"license_number\":\"91310118MA1JXXXX\"" - + "}," - + "\"subject_type\":\"SUBJECT_TYPE_ENTERPRISE\"," - + "\"identity_info\": {" - + "\"owner\":true," - + "\"id_doc_type\":\"IDENTIFICATION_TYPE_IDCARD\"," - + "\"id_card_info\": {" - + "\"id_card_copy\":\"F8O5MNAOlYZyxZcLnWXkyvLpqoz7MNRULxju0NqUCtLGBl_vm8Bhj9uAyuLyDART9UsA10spF9gbT3DEoM85HxPQOhMuilK0zLtOxAjPx58\"," - + "\"card_period_end\":\"2035-12-28\"," - + "\"card_period_begin\":\"2015-12-28\"," - + "\"id_card_name\":\"JRMJGA7B7oSVS+krFeaQn4AvYZE2LL9tTwA+XXa9lYJU4AhS+Qheb7fhgo+D+hfa0v+ykU1BVvVo7NpCfgOYQqmYDyYF27Q/p4hB7IoqZLhJUE+hTG45VNoa9ASaKG79Hg+eGz4YTIHFGMFm1ljyg4fd5lGJixCqn38/gCfwm5x6vDOMVkFpqbUdR7klQwReGoG7iSlEpr4gZPqzItcBHiuXidMToKZTX1Lol1Lx52DHk0blcdh1CMRhv+wxQzF0lJMy/WtVyjKuB8daDbLJKTEwDx5KfkTZGHmGiaJnWY0qFX03sXsufvfB0Wj6Z37+nJnV16fplPmdr1/KEHamLw==\"," - + "\"id_card_national\":\"F8O5MNAOlYZyxZcLnWXkyvcmQrkBXCIo2vZGUoM6ER-skL5k6IOhzeJ34tNNUggQIPfJbM_pzdg9jM4pQbkIm84_bKfi2JKNn99xIurNgwI\"," - + "\"id_card_number\":\"V0quwnIu/PLbdQQ3/nzMqjvHtChDqed4Jpc3Iy2lgnFoWVNXguRWBHMYKHaLgLvnxLvO6TciMnrSw13QzUJD4ZnEIiks8gGTd+OCzl5Jl3F+sneQ+Js4akBnCSBQso/SERvi6vUqCeRhX1vtiFsmKtqlL8r/ssrFev4FoJEka5gGME1osTgcpMMTIR8rolIO1oXbl3e8z5RDics5xKH2Ogjzis73yq9M18ap0uRRdLWoX/cxeG3tbU1bi5jZsAU9hGHXs4BKTaHfrslsKIkqXR0f2Jpk7H5qtwAyP8glcALN7gB5DIOmBEIZ5zx2PrDm38CsZHstu0hF8beXV/PG2w==\"" - + "}" - + "}" - + "}," - + "\"business_code\":\"20201126100507000003\"," - + "\"contact_info\": {" - + "\"contact_name\":\"AD2jwe8eYFYfeoSmBpyRYUawyQgQkUoAajOlHnQM/JzproDF7hikLDouMr5Mb1W5otvdJZYEipG0HzwLpG9NXbqP6SXSpzQFb8fY5cpuXZsIbDy70lAybF0bbxJiJw1PHSd7KpMbu0XHqwlicePLUOw7HCNV6euQsKEvtusiWsaVrNNdKXpj3ONhyAg2ws4ibc56GUVoNll3osmGLPi6/bIn3pD6sjNThgPE9UzRQax0XPwgIpafIewQiVy0GNtv5P33wqPa9pAsdEmaLXNtQr2Ddjw5SYMInen1qbVO8NP0VhuWmYiAjd1WbkNnR+gbwsilBCYYeRuFbKfqatASnA==\"," - + "\"mobile_phone\":\"GLc5+TuqJbxLeQO+CrKeDWF+7lZq9IsidIU4zcMpus4qsE8r1qNyvVMjrZfWLrjOItiQhXqkiKZs0B4M0UWAviWwmBhNWW0BJrauBjZbGZU+pLHC/2eOetdDC4sQqHN7Xw0N4tizqeQNu49n+DbSiv0TL09EcmNUUV9rImfjpVyo77MxKhPvdg3ODwS+IVvY2Tc9q11iBgaPIQ+XwoBaJGth1wdw0GLgEFUmX02TWxjHxq7f5O1RU3LjBlt1O+56ZZYpA+zr+IjQ/TwrIDp+4nk9v1oW2wtHuwrdqKrlLyJ1/zdoqwSddLuGxp8PwSM8CKobQP8TXhJu0S9pwLbNyg==\"," - + "\"contact_id_number\":\"iC35X6SaOx4A4BEJ4fmM2oOkYRO5rEzRh2QRdrxFD3+HwmNjxddsm1LoqfhSiV34DAO2x3Ded3q2c1LJ7NHqa3/IGCDss4FKlgIyiu5AmzQTTYwsobmvVFxeSUXA4PnH/tUTfatJOuj+9Emt7fmnpO9uWeCLIn5CXaaABrXpO4mUu8qPBaoF2jTfbwBm6QiYX58kATyRrIvBRs6VorHJydXkz3P1hCejh8sAYoJXlNHnoajI+NEwiWX9RhwUadYLbMwww68cc7Yzehp3s6an0NWuC76Y4e7FQ/i5D9ZpUvLKUoYfFsZMnHrv/PhLxmv5l8gQs9/IkmOdYfRujKZJwQ==\"," - + "\"contact_email\":\"ggK2ABtJ8bBiBo1iM7I6R2yEvhD6WC96d07gthnPGajc4lBCKpIqXjyNX8B97vc0OilyLRNUcySbT/KUejPyu4x9W6Ok6iS4zcerfKfIQkKs+3JXIMo0bu+GyI5O0fzRrPg1Mek2okfIjVK9wiTNJTzoGyz9twMXEaqqrOTbysyhnkqfrol5dad/TPg8qNWaBO3+Ma/hr1Tr0xeHWkKX3mBySC3NW49HM51x0PvFAwnStHr/8hiGzGpqAA3yJuYdlEwey3Lv+/bMmbTq+AyrYq9xX3q+n0VHuiSnzgICPwQiP4zXsoivA0bm7DSgcP1Oa6MjpGqMOS7AU1dHyak2GQ==\"" - + "}," - + "\"bank_account_info\": {" - + "\"account_number\":\"Bfu6CzrRWlVTLZwjEK2CCXG0KRfGoIsbYs9IYmtFcV9FTEVLCcVCRGW6DVE2hMMr7U9tSdo7QqsptXZ7Zhciandyx9kRkY/VmPywurySvCbqpOLbx3AgmQY7H6/Ye542R0uloi6Pdp5FjqY/TdnlDcTS4cqv9iqU0DqKAUt7q+L6jZ8lrSlGFPI/1RkXCGAhlTSZ/iAJYDWzcN/E0cno9BQPYCmEIWldzj7W3Tmhi1eaZYX5mlLWnTOuVmMsRXIehb4y6LCi6T0kS7/c3GOFwlTzHVaaUgFqZhOL00h2G4Cl94uZfuVNO7KTiFaWtV61muEN6JfaSnFwRDSHxhtsRg==\"," - + "\"bank_address_code\":\"310101\"," - + "\"account_name\":\"RVBRWZKlmzrjkDmz4uEkaLQLU5q5xErXGoWhzDNdnQjRlfn1NVHL2EtIE+B0BULFNOHrX61q13lcgo9CDal9YJ/LjZkzAAsivwJZpNSRZbAsNNjqbYiiVhdnxYpwMqtukVgZAFgx0XMovOeSGX1+Dosc2vKJSsxtUw6wJXcZbMjvsX5/xamFTvRIx1J2a/q3ODBJ9URO5O2FDhGwLx8LQnFIv7xUDM3JXw7c6+eNy1OYTVwlj3/MIDQVw2eiPjpG1vC6K6PRwCI4wFZk1QwH99Xa3Wwvf+ek54j7FQTh0N703dK6jjonL5L6Lh9ZsckLx45InkARlPnU0KQpoK5g9w==\"," - + "\"bank_account_type\":\"BANK_ACCOUNT_TYPE_CORPORATE\"," - + "\"account_bank\":\"招商银行\"" - + "}," - + "\"settlement_info\": {" - + "\"settlement_id\":\"716\"," - + "\"qualification_type\":\"零售批发/生活娱乐/网上商城/其他\"" - + "}" - + "}"; + String reqdata = convertToStr(submitInfo); StringEntity entity = new StringEntity(reqdata,"utf-8"); entity.setContentType("application/json"); httpPost.setEntity(entity); httpPost.setHeader("Accept", "application/json"); - httpPost.setHeader("Wechatpay-Serial", "XXXXXXXXXXXXXX"); //完成签名并执行请求 CloseableHttpResponse response = httpClient.execute(httpPost); - try { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { //处理成功 @@ -129,48 +104,36 @@ throw new IOException("request failed"); } } finally { + httpClient.close(); response.close(); } - httpClient.close(); + } - /** - * @description 创建httpClient - * @author jqs - * @date 2023/6/19 12:50 - * @param - * @return CloseableHttpClient - */ - private CloseableHttpClient createHttpClient() throws NotFoundException, IOException, GeneralSecurityException, HttpCodeException { - String merchantId = ""; - PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey( - new FileInputStream("/path/to/apiclient_key.pem")); - String merchantSerialNumber = ""; - String apiV3Key = ""; + public static void QueryApplyments(String applymentId) throws Exception{ - // 获取证书管理器实例 - CertificatesManager certificatesManager = CertificatesManager.getInstance(); - // 向证书管理器增加需要自动更新平台证书的商户信息 - certificatesManager.putMerchant(merchantId, new WechatPay2Credentials(merchantId, - new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)), apiV3Key.getBytes(StandardCharsets.UTF_8)); - // ... 若有多个商户号,可继续调用putMerchant添加商户信息 - - // 从证书管理器中获取verifier - Verifier verifier = certificatesManager.getVerifier(merchantId); - WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() - .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey) - .withValidator(new WechatPay2Validator(verifier)); - - CloseableHttpClient httpClient = builder.build(); - return httpClient; + // 初始化httpClient + CloseableHttpClient httpClient = createHttpClient(); + //请求URL + HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/ecommerce/applyments/out-request-no/"+applymentId); + httpGet.setHeader("Accept", "application/json"); + //完成签名并执行请求 + CloseableHttpResponse response = httpClient.execute(httpGet); + try { + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode == 200) { //处理成功 + System.out.println("success,return body = " + EntityUtils.toString(response.getEntity())); + } else if (statusCode == 204) { //处理成功,无返回Body + System.out.println("success"); + } else { + System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity())); + throw new IOException("request failed"); + } + } finally { + httpClient.close(); + response.close(); + } } - - //提交申请 - /*public static String apply(SubmitInfo submitInfo) throws Exception { - String bodyStr=convertToStr(submitInfo); - HttpResponse response = HttpUtils.v3HttpExecute("POST",EcommerceUrl.APPLYMENTS, - "自己系统的应用名称","服务商商户号","商户API证书序列号","平台证书序列号",requestParam,"商户API证书位置.pem",null); - }*/ //加密申请信息 @@ -178,6 +141,7 @@ rsaEncryptSubmitInfo(submitInfo); return JSONObject.toJSONString(submitInfo); } + private static void rsaEncryptSubmitInfo(SubmitInfo submitInfo) throws Exception { IdCardInfo idCardInfo=submitInfo.getId_card_info(); @@ -197,7 +161,7 @@ } private static String rsaEncryptByCert(String content) throws Exception { - String platPrivateKey = ""; + String platPrivateKey = PRIVATE_KEY; InputStream inStream=new ByteArrayInputStream(platPrivateKey.getBytes(StandardCharsets.UTF_8)); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate certificate = (X509Certificate)cf.generateCertificate(inStream); -- Gitblit v1.7.1