修改获取平台证书接口;创建设备操作日志表

This commit is contained in:
2024-12-30 14:32:03 +08:00
parent aa97a61285
commit d7cd539478
13 changed files with 674 additions and 148 deletions

View File

@ -0,0 +1,71 @@
package com.fastbee.iot.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.fastbee.common.annotation.Excel;
import com.fastbee.common.core.domain.BaseEntity;
/**
* 设备操作记录对象 ng_device_operation_records
*
* @author kerwincui
* @date 2024-12-30
*/
@ApiModel(value = "NgDeviceOperationRecords",description = "设备操作记录 ng_device_operation_records")
@Data
@EqualsAndHashCode(callSuper = true)
public class NgDeviceOperationRecords extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键自增 */
private Long id;
/** 用户id */
@Excel(name = "用户id")
@ApiModelProperty("用户id")
private Long userId;
/** 机构id */
@Excel(name = "机构id")
@ApiModelProperty("机构id")
private Long deptId;
/** 操作报文内容 */
@Excel(name = "操作报文内容")
@ApiModelProperty("操作报文内容")
private String operationMessage;
/** cmd的值如700110 */
@Excel(name = "cmd的值如700110")
@ApiModelProperty("cmd的值如700110")
private Long operationType;
/** 操作内容,如开阀/关阀 */
@Excel(name = "操作内容,如开阀/关阀")
@ApiModelProperty("操作内容,如开阀/关阀")
private String operationContent;
/** 操作时间 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd")
@ApiModelProperty("操作时间")
private Date operationTime;
/** 0=成功1=失败 */
@Excel(name = "0=成功1=失败")
@ApiModelProperty("0=成功1=失败")
private Integer operationResult;
/** 失败原因 */
@Excel(name = "失败原因")
@ApiModelProperty("失败原因")
private String failureReason;
}

View File

