mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-08-23 13:06:54 +08:00
实现企业付款的接口,暂时未调通,因缺少证书 for issue #50
This commit is contained in:
parent
a4b0fdce93
commit
dabafc2a9e
@ -1,8 +1,11 @@
|
||||
package me.chanjar.weixin.mp.api;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Map;
|
||||
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxEntPayResult;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxMpPayResult;
|
||||
@ -85,4 +88,17 @@ public interface WxMpPayService {
|
||||
*/
|
||||
WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。
|
||||
* 比如目前的保险行业向客户退保、给付、理赔。
|
||||
* 企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”https://pay.weixin.qq.com/进行操作。
|
||||
* 注意:与商户微信支付收款资金并非同一账户,需要单独充值。
|
||||
* 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
|
||||
* 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
|
||||
* @param keyFile 证书文件对象
|
||||
* </pre>
|
||||
*/
|
||||
WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException;
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
package me.chanjar.weixin.mp.api.impl;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.security.KeyStore;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -8,8 +11,19 @@ import java.util.Map.Entry;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.net.ssl.SSLContext;
|
||||
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
|
||||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
|
||||
import org.apache.http.entity.StringEntity;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.ssl.SSLContexts;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.joor.Reflect;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
@ -23,6 +37,8 @@ import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
|
||||
import me.chanjar.weixin.mp.api.WxMpPayService;
|
||||
import me.chanjar.weixin.mp.api.WxMpService;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxEntPayResult;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxMpPayResult;
|
||||
@ -263,6 +279,23 @@ public class WxMpPayServiceImpl implements WxMpPayService {
|
||||
|
||||
private void checkParameters(WxUnifiedOrderRequest request) {
|
||||
|
||||
checkNotNullParams(request);
|
||||
|
||||
if (!TRADE_TYPES.contains(request.getTradeType())) {
|
||||
throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一");
|
||||
|
||||
}
|
||||
|
||||
if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) {
|
||||
throw new IllegalArgumentException("当 trade_type是'JSAPI'时未指定openid");
|
||||
}
|
||||
|
||||
if ("NATIVE".equals(request.getTradeType()) && request.getProductId() == null) {
|
||||
throw new IllegalArgumentException("当 trade_type是'NATIVE'时未指定product_id");
|
||||
}
|
||||
}
|
||||
|
||||
private void checkNotNullParams(Object request) {
|
||||
List<String> nullFields = Lists.newArrayList();
|
||||
for (Entry<String, Reflect> entry : Reflect.on(request).fields()
|
||||
.entrySet()) {
|
||||
@ -281,20 +314,6 @@ public class WxMpPayServiceImpl implements WxMpPayService {
|
||||
if (!nullFields.isEmpty()) {
|
||||
throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值");
|
||||
}
|
||||
|
||||
if (!TRADE_TYPES.contains(request.getTradeType())) {
|
||||
throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一");
|
||||
|
||||
}
|
||||
|
||||
if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) {
|
||||
throw new IllegalArgumentException("当 trade_type是'JSAPI'时未指定openid");
|
||||
}
|
||||
|
||||
if ("NATIVE".equals(request.getTradeType())
|
||||
&& request.getProductId() == null) {
|
||||
throw new IllegalArgumentException("当 trade_type是'NATIVE'时未指定product_id");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -332,4 +351,50 @@ public class WxMpPayServiceImpl implements WxMpPayService {
|
||||
return payInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException {
|
||||
checkNotNullParams(request);
|
||||
|
||||
XStream xstream = XStreamInitializer.getInstance();
|
||||
xstream.processAnnotations(WxEntPayRequest.class);
|
||||
xstream.processAnnotations(WxEntPayResult.class);
|
||||
|
||||
request.setMchAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
|
||||
request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
|
||||
request.setNonceStr(System.currentTimeMillis() + "");
|
||||
|
||||
String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
|
||||
request.setSign(sign);
|
||||
|
||||
String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers";
|
||||
|
||||
try (FileInputStream instream = new FileInputStream(keyFile)) {
|
||||
String mchId = request.getMchId();
|
||||
KeyStore keyStore = KeyStore.getInstance("PKCS12");
|
||||
keyStore.load(instream, mchId.toCharArray());
|
||||
|
||||
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();
|
||||
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
|
||||
new DefaultHostnameVerifier());
|
||||
|
||||
try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) {
|
||||
HttpPost httpPost = new HttpPost(url);
|
||||
httpPost.setEntity(new StringEntity(new String(xstream.toXML(request).getBytes("UTF-8"), "ISO-8859-1")));
|
||||
|
||||
try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
|
||||
String responseContent = EntityUtils.toString(response.getEntity());
|
||||
WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
|
||||
if ("FAIL".equals(result.getResultCode())) {
|
||||
throw new WxErrorException(
|
||||
WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,253 @@
|
||||
package me.chanjar.weixin.mp.bean.pay;
|
||||
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
|
||||
/**
|
||||
* 企业付款请求对象
|
||||
* 注释中各行含义如下:
|
||||
* 字段名、 变量名、 是否必填、 示例值、 类型、 描述
|
||||
* Created by Binary Wang on 2016/10/02.
|
||||
* @author binarywang (https://github.com/binarywang)
|
||||
*/
|
||||
@XStreamAlias("xml")
|
||||
public class WxEntPayRequest {
|
||||
/**
|
||||
* 公众账号appid
|
||||
* mch_appid
|
||||
* 是
|
||||
* wx8888888888888888
|
||||
* String
|
||||
* 微信分配的公众账号ID(企业号corpid即为此appId)
|
||||
*/
|
||||
@XStreamAlias("mch_appid")
|
||||
private String mchAppid;
|
||||
|
||||
/**
|
||||
* 商户号
|
||||
* mchid
|
||||
* 是
|
||||
* 1900000109
|
||||
* String(32)
|
||||
* 微信支付分配的商户号
|
||||
*/
|
||||
@XStreamAlias("mchid")
|
||||
private String mchId;
|
||||
|
||||
/**
|
||||
* 设备号
|
||||
* device_info
|
||||
* 否
|
||||
* 13467007045764
|
||||
* String(32)
|
||||
*微信支付分配的终端设备号
|
||||
*/
|
||||
@XStreamAlias("device_info")
|
||||
private String deviceInfo;
|
||||
|
||||
/**
|
||||
* 随机字符串
|
||||
* nonce_str
|
||||
*是
|
||||
*5K8264ILTKCH16CQ2502SI8ZNMTM67VS
|
||||
*String(32)
|
||||
*随机字符串,不长于32位
|
||||
*/
|
||||
@XStreamAlias("nonce_str")
|
||||
private String nonceStr;
|
||||
|
||||
/**
|
||||
* 签名
|
||||
* sign
|
||||
* 是
|
||||
* C380BEC2BFD727A4B6845133519F3AD6
|
||||
* String(32)
|
||||
*签名,详见签名算法
|
||||
*/
|
||||
@XStreamAlias("sign")
|
||||
private String sign;
|
||||
|
||||
/**
|
||||
* 商户订单号
|
||||
* partner_trade_no
|
||||
* 是
|
||||
* 10000098201411111234567890
|
||||
* String
|
||||
* 商户订单号,
|
||||
*/
|
||||
@XStreamAlias("partner_trade_no")
|
||||
private String partnerTradeNo;
|
||||
|
||||
/**
|
||||
* 需保持唯一性 用户openid
|
||||
* openid
|
||||
* 是
|
||||
* oxTWIuGaIt6gTKsQRLau2M0yL16E
|
||||
* String
|
||||
* 商户appid下,某用户的openid
|
||||
*/
|
||||
@XStreamAlias("openid")
|
||||
private String openid;
|
||||
|
||||
/**
|
||||
* 校验用户姓名选项
|
||||
* check_name
|
||||
* 是
|
||||
* OPTION_CHECK
|
||||
* String
|
||||
* NO_CHECK:不校验真实姓名
|
||||
* FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
|
||||
* OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
|
||||
*/
|
||||
@XStreamAlias("check_name")
|
||||
private String checkName;
|
||||
|
||||
/**
|
||||
* 收款用户姓名
|
||||
* re_user_name
|
||||
* 可选
|
||||
* 马花花
|
||||
* String
|
||||
* 收款用户真实姓名。
|
||||
* 如果check_name设置为FORCE_CHECK或OPTION_CHECK, 则必填用户真实姓名
|
||||
*/
|
||||
@XStreamAlias("re_user_name")
|
||||
private String reUserName;
|
||||
|
||||
/**
|
||||
* 金额
|
||||
* amount
|
||||
* 是
|
||||
* 10099
|
||||
* int
|
||||
* 企业付款金额, 单位为分
|
||||
*/
|
||||
@XStreamAlias("amount")
|
||||
private Integer amount;
|
||||
|
||||
/**
|
||||
* 企业付款描述信息
|
||||
* desc
|
||||
* 是
|
||||
* 理赔
|
||||
* String
|
||||
* 企业付款操作说明信息。必填。
|
||||
*/
|
||||
@XStreamAlias("desc")
|
||||
private String description;
|
||||
|
||||
/**
|
||||
* Ip地址
|
||||
* spbill_create_ip
|
||||
* 是
|
||||
* 192.168.0.1
|
||||
* String(32)
|
||||
* 调用接口的机器Ip地址
|
||||
*/
|
||||
@XStreamAlias("spbill_create_ip")
|
||||
private String spbillCreateIp;
|
||||
|
||||
public String getMchAppid() {
|
||||
return mchAppid;
|
||||
}
|
||||
|
||||
public void setMchAppid(String mchAppid) {
|
||||
this.mchAppid = mchAppid;
|
||||
}
|
||||
|
||||
public String getMchId() {
|
||||
return mchId;
|
||||
}
|
||||
|
||||
public void setMchId(String mchId) {
|
||||
this.mchId = mchId;
|
||||
}
|
||||
|
||||
public String getDeviceInfo() {
|
||||
return deviceInfo;
|
||||
}
|
||||
|
||||
public void setDeviceInfo(String deviceInfo) {
|
||||
this.deviceInfo = deviceInfo;
|
||||
}
|
||||
|
||||
public String getNonceStr() {
|
||||
return nonceStr;
|
||||
}
|
||||
|
||||
public void setNonceStr(String nonceStr) {
|
||||
this.nonceStr = nonceStr;
|
||||
}
|
||||
|
||||
public String getSign() {
|
||||
return sign;
|
||||
}
|
||||
|
||||
public void setSign(String sign) {
|
||||
this.sign = sign;
|
||||
}
|
||||
|
||||
public String getPartnerTradeNo() {
|
||||
return partnerTradeNo;
|
||||
}
|
||||
|
||||
public void setPartnerTradeNo(String partnerTradeNo) {
|
||||
this.partnerTradeNo = partnerTradeNo;
|
||||
}
|
||||
|
||||
public String getOpenid() {
|
||||
return openid;
|
||||
}
|
||||
|
||||
public void setOpenid(String openid) {
|
||||
this.openid = openid;
|
||||
}
|
||||
|
||||
public String getCheckName() {
|
||||
return checkName;
|
||||
}
|
||||
|
||||
public void setCheckName(String checkName) {
|
||||
this.checkName = checkName;
|
||||
}
|
||||
|
||||
public String getReUserName() {
|
||||
return reUserName;
|
||||
}
|
||||
|
||||
public void setReUserName(String reUserName) {
|
||||
this.reUserName = reUserName;
|
||||
}
|
||||
|
||||
public Integer getAmount() {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public void setAmount(Integer amount) {
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public String getSpbillCreateIp() {
|
||||
return spbillCreateIp;
|
||||
}
|
||||
|
||||
public void setSpbillCreateIp(String spbillCreateIp) {
|
||||
this.spbillCreateIp = spbillCreateIp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,190 @@
|
||||
package me.chanjar.weixin.mp.bean.pay;
|
||||
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
import com.thoughtworks.xstream.annotations.XStreamAlias;
|
||||
|
||||
/**
|
||||
* 企业付款返回结果
|
||||
* Created by Binary Wang on 2016/10/02.
|
||||
* @author binarywang (https://github.com/binarywang)
|
||||
*/
|
||||
@XStreamAlias("xml")
|
||||
public class WxEntPayResult {
|
||||
|
||||
/**
|
||||
* 返回状态码
|
||||
*/
|
||||
@XStreamAlias("return_code")
|
||||
private String returnCode;
|
||||
|
||||
/**
|
||||
* 返回信息
|
||||
*/
|
||||
@XStreamAlias("return_msg")
|
||||
private String returnMsg;
|
||||
|
||||
//############以下字段在return_code为SUCCESS的时候有返回
|
||||
|
||||
/**
|
||||
* 商户appid
|
||||
*/
|
||||
@XStreamAlias("mch_appid")
|
||||
private String mchAppid;
|
||||
|
||||
/**
|
||||
* 商户号
|
||||
*/
|
||||
@XStreamAlias("mchid")
|
||||
private String mchId;
|
||||
|
||||
/**
|
||||
* 设备号
|
||||
*/
|
||||
@XStreamAlias("device_info")
|
||||
private String deviceInfo;
|
||||
|
||||
/**
|
||||
* 随机字符串
|
||||
*/
|
||||
@XStreamAlias("nonce_str")
|
||||
private String nonceStr;
|
||||
|
||||
/**
|
||||
* 业务结果
|
||||
*/
|
||||
@XStreamAlias("result_code")
|
||||
private String resultCode;
|
||||
/**
|
||||
* 错误代码
|
||||
*/
|
||||
@XStreamAlias("err_code")
|
||||
private String errCode;
|
||||
|
||||
/**
|
||||
* 错误代码描述
|
||||
*/
|
||||
@XStreamAlias("err_code_des")
|
||||
private String errCodeDes;
|
||||
|
||||
//############以下字段在return_code 和result_code都为SUCCESS的时候有返回##############
|
||||
/**
|
||||
* 商户订单号
|
||||
*/
|
||||
@XStreamAlias("partner_trade_no")
|
||||
private String partnerTradeNo;
|
||||
|
||||
/**
|
||||
* 微信订单号
|
||||
*/
|
||||
@XStreamAlias("payment_no")
|
||||
private String paymentNo;
|
||||
|
||||
/**
|
||||
* 微信支付成功时间
|
||||
*/
|
||||
@XStreamAlias("payment_time")
|
||||
private String paymentTime;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
|
||||
}
|
||||
|
||||
public String getReturnCode() {
|
||||
return returnCode;
|
||||
}
|
||||
|
||||
public void setReturnCode(String returnCode) {
|
||||
this.returnCode = returnCode;
|
||||
}
|
||||
|
||||
public String getReturnMsg() {
|
||||
return returnMsg;
|
||||
}
|
||||
|
||||
public void setReturnMsg(String returnMsg) {
|
||||
this.returnMsg = returnMsg;
|
||||
}
|
||||
|
||||
public String getMchAppid() {
|
||||
return mchAppid;
|
||||
}
|
||||
|
||||
public void setMchAppid(String mchAppid) {
|
||||
this.mchAppid = mchAppid;
|
||||
}
|
||||
|
||||
public String getMchId() {
|
||||
return mchId;
|
||||
}
|
||||
|
||||
public void setMchId(String mchId) {
|
||||
this.mchId = mchId;
|
||||
}
|
||||
|
||||
public String getDeviceInfo() {
|
||||
return deviceInfo;
|
||||
}
|
||||
|
||||
public void setDeviceInfo(String deviceInfo) {
|
||||
this.deviceInfo = deviceInfo;
|
||||
}
|
||||
|
||||
public String getNonceStr() {
|
||||
return nonceStr;
|
||||
}
|
||||
|
||||
public void setNonceStr(String nonceStr) {
|
||||
this.nonceStr = nonceStr;
|
||||
}
|
||||
|
||||
public String getResultCode() {
|
||||
return resultCode;
|
||||
}
|
||||
|
||||
public void setResultCode(String resultCode) {
|
||||
this.resultCode = resultCode;
|
||||
}
|
||||
|
||||
public String getErrCode() {
|
||||
return errCode;
|
||||
}
|
||||
|
||||
public void setErrCode(String errCode) {
|
||||
this.errCode = errCode;
|
||||
}
|
||||
|
||||
public String getErrCodeDes() {
|
||||
return errCodeDes;
|
||||
}
|
||||
|
||||
public void setErrCodeDes(String errCodeDes) {
|
||||
this.errCodeDes = errCodeDes;
|
||||
}
|
||||
|
||||
public String getPartnerTradeNo() {
|
||||
return partnerTradeNo;
|
||||
}
|
||||
|
||||
public void setPartnerTradeNo(String partnerTradeNo) {
|
||||
this.partnerTradeNo = partnerTradeNo;
|
||||
}
|
||||
|
||||
public String getPaymentNo() {
|
||||
return paymentNo;
|
||||
}
|
||||
|
||||
public void setPaymentNo(String paymentNo) {
|
||||
this.paymentNo = paymentNo;
|
||||
}
|
||||
|
||||
public String getPaymentTime() {
|
||||
return paymentTime;
|
||||
}
|
||||
|
||||
public void setPaymentTime(String paymentTime) {
|
||||
this.paymentTime = paymentTime;
|
||||
}
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
package me.chanjar.weixin.mp.api.impl;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.testng.annotations.Guice;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
@ -8,6 +10,7 @@ import com.google.inject.Inject;
|
||||
import me.chanjar.weixin.common.exception.WxErrorException;
|
||||
import me.chanjar.weixin.mp.api.ApiTestModule;
|
||||
import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxRedpackResult;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest;
|
||||
import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest;
|
||||
@ -74,4 +77,16 @@ public class WxMpPayServiceImplTest {
|
||||
.tradeType("JSAPI").openid("122").outTradeNo("111111").build());
|
||||
System.err.println(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#entPay(WxEntPayRequest, File)}.
|
||||
* @throws WxErrorException
|
||||
*/
|
||||
@Test
|
||||
public final void testEntPay() throws WxErrorException {
|
||||
File keyFile = new File("E:\\dlt.p12");
|
||||
WxEntPayRequest request = new WxEntPayRequest();
|
||||
System.err.println(this.wxService.getPayService().entPay(request, keyFile));
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user