package com.tx.eoms.wxpay;
import java.util.HashMap;
import java.util.Map;
import static com.tx.eoms.wxpay.WXPayConstants.SignType;
public class WXPay {
private WXPayConfig config;
private SignType signType;
private boolean autoReport;
private boolean useSandbox;
private String notifyUrl;
private WXPayRequest wxPayRequest;
public WXPay(final WXPayConfig config) throws Exception {
this(config, null, true, false);
}
public WXPay(final WXPayConfig config, final boolean autoReport) throws Exception {
this(config, null, autoReport, false);
}
public WXPay(final WXPayConfig config, final boolean autoReport, final boolean useSandbox) throws Exception {
this(config, null, autoReport, useSandbox);
}
public WXPay(final WXPayConfig config, final String notifyUrl) throws Exception {
this(config, notifyUrl, true, false);
}
public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport) throws Exception {
this(config, notifyUrl, autoReport, false);
}
public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
this.config = config;
this.notifyUrl = notifyUrl;
this.autoReport = autoReport;
this.useSandbox = useSandbox;
if (useSandbox) {
this.signType = SignType.MD5; // 沙箱环境
} else {
this.signType = SignType.MD5;
}
this.wxPayRequest = new WXPayRequest(config);
}
private void checkWXPayConfig() throws Exception {
if (this.config == null) {
throw new Exception("config is null");
}
if (this.config.getAppID() == null || this.config.getAppID().trim().length() == 0) {
throw new Exception("appid in config is empty");
}
if (this.config.getMchID() == null || this.config.getMchID().trim().length() == 0) {
throw new Exception("appid in config is empty");
}
if (this.config.getCertStream() == null) {
throw new Exception("cert stream in config is empty");
}
if (this.config.getWXPayDomain() == null) {
throw new Exception("config.getWXPayDomain() is null");
}
if (this.config.getHttpConnectTimeoutMs() < 10) {
throw new Exception("http connect timeout is too small");
}
if (this.config.getHttpReadTimeoutMs() < 10) {
throw new Exception("http read timeout is too small");
}
}
/**
* 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
* 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
*
* @param reqData
* @return
* @throws Exception
*/
public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
reqData.put("appid", config.getAppID());
reqData.put("mch_id", config.getMchID());
reqData.put("nonce_str", WXPayUtil.generateNonceStr());
if (SignType.MD5.equals(this.signType)) {
reqData.put("sign_type", WXPayConstants.MD5);
} else if (SignType.HMACSHA256.equals(this.signType)) {
reqData.put("sign_type", WXPayConstants.HMACSHA256);
}
reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));
return reqData;
}
/**
* 判断xml数据的sign是否有效,必须包含sign字段,否则返回false。
*
* @param reqData 向wxpay post的请求数据
* @return 签名是否有效
* @throws Exception
*/
public boolean isResponseSignatureValid(Map<String, String> reqData) throws Exception {
// 返回数据的签名方式和请求中给定的签名方式是一致的
return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), this.signType);
}
/**
* 判断支付结果通知中的sign是否有效
*
* @param reqData 向wxpay post的请求数据
* @return 签名是否有效
* @throws Exception
*/
public boolean isPayResultNotifySignatureValid(Map<String, String> reqData) throws Exception {
String signTypeInData = reqData.get(WXPayConstants.FIELD_SIGN_TYPE);
SignType signType;
if (signTypeInData == null) {
signType = SignType.MD5;
} else {
signTypeInData = signTypeInData.trim();
if (signTypeInData.length() == 0) {
signType = SignType.MD5;
} else if (WXPayConstants.MD5.equals(signTypeInData)) {
signType = SignType.MD5;
} else if (WXPayConstants.HMACSHA256.equals(signTypeInData)) {
signType = SignType.HMACSHA256;
} else {
throw new Exception(String.format("Unsupported sign_type: %s", signTypeInData));
}
}
return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), signType);
}
/**
* 不需要证书的请求
*
* @param urlSuffix String
* @param reqData 向wxpay post的请求数据
* @param connectTimeoutMs 超时时间,单位是毫秒
* @param readTimeoutMs 超时时间,单位是毫秒
* @return API返回数据
* @throws Exception
*/
public String requestWithoutCert(String urlSuffix, Map<String, String> reqData,
int connectTimeoutMs, int readTimeoutMs) throws Exception {
String msgUUID = reqData.get("nonce_str");
String reqBody = WXPayUtil.mapToXml(reqData);
String resp = this.wxPayRequest.requestWithoutCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, autoReport);
return resp;
}
/**
* 需要证书的请求
*
* @param urlSuffix String
* @param reqData 向wxpay post的请求数据 Map
* @param connectTimeoutMs 超时时间,单位是毫秒
* @param readTimeoutMs 超时时间,单位是毫秒
* @return API返回数据
* @throws Exception
*/
public String requestWithCert(String urlSuffix, Map<String, String> reqData,
int connectTimeoutMs, int readTimeoutMs) throws Exception {
String msgUUID = reqData.get("nonce_str");
String reqBody = WXPayUtil.mapToXml(reqData);
String resp = this.wxPayRequest.requestWithCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, this.autoReport);
return resp;
}
/**
* 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。
*
* @param xmlStr API返回的XML格式数据
* @return Map类型数据
* @throws Exception
*/
public Map<String, String> processResponseXml(String xmlStr) throws Exception {
String RETURN_CODE = "return_code";
String return_code;
Map<String, String> respData = WXPayUtil.xmlToMap(xmlStr);
if (respData.containsKey(RETURN_CODE)) {
return_code = respData.get(RETURN_CODE);
} else {
throw new Exception(String.format("No `return_code` in XML: %s", xmlStr));
}
if (return_code.equals(WXPayConstants.FAIL)) {
return respData;
} else if (return_code.equals(WXPayConstants.SUCCESS)) {
if (this.isResponseSignatureValid(respData)) {
return respData;
} else {
throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr));
}
} else {
throw new Exception(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr));
}
}
/**
* 作用:提交刷卡支付<br>
* 场景:刷卡支付
*
* @param reqData 向wxpay post的请求数据
* @return API返回数据
没有合适的资源?快使用搜索试试~ 我知道了~
基于SpringBoot的企业办公管理系统eoms.zip
共400个文件
java:223个
vue:60个
svg:50个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 193 浏览量
2024-05-17
23:49:57
上传
评论
收藏 1.78MB ZIP 举报
温馨提示
该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot的企业办公管理系统eoms.zip (400个子文件)
index.html 745B
WXPay.java 25KB
AttendanceController.java 13KB
UserController.java 13KB
WXPayReport.java 11KB
WXPayRequest.java 10KB
WXPayUtil.java 10KB
AmectServiceImpl.java 9KB
AmectController.java 9KB
Base64.java 9KB
MeetingController.java 7KB
ScheduleTask.java 6KB
TaskController.java 6KB
VerifyUtil.java 6KB
ApprovalController.java 5KB
LeaveController.java 5KB
MeetingServiceImpl.java 5KB
AttendanceServiceImpl.java 5KB
ExcelController.java 5KB
UserServiceImpl.java 5KB
ReimController.java 4KB
XssHttpServletRequestWrapper.java 4KB
MeetingWorkFlowTask.java 4KB
RoleController.java 4KB
MeetingRoomController.java 4KB
TodoController.java 4KB
TrtcUtil.java 4KB
ApprovalServiceImpl.java 4KB
CosUtil.java 3KB
LeaveWorkFlowTask.java 3KB
NoticeController.java 3KB
AmectTypeController.java 3KB
TaskServiceImpl.java 3KB
ReimWorkFlowTask.java 3KB
DeptController.java 3KB
DocumentController.java 3KB
UserDao.java 3KB
WXPayConstants.java 3KB
WebSocketService.java 3KB
ReimServiceImpl.java 3KB
UserService.java 3KB
LeaveServiceImpl.java 2KB
ExceptionAdvice.java 2KB
RoleServiceImpl.java 2KB
SearchAmectByPageForm.java 2KB
AddMeetingForm.java 2KB
CosController.java 2KB
UpdateUserForm.java 2KB
MeetingRoomServiceImpl.java 2KB
SearchReimByPageForm.java 2KB
AmectDao.java 2KB
DeptServiceImpl.java 2KB
AddUserForm.java 2KB
MeetingDao.java 2KB
WXPayConfig.java 2KB
NoticeServiceImpl.java 2KB
AmectTypeServiceImpl.java 2KB
SearchLeaveByPageForm.java 2KB
MyWXPayConfig.java 2KB
TodoServiceImpl.java 2KB
AttendanceDao.java 2KB
AmectService.java 1KB
MeetingService.java 1KB
TaskDao.java 1KB
DocumentServiceImpl.java 1KB
SearchChartForm.java 1KB
Meeting.java 1KB
CommonResult.java 1KB
WXPayXmlUtil.java 1KB
SearchUserByPageForm.java 1KB
IWXPayDomain.java 1KB
UpdateMeetingRoomForm.java 1KB
RoleDao.java 1KB
TodoDao.java 1KB
SearchNoticeByPageForm.java 1KB
SearchTodoListForm.java 1KB
SaTokenConfig.java 1KB
SearchTaskByPageForm.java 1KB
PermissionController.java 1KB
SearchOfflineMeetingListForm.java 1KB
SearchAttendanceRecordForm.java 1KB
UpdateAmectForm.java 1KB
Task.java 1KB
SearchFreeMeetingRoomForm.java 1KB
AttendanceService.java 1KB
InitSystemConstants.java 1KB
MeetingRoomDao.java 1KB
AddTodoListForm.java 1KB
SearchOfflineMeetingInWeekForm.java 1KB
User.java 1KB
UpdateRoleForm.java 1KB
ThreadPoolConfig.java 1KB
SearchOnlineMeetingListForm.java 1KB
UpdateDeptForm.java 1KB
AddMeetingRoomForm.java 1016B
LeaveDao.java 1014B
AddAmectForm.java 1007B
UpdateAmectTypeByIdForm.java 1005B
DeptDao.java 1001B
MeetingRoomService.java 993B
共 400 条
- 1
- 2
- 3
- 4
资源评论
枫蜜柚子茶
- 粉丝: 7412
- 资源: 5103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功