@ -0,0 +1,63 @@
package com.fastbee.iot.mapper;
import java.util.List;
import com.fastbee.iot.domain.NgDeviceOperationRecords;
import org.springframework.stereotype.Repository;
/**
* 设备操作记录Mapper接口
*
* @author kerwincui
* @date 2024-12-30
*/
@Repository
public interface NgDeviceOperationRecordsMapper
{
/**
* 查询设备操作记录
*
* @param id 设备操作记录主键
* @return 设备操作记录
*/
public NgDeviceOperationRecords selectNgDeviceOperationRecordsById(Long id);
/**
* 查询设备操作记录列表
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 设备操作记录集合
*/
public List<NgDeviceOperationRecords> selectNgDeviceOperationRecordsList(NgDeviceOperationRecords ngDeviceOperationRecords);
/**
* 新增设备操作记录
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 结果
*/
public int insertNgDeviceOperationRecords(NgDeviceOperationRecords ngDeviceOperationRecords);
/**
* 修改设备操作记录
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 结果
*/
public int updateNgDeviceOperationRecords(NgDeviceOperationRecords ngDeviceOperationRecords);
/**
* 删除设备操作记录
*
* @param id 设备操作记录主键
* @return 结果
*/
public int deleteNgDeviceOperationRecordsById(Long id);
/**
* 批量删除设备操作记录
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteNgDeviceOperationRecordsByIds(Long[] ids);
}

View File

@ -0,0 +1,61 @@
package com.fastbee.iot.service;
import java.util.List;
import com.fastbee.iot.domain.NgDeviceOperationRecords;
/**
* 设备操作记录Service接口
*
* @author kerwincui
* @date 2024-12-30
*/
public interface INgDeviceOperationRecordsService
{
/**
* 查询设备操作记录
*
* @param id 设备操作记录主键
* @return 设备操作记录
*/
public NgDeviceOperationRecords selectNgDeviceOperationRecordsById(Long id);
/**
* 查询设备操作记录列表
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 设备操作记录集合
*/
public List<NgDeviceOperationRecords> selectNgDeviceOperationRecordsList(NgDeviceOperationRecords ngDeviceOperationRecords);
/**
* 新增设备操作记录
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 结果
*/
public int insertNgDeviceOperationRecords(NgDeviceOperationRecords ngDeviceOperationRecords);
/**
* 修改设备操作记录
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 结果
*/
public int updateNgDeviceOperationRecords(NgDeviceOperationRecords ngDeviceOperationRecords);
/**
* 批量删除设备操作记录
*
* @param ids 需要删除的设备操作记录主键集合
* @return 结果
*/
public int deleteNgDeviceOperationRecordsByIds(Long[] ids);
/**
* 删除设备操作记录信息
*
* @param id 设备操作记录主键
* @return 结果
*/
public int deleteNgDeviceOperationRecordsById(Long id);
}

View File

@ -0,0 +1,96 @@
package com.fastbee.iot.service.impl;
import java.util.List;
import com.fastbee.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fastbee.iot.mapper.NgDeviceOperationRecordsMapper;
import com.fastbee.iot.domain.NgDeviceOperationRecords;
import com.fastbee.iot.service.INgDeviceOperationRecordsService;
/**
* 设备操作记录Service业务层处理
*
* @author kerwincui
* @date 2024-12-30
*/
@Service
public class NgDeviceOperationRecordsServiceImpl implements INgDeviceOperationRecordsService
{
@Autowired
private NgDeviceOperationRecordsMapper ngDeviceOperationRecordsMapper;
/**
* 查询设备操作记录
*
* @param id 设备操作记录主键
* @return 设备操作记录
*/
@Override
public NgDeviceOperationRecords selectNgDeviceOperationRecordsById(Long id)
{
return ngDeviceOperationRecordsMapper.selectNgDeviceOperationRecordsById(id);
}
/**
* 查询设备操作记录列表
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 设备操作记录
*/
@Override
public List<NgDeviceOperationRecords> selectNgDeviceOperationRecordsList(NgDeviceOperationRecords ngDeviceOperationRecords)
{
return ngDeviceOperationRecordsMapper.selectNgDeviceOperationRecordsList(ngDeviceOperationRecords);
}
/**
* 新增设备操作记录
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 结果
*/
@Override
public int insertNgDeviceOperationRecords(NgDeviceOperationRecords ngDeviceOperationRecords)
{
ngDeviceOperationRecords.setCreateTime(DateUtils.getNowDate());
return ngDeviceOperationRecordsMapper.insertNgDeviceOperationRecords(ngDeviceOperationRecords);
}
/**
* 修改设备操作记录
*
* @param ngDeviceOperationRecords 设备操作记录
* @return 结果
*/
@Override
public int updateNgDeviceOperationRecords(NgDeviceOperationRecords ngDeviceOperationRecords)
{
ngDeviceOperationRecords.setUpdateTime(DateUtils.getNowDate());
return ngDeviceOperationRecordsMapper.updateNgDeviceOperationRecords(ngDeviceOperationRecords);
}
/**
* 批量删除设备操作记录
*
* @param ids 需要删除的设备操作记录主键
* @return 结果
*/
@Override
public int deleteNgDeviceOperationRecordsByIds(Long[] ids)
{
return ngDeviceOperationRecordsMapper.deleteNgDeviceOperationRecordsByIds(ids);
}
/**
* 删除设备操作记录信息
*
* @param id 设备操作记录主键
* @return 结果
*/
@Override
public int deleteNgDeviceOperationRecordsById(Long id)
{
return ngDeviceOperationRecordsMapper.deleteNgDeviceOperationRecordsById(id);
}
}

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fastbee.iot.mapper.NgDeviceOperationRecordsMapper">
<resultMap type="NgDeviceOperationRecords" id="NgDeviceOperationRecordsResult">
<result property="id" column="id" />
<result property="userId" column="user_id" />
<result property="deptId" column="dept_id" />
<result property="operationMessage" column="operation_message" />
<result property="operationType" column="operation_type" />
<result property="operationContent" column="operation_content" />
<result property="operationTime" column="operation_time" />
<result property="operationResult" column="operation_result" />
<result property="failureReason" column="failure_reason" />
<result property="remark" column="remark" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
<result property="createBy" column="create_by" />
<result property="updateBy" column="update_by" />
</resultMap>
<sql id="selectNgDeviceOperationRecordsVo">
select id, user_id, dept_id, operation_message, operation_type, operation_content, operation_time, operation_result, failure_reason, remark, create_time, update_time, create_by, update_by from ng_device_operation_records
</sql>
<select id="selectNgDeviceOperationRecordsList" parameterType="NgDeviceOperationRecords" resultMap="NgDeviceOperationRecordsResult">
<include refid="selectNgDeviceOperationRecordsVo"/>
<where>
<if test="userId != null "> and user_id = #{userId}</if>
<if test="deptId != null "> and dept_id = #{deptId}</if>
<if test="operationMessage != null and operationMessage != ''"> and operation_message = #{operationMessage}</if>
<if test="operationType != null "> and operation_type = #{operationType}</if>
<if test="operationContent != null and operationContent != ''"> and operation_content = #{operationContent}</if>
<if test="operationTime != null "> and operation_time = #{operationTime}</if>
<if test="operationResult != null "> and operation_result = #{operationResult}</if>
<if test="failureReason != null and failureReason != ''"> and failure_reason = #{failureReason}</if>
</where>
</select>
<select id="selectNgDeviceOperationRecordsById" parameterType="Long" resultMap="NgDeviceOperationRecordsResult">
<include refid="selectNgDeviceOperationRecordsVo"/>
where id = #{id}
</select>
<insert id="insertNgDeviceOperationRecords" parameterType="NgDeviceOperationRecords" useGeneratedKeys="true" keyProperty="id">
insert into ng_device_operation_records
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userId != null">user_id,</if>
<if test="deptId != null">dept_id,</if>
<if test="operationMessage != null">operation_message,</if>
<if test="operationType != null">operation_type,</if>
<if test="operationContent != null">operation_content,</if>
<if test="operationTime != null">operation_time,</if>
<if test="operationResult != null">operation_result,</if>
<if test="failureReason != null">failure_reason,</if>
<if test="remark != null">remark,</if>
<if test="createTime != null">create_time,</if>
<if test="updateTime != null">update_time,</if>
<if test="createBy != null">create_by,</if>
<if test="updateBy != null">update_by,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userId != null">#{userId},</if>
<if test="deptId != null">#{deptId},</if>
<if test="operationMessage != null">#{operationMessage},</if>
<if test="operationType != null">#{operationType},</if>
<if test="operationContent != null">#{operationContent},</if>
<if test="operationTime != null">#{operationTime},</if>
<if test="operationResult != null">#{operationResult},</if>
<if test="failureReason != null">#{failureReason},</if>
<if test="remark != null">#{remark},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="createBy != null">#{createBy},</if>
<if test="updateBy != null">#{updateBy},</if>
</trim>
</insert>
<update id="updateNgDeviceOperationRecords" parameterType="NgDeviceOperationRecords">
update ng_device_operation_records
<trim prefix="SET" suffixOverrides=",">
<if test="userId != null">user_id = #{userId},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
<if test="operationMessage != null">operation_message = #{operationMessage},</if>
<if test="operationType != null">operation_type = #{operationType},</if>
<if test="operationContent != null">operation_content = #{operationContent},</if>
<if test="operationTime != null">operation_time = #{operationTime},</if>
<if test="operationResult != null">operation_result = #{operationResult},</if>
<if test="failureReason != null">failure_reason = #{failureReason},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteNgDeviceOperationRecordsById" parameterType="Long">
delete from ng_device_operation_records where id = #{id}
</delete>
<delete id="deleteNgDeviceOperationRecordsByIds" parameterType="String">
delete from ng_device_operation_records where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,11 @@
package com.fastbee.rechargecard.domain.dto;
import lombok.Data;
@Data
public class WeChatPlatformCertificate {
private String mchId;//商户号
private String privateKey;//商户api证书私钥
private String serial_no;//商户api证书序列号
private String apiV3Key;//商户apiv3Key
}

View File

@ -25,7 +25,7 @@ public interface IUserWechatPayService {
/**
* 获取平台证书
*/
//public Map<String,Object> getPlatformCertificat();
public Map<String,Object> getPlatformCertificat(String mchId,String privateKey,String serial_no,String apiV3Key);
}

View File

@ -8,9 +8,6 @@ import com.fastbee.common.utils.pay.wxPayConfig;
import com.fastbee.rechargecard.domain.NgMerchants;
import com.fastbee.rechargecard.domain.dto.WeChatRecharge;
import com.fastbee.rechargecard.mapper.NgMerchantsMapper;
import com.fastbee.rechargecard.service.INgUserRechargeRecordsService;
import com.fastbee.rechargecard.service.IUserConsumptionDetailsService;
import com.fastbee.rechargecard.service.IUserRechargeCardsService;
import com.fastbee.rechargecard.service.IUserWechatPayService;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
@ -21,10 +18,7 @@ import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@ -35,38 +29,43 @@ import java.util.*;
@Service
public class UserWechatPayServiceImpl implements IUserWechatPayService {
@Autowired
private NgMerchantsMapper ngMerchantsMapper;
/** 商户号 */
//public static String mchId = "1531795301";
public static String mchId = "1503198881";
//public static String mchId = "1503198881";
/** 商户API私钥文件路径 */
//public static String privateKeyPath = "fastbee-common/src/main/java/com/fastbee/common/utils/pay/apiclient_key.pem";
// public static String privateKeyPath = "fastbee-common/src/main/java/com/fastbee/common/utils/pay/damogang_apiclient_key.pem";
//TODO 生产环境私钥路径
//public static String privateKeyPath = "/home/soft/hzwmiot/fastbee-admin/target/damogang_apiclient_key.pem";
@Autowired
private NgMerchantsMapper ngMerchantsMapper;
/** 商户API证书序列号 */
//public static String serial_no = "3075B63EF52666EDC3EAFC5D4FB35C02CE123A9C";
public static String serial_no = "7A55F5763A002C749F1AB10E1D52DE6688DCDDC0";
// public static String serial_no = "7A55F5763A002C749F1AB10E1D52DE6688DCDDC0";
/** 商户APIV3密钥 */
//public static String apiV3Key = "e85a203e8ca146102f5cd7ecff912580";
public static String apiV3Key = "damogangguanqunongcunyunshuizhex";
//微信小程序appid
public static String appId="wx308612d2a8423311";
//微信小程序appSecret
public static String appSecret="7f591f559929a3bf2dbea4e156b08ae9";
// public static String apiV3Key = "damogangguanqunongcunyunshuizhex";
//微信支付公钥地址
// public static String publicKeyPath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/wechat_public_key.pem";
//public static String publicKeyPath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/wechat_public_key.pem";
//平台证书地址
public static String platformCertificatePath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/damogang_platformCertificate.pem";
// public static String platformCertificatePath="fastbee-common/src/main/java/com/fastbee/common/utils/pay/damogang_platformCertificate.pem";
//支付结果回调地址
// public static String notify_url="https://3ffb1c5f.r3.cpolar.cn/pay/getresult";//https://3ffb1c5f.r3.cpolar.cn
//TODO 生产环境支付结果异步通知地址
public static String notify_url="https://farmh5.hze2.com/prod-api/pay/getresult";
//https://5f655ed0.r3.cpolar.cn
//微信小程序appid
public static String appId="wx308612d2a8423311";
//微信小程序appSecret
public static String appSecret="7f591f559929a3bf2dbea4e156b08ae9";
@Override
/**
* 创建订单获取prepay_id和paySign
@ -166,6 +165,125 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
httpClient.close();
}
}
/**
* 获取openId
* @param code
* @return
*/
@Override
public Map<String, Object> GetOpenId(String code)
{
System.out.println(code);
//String url = String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appId, appSecret, code);
//String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId+"&secret="+appSecret+"&code="+code+"&grant_type=authorization_code";
String url="https://api.weixin.qq.com/sns/jscode2session?appid="+appId+"&secret="+appSecret+"&js_code="+code+"&grant_type=authorization_code";
//RestTemplate restTemplate = new RestTemplate();
//Map<String, Object> response = restTemplate.getForObject(url, Map.class);
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpGet httpGet = new HttpGet(url);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
String responseString = EntityUtils.toString(response.getEntity());
Map<String, Object> responseMap = JSONUtil.toBean(responseString, Map.class);
//打印出返回前端的所有参数
// 获取键的集合
Set<String> keySet = responseMap.keySet();
// 遍历键集合
for (String key : keySet) {
System.out.println(key + ": " + responseMap.get(key));
}
// 解析responseString以获取openid
return responseMap; // 这里返回的是整个响应字符串需要自行解析出openid
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 获取平台证书
* @return
*/
@Override
public Map<String,Object> getPlatformCertificat(String mchId,String privateKey,String serial_no,String apiV3Key)
{
String url="https://api.mch.weixin.qq.com/v3/certificates";
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpGet httpGet = new HttpGet(url);
//生成签名
Map<String,String> signResult=getSign(null,"GET","/v3/certificates",privateKey);
Set<String> keySet2 = signResult.keySet();
// 遍历键集合
for (String key : keySet2) {
System.err.println(key + ": " + signResult.get(key));
}
String sign=signResult.get("sign").toString();
String nonce_str=signResult.get("nonce_str").toString();
String timeStamp=signResult.get("timeStamp").toString();
String Authorization="WECHATPAY2-SHA256-RSA2048 mchid=\""+mchId+"\",nonce_str=\""+nonce_str+"\",signature=\""+sign+"\",timestamp=\""+timeStamp+"\",serial_no=\""+serial_no+"\"";
System.err.println(Authorization);
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Authorization",Authorization);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
String responseString = EntityUtils.toString(response.getEntity());
System.err.println(responseString);
Map<String, Object> responseMap = JSONUtil.toBean(responseString, Map.class);
// 使用Optional来避免null检查
Optional<?> optionalObj = Optional.ofNullable(responseMap.get("data"));
System.err.println(optionalObj);
// 链式调用map和flatMap方法来安全地转换和获取Map
Map<?, ?> map = optionalObj
.filter(List.class::isInstance) // 确保obj是List类型
.map(List.class::cast) // 将obj转换为List
.filter(list -> !list.isEmpty() && list.get(0) instanceof Map) // 确保List不为空并且第一个元素是Map类型
.map(list -> (Map<?, ?>) list.get(0)) // 将List中的第一个元素转换为Map
.orElse(null); // 如果任何检查失败则返回null
System.err.println(map);
//解密jsonObject对象
Map<String,Object> encrypt_certificate= (Map<String, Object>) map.get("encrypt_certificate");
System.err.println("111");
System.err.println(encrypt_certificate);
String serial=map.get("serial_no").toString();
System.err.println("平台证书序列号:"+serial);
String associated_data=encrypt_certificate.get("associated_data").toString();//加密证书的附加数据固定为“certificate"
String ciphertext=encrypt_certificate.get("ciphertext").toString();//加密证书的随机串
String nonce=encrypt_certificate.get("nonce").toString();//加密后的证书内容
System.err.println("ciphertext:"+ciphertext);
System.err.println("nonce:"+nonce);
System.err.println("associated_data:"+associated_data);
//使用apiv3key解密
String decryptData="";
try{
decryptData= new AesUtil(apiV3Key.getBytes(StandardCharsets.UTF_8)).decryptToString
(associated_data.getBytes(StandardCharsets.UTF_8),
nonce.getBytes(StandardCharsets.UTF_8),
ciphertext);
System.out.println("解密成功:\n"+decryptData);
}catch (Exception e)
{
System.out.println("解密失败");
}
Map<String,Object> result=new HashMap<>();
result.put("platformCertificate",responseMap.toString());
result.put("serial",serial);
Set<String> keys=result.keySet();
for(String key : keys)
{
System.out.println(key+":"+result.get(key));
}
// 解析responseString以获取openid
return result; // 这里返回的是整个响应字符串需要自行解析出openid
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 生成签名
*/
@ -240,122 +358,6 @@ public class UserWechatPayServiceImpl implements IUserWechatPayService {
return Base64.getEncoder().encodeToString(sign.sign());
}
/**
* 获取openId
* @param code
* @return
*/
@Override
public Map<String, Object> GetOpenId(String code)
{
System.out.println(code);
//String url = String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appId, appSecret, code);
//String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId+"&secret="+appSecret+"&code="+code+"&grant_type=authorization_code";
String url="https://api.weixin.qq.com/sns/jscode2session?appid="+appId+"&secret="+appSecret+"&js_code="+code+"&grant_type=authorization_code";
//RestTemplate restTemplate = new RestTemplate();
//Map<String, Object> response = restTemplate.getForObject(url, Map.class);
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpGet httpGet = new HttpGet(url);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
String responseString = EntityUtils.toString(response.getEntity());
Map<String, Object> responseMap = JSONUtil.toBean(responseString, Map.class);
//打印出返回前端的所有参数
// 获取键的集合
Set<String> keySet = responseMap.keySet();
// 遍历键集合
for (String key : keySet) {
System.out.println(key + ": " + responseMap.get(key));
}
// 解析responseString以获取openid
return responseMap; // 这里返回的是整个响应字符串需要自行解析出openid
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 获取平台证书
* @return
*/
/*@Override*/
/*public Map<String,Object> getPlatformCertificat()
{
String url="https://api.mch.weixin.qq.com/v3/certificates";
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpGet httpGet = new HttpGet(url);
//生成签名
Map<String,String> signResult=getSign(null,"GET","/v3/certificates");
Set<String> keySet2 = signResult.keySet();
// 遍历键集合
for (String key : keySet2) {
System.err.println(key + ": " + signResult.get(key));
}
String sign=signResult.get("sign").toString();
String nonce_str=signResult.get("nonce_str").toString();
String timeStamp=signResult.get("timeStamp").toString();
String Authorization="WECHATPAY2-SHA256-RSA2048 mchid=\""+mchId+"\",nonce_str=\""+nonce_str+"\",signature=\""+sign+"\",timestamp=\""+timeStamp+"\",serial_no=\""+serial_no+"\"";
System.err.println(Authorization);
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Authorization",Authorization);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
String responseString = EntityUtils.toString(response.getEntity());
System.err.println(responseString);
Map<String, Object> responseMap = JSONUtil.toBean(responseString, Map.class);
// 使用Optional来避免null检查
Optional<?> optionalObj = Optional.ofNullable(responseMap.get("data"));
System.err.println(optionalObj);
// 链式调用map和flatMap方法来安全地转换和获取Map
Map<?, ?> map = optionalObj
.filter(List.class::isInstance) // 确保obj是List类型
.map(List.class::cast) // 将obj转换为List
.filter(list -> !list.isEmpty() && list.get(0) instanceof Map) // 确保List不为空并且第一个元素是Map类型
.map(list -> (Map<?, ?>) list.get(0)) // 将List中的第一个元素转换为Map
.orElse(null); // 如果任何检查失败则返回null
System.err.println(map);
//解密jsonObject对象
Map<String,Object> encrypt_certificate= (Map<String, Object>) map.get("encrypt_certificate");
System.err.println("111");
System.err.println(encrypt_certificate);
String serial=map.get("serial_no").toString();
System.err.println("平台证书序列号:"+serial);
String associated_data=encrypt_certificate.get("associated_data").toString();//加密证书的附加数据固定为“certificate"
String ciphertext=encrypt_certificate.get("ciphertext").toString();//加密证书的随机串
String nonce=encrypt_certificate.get("nonce").toString();//加密后的证书内容
System.err.println("ciphertext:"+ciphertext);
System.err.println("nonce:"+nonce);
System.err.println("associated_data:"+associated_data);
//使用apiv3key解密
String decryptData="";
try{
decryptData= new AesUtil(apiV3Key.getBytes(StandardCharsets.UTF_8)).decryptToString
(associated_data.getBytes(StandardCharsets.UTF_8),
nonce.getBytes(StandardCharsets.UTF_8),
ciphertext);
System.out.println("解密成功:\n"+decryptData);
}catch (Exception e)
{
System.out.println("解密失败");
}
Map<String,Object> result=new HashMap<>();
result.put("platformCertificate",responseMap.toString());
result.put("serial",serial);
Set<String> keys=result.keySet();
for(String key : keys)
{
System.out.println(key+":"+result.get(key));
}
// 解析responseString以获取openid
return result; // 这里返回的是整个响应字符串需要自行解析出openid
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}*/