调整支付远程调用方式
This commit is contained in:
parent
9e10c9bdff
commit
ad4de70242
@ -198,7 +198,8 @@ public class RestRemoteRequest {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private String getStringResponse(ResponseEntity<String> responseEntity) {
|
private String getStringResponse(ResponseEntity<String> responseEntity) {
|
||||||
if (responseEntity.getStatusCode() != HttpStatus.OK) {
|
if (responseEntity.getStatusCode() != HttpStatus.OK &&
|
||||||
|
responseEntity.getStatusCode() != HttpStatus.NO_CONTENT) {
|
||||||
throw new RemoteResponseException("远程调用响应状态码不支持: " + responseEntity.getStatusCode());
|
throw new RemoteResponseException("远程调用响应状态码不支持: " + responseEntity.getStatusCode());
|
||||||
}
|
}
|
||||||
String responseBody = responseEntity.getBody();
|
String responseBody = responseEntity.getBody();
|
||||||
|
@ -9,14 +9,14 @@ import ink.wgink.module.wechat.pojo.vos.official.account.OfficialAccountTemplate
|
|||||||
import ink.wgink.module.wechat.result.TemplateMessageWechatResult;
|
import ink.wgink.module.wechat.result.TemplateMessageWechatResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ClassName: ITemplateMessageRemoteService
|
* @ClassName: IOfficialAccountRemoteService
|
||||||
* @Description: 模板消息
|
* @Description: 微信公众号远程调用
|
||||||
* @Author: wanggeng
|
* @Author: wanggeng
|
||||||
* @Date: 2021/9/30 9:19 上午
|
* @Date: 2021/9/30 9:19 上午
|
||||||
* @Version: 1.0
|
* @Version: 1.0
|
||||||
*/
|
*/
|
||||||
@RemoteService
|
@RemoteService
|
||||||
public interface IOfficialAccountTemplateMessageRemoteService {
|
public interface IOfficialAccountRemoteService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送消息模板
|
* 发送消息模板
|
@ -0,0 +1,86 @@
|
|||||||
|
package ink.wgink.module.wechat.remote.pay.v3;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import ink.wgink.annotation.rpc.rest.RemoteService;
|
||||||
|
import ink.wgink.annotation.rpc.rest.method.RemoteGetMethod;
|
||||||
|
import ink.wgink.annotation.rpc.rest.method.RemotePostMethod;
|
||||||
|
import ink.wgink.annotation.rpc.rest.params.*;
|
||||||
|
import ink.wgink.module.wechat.pojo.pay.v3.jsapi.pojo.PayPrepay;
|
||||||
|
import ink.wgink.module.wechat.pojo.pay.v3.order.OrderSearch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ClassName: IOrderPayRemoteService
|
||||||
|
* @Description: 订单远程调用
|
||||||
|
* @Author: wanggeng
|
||||||
|
* @Date: 2021/10/2 10:58 上午
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@RemoteService
|
||||||
|
public interface IOrderPayRemoteService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下单
|
||||||
|
*
|
||||||
|
* @param server
|
||||||
|
* @param authorization
|
||||||
|
* @param serialNumber
|
||||||
|
* @param payPlaceOrder
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@RemotePostMethod("/v3/pay/transactions/jsapi")
|
||||||
|
PayPrepay placeOrderJsapi(@RemoteServerParams String server,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_AUTHORIZATION) String authorization,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_WECHATPAY_SERIAL) String serialNumber,
|
||||||
|
@RemoteJsonBodyParams JSONObject payPlaceOrder);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭订单
|
||||||
|
*
|
||||||
|
* @param server
|
||||||
|
* @param businessOrderId
|
||||||
|
* @param authorization
|
||||||
|
* @param serialNumber
|
||||||
|
* @param orderClose
|
||||||
|
*/
|
||||||
|
@RemotePostMethod("/v3/pay/transactions/out-trade-no/{businessOrderId}/close")
|
||||||
|
void closePlaceOrder(@RemoteServerParams String server,
|
||||||
|
@RemotePathParams("businessOrderId") String businessOrderId,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_AUTHORIZATION) String authorization,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_WECHATPAY_SERIAL) String serialNumber,
|
||||||
|
@RemoteJsonBodyParams JSONObject orderClose);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信支付订单号查询
|
||||||
|
*
|
||||||
|
* @param server
|
||||||
|
* @param transactionId
|
||||||
|
* @param authorization
|
||||||
|
* @param serialNumber
|
||||||
|
* @param mchid
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@RemoteGetMethod("/v3/pay/transactions/id/{transactionId}")
|
||||||
|
OrderSearch getOrder(@RemoteServerParams String server,
|
||||||
|
@RemotePathParams("transactionId") String transactionId,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_AUTHORIZATION) String authorization,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_WECHATPAY_SERIAL) String serialNumber,
|
||||||
|
@RemoteQueryParams("mchid") String mchid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商户订单号查询
|
||||||
|
*
|
||||||
|
* @param server
|
||||||
|
* @param businessOrderId
|
||||||
|
* @param authorization
|
||||||
|
* @param serialNumber
|
||||||
|
* @param mchid
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@RemoteGetMethod("/v3/pay/transactions/out-trade-no/{businessOrderId}")
|
||||||
|
OrderSearch getBusinessOrder(@RemoteServerParams String server,
|
||||||
|
@RemotePathParams("businessOrderId") String businessOrderId,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_AUTHORIZATION) String authorization,
|
||||||
|
@RemoteHeaderParams(IPayRemoteService.HEADER_WECHATPAY_SERIAL) String serialNumber,
|
||||||
|
@RemoteQueryParams("mchid") String mchid);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package ink.wgink.module.wechat.remote.pay.v3;
|
||||||
|
|
||||||
|
import ink.wgink.annotation.rpc.rest.RemoteService;
|
||||||
|
import ink.wgink.annotation.rpc.rest.method.RemoteGetMethod;
|
||||||
|
import ink.wgink.annotation.rpc.rest.params.RemoteHeaderParams;
|
||||||
|
import ink.wgink.annotation.rpc.rest.params.RemoteServerParams;
|
||||||
|
import ink.wgink.module.wechat.pojo.pay.v3.certificates.Certificate;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ClassName: IPayRemoteService
|
||||||
|
* @Description: 支付远程调用
|
||||||
|
* @Author: wanggeng
|
||||||
|
* @Date: 2021/10/1 10:03 下午
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@RemoteService
|
||||||
|
public interface IPayRemoteService {
|
||||||
|
|
||||||
|
String HEADER_AUTHORIZATION = "Authorization";
|
||||||
|
String HEADER_WECHATPAY_SERIAL = "Wechatpay-Serial";
|
||||||
|
|
||||||
|
@RemoteGetMethod("/v3/certificates")
|
||||||
|
List<Certificate> listCertificates(@RemoteServerParams String server,
|
||||||
|
@RemoteHeaderParams(HEADER_AUTHORIZATION) String authorization,
|
||||||
|
@RemoteHeaderParams("serialNumber") String serialNumber);
|
||||||
|
|
||||||
|
}
|
@ -5,7 +5,7 @@ import ink.wgink.exceptions.ParamsException;
|
|||||||
import ink.wgink.exceptions.rpc.RemoteRequestException;
|
import ink.wgink.exceptions.rpc.RemoteRequestException;
|
||||||
import ink.wgink.module.wechat.manager.OfficialAccountAccessTokenManager;
|
import ink.wgink.module.wechat.manager.OfficialAccountAccessTokenManager;
|
||||||
import ink.wgink.module.wechat.pojo.vos.official.account.OfficialAccountTemplateMessageSendVO;
|
import ink.wgink.module.wechat.pojo.vos.official.account.OfficialAccountTemplateMessageSendVO;
|
||||||
import ink.wgink.module.wechat.remote.official.account.IOfficialAccountTemplateMessageRemoteService;
|
import ink.wgink.module.wechat.remote.official.account.IOfficialAccountRemoteService;
|
||||||
import ink.wgink.module.wechat.result.TemplateMessageWechatResult;
|
import ink.wgink.module.wechat.result.TemplateMessageWechatResult;
|
||||||
import ink.wgink.module.wechat.service.official.account.IOfficialAccountTemplateMessageService;
|
import ink.wgink.module.wechat.service.official.account.IOfficialAccountTemplateMessageService;
|
||||||
import ink.wgink.properties.wechat.official.account.OfficialAccountProperties;
|
import ink.wgink.properties.wechat.official.account.OfficialAccountProperties;
|
||||||
@ -25,7 +25,7 @@ import org.springframework.stereotype.Service;
|
|||||||
public class OfficialAccountTemplateMessageServiceImpl extends DefaultBaseService implements IOfficialAccountTemplateMessageService {
|
public class OfficialAccountTemplateMessageServiceImpl extends DefaultBaseService implements IOfficialAccountTemplateMessageService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IOfficialAccountTemplateMessageRemoteService officialAccountTemplateMessageRemoteService;
|
private IOfficialAccountRemoteService officialAccountTemplateMessageRemoteService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private OfficialAccountProperties officialAccountProperties;
|
private OfficialAccountProperties officialAccountProperties;
|
||||||
|
|
||||||
|
@ -3,11 +3,12 @@ package ink.wgink.module.wechat.service.pay.v3.certificates.impl;
|
|||||||
import ink.wgink.exceptions.base.SystemException;
|
import ink.wgink.exceptions.base.SystemException;
|
||||||
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.certificates.Certificate;
|
import ink.wgink.module.wechat.pojo.pay.v3.certificates.Certificate;
|
||||||
import ink.wgink.module.wechat.request.pay.v3.AbstractPayRequest;
|
import ink.wgink.module.wechat.remote.pay.v3.IPayRemoteService;
|
||||||
import ink.wgink.module.wechat.request.pay.v3.certificates.CertificatePayRequestImpl;
|
|
||||||
import ink.wgink.module.wechat.service.pay.BasePayService;
|
import ink.wgink.module.wechat.service.pay.BasePayService;
|
||||||
import ink.wgink.module.wechat.service.pay.v3.certificates.ICertificateService;
|
import ink.wgink.module.wechat.service.pay.v3.certificates.ICertificateService;
|
||||||
|
import ink.wgink.module.wechat.utils.pay.PayAesUtil;
|
||||||
import ink.wgink.util.date.DateUtil;
|
import ink.wgink.util.date.DateUtil;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
|
||||||
@ -27,7 +28,38 @@ import java.util.List;
|
|||||||
@Service
|
@Service
|
||||||
public class CertificateServiceImpl extends BasePayService implements ICertificateService {
|
public class CertificateServiceImpl extends BasePayService implements ICertificateService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IPayRemoteService payRemoteService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
public String getNewestPlatformCertificate() throws Exception {
|
||||||
|
String urlSuffix = "/v3/certificates";
|
||||||
|
|
||||||
|
LOG.debug("获得证书序列号");
|
||||||
|
String serialNumber = getSerialNumber();
|
||||||
|
String authorization = getAuthorization(RequestMethod.GET, urlSuffix, serialNumber, payProperties, "", PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
|
List<Certificate> certificates = payRemoteService.listCertificates(getPayBaseUrl(), authorization, serialNumber);
|
||||||
|
|
||||||
|
LOG.debug("获取最新的平台证书");
|
||||||
|
Certificate newestCertificate = certificates.get(certificates.size() - 1);
|
||||||
|
LOG.debug("解析密文");
|
||||||
|
PayAesUtil aesUtil = new PayAesUtil(payProperties.getApiV3Secretkey().getBytes(StandardCharsets.UTF_8));
|
||||||
|
Certificate.EncryptCertificate encryptCertificate = newestCertificate.getEncryptCertificate();
|
||||||
|
String ciphertext = aesUtil.decryptToString(encryptCertificate.getAssociatedData().getBytes(StandardCharsets.UTF_8), encryptCertificate.getNonce().getBytes(StandardCharsets.UTF_8), encryptCertificate.getCiphertext());
|
||||||
|
String certificateFilePath = payProperties.getCertificatePath() + File.separator + DateUtil.getDays()+ "_wxp_pub.pem";
|
||||||
|
LOG.debug("新证书文件路径:{}", certificateFilePath);
|
||||||
|
try (FileWriter fileWriter = new FileWriter(certificateFilePath)) {
|
||||||
|
fileWriter.write(ciphertext);
|
||||||
|
fileWriter.flush();
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.error(e.getMessage(), e);
|
||||||
|
throw new SystemException("证书生成异常");
|
||||||
|
}
|
||||||
|
LOG.debug("保存新平台证书成功");
|
||||||
|
return certificateFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
public String getNewestPlatformCertificate() throws Exception {
|
public String getNewestPlatformCertificate() throws Exception {
|
||||||
String urlSuffix = "/v3/certificates";
|
String urlSuffix = "/v3/certificates";
|
||||||
String url = getPayBaseUrl() + urlSuffix;
|
String url = getPayBaseUrl() + urlSuffix;
|
||||||
@ -37,6 +69,7 @@ public class CertificateServiceImpl extends BasePayService implements ICertifica
|
|||||||
CertificatePayRequestImpl certificatesPayRequest = new CertificatePayRequestImpl();
|
CertificatePayRequestImpl certificatesPayRequest = new CertificatePayRequestImpl();
|
||||||
String authorization = getAuthorization(RequestMethod.GET, urlSuffix, serialNumber, payProperties, "", PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
String authorization = getAuthorization(RequestMethod.GET, urlSuffix, serialNumber, payProperties, "", PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
List<Certificate> certificates = certificatesPayRequest.get(url, authorization, serialNumber);
|
List<Certificate> certificates = certificatesPayRequest.get(url, authorization, serialNumber);
|
||||||
|
|
||||||
LOG.debug("获取最新的平台证书");
|
LOG.debug("获取最新的平台证书");
|
||||||
Certificate newestCertificate = certificates.get(certificates.size() - 1);
|
Certificate newestCertificate = certificates.get(certificates.size() - 1);
|
||||||
LOG.debug("解析密文");
|
LOG.debug("解析密文");
|
||||||
@ -55,4 +88,6 @@ public class CertificateServiceImpl extends BasePayService implements ICertifica
|
|||||||
LOG.debug("保存新平台证书成功");
|
LOG.debug("保存新平台证书成功");
|
||||||
return certificateFilePath;
|
return certificateFilePath;
|
||||||
}
|
}
|
||||||
|
**/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,9 @@ import ink.wgink.module.wechat.manager.pay.v3.PayManager;
|
|||||||
import ink.wgink.module.wechat.pojo.pay.v3.PayErrorResponse;
|
import ink.wgink.module.wechat.pojo.pay.v3.PayErrorResponse;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.PayNotice;
|
import ink.wgink.module.wechat.pojo.pay.v3.PayNotice;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.PayNoticeCiphertext;
|
import ink.wgink.module.wechat.pojo.pay.v3.PayNoticeCiphertext;
|
||||||
import ink.wgink.module.wechat.request.pay.v3.AbstractPayRequest;
|
|
||||||
import ink.wgink.module.wechat.service.pay.v3.IPayNoticeService;
|
import ink.wgink.module.wechat.service.pay.v3.IPayNoticeService;
|
||||||
import ink.wgink.module.wechat.service.pay.v3.IPayService;
|
import ink.wgink.module.wechat.service.pay.v3.IPayService;
|
||||||
|
import ink.wgink.module.wechat.utils.pay.PayAesUtil;
|
||||||
import ink.wgink.module.wechat.utils.pay.PayVerifyUtil;
|
import ink.wgink.module.wechat.utils.pay.PayVerifyUtil;
|
||||||
import ink.wgink.properties.wechat.pay.v3.PayProperties;
|
import ink.wgink.properties.wechat.pay.v3.PayProperties;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@ -59,7 +59,7 @@ public class IPayServiceImpl extends DefaultBaseService implements IPayService {
|
|||||||
|
|
||||||
LOG.debug("解密内容");
|
LOG.debug("解密内容");
|
||||||
PayNotice.Resource resource = payNotice.getResource();
|
PayNotice.Resource resource = payNotice.getResource();
|
||||||
AbstractPayRequest.AesUtil aesUtil = new AbstractPayRequest.AesUtil(payProperties.getApiV3Secretkey().getBytes(StandardCharsets.UTF_8));
|
PayAesUtil aesUtil = new PayAesUtil(payProperties.getApiV3Secretkey().getBytes(StandardCharsets.UTF_8));
|
||||||
String payNoticeCiphertextJsonString = aesUtil.decryptToString(resource.getAssociated_data().getBytes(StandardCharsets.UTF_8), resource.getNonce().getBytes(StandardCharsets.UTF_8), resource.getCiphertext());
|
String payNoticeCiphertextJsonString = aesUtil.decryptToString(resource.getAssociated_data().getBytes(StandardCharsets.UTF_8), resource.getNonce().getBytes(StandardCharsets.UTF_8), resource.getCiphertext());
|
||||||
PayNoticeCiphertext payNoticeCiphertext = JSONObject.parseObject(payNoticeCiphertextJsonString, PayNoticeCiphertext.class);
|
PayNoticeCiphertext payNoticeCiphertext = JSONObject.parseObject(payNoticeCiphertextJsonString, PayNoticeCiphertext.class);
|
||||||
payNoticeService.handle(payNoticeCiphertext);
|
payNoticeService.handle(payNoticeCiphertext);
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
package ink.wgink.module.wechat.service.pay.v3.jsapi.impl;
|
package ink.wgink.module.wechat.service.pay.v3.jsapi.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.PaySign;
|
import ink.wgink.module.wechat.pojo.pay.v3.PaySign;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.jsapi.pojo.PayPlaceOrder;
|
import ink.wgink.module.wechat.pojo.pay.v3.jsapi.pojo.PayPlaceOrder;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.jsapi.pojo.PayPrepay;
|
import ink.wgink.module.wechat.pojo.pay.v3.jsapi.pojo.PayPrepay;
|
||||||
import ink.wgink.module.wechat.request.pay.v3.jsapi.PlaceOrderPayRequestImpl;
|
import ink.wgink.module.wechat.remote.pay.v3.IOrderPayRemoteService;
|
||||||
import ink.wgink.module.wechat.service.pay.BasePayService;
|
import ink.wgink.module.wechat.service.pay.BasePayService;
|
||||||
import ink.wgink.module.wechat.service.pay.v3.jsapi.IJsapiService;
|
import ink.wgink.module.wechat.service.pay.v3.jsapi.IJsapiService;
|
||||||
import ink.wgink.module.wechat.utils.pay.PayPrivateKeyUtil;
|
import ink.wgink.module.wechat.utils.pay.PayPrivateKeyUtil;
|
||||||
@ -17,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ClassName: JsapiServiceImpl
|
* @ClassName: JsapiServiceImpl
|
||||||
* @Description: Jsapi业务
|
* @Description: Jsapi业务
|
||||||
@ -30,8 +33,41 @@ public class JsapiServiceImpl extends BasePayService implements IJsapiService {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MiniappProperties miniappProperties;
|
private MiniappProperties miniappProperties;
|
||||||
|
@Autowired
|
||||||
|
private IOrderPayRemoteService orderPayRemoteService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
public PaySign placeOrder(PayPlaceOrder payPlaceOrder) throws Exception {
|
||||||
|
payPlaceOrder.setAppid(miniappProperties.getAppKey());
|
||||||
|
payPlaceOrder.setMchid(payProperties.getMchid());
|
||||||
|
BeanPropertyCheckUtil.checkField(payPlaceOrder);
|
||||||
|
String urlSuffix = "/v3/pay/transactions/jsapi";
|
||||||
|
|
||||||
|
LOG.debug("获得证书序列号");
|
||||||
|
String serialNumber = getSerialNumber();
|
||||||
|
|
||||||
|
LOG.debug("调用微信支付,发起预支付");
|
||||||
|
JSONObject body = getPlaceOrderJsonObject(payPlaceOrder);
|
||||||
|
String authorization = getAuthorization(RequestMethod.POST, urlSuffix, serialNumber, payProperties, body.toString(), PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
|
|
||||||
|
LOG.debug("请求获得结果");
|
||||||
|
PayPrepay payPrepay = orderPayRemoteService.placeOrderJsapi(getPayBaseUrl(), authorization, serialNumber, body);
|
||||||
|
|
||||||
|
LOG.debug("生成返回结果");
|
||||||
|
long timestamp = System.currentTimeMillis() / 1000;
|
||||||
|
String nonceStr = WStringUtil.randomSubStr(UUIDUtil.get32UUID(), 10).toUpperCase();
|
||||||
|
|
||||||
|
PaySign paySign = new PaySign();
|
||||||
|
paySign.setAppId(miniappProperties.getAppKey());
|
||||||
|
paySign.setPrepayId(payPrepay.getPrepayId());
|
||||||
|
paySign.setNonceStr(nonceStr);
|
||||||
|
paySign.setTimestamp(String.valueOf(timestamp));
|
||||||
|
paySign.setPaySign(getPaySign(timestamp, nonceStr, payPrepay.getPrepayId()));
|
||||||
|
return paySign;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 没问题会删除`
|
||||||
public PaySign placeOrder(PayPlaceOrder payPlaceOrder) throws Exception {
|
public PaySign placeOrder(PayPlaceOrder payPlaceOrder) throws Exception {
|
||||||
payPlaceOrder.setAppid(miniappProperties.getAppKey());
|
payPlaceOrder.setAppid(miniappProperties.getAppKey());
|
||||||
payPlaceOrder.setMchid(payProperties.getMchid());
|
payPlaceOrder.setMchid(payProperties.getMchid());
|
||||||
@ -44,7 +80,7 @@ public class JsapiServiceImpl extends BasePayService implements IJsapiService {
|
|||||||
|
|
||||||
LOG.debug("调用微信支付,发起预支付");
|
LOG.debug("调用微信支付,发起预支付");
|
||||||
PlaceOrderPayRequestImpl placeOrderPayRequest = new PlaceOrderPayRequestImpl();
|
PlaceOrderPayRequestImpl placeOrderPayRequest = new PlaceOrderPayRequestImpl();
|
||||||
JSONObject body = placeOrderPayRequest.bodyJson(payPlaceOrder);
|
JSONObject body = getPlaceOrderJsonObject(payPlaceOrder);
|
||||||
String authorization = getAuthorization(RequestMethod.POST, urlSuffix, serialNumber, payProperties, body.toString(), PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
String authorization = getAuthorization(RequestMethod.POST, urlSuffix, serialNumber, payProperties, body.toString(), PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
|
|
||||||
LOG.debug("请求获得结果");
|
LOG.debug("请求获得结果");
|
||||||
@ -62,6 +98,7 @@ public class JsapiServiceImpl extends BasePayService implements IJsapiService {
|
|||||||
paySign.setPaySign(getPaySign(timestamp, nonceStr, payPrepay.getPrepayId()));
|
paySign.setPaySign(getPaySign(timestamp, nonceStr, payPrepay.getPrepayId()));
|
||||||
return paySign;
|
return paySign;
|
||||||
}
|
}
|
||||||
|
**/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得小程序签名
|
* 获得小程序签名
|
||||||
@ -83,4 +120,137 @@ public class JsapiServiceImpl extends BasePayService implements IJsapiService {
|
|||||||
return PayPrivateKeyUtil.encryptByPrivateKey(signBS.toString(), key);
|
return PayPrivateKeyUtil.encryptByPrivateKey(signBS.toString(), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取
|
||||||
|
* @param payPlaceOrder
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONObject getPlaceOrderJsonObject(PayPlaceOrder payPlaceOrder) {
|
||||||
|
JSONObject bodyObject = new JSONObject();
|
||||||
|
bodyObject.put("appid", payPlaceOrder.getAppid());
|
||||||
|
bodyObject.put("mchid", payPlaceOrder.getMchid());
|
||||||
|
bodyObject.put("description", payPlaceOrder.getDescription());
|
||||||
|
bodyObject.put("out_trade_no", payPlaceOrder.getOutTradeNo());
|
||||||
|
bodyObject.put("time_expire", payPlaceOrder.getTimeExpire());
|
||||||
|
bodyObject.put("attach", payPlaceOrder.getAttach());
|
||||||
|
bodyObject.put("notify_url", payPlaceOrder.getNotifyUrl());
|
||||||
|
bodyObject.put("goods_tag", payPlaceOrder.getGoodsTag());
|
||||||
|
bodyObject.put("amount", getAmountJsonObject(payPlaceOrder.getAmount()));
|
||||||
|
bodyObject.put("payer", getPayer(payPlaceOrder.getPayer()));
|
||||||
|
if (payPlaceOrder.getDetail() != null) {
|
||||||
|
bodyObject.put("detail", getDetail(payPlaceOrder.getDetail()));
|
||||||
|
}
|
||||||
|
if (payPlaceOrder.getSceneInfo() != null) {
|
||||||
|
bodyObject.put("scene_info", getSceneInfo(payPlaceOrder.getSceneInfo()));
|
||||||
|
}
|
||||||
|
if (payPlaceOrder.getSettleInfo() != null) {
|
||||||
|
bodyObject.put("settle_info", getSettleInfo(payPlaceOrder.getSettleInfo()));
|
||||||
|
}
|
||||||
|
return bodyObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单金额
|
||||||
|
*
|
||||||
|
* @param amount
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONObject getAmountJsonObject(PayPlaceOrder.Amount amount) {
|
||||||
|
JSONObject amountJsonObject = new JSONObject();
|
||||||
|
amountJsonObject.put("total", amount.getTotal());
|
||||||
|
amountJsonObject.put("currency", amount.getCurrency());
|
||||||
|
return amountJsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付者
|
||||||
|
*
|
||||||
|
* @param payer
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONObject getPayer(PayPlaceOrder.Payer payer) {
|
||||||
|
JSONObject payerJsonObject = new JSONObject();
|
||||||
|
payerJsonObject.put("openid", payer.getOpenid());
|
||||||
|
return payerJsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优惠功能
|
||||||
|
*
|
||||||
|
* @param detail
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONObject getDetail(PayPlaceOrder.Detail detail) {
|
||||||
|
JSONObject detailJsonObject = new JSONObject();
|
||||||
|
detailJsonObject.put("cost_price", detail.getCostPrice());
|
||||||
|
detailJsonObject.put("invoice_id", detail.getInvoiceId());
|
||||||
|
if (detail.getGoodsDetail() != null || !detail.getGoodsDetail().isEmpty()) {
|
||||||
|
detailJsonObject.put("goods_detail", listGoodsDetail(detail.getGoodsDetail()));
|
||||||
|
}
|
||||||
|
return detailJsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品列表
|
||||||
|
*
|
||||||
|
* @param goodsList
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONArray listGoodsDetail(List<PayPlaceOrder.Detail.Goods> goodsList) {
|
||||||
|
JSONArray goodsDetailJsonArray = new JSONArray();
|
||||||
|
for (PayPlaceOrder.Detail.Goods goods : goodsList) {
|
||||||
|
JSONObject goodsJsonObject = new JSONObject();
|
||||||
|
goodsJsonObject.put("merchant_goods_id", goods.getMerchantGoodsId());
|
||||||
|
goodsJsonObject.put("wechatpay_goods_id", goods.getWechatpayGoodsId());
|
||||||
|
goodsJsonObject.put("goods_name", goods.getGoodsName());
|
||||||
|
goodsJsonObject.put("quantity", goods.getQuantity());
|
||||||
|
goodsJsonObject.put("unit_price", goods.getUnitPrice());
|
||||||
|
goodsDetailJsonArray.add(goodsJsonObject);
|
||||||
|
}
|
||||||
|
return goodsDetailJsonArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 场景信息
|
||||||
|
*
|
||||||
|
* @param sceneInfo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONObject getSceneInfo(PayPlaceOrder.SceneInfo sceneInfo) {
|
||||||
|
JSONObject sceneInfoJsonObject = new JSONObject();
|
||||||
|
sceneInfoJsonObject.put("payer_client_ip", sceneInfo.getPayerClientIp());
|
||||||
|
sceneInfoJsonObject.put("device_id", sceneInfo.getDeviceId());
|
||||||
|
if (sceneInfo.getStoreInfo() != null) {
|
||||||
|
sceneInfoJsonObject.put("store_info", getStoreInfo(sceneInfo.getStoreInfo()));
|
||||||
|
}
|
||||||
|
return sceneInfoJsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商户门店信息
|
||||||
|
*
|
||||||
|
* @param storeInfo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONObject getStoreInfo(PayPlaceOrder.SceneInfo.StoreInfo storeInfo) {
|
||||||
|
JSONObject storeInfoJsonObject = new JSONObject();
|
||||||
|
storeInfoJsonObject.put("id", storeInfo.getId());
|
||||||
|
storeInfoJsonObject.put("name", storeInfo.getName());
|
||||||
|
storeInfoJsonObject.put("area_code", storeInfo.getAreaCode());
|
||||||
|
storeInfoJsonObject.put("address", storeInfo.getAddress());
|
||||||
|
return storeInfoJsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否指定分账
|
||||||
|
*
|
||||||
|
* @param settleInfo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private JSONObject getSettleInfo(PayPlaceOrder.SettleInfo settleInfo) {
|
||||||
|
JSONObject settleJsonObject = new JSONObject();
|
||||||
|
settleJsonObject.put("profit_sharing", settleInfo.getProfitSharing());
|
||||||
|
return settleJsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
package ink.wgink.module.wechat.service.pay.v3.order.impl;
|
package ink.wgink.module.wechat.service.pay.v3.order.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import ink.wgink.exceptions.ParamsException;
|
import ink.wgink.exceptions.ParamsException;
|
||||||
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.order.OrderClose;
|
import ink.wgink.module.wechat.pojo.pay.v3.order.OrderClose;
|
||||||
import ink.wgink.module.wechat.request.pay.v3.order.OrderClosePayRequestImpl;
|
import ink.wgink.module.wechat.remote.pay.v3.IOrderPayRemoteService;
|
||||||
import ink.wgink.module.wechat.service.pay.BasePayService;
|
import ink.wgink.module.wechat.service.pay.BasePayService;
|
||||||
import ink.wgink.module.wechat.service.pay.v3.order.IOrderCloseService;
|
import ink.wgink.module.wechat.service.pay.v3.order.IOrderCloseService;
|
||||||
import ink.wgink.properties.wechat.pay.v3.PayProperties;
|
import ink.wgink.properties.wechat.pay.v3.PayProperties;
|
||||||
@ -25,6 +26,8 @@ public class OrderCloseServiceImpl extends BasePayService implements IOrderClose
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private PayProperties payProperties;
|
private PayProperties payProperties;
|
||||||
|
@Autowired
|
||||||
|
private IOrderPayRemoteService orderPayRemoteService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void closeOrder(String businessOrderId) throws Exception {
|
public void closeOrder(String businessOrderId) throws Exception {
|
||||||
@ -34,6 +37,27 @@ public class OrderCloseServiceImpl extends BasePayService implements IOrderClose
|
|||||||
OrderClose orderClose = new OrderClose();
|
OrderClose orderClose = new OrderClose();
|
||||||
orderClose.setMchid(payProperties.getMchid());
|
orderClose.setMchid(payProperties.getMchid());
|
||||||
|
|
||||||
|
String urlSuffix = "/v3/pay/transactions/out-trade-no/" + businessOrderId + "/close";
|
||||||
|
String serialNumber = getSerialNumber();
|
||||||
|
JSONObject body = bodyJson(orderClose);
|
||||||
|
String authorization = getAuthorization(RequestMethod.POST, urlSuffix, serialNumber, payProperties, body.toString(), PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
|
orderPayRemoteService.closePlaceOrder(getPayBaseUrl(), businessOrderId, authorization, serialNumber, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONObject bodyJson(OrderClose orderClose) {
|
||||||
|
JSONObject bodyJsonObject = new JSONObject();
|
||||||
|
bodyJsonObject.put("mchid", orderClose.getMchid());
|
||||||
|
return bodyJsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
public void closeOrder(String businessOrderId) throws Exception {
|
||||||
|
if (StringUtils.isBlank(businessOrderId)) {
|
||||||
|
throw new ParamsException("订单不能为空");
|
||||||
|
}
|
||||||
|
OrderClose orderClose = new OrderClose();
|
||||||
|
orderClose.setMchid(payProperties.getMchid());
|
||||||
|
|
||||||
String urlSuffix = "/v3/pay/transactions/out-trade-no/" + businessOrderId + "/close";
|
String urlSuffix = "/v3/pay/transactions/out-trade-no/" + businessOrderId + "/close";
|
||||||
OrderClosePayRequestImpl orderClosePayRequest = new OrderClosePayRequestImpl();
|
OrderClosePayRequestImpl orderClosePayRequest = new OrderClosePayRequestImpl();
|
||||||
String url = getPayBaseUrl() + urlSuffix;
|
String url = getPayBaseUrl() + urlSuffix;
|
||||||
@ -42,4 +66,5 @@ public class OrderCloseServiceImpl extends BasePayService implements IOrderClose
|
|||||||
String authorization = getAuthorization(RequestMethod.POST, urlSuffix, serialNumber, payProperties, body.toString(), PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
String authorization = getAuthorization(RequestMethod.POST, urlSuffix, serialNumber, payProperties, body.toString(), PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
orderClosePayRequest.post(url, authorization, serialNumber, body);
|
orderClosePayRequest.post(url, authorization, serialNumber, body);
|
||||||
}
|
}
|
||||||
|
**/
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ package ink.wgink.module.wechat.service.pay.v3.order.impl;
|
|||||||
import ink.wgink.exceptions.ParamsException;
|
import ink.wgink.exceptions.ParamsException;
|
||||||
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
import ink.wgink.module.wechat.enums.PayAuthorizationTypeEnum;
|
||||||
import ink.wgink.module.wechat.pojo.pay.v3.order.OrderSearch;
|
import ink.wgink.module.wechat.pojo.pay.v3.order.OrderSearch;
|
||||||
import ink.wgink.module.wechat.request.pay.v3.order.OrderSearchPayRequestImpl;
|
import ink.wgink.module.wechat.remote.pay.v3.IOrderPayRemoteService;
|
||||||
import ink.wgink.module.wechat.service.pay.BasePayService;
|
import ink.wgink.module.wechat.service.pay.BasePayService;
|
||||||
import ink.wgink.module.wechat.service.pay.v3.order.IOrderSearchService;
|
import ink.wgink.module.wechat.service.pay.v3.order.IOrderSearchService;
|
||||||
import ink.wgink.properties.wechat.pay.v3.PayProperties;
|
import ink.wgink.properties.wechat.pay.v3.PayProperties;
|
||||||
@ -24,6 +24,9 @@ public class OrderSearchServiceImpl extends BasePayService implements IOrderSear
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private PayProperties payProperties;
|
private PayProperties payProperties;
|
||||||
|
@Autowired
|
||||||
|
private IOrderPayRemoteService orderPayRemoteService;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OrderSearch getOrder(String transactionId) throws Exception {
|
public OrderSearch getOrder(String transactionId) throws Exception {
|
||||||
@ -31,7 +34,9 @@ public class OrderSearchServiceImpl extends BasePayService implements IOrderSear
|
|||||||
throw new ParamsException("微信订单号参数不能为空");
|
throw new ParamsException("微信订单号参数不能为空");
|
||||||
}
|
}
|
||||||
String urlSuffix = "/v3/pay/transactions/id/" + transactionId + "?mchid=" + payProperties.getMchid();
|
String urlSuffix = "/v3/pay/transactions/id/" + transactionId + "?mchid=" + payProperties.getMchid();
|
||||||
return getOrderInfo(urlSuffix);
|
String serialNumber = getSerialNumber();
|
||||||
|
String authorization = getAuthorization(RequestMethod.GET, urlSuffix, serialNumber, payProperties, null, PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
|
return orderPayRemoteService.getOrder(getPayBaseUrl(), transactionId, authorization, serialNumber, payProperties.getMchid());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -40,14 +45,35 @@ public class OrderSearchServiceImpl extends BasePayService implements IOrderSear
|
|||||||
throw new ParamsException("商家订单号参数不能为空");
|
throw new ParamsException("商家订单号参数不能为空");
|
||||||
}
|
}
|
||||||
String urlSuffix = "/v3/pay/transactions/out-trade-no/" + businessOrderId + "?mchid=" + payProperties.getMchid();
|
String urlSuffix = "/v3/pay/transactions/out-trade-no/" + businessOrderId + "?mchid=" + payProperties.getMchid();
|
||||||
return getOrderInfo(urlSuffix);
|
|
||||||
}
|
|
||||||
|
|
||||||
private OrderSearch getOrderInfo(String urlSuffix) throws Exception {
|
|
||||||
OrderSearchPayRequestImpl orderSearchPayRequest = new OrderSearchPayRequestImpl();
|
|
||||||
String url = getPayBaseUrl() + urlSuffix;
|
|
||||||
String serialNumber = getSerialNumber();
|
String serialNumber = getSerialNumber();
|
||||||
String authorization = getAuthorization(RequestMethod.GET, urlSuffix, serialNumber, payProperties, null, PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
String authorization = getAuthorization(RequestMethod.GET, urlSuffix, serialNumber, payProperties, null, PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
return orderSearchPayRequest.get(url, authorization, serialNumber);
|
return orderPayRemoteService.getBusinessOrder(getPayBaseUrl(), businessOrderId, authorization, serialNumber, payProperties.getMchid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@Override public OrderSearch getOrder(String transactionId) throws Exception {
|
||||||
|
if (StringUtils.isBlank(transactionId)) {
|
||||||
|
throw new ParamsException("微信订单号参数不能为空");
|
||||||
|
}
|
||||||
|
String urlSuffix = "/v3/pay/transactions/id/" + transactionId + "?mchid=" + payProperties.getMchid();
|
||||||
|
return getOrderInfo(urlSuffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public OrderSearch getBusinessOrder(String businessOrderId) throws Exception {
|
||||||
|
if (StringUtils.isBlank(businessOrderId)) {
|
||||||
|
throw new ParamsException("商家订单号参数不能为空");
|
||||||
|
}
|
||||||
|
String urlSuffix = "/v3/pay/transactions/out-trade-no/" + businessOrderId + "?mchid=" + payProperties.getMchid();
|
||||||
|
return getOrderInfo(urlSuffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
private OrderSearch getOrderInfo(String urlSuffix) throws Exception {
|
||||||
|
OrderSearchPayRequestImpl orderSearchPayRequest = new OrderSearchPayRequestImpl();
|
||||||
|
String url = getPayBaseUrl() + urlSuffix;
|
||||||
|
String serialNumber = getSerialNumber();
|
||||||
|
String authorization = getAuthorization(RequestMethod.GET, urlSuffix, serialNumber, payProperties, null, PayAuthorizationTypeEnum.WECHATPAY2_SHA256_RSA2048);
|
||||||
|
return orderSearchPayRequest.get(url, authorization, serialNumber);
|
||||||
|
}
|
||||||
|
**/
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,65 @@
|
|||||||
|
package ink.wgink.module.wechat.utils.pay;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.NoSuchPaddingException;
|
||||||
|
import javax.crypto.spec.GCMParameterSpec;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
import java.security.InvalidAlgorithmParameterException;
|
||||||
|
import java.security.InvalidKeyException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ClassName: PayAesUtil
|
||||||
|
* @Description: 支付AES加密
|
||||||
|
* @Author: wanggeng
|
||||||
|
* @Date: 2021/10/2 2:23 下午
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
public class PayAesUtil {
|
||||||
|
|
||||||
|
static final int KEY_LENGTH_BYTE = 32;
|
||||||
|
static final int TAG_LENGTH_BIT = 128;
|
||||||
|
private final byte[] aesKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param key APIv3秘钥
|
||||||
|
*/
|
||||||
|
public PayAesUtil(byte[] key) {
|
||||||
|
if (key.length != KEY_LENGTH_BYTE) {
|
||||||
|
throw new IllegalArgumentException("无效的ApiV3Key,长度必须为32个字节");
|
||||||
|
}
|
||||||
|
this.aesKey = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解密
|
||||||
|
*
|
||||||
|
* @param associatedData 关联数据
|
||||||
|
* @param nonce 加密使用的随机串初始化向量
|
||||||
|
* @param ciphertext 密文
|
||||||
|
* @return
|
||||||
|
* @throws GeneralSecurityException
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext) throws GeneralSecurityException, IOException {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
|
||||||
|
|
||||||
|
SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
|
||||||
|
GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
|
||||||
|
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key, spec);
|
||||||
|
cipher.updateAAD(associatedData);
|
||||||
|
|
||||||
|
return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), "utf-8");
|
||||||
|
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user