mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-10-31 10:38:42 +08:00 
			
		
		
		
	实现企业付款的接口,暂时未调通,因缺少证书 for issue #50
This commit is contained in:
		| @ -1,8 +1,11 @@ | |||||||
| package me.chanjar.weixin.mp.api; | package me.chanjar.weixin.mp.api; | ||||||
|  |  | ||||||
|  | import java.io.File; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
| import me.chanjar.weixin.common.exception.WxErrorException; | 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.WxMpPayCallback; | ||||||
| import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; | import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; | ||||||
| import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; | import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; | ||||||
| @ -85,4 +88,17 @@ public interface WxMpPayService { | |||||||
|    */ |    */ | ||||||
|   WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException; |   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; | package me.chanjar.weixin.mp.api.impl; | ||||||
|  |  | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileInputStream; | ||||||
| import java.lang.reflect.Field; | import java.lang.reflect.Field; | ||||||
|  | import java.security.KeyStore; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| @ -8,8 +11,19 @@ import java.util.Map.Entry; | |||||||
| import java.util.SortedMap; | import java.util.SortedMap; | ||||||
| import java.util.TreeMap; | import java.util.TreeMap; | ||||||
|  |  | ||||||
|  | import javax.net.ssl.SSLContext; | ||||||
|  |  | ||||||
| import org.apache.commons.codec.digest.DigestUtils; | import org.apache.commons.codec.digest.DigestUtils; | ||||||
| import org.apache.commons.lang3.StringUtils; | 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 org.joor.Reflect; | ||||||
|  |  | ||||||
| import com.google.common.collect.Lists; | 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.common.util.xml.XStreamInitializer; | ||||||
| import me.chanjar.weixin.mp.api.WxMpPayService; | import me.chanjar.weixin.mp.api.WxMpPayService; | ||||||
| import me.chanjar.weixin.mp.api.WxMpService; | 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.WxMpPayCallback; | ||||||
| import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; | import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; | ||||||
| import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; | import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; | ||||||
| @ -263,6 +279,23 @@ public class WxMpPayServiceImpl implements WxMpPayService { | |||||||
|  |  | ||||||
|   private void checkParameters(WxUnifiedOrderRequest request) { |   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(); |     List<String> nullFields = Lists.newArrayList(); | ||||||
|     for (Entry<String, Reflect> entry : Reflect.on(request).fields() |     for (Entry<String, Reflect> entry : Reflect.on(request).fields() | ||||||
|         .entrySet()) { |         .entrySet()) { | ||||||
| @ -281,20 +314,6 @@ public class WxMpPayServiceImpl implements WxMpPayService { | |||||||
|     if (!nullFields.isEmpty()) { |     if (!nullFields.isEmpty()) { | ||||||
|       throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值"); |       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 |   @Override | ||||||
| @ -332,4 +351,50 @@ public class WxMpPayServiceImpl implements WxMpPayService { | |||||||
|     return payInfo; |     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; | package me.chanjar.weixin.mp.api.impl; | ||||||
|  |  | ||||||
|  | import java.io.File; | ||||||
|  |  | ||||||
| import org.testng.annotations.Guice; | import org.testng.annotations.Guice; | ||||||
| import org.testng.annotations.Test; | 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.common.exception.WxErrorException; | ||||||
| import me.chanjar.weixin.mp.api.ApiTestModule; | import me.chanjar.weixin.mp.api.ApiTestModule; | ||||||
| import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; | 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.WxRedpackResult; | ||||||
| import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; | import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; | ||||||
| import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; | import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; | ||||||
| @ -74,4 +77,16 @@ public class WxMpPayServiceImplTest { | |||||||
|             .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); |             .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); | ||||||
|     System.err.println(result); |     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)); | ||||||
|  |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Binary Wang
					Binary Wang