package com.ruoyi.shop.util;
|
|
import com.alibaba.fastjson2.JSONObject;
|
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.shop.util.dto.ContactInfo;
|
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.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.HttpPost;
|
import org.apache.http.entity.StringEntity;
|
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.util.EntityUtils;
|
|
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;
|
import java.security.GeneralSecurityException;
|
import java.security.PrivateKey;
|
import java.security.PublicKey;
|
import java.security.cert.CertificateFactory;
|
import java.security.cert.X509Certificate;
|
import java.util.Base64;
|
|
/**
|
* @ClassName WxShopUtils
|
* @Description TODO
|
* @Author jqs
|
* @Date 2023/6/19 11:11
|
* @Version 1.0
|
*/
|
|
public class WxShopUtils {
|
|
public void ApplymentSubMch() throws Exception {
|
|
// 初始化httpClient
|
CloseableHttpClient httpClient = createHttpClient();
|
//请求URL
|
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/");
|
// 请求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\":\"零售批发/生活娱乐/网上商城/其他\""
|
+ "}"
|
+ "}";
|
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) { //处理成功
|
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 {
|
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 = "";
|
|
// 获取证书管理器实例
|
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;
|
}
|
|
//提交申请
|
/*public static String apply(SubmitInfo submitInfo) throws Exception {
|
String bodyStr=convertToStr(submitInfo);
|
HttpResponse response = HttpUtils.v3HttpExecute("POST",EcommerceUrl.APPLYMENTS,
|
"自己系统的应用名称","服务商商户号","商户API证书序列号","平台证书序列号",requestParam,"商户API证书位置.pem",null);
|
}*/
|
|
|
//加密申请信息
|
private static String convertToStr(SubmitInfo submitInfo) throws Exception {
|
rsaEncryptSubmitInfo(submitInfo);
|
return JSONObject.toJSONString(submitInfo);
|
}
|
|
private static void rsaEncryptSubmitInfo(SubmitInfo submitInfo) throws Exception {
|
IdCardInfo idCardInfo=submitInfo.getId_card_info();
|
if(idCardInfo!=null){
|
idCardInfo.setId_card_name(rsaEncryptByCert(idCardInfo.getId_card_name()));
|
idCardInfo.setId_card_number(rsaEncryptByCert(idCardInfo.getId_card_number()));
|
}
|
ContactInfo contactInfo=submitInfo.getContact_info();
|
if(contactInfo!=null){
|
contactInfo.setContact_name(rsaEncryptByCert(contactInfo.getContact_name()));
|
contactInfo.setContact_id_card_number(rsaEncryptByCert(contactInfo.getContact_id_card_number()));
|
contactInfo.setMobile_phone(rsaEncryptByCert(contactInfo.getMobile_phone()));
|
if(!StringUtils.isEmpty(contactInfo.getContact_email())){
|
contactInfo.setContact_email(rsaEncryptByCert(contactInfo.getContact_email()));
|
}
|
}
|
}
|
|
private static String rsaEncryptByCert(String content) throws Exception {
|
String platPrivateKey = "";
|
InputStream inStream=new ByteArrayInputStream(platPrivateKey.getBytes(StandardCharsets.UTF_8));
|
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
X509Certificate certificate = (X509Certificate)cf.generateCertificate(inStream);
|
PublicKey publicKey=certificate.getPublicKey();
|
Cipher ci= Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
|
ci.init(Cipher.ENCRYPT_MODE,publicKey);
|
return Base64.getEncoder().encodeToString(ci.doFinal(content.getBytes(StandardCharsets.UTF_8)));
|
}
|
|
|
}
|