mirror of
https://github.com/dromara/payment-spring-boot.git
synced 2026-03-18 07:53:41 +08:00
feat: 基于V2实现现金红包以及企业付款到零钱功能
- 实现现金红包接口 - 实现企业付款到零钱功能 - 增加V2需要的依赖
This commit is contained in:
@@ -56,6 +56,16 @@
|
|||||||
<groupId>com.alipay.sdk</groupId>
|
<groupId>com.alipay.sdk</groupId>
|
||||||
<artifactId>alipay-sdk-java</artifactId>
|
<artifactId>alipay-sdk-java</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
|
<artifactId>jackson-dataformat-xml</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 felord.cn
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Website:
|
||||||
|
* https://felord.cn
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.felord.payment.wechat.v2;
|
||||||
|
|
||||||
|
import cn.felord.payment.wechat.WechatPayProperties;
|
||||||
|
import cn.felord.payment.wechat.v2.model.GroupRedpackModel;
|
||||||
|
import cn.felord.payment.wechat.v2.model.RedpackInfoModel;
|
||||||
|
import cn.felord.payment.wechat.v2.model.RedpackModel;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 现金红包
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
public class WechatPayRedpackApi {
|
||||||
|
private final WechatV2Client wechatV2Client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new Wechat pay redpack api.
|
||||||
|
*
|
||||||
|
* @param wechatV2Client the wechat v 2 client
|
||||||
|
*/
|
||||||
|
public WechatPayRedpackApi(WechatV2Client wechatV2Client) {
|
||||||
|
this.wechatV2Client = wechatV2Client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发放随机红包
|
||||||
|
*
|
||||||
|
* @param redpackModel the redpack model
|
||||||
|
* @return the json node
|
||||||
|
*/
|
||||||
|
public JsonNode sendRedpack(RedpackModel redpackModel) {
|
||||||
|
|
||||||
|
WechatPayProperties.V3 v3 = wechatV2Client.getWechatMetaBean().getV3();
|
||||||
|
redpackModel.setWxappid(v3.getAppId());
|
||||||
|
redpackModel.setMchId(v3.getMchId());
|
||||||
|
return wechatV2Client.wechatPayRequest(redpackModel,
|
||||||
|
HttpMethod.POST,
|
||||||
|
"https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发放裂变红包
|
||||||
|
*
|
||||||
|
* @param groupRedpackModel the group redpack model
|
||||||
|
* @return the json node
|
||||||
|
*/
|
||||||
|
public JsonNode sendRedpack(GroupRedpackModel groupRedpackModel) {
|
||||||
|
WechatPayProperties.V3 v3 = wechatV2Client.getWechatMetaBean().getV3();
|
||||||
|
groupRedpackModel.setWxappid(v3.getAppId());
|
||||||
|
groupRedpackModel.setMchId(v3.getMchId());
|
||||||
|
return wechatV2Client.wechatPayRequest(groupRedpackModel,
|
||||||
|
HttpMethod.POST,
|
||||||
|
"https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询红包信息
|
||||||
|
*
|
||||||
|
* @param redpackInfoModel the redpack info model
|
||||||
|
* @return the json node
|
||||||
|
*/
|
||||||
|
public JsonNode redpackInfo(RedpackInfoModel redpackInfoModel) {
|
||||||
|
WechatPayProperties.V3 v3 = wechatV2Client.getWechatMetaBean().getV3();
|
||||||
|
redpackInfoModel.setAppid(v3.getAppId());
|
||||||
|
redpackInfoModel.setMchId(v3.getMchId());
|
||||||
|
return wechatV2Client.wechatPayRequest(redpackInfoModel,
|
||||||
|
HttpMethod.POST,
|
||||||
|
"https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 felord.cn
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Website:
|
||||||
|
* https://felord.cn
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.felord.payment.wechat.v2;
|
||||||
|
|
||||||
|
import cn.felord.payment.wechat.WechatPayProperties;
|
||||||
|
import cn.felord.payment.wechat.v2.model.TransferInfoModel;
|
||||||
|
import cn.felord.payment.wechat.v2.model.TransferModel;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 企业付款
|
||||||
|
* <p>
|
||||||
|
* TODO 暂时没有企业付款到银行卡
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
public class WechatPayTransfersApi {
|
||||||
|
private final WechatV2Client wechatV2Client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new Wechat pay transfers api.
|
||||||
|
*
|
||||||
|
* @param wechatV2Client the wechat v 2 client
|
||||||
|
*/
|
||||||
|
public WechatPayTransfersApi(WechatV2Client wechatV2Client) {
|
||||||
|
this.wechatV2Client = wechatV2Client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 企业付款到零钱
|
||||||
|
*
|
||||||
|
* @param transferModel the transfer model
|
||||||
|
* @return json node
|
||||||
|
*/
|
||||||
|
public JsonNode transfer(TransferModel transferModel) {
|
||||||
|
WechatPayProperties.V3 v3 = wechatV2Client.getWechatMetaBean().getV3();
|
||||||
|
transferModel.setMchAppid(v3.getAppId());
|
||||||
|
transferModel.setMchid(v3.getMchId());
|
||||||
|
return wechatV2Client.wechatPayRequest(transferModel,
|
||||||
|
HttpMethod.POST,
|
||||||
|
"https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询企业付款
|
||||||
|
*
|
||||||
|
* @param transferModel the transfer model
|
||||||
|
* @return the json node
|
||||||
|
*/
|
||||||
|
public JsonNode transferInfo(TransferInfoModel transferModel) {
|
||||||
|
WechatPayProperties.V3 v3 = wechatV2Client.getWechatMetaBean().getV3();
|
||||||
|
transferModel.setAppid(v3.getAppId());
|
||||||
|
transferModel.setMchId(v3.getMchId());
|
||||||
|
return wechatV2Client.wechatPayRequest(transferModel,
|
||||||
|
HttpMethod.POST,
|
||||||
|
"https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 felord.cn
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Website:
|
||||||
|
* https://felord.cn
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.felord.payment.wechat.v2;
|
||||||
|
|
||||||
|
import cn.felord.payment.wechat.WechatPayProperties;
|
||||||
|
import cn.felord.payment.wechat.v2.model.BaseModel;
|
||||||
|
import cn.felord.payment.wechat.v3.WechatMetaBean;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信支付V2 客户端
|
||||||
|
* <p>
|
||||||
|
* V3接口不完善的临时性解决方案
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
public class WechatV2Client {
|
||||||
|
private final WechatMetaBean wechatMetaBean;
|
||||||
|
|
||||||
|
public WechatV2Client(WechatMetaBean wechatMetaBean) {
|
||||||
|
this.wechatMetaBean = wechatMetaBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <M extends BaseModel> JsonNode wechatPayRequest(M model, HttpMethod method, String url) {
|
||||||
|
WechatPayProperties.V3 v3 = wechatMetaBean.getV3();
|
||||||
|
return model
|
||||||
|
.appSecret(v3.getAppSecret())
|
||||||
|
.request(v3.getMchId(), method, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
public WechatMetaBean getWechatMetaBean() {
|
||||||
|
return wechatMetaBean;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 felord.cn
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Website:
|
||||||
|
* https://felord.cn
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.felord.payment.wechat.v2.model;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.felord.payment.PayException;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.MapperFeature;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
|
||||||
|
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.http.conn.ssl.NoopHostnameVerifier;
|
||||||
|
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
||||||
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.apache.http.ssl.SSLContextBuilder;
|
||||||
|
import org.bouncycastle.crypto.Digest;
|
||||||
|
import org.bouncycastle.crypto.digests.MD5Digest;
|
||||||
|
import org.bouncycastle.util.encoders.Hex;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.http.RequestEntity;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||||
|
import org.springframework.util.AlternativeJdkIdGenerator;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
import org.springframework.util.IdGenerator;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
|
import javax.net.ssl.HostnameVerifier;
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.*;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type Base model.
|
||||||
|
*
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public class BaseModel {
|
||||||
|
private static final XmlMapper XML_MAPPER = new XmlMapper();
|
||||||
|
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
|
||||||
|
|
||||||
|
static {
|
||||||
|
// 忽略null
|
||||||
|
XML_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL)
|
||||||
|
// 属性使用 驼峰首字母小写
|
||||||
|
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
|
||||||
|
OBJECT_MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
|
||||||
|
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
|
||||||
|
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static final IdGenerator ID_GENERATOR = new AlternativeJdkIdGenerator();
|
||||||
|
private final String nonceStr = ID_GENERATOR.generateId()
|
||||||
|
.toString()
|
||||||
|
.replaceAll("-", "");
|
||||||
|
private String sign;
|
||||||
|
@JsonIgnore
|
||||||
|
private String appSecret;
|
||||||
|
|
||||||
|
|
||||||
|
public BaseModel appSecret(String appSecret) {
|
||||||
|
this.appSecret = appSecret;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Xml string.
|
||||||
|
*
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
@SneakyThrows
|
||||||
|
private String xml() {
|
||||||
|
String link = link(this);
|
||||||
|
this.sign = this.md5(link);
|
||||||
|
return XML_MAPPER.writer()
|
||||||
|
.withRootName("xml")
|
||||||
|
.writeValueAsString(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* md5摘要.
|
||||||
|
*
|
||||||
|
* @param src the src
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
private String md5(String src) {
|
||||||
|
Digest digest = new MD5Digest();
|
||||||
|
byte[] bytes = src.getBytes(StandardCharsets.UTF_8);
|
||||||
|
digest.update(bytes, 0, bytes.length);
|
||||||
|
byte[] md5Bytes = new byte[digest.getDigestSize()];
|
||||||
|
digest.doFinal(md5Bytes, 0);
|
||||||
|
return Hex.toHexString(md5Bytes).toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按照格式拼接参数以生成签名
|
||||||
|
*
|
||||||
|
* @param <T> the type parameter
|
||||||
|
* @param t the t
|
||||||
|
* @return the map
|
||||||
|
*/
|
||||||
|
@SneakyThrows
|
||||||
|
private <T> String link(T t) {
|
||||||
|
Assert.hasText(appSecret, "wechat pay appSecret is required");
|
||||||
|
return OBJECT_MAPPER
|
||||||
|
.writer()
|
||||||
|
.writeValueAsString(t)
|
||||||
|
.replaceAll("\":\"", "=")
|
||||||
|
.replaceAll("\",\"", "&")
|
||||||
|
.replaceAll("\\{\"", "")
|
||||||
|
.replaceAll("\"}", "")
|
||||||
|
.concat("&key=").concat(this.appSecret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
public JsonNode request(String mchId, HttpMethod method, String url) {
|
||||||
|
String xml = this.xml();
|
||||||
|
RequestEntity<String> body = RequestEntity.method(method, UriComponentsBuilder.fromHttpUrl(url)
|
||||||
|
.build()
|
||||||
|
.toUri())
|
||||||
|
.header("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
.body(xml);
|
||||||
|
ResponseEntity<String> responseEntity = this.getRestTemplateClientAuthentication(mchId)
|
||||||
|
.exchange(url, method, body, String.class);
|
||||||
|
|
||||||
|
if (!responseEntity.getStatusCode().is2xxSuccessful()) {
|
||||||
|
throw new PayException("wechat pay v2 error ");
|
||||||
|
}
|
||||||
|
String result = responseEntity.getBody();
|
||||||
|
|
||||||
|
return XML_MAPPER.readTree(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private RestTemplate getRestTemplateClientAuthentication(String mchId)
|
||||||
|
throws IOException, UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException,
|
||||||
|
KeyStoreException, KeyManagementException {
|
||||||
|
ClassPathResource resource = new ClassPathResource("wechat/apiclient_cert.p12");
|
||||||
|
|
||||||
|
char[] pem = mchId.toCharArray();
|
||||||
|
|
||||||
|
KeyStore store = KeyStore.getInstance("PKCS12");
|
||||||
|
store.load(resource.getInputStream(), pem);
|
||||||
|
|
||||||
|
// Trust own CA and all self-signed certs
|
||||||
|
SSLContext sslcontext = SSLContextBuilder.create()
|
||||||
|
.loadKeyMaterial(store, pem)
|
||||||
|
.build();
|
||||||
|
// Allow TLSv1 protocol only
|
||||||
|
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
|
||||||
|
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"},
|
||||||
|
null, hostnameVerifier);
|
||||||
|
|
||||||
|
CloseableHttpClient httpclient = HttpClients.custom()
|
||||||
|
.setSSLSocketFactory(sslsf)
|
||||||
|
.build();
|
||||||
|
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpclient);
|
||||||
|
return new RestTemplate(clientHttpRequestFactory);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 felord.cn
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Website:
|
||||||
|
* https://felord.cn
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.felord.payment.wechat.v2.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class GroupRedpackModel extends BaseModel {
|
||||||
|
|
||||||
|
private String wxappid;
|
||||||
|
private String mchId;
|
||||||
|
private String mchBillno;
|
||||||
|
private String sendName;
|
||||||
|
private String reOpenid;
|
||||||
|
private String totalAmount;
|
||||||
|
private String totalNum;
|
||||||
|
private String amtType = "ALL_RAND";
|
||||||
|
private String wishing;
|
||||||
|
private String clientIp;
|
||||||
|
private String actName;
|
||||||
|
private String remark;
|
||||||
|
private String sceneId;
|
||||||
|
private String riskInfo;
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 felord.cn
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Website:
|
||||||
|
* https://felord.cn
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.felord.payment.wechat.v2.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class RedpackInfoModel extends BaseModel {
|
||||||
|
|
||||||
|
private String appid;
|
||||||
|
private String mchId;
|
||||||
|
private String mchBillno;
|
||||||
|
private String billType = "MCHT";
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package cn.felord.payment.wechat.v2.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class RedpackModel extends BaseModel {
|
||||||
|
|
||||||
|
private String wxappid;
|
||||||
|
private String mchId;
|
||||||
|
private String mchBillno;
|
||||||
|
private String sendName;
|
||||||
|
private String reOpenid;
|
||||||
|
private String totalAmount;
|
||||||
|
private String totalNum;
|
||||||
|
private String wishing;
|
||||||
|
private String clientIp;
|
||||||
|
private String actName;
|
||||||
|
private String remark;
|
||||||
|
private String sceneId;
|
||||||
|
private String riskInfo;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019-2021 felord.cn
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* Website:
|
||||||
|
* https://felord.cn
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.felord.payment.wechat.v2.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class TransferInfoModel extends BaseModel {
|
||||||
|
private String appid;
|
||||||
|
private String mchId;
|
||||||
|
private String partnerTradeNo;
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package cn.felord.payment.wechat.v2.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author felord.cn
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class TransferModel extends BaseModel{
|
||||||
|
private String mchAppid;
|
||||||
|
private String mchid;
|
||||||
|
private String deviceInfo;
|
||||||
|
private String partnerTradeNo;
|
||||||
|
private String openid;
|
||||||
|
private String checkName;
|
||||||
|
private String reUserName;
|
||||||
|
private String amount;
|
||||||
|
private String desc;
|
||||||
|
private String spbillCreateIp;
|
||||||
|
}
|
||||||
@@ -18,6 +18,10 @@
|
|||||||
*/
|
*/
|
||||||
package cn.felord.payment.wechat.v3;
|
package cn.felord.payment.wechat.v3;
|
||||||
|
|
||||||
|
import cn.felord.payment.wechat.v2.WechatPayRedpackApi;
|
||||||
|
import cn.felord.payment.wechat.v2.WechatPayTransfersApi;
|
||||||
|
import cn.felord.payment.wechat.v2.WechatV2Client;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信支付工具.
|
* 微信支付工具.
|
||||||
*
|
*
|
||||||
@@ -118,4 +122,34 @@ public class WechatApiProvider {
|
|||||||
return new WechatPayCallback(wechatPayClient.signatureProvider(), tenantId);
|
return new WechatPayCallback(wechatPayClient.signatureProvider(), tenantId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 现金红包,基于V2
|
||||||
|
*
|
||||||
|
* @param tenantId the tenant id
|
||||||
|
* @return wechat pay redpack api
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
public WechatPayRedpackApi redpackApi(String tenantId) {
|
||||||
|
WechatMetaBean wechatMeta = wechatPayClient.signatureProvider()
|
||||||
|
.wechatMetaContainer()
|
||||||
|
.getWechatMeta(tenantId);
|
||||||
|
WechatV2Client wechatV2Client = new WechatV2Client(wechatMeta);
|
||||||
|
return new WechatPayRedpackApi(wechatV2Client);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 企业付款到零钱,目前不包括到银行卡,基于V2
|
||||||
|
*
|
||||||
|
* @param tenantId the tenant id
|
||||||
|
* @return wechat pay redpack api
|
||||||
|
* @since 1.0.5.RELEASE
|
||||||
|
*/
|
||||||
|
public WechatPayTransfersApi transfersApi(String tenantId) {
|
||||||
|
WechatMetaBean wechatMeta = wechatPayClient.signatureProvider()
|
||||||
|
.wechatMetaContainer()
|
||||||
|
.getWechatMeta(tenantId);
|
||||||
|
WechatV2Client wechatV2Client = new WechatV2Client(wechatMeta);
|
||||||
|
return new WechatPayTransfersApi(wechatV2Client);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,14 @@
|
|||||||
<groupId>org.bouncycastle</groupId>
|
<groupId>org.bouncycastle</groupId>
|
||||||
<artifactId>bcprov-jdk15to18</artifactId>
|
<artifactId>bcprov-jdk15to18</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
|
<artifactId>jackson-dataformat-xml</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
12
pom.xml
12
pom.xml
@@ -54,6 +54,8 @@
|
|||||||
<lombok.verison>1.18.12</lombok.verison>
|
<lombok.verison>1.18.12</lombok.verison>
|
||||||
<jackson.version>2.9.10</jackson.version>
|
<jackson.version>2.9.10</jackson.version>
|
||||||
<bcprov.version>1.66</bcprov.version>
|
<bcprov.version>1.66</bcprov.version>
|
||||||
|
<jackson.version>2.11.4</jackson.version>
|
||||||
|
<httpclient.version>4.5.13</httpclient.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
@@ -116,6 +118,16 @@
|
|||||||
<artifactId>payment-spring-boot-autoconfigure</artifactId>
|
<artifactId>payment-spring-boot-autoconfigure</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||||
|
<artifactId>jackson-dataformat-xml</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>${httpclient.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user