...
 
Commits (19)
    https://gitcode.net/int/IJPay/-/commit/db5cf25c9f67a5abcee714c28e06d8ed98b2f544 同步 IJPay-Demo-Springboot 的优化示例 2023-02-01T12:32:59+08:00 noear noear@live.cn https://gitcode.net/int/IJPay/-/commit/2e755b58279b9af99f823794913a5b74f6540030 IJPay-Demo-Solon: 升级 Solon 为:2.0.0 2023-02-01T12:34:41+08:00 noear noear@live.cn https://gitcode.net/int/IJPay/-/commit/de9555be36216a11f392c3bd5e60a7feed8463f0 :bookmark: release 2.9.6 :) 2023-02-01T12:35:24+08:00 noear noear@live.cn https://gitcode.net/int/IJPay/-/commit/a458e3a98a4dacb01955cdf70c00007f49887544 :bookmark: release 2.9.6 :) 2023-02-01T14:54:28+00:00 Javen javendev@126.com <gl-emoji title="bookmark" data-name="bookmark" data-unicode-version="6.0">🔖</gl-emoji> release 2.9.6 :) https://gitcode.net/int/IJPay/-/commit/9397a54e43e8b319b5b354993643e7e5267c562c :zap: README 添加 for solon demo 地址 2023-02-03T07:59:53+08:00 noear noear@live.cn https://gitcode.net/int/IJPay/-/commit/ef87f50c58cd82e735a5fb3222f1c1edce3d2090 :sparkles: 添加 for solon demo 地址 2023-02-05T07:59:18+00:00 Javen javendev@126.com <gl-emoji title="sparkles" data-name="sparkles" data-unicode-version="6.0">✨</gl-emoji> 添加 for solon demo 地址 https://gitcode.net/int/IJPay/-/commit/328711d61ddbee3c1d592403e27280d65e199461 升级fastjson版本到1.2.83,1.2.83版本之前存在代码执行漏洞风险,CVE-2022-25845 2023-02-28T03:36:38+00:00 lingkkkk 12523864+lingkkkk@user.noreply.gitee.com 升级fastjson版本到1.2.83,1.2.83版本之前存在代码执行漏洞风险,CVE-2022-25845 Signed-off-by: <span data-trailer="Signed-off-by:"><a href="mailto:12523864+lingkkkk@user.noreply.gitee.com" title="12523864+lingkkkk@user.noreply.gitee.com"></a><a href="javascript:void(0)" class="avatar s16 avatar-inline identicon bg4" style="text-decoration: none">N</a><a href="mailto:12523864+lingkkkk@user.noreply.gitee.com" title="12523864+lingkkkk@user.noreply.gitee.com">lingkkkk</a> &lt;<a href="mailto:12523864+lingkkkk@user.noreply.gitee.com" title="12523864+lingkkkk@user.noreply.gitee.com">12523864+lingkkkk@user.noreply.gitee.com</a>&gt;</span> https://gitcode.net/int/IJPay/-/commit/7e99a13b972e7f2b9abd85215d5e7a6d7ba9227d :arrow_up: 依赖升级 2023-03-08T12:55:37+00:00 Javen javendev@126.com <gl-emoji title="upwards black arrow" data-name="arrow_up" data-unicode-version="4.0">⬆</gl-emoji> 依赖升级 https://gitcode.net/int/IJPay/-/commit/396da1bf84241414eb27498a424f35d0fbd7ddc4 :sparkles: 微信支付支持教培续费通 2023-03-12T15:37:31+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/ed40ef498235aa1eb80d9a0e33feba8b567f2419 :sparkles: 新增微信支付商家转账到零钱示例 2023-03-12T15:38:24+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/2e4ac763146c4bb66e4a686f618c478330a6e8cb :sparkles: 新增获取文件真实路径静态方法 2023-03-27T20:51:24+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/981b05d95e1f8dad6477de204e9edbb78617aaa8 :arrow_up: 依赖升级 2023-03-27T21:01:01+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/3ca7b5bf8997a84d8c231cfd290f05954509a3d0 :bookmark: release 2.9.7 :) 2023-03-27T21:26:14+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/140f4a2a2059f01fe0bd9cadcc0a76f071897cef :bug: 修复 github 反馈的bug #63 2023-04-01T17:49:14+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/9d6a3ca75c5a93291f216223aa3ddaaddf9eb391 :bug: 修复 github 反馈的bug #65 2023-04-01T17:49:48+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/72d20a90bacf38f7153ee44d218698f6bc04f432 :bug: 修复 github 反馈的bug #64 2023-04-01T17:51:57+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/e0c396bd81ed405a4e3aa9e3868f5bedee6cb393 :building_construction: 调整微信支付 v3 接口授权认证类型为枚举 2023-04-01T17:59:15+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/4475ccd8ffb6617191b9aa4354c78e2161a09654 :sparkles: 微信支付新增示例 2023-04-02T09:33:50+08:00 Javen205 javendev@126.com https://gitcode.net/int/IJPay/-/commit/7788c868ab79418aef1cca075855e5ab7f64929d :sparkles: 调整开源协议 2023-04-05T14:31:33+08:00 Javen205 javendev@126.com
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......
......@@ -451,8 +451,8 @@ public class AliPayApi {
*
* @param response {@link HttpServletResponse}
* @param model {@link AlipayTradeWapPayModel}
* @param returnUrl 步通知URL
* @param notifyUrl 步通知URL
* @param returnUrl 步通知URL
* @param notifyUrl 步通知URL
* @throws AlipayApiException 支付宝 Api 异常
* @throws IOException IO 异常
*/
......
......@@ -33,7 +33,8 @@ public class AliPayApiConfigKit {
if (CFG_MAP.size() == 0) {
CFG_MAP.put(DEFAULT_CFG_KEY, aliPayApiConfig);
}
return CFG_MAP.put(aliPayApiConfig.getAppId(), aliPayApiConfig);
CFG_MAP.put(aliPayApiConfig.getAppId(), aliPayApiConfig);
return aliPayApiConfig;
}
/**
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......
package com.ijpay.core.enums;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>微信支付 v3 接口授权认证类型枚举</p>
*
* @author Javen
*/
public enum AuthTypeEnum {
/**
* 国密
*/
SM("WECHATPAY2-SM2-WITH-SM3", "国密算法"),
/**
* RSA
*/
RSA("WECHATPAY2-SHA256-RSA2048", "RSA算法"),
;
private final String url;
private final String desc;
AuthTypeEnum(String url, String desc) {
this.url = url;
this.desc = desc;
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
public String getUrl() {
return url;
}
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
public String getDesc() {
return desc;
}
}
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ijpay.core.IJPayHttpResponse;
import com.ijpay.core.enums.AuthTypeEnum;
import com.ijpay.core.enums.RequestMethodEnum;
import com.ijpay.core.enums.SignType;
......@@ -578,7 +579,7 @@ public class WxPayKit {
String serialNo, String keyPath, String body) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = PayKit.generateStr();
return buildAuthorization(method, urlSuffix, mchId, serialNo, keyPath, body, nonceStr, timestamp, authType);
......@@ -600,7 +601,7 @@ public class WxPayKit {
String serialNo, PrivateKey privateKey, String body) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = PayKit.generateStr();
return buildAuthorization(method, urlSuffix, mchId, serialNo, privateKey, body, nonceStr, timestamp, authType);
......@@ -741,7 +742,6 @@ public class WxPayKit {
// 获取平台证书序列号
X509Certificate certificate = PayKit.getCertificate(certInputStream);
String serialNumber = certificate.getSerialNumber().toString(16).toUpperCase();
System.out.println(serialNumber);
// 验证证书序列号
if (serialNumber.equals(serialNo)) {
boolean verifySignature = WxPayKit.verifySignature(signature, body, nonce, timestamp,
......
......@@ -5,7 +5,7 @@
<parent>
<groupId>org.noear</groupId>
<artifactId>solon-parent</artifactId>
<version>1.12.2</version>
<version>2.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ijpay.demo</groupId>
......@@ -19,9 +19,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<ijapy.version>2.9.3</ijapy.version>
<enjoy.version>4.3</enjoy.version>
<fastjson.version>1.2.75</fastjson.version>
<ijapy.version>2.9.6</ijapy.version>
</properties>
<dependencies>
......
......@@ -82,10 +82,12 @@ public class WxPayV3Controller {
public String index() {
log.info(wxPayV3Bean.toString());
try {
String classPath = "classpath:/dev/apiclient_cert.p12";
String classPath = "classpath:/dev/apiclient_key.pem";
String v3 = "classpath:/dev/wxpay_v3.properties";
String absolutePath = PayKit.getAbsolutePath(classPath);
log.info("absolutePath:{}", absolutePath);
String certFileContent = PayKit.getCertFileContent(classPath);
log.info("classPath content:{}", certFileContent);
InputStream inputStream = PayKit.getCertFileInputStream(v3);
if (null != inputStream) {
ByteArrayOutputStream result = new ByteArrayOutputStream();
......
......@@ -21,7 +21,7 @@
<ijapy.version>2.9.6</ijapy.version>
<enjoy.version>4.3</enjoy.version>
<fastjson.version>1.2.75</fastjson.version>
<fastjson.version>1.2.83</fastjson.version>
</properties>
<dependencies>
......
......@@ -26,11 +26,14 @@ import com.ijpay.wxpay.enums.v3.ComplaintsApiEnum;
import com.ijpay.wxpay.enums.v3.OtherApiEnum;
import com.ijpay.wxpay.enums.v3.PayGiftActivityApiEnum;
import com.ijpay.wxpay.enums.v3.PayScoreApiEnum;
import com.ijpay.wxpay.enums.v3.TransferApiEnum;
import com.ijpay.wxpay.model.v3.Amount;
import com.ijpay.wxpay.model.v3.BatchTransferModel;
import com.ijpay.wxpay.model.v3.Payer;
import com.ijpay.wxpay.model.v3.RefundAmount;
import com.ijpay.wxpay.model.v3.RefundGoodsDetail;
import com.ijpay.wxpay.model.v3.RefundModel;
import com.ijpay.wxpay.model.v3.TransferDetailInput;
import com.ijpay.wxpay.model.v3.UnifiedOrderModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -51,6 +54,7 @@ import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
......@@ -282,6 +286,85 @@ public class WxPayV3Controller {
}
}
@RequestMapping("/appPay")
@ResponseBody
public String appPay() {
try {
String timeExpire = DateTimeZoneUtil.dateToTimeZone(System.currentTimeMillis() + 1000 * 60 * 3);
UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel()
.setAppid(wxPayV3Bean.getAppId())
.setMchid(wxPayV3Bean.getMchId())
.setDescription("IJPay 让支付触手可及")
.setOut_trade_no(PayKit.generateStr())
.setTime_expire(timeExpire)
.setAttach("微信系开发脚手架 https://gitee.com/javen205/TNWX")
.setNotify_url(wxPayV3Bean.getDomain().concat("/v3/payNotify"))
.setAmount(new Amount().setTotal(1));
log.info("统一下单参数 {}", JSONUtil.toJsonStr(unifiedOrderModel));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.POST,
WxDomainEnum.CHINA.toString(),
BasePayApiEnum.APP_PAY.toString(),
wxPayV3Bean.getMchId(),
getSerialNumber(),
null,
wxPayV3Bean.getKeyPath(),
JSONUtil.toJsonStr(unifiedOrderModel)
);
log.info("统一下单响应 {}", response);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Bean.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
if (response.getStatus() == OK && verifySignature) {
String body = response.getBody();
JSONObject jsonObject = JSONUtil.parseObj(body);
String prepayId = jsonObject.getStr("prepay_id");
Map<String, String> map = WxPayKit.appCreateSign(wxPayV3Bean.getAppId(), wxPayV3Bean.getMchId(), prepayId, wxPayV3Bean.getKeyPath());
log.info("唤起支付参数:{}", map);
return JSONUtil.toJsonStr(map);
}
return JSONUtil.toJsonStr(response);
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
@RequestMapping("/query")
@ResponseBody
public String query(@RequestParam String outTradeNo) {
try {
Map<String, String> params = new HashMap<>(16);
params.put("mchid", wxPayV3Bean.getMchId());
log.info("统一下单参数 {}", JSONUtil.toJsonStr(params));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.GET,
WxDomainEnum.CHINA.toString(),
String.format(BasePayApiEnum.ORDER_QUERY_BY_OUT_TRADE_NO.toString(), outTradeNo),
wxPayV3Bean.getMchId(),
getSerialNumber(),
null,
wxPayV3Bean.getKeyPath(),
params
);
log.info("查询响应 {}", response);
if (response.getStatus() == OK) {
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Bean.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
return response.getBody();
}
return JSONUtil.toJsonStr(response);
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
@RequestMapping("/jsApiPay")
@ResponseBody
public String jsApiPay(@RequestParam(value = "openId", required = false, defaultValue = "o-_-itxuXeGW3O1cxJ7FXNmq8Wf8") String openId) {
......@@ -328,6 +411,49 @@ public class WxPayV3Controller {
}
}
@RequestMapping("/batchTransfer")
@ResponseBody
public String batchTransfer(@RequestParam(value = "openId", required = false, defaultValue = "o-_-itxuXeGW3O1cxJ7FXNmq8Wf8") String openId) {
try {
BatchTransferModel batchTransferModel = new BatchTransferModel()
.setAppid(wxPayV3Bean.getAppId())
.setOut_batch_no(PayKit.generateStr())
.setBatch_name("IJPay 测试微信转账到零钱")
.setBatch_remark("IJPay 测试微信转账到零钱")
.setTotal_amount(1)
.setTotal_num(1)
.setTransfer_detail_list(Collections.singletonList(
new TransferDetailInput()
.setOut_detail_no(PayKit.generateStr())
.setTransfer_amount(1)
.setTransfer_remark("IJPay 测试微信转账到零钱")
.setOpenid(openId)));
log.info("发起商家转账请求参数 {}", JSONUtil.toJsonStr(batchTransferModel));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.POST,
WxDomainEnum.CHINA.toString(),
TransferApiEnum.TRANSFER_BATCHES.toString(),
wxPayV3Bean.getMchId(),
getSerialNumber(),
null,
wxPayV3Bean.getKeyPath(),
JSONUtil.toJsonStr(batchTransferModel)
);
log.info("发起商家转账响应 {}", response);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Bean.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
if (response.getStatus() == OK && verifySignature) {
return response.getBody();
}
return JSONUtil.toJsonStr(response);
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
@RequestMapping("/put")
@ResponseBody
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......@@ -24,7 +24,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......@@ -31,7 +31,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
......
......@@ -3,7 +3,7 @@
<parent>
<artifactId>IJPay-Plugin</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -3,7 +3,7 @@
<parent>
<artifactId>IJPay-Plugin</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -3,7 +3,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......@@ -19,7 +19,7 @@
<properties>
<spring.boot.version>2.7.5</spring.boot.version>
<lombok.version>1.18.24</lombok.version>
<lombok.version>1.18.26</lombok.version>
<slf4j.api.version>2.0.6</slf4j.api.version>
</properties>
<dependencyManagement>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......@@ -19,7 +19,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......@@ -19,7 +19,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......@@ -19,7 +19,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
......
......@@ -20,6 +20,7 @@ import com.ijpay.wxpay.enums.v2.PayApiEnum;
import com.ijpay.wxpay.enums.v2.ProfitSharingApiEnum;
import com.ijpay.wxpay.enums.v2.RedPackApiEnum;
import com.ijpay.wxpay.enums.v2.TransferApiEnum;
import com.ijpay.core.enums.AuthTypeEnum;
import java.io.File;
import java.io.InputStream;
......@@ -255,9 +256,9 @@ public class WxPayApi {
* @throws Exception 接口执行异常
*/
public static IJPayHttpResponse v3(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String mchId, String serialNo, String platSerialNo, String keyPath,
String body, String nonceStr, long timestamp, String authType,
File file) throws Exception {
String mchId, String serialNo, String platSerialNo, String keyPath,
String body, String nonceStr, long timestamp, String authType,
File file) throws Exception {
// 构建 Authorization
String authorization = WxPayKit.buildAuthorization(method, urlSuffix, mchId, serialNo,
keyPath, body, nonceStr, timestamp, authType);
......@@ -299,9 +300,9 @@ public class WxPayApi {
* @throws Exception 接口执行异常
*/
public static IJPayHttpResponse v3(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String mchId, String serialNo, String platSerialNo, PrivateKey privateKey,
String body, String nonceStr, long timestamp, String authType,
File file) throws Exception {
String mchId, String serialNo, String platSerialNo, PrivateKey privateKey,
String body, String nonceStr, long timestamp, String authType,
File file) throws Exception {
// 构建 Authorization
String authorization = WxPayKit.buildAuthorization(method, urlSuffix, mchId, serialNo,
privateKey, body, nonceStr, timestamp, authType);
......@@ -339,9 +340,9 @@ public class WxPayApi {
* @throws Exception 接口执行异常
*/
public static IJPayHttpResponse v3(RequestMethodEnum method, String urlPrefix, String urlSuffix, String mchId,
String serialNo, String platSerialNo, String keyPath, String body) throws Exception {
String serialNo, String platSerialNo, String keyPath, String body) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = WxPayKit.generateStr();
return v3(method, urlPrefix, urlSuffix, mchId, serialNo, platSerialNo, keyPath, body, nonceStr, timestamp, authType, null);
}
......@@ -361,9 +362,9 @@ public class WxPayApi {
* @throws Exception 接口执行异常
*/
public static IJPayHttpResponse v3(RequestMethodEnum method, String urlPrefix, String urlSuffix, String mchId,
String serialNo, String platSerialNo, PrivateKey privateKey, String body) throws Exception {
String serialNo, String platSerialNo, PrivateKey privateKey, String body) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = WxPayKit.generateStr();
return v3(method, urlPrefix, urlSuffix, mchId, serialNo, platSerialNo, privateKey, body, nonceStr, timestamp, authType, null);
}
......@@ -383,10 +384,10 @@ public class WxPayApi {
* @throws Exception 接口执行异常
*/
public static IJPayHttpResponse v3(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String mchId, String serialNo, String platSerialNo, String keyPath,
Map<String, String> params) throws Exception {
String mchId, String serialNo, String platSerialNo, String keyPath,
Map<String, String> params) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = WxPayKit.generateStr();
if (null != params && !params.keySet().isEmpty()) {
urlSuffix = urlSuffix.concat("?").concat(PayKit.createLinkString(params, true));
......@@ -409,10 +410,10 @@ public class WxPayApi {
* @throws Exception 接口执行异常
*/
public static IJPayHttpResponse v3(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String mchId, String serialNo, String platSerialNo, PrivateKey privateKey,
Map<String, String> params) throws Exception {
String mchId, String serialNo, String platSerialNo, PrivateKey privateKey,
Map<String, String> params) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = WxPayKit.generateStr();
if (null != params && !params.keySet().isEmpty()) {
urlSuffix = urlSuffix.concat("?").concat(PayKit.createLinkString(params, true));
......@@ -436,7 +437,7 @@ public class WxPayApi {
*/
public static IJPayHttpResponse v3(String urlPrefix, String urlSuffix, String mchId, String serialNo, String platSerialNo, String keyPath, String body, File file) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = WxPayKit.generateStr();
return v3(RequestMethodEnum.UPLOAD, urlPrefix, urlSuffix, mchId, serialNo, platSerialNo, keyPath, body, nonceStr, timestamp, authType, file);
}
......@@ -458,7 +459,7 @@ public class WxPayApi {
public static IJPayHttpResponse v3(String urlPrefix, String urlSuffix, String mchId, String serialNo,
String platSerialNo, PrivateKey privateKey, String body, File file) throws Exception {
long timestamp = System.currentTimeMillis() / 1000;
String authType = "WECHATPAY2-SHA256-RSA2048";
String authType = AuthTypeEnum.RSA.getUrl();
String nonceStr = WxPayKit.generateStr();
return v3(RequestMethodEnum.UPLOAD, urlPrefix, urlSuffix, mchId, serialNo, platSerialNo, privateKey, body, nonceStr, timestamp, authType, file);
}
......@@ -483,9 +484,9 @@ public class WxPayApi {
*/
@Deprecated
public static Map<String, Object> v3Execution(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String mchId, String serialNo, String platSerialNo, String keyPath,
String body, String nonceStr, long timestamp, String authType,
File file) throws Exception {
String mchId, String serialNo, String platSerialNo, String keyPath,
String body, String nonceStr, long timestamp, String authType,
File file) throws Exception {
IJPayHttpResponse response = v3(method, urlPrefix, urlSuffix, mchId, serialNo, platSerialNo, keyPath, body, nonceStr, timestamp, authType, file);
return buildResMap(response);
}
......@@ -505,7 +506,7 @@ public class WxPayApi {
*/
@Deprecated
public static Map<String, Object> v3Execution(RequestMethodEnum method, String urlPrefix, String urlSuffix, String mchId,
String serialNo, String keyPath, String body) throws Exception {
String serialNo, String keyPath, String body) throws Exception {
IJPayHttpResponse response = v3(method, urlPrefix, urlSuffix, mchId, serialNo, null, keyPath, body);
return buildResMap(response);
}
......@@ -526,7 +527,7 @@ public class WxPayApi {
*/
@Deprecated
public static Map<String, Object> v3Execution(RequestMethodEnum method, String urlPrefix, String urlSuffix, String mchId,
String serialNo, String platSerialNo, String keyPath, String body) throws Exception {
String serialNo, String platSerialNo, String keyPath, String body) throws Exception {
IJPayHttpResponse response = v3(method, urlPrefix, urlSuffix, mchId, serialNo, platSerialNo, keyPath, body);
return buildResMap(response);
}
......@@ -547,8 +548,8 @@ public class WxPayApi {
*/
@Deprecated
public static Map<String, Object> v3Execution(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String mchId, String serialNo, String platSerialNo, String keyPath,
Map<String, String> params) throws Exception {
String mchId, String serialNo, String platSerialNo, String keyPath,
Map<String, String> params) throws Exception {
IJPayHttpResponse response = v3(method, urlPrefix, urlSuffix, mchId, serialNo, platSerialNo, keyPath, params);
return buildResMap(response);
}
......@@ -568,8 +569,8 @@ public class WxPayApi {
*/
@Deprecated
public static Map<String, Object> v3Execution(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String mchId, String serialNo, String keyPath,
Map<String, String> params) throws Exception {
String mchId, String serialNo, String keyPath,
Map<String, String> params) throws Exception {
IJPayHttpResponse response = v3(method, urlPrefix, urlSuffix, mchId, serialNo, null, keyPath, params);
return buildResMap(response);
}
......
package com.ijpay.wxpay.enums.v3;
import com.ijpay.wxpay.enums.WxApiEnum;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>微信支付 v3 接口-教培续费通相关接口枚举</p>
*
* @author Javen
*/
public enum EduPaPayEnum implements WxApiEnum {
/**
* 通过协议号查询签约
*/
QUERY_CONTRACTS_BY_ID("/v3/edu-papay/contracts/id/%s", "通过协议号查询签约"),
/**
* 预签约
*/
PRE_SIGN("/v3/edu-papay/contracts/presign", "预签约"),
/**
* 解约
*/
DELETE_CONTRACTS("/v3/edu-papay/contracts/%s", "解约"),
/**
* 通过用户标识查询签约
*/
QUERY_CONTRACTS_BY_USER("/v3/edu-papay/user/%s/contracts", "通过用户标识查询签约"),
/**
* 受理扣款
*/
TRANSACTIONS("/v3/edu-papay/transactions", "受理扣款"),
/**
* 通过微信订单号查询订单
*/
QUERY_TRANSACTIONS_BY_TRANSACTION_ID("/v3/edu-papay/transactions/id/%s", "通过微信订单号查询订单"),
/**
* 通过商户订单号查询订单
*/
QUERY_TRANSACTIONS_BY_OUT_TRADE_NO("/v3/edu-papay/transactions/out-trade-no/%s", "通过商户订单号查询订单"),
/**
* 发送扣款预通知
*/
SEND_NOTIFICATION("/v3/edu-papay/user-notifications/%s/send", "发送扣款预通知"),
;
/**
* 接口URL
*/
private final String url;
/**
* 接口描述
*/
private final String desc;
EduPaPayEnum(String url, String desc) {
this.url = url;
this.desc = desc;
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
@Override
public String getUrl() {
return url;
}
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
@Override
public String getDesc() {
return desc;
}
}
package com.ijpay.wxpay.model.v3;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>发起商家转账 Model</p>
*
* @author Javen
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class BatchTransferModel {
/**
* 申请商户号的appid或商户号绑定的appid(企业号corpid即为此appid)
*/
private String appid;
/**
* 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一
*/
private String out_batch_no;
/**
* 该笔批量转账的名称
*/
private String batch_name;
/**
* 转账说明,UTF8编码,最多允许32个字符
*/
private String batch_remark;
/**
* 转账金额单位为“分”。转账总金额必须与批次内所有明细转账金额之和保持一致,否则无法发起转账操作
*/
private Integer total_amount;
/**
* 一个转账批次单最多发起一千笔转账。转账总笔数必须与批次内所有明细之和保持一致,否则无法发起转账操作
*/
private Integer total_num;
/**
* 发起批量转账的明细列表,最多一千笔
*/
private List<TransferDetailInput> transfer_detail_list;
/**
* 指定该笔转账使用的转账场景ID
*/
private String transfer_scene_id;
}
package com.ijpay.wxpay.model.v3;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>发起批量转账的明细列表</p>
*
* @author Javen
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class TransferDetailInput {
/**
* 商户系统内部区分转账批次单下不同转账明细单的唯一标识,要求此参数只能由数字、大小写字母组成
*/
private String out_detail_no;
/**
* 转账金额单位为“分”
*/
private Integer transfer_amount;
/**
* 单条转账备注(微信用户会收到该备注),UTF8编码,最多允许32个字符
*/
private String transfer_remark;
/**
* 商户appid下,某用户的openid
*/
private String openid;
/**
* 收款方真实姓名。支持标准RSA算法和国密算法,公钥由微信侧提供
* 明细转账金额<0.3元时,不允许填写收款用户姓名
* 明细转账金额 >= 2,000元时,该笔明细必须填写收款用户姓名
* 同一批次转账明细中的姓名字段传入规则需保持一致,也即全部填写、或全部不填写
* 若商户传入收款用户姓名,微信支付会校验用户openID与姓名是否一致,并提供电子回单
*/
private String user_name;
/**
* 收款方身份证号,可不用填(采用标准RSA算法,公钥由微信侧提供)
* 当填入收款方身份证号时,姓名字段必须填入。
*/
private String user_id_card;
}
......@@ -5,7 +5,7 @@
<parent>
<artifactId>IJPay</artifactId>
<groupId>com.github.javen205</groupId>
<version>2.9.6</version>
<version>2.9.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......@@ -18,7 +18,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
......
此差异已折叠。
......@@ -96,6 +96,10 @@ JavaDoc 文档:[https://apidoc.gitee.com/javen205/IJPay](https://apidoc.gitee.
[Gitee-JFinal-Demo](https://gitee.com/javen205/IJPay/tree/master/IJPay-Demo-JFinal) [GitHub-JFinal-Demo](https://github.com/javen205/IJPay/tree/master/IJPay-Demo-JFinal)
[Gitee-Solon-Demo](https://gitee.com/javen205/IJPay/tree/master/IJPay-Demo-Solon) [GitHub-Solon-Demo](https://github.com/javen205/IJPay/tree/master/IJPay-Demo-Solon)
[Gitee-SpringBoot-Demo](https://gitee.com/javen205/IJPay/tree/master/IJPay-Demo-SpringBoot) [GitHub-SpringBoot-Demo](https://github.com/javen205/IJPay/tree/master/IJPay-Demo-SpringBoot)
### 联系方式
......
......@@ -7,7 +7,7 @@
<groupId>com.github.javen205</groupId>
<artifactId>IJPay</artifactId>
<version>2.9.6</version>
<version>2.9.7</version>
<name>IJPay</name>
<description>IJPay 让支付触手可及(Easy Pay Library)</description>
<url>https://github.com/Javen205/IJPay</url>
......@@ -55,7 +55,7 @@
<properties>
<jdk.version>1.8</jdk.version>
<junit.version>4.13.2</junit.version>
<hutool.version>5.8.11</hutool.version>
<hutool.version>5.8.16</hutool.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
......