| @@ -18,6 +18,7 @@ public interface WxMpPayService { | |||
| * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | |||
| * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder | |||
| * @throws WxErrorException | |||
| * @param request 请求对象 | |||
| * | |||
| */ | |||
| WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request) | |||
| @@ -26,11 +27,10 @@ public interface WxMpPayService { | |||
| /** | |||
| * 该接口调用“统一下单”接口,并拼装发起支付请求需要的参数 | |||
| * 详见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN | |||
| * | |||
| * @param request 请求对象 | |||
| */ | |||
| Map<String, String> getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException; | |||
| /** | |||
| * 该接口提供所有微信支付订单的查询,当支付通知处理异常戒丢失的情冴,商户可以通过该接口查询订单支付状态。 | |||
| * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2 | |||
| @@ -53,6 +53,7 @@ public interface WxMpPayService { | |||
| * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 | |||
| * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund | |||
| * </pre> | |||
| * @param request 请求对象 | |||
| * @param keyFile 证书文件对象 | |||
| * @return 退款操作结果 | |||
| */ | |||
| @@ -74,6 +75,7 @@ public interface WxMpPayService { | |||
| * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3 | |||
| * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4 | |||
| * </pre> | |||
| * @param request 请求对象 | |||
| * @param keyFile 证书文件对象 | |||
| */ | |||
| WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile) throws WxErrorException; | |||
| @@ -86,9 +88,22 @@ public interface WxMpPayService { | |||
| * 注意:与商户微信支付收款资金并非同一账户,需要单独充值。 | |||
| * 文档详见: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> | |||
| * @param request 请求对象 | |||
| * @param keyFile 证书文件对象 | |||
| */ | |||
| WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 查询企业付款API | |||
| * 用于商户的企业付款操作进行结果查询,返回付款操作详细结果。 | |||
| * 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3 | |||
| * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo | |||
| * </pre> | |||
| * @param partnerTradeNo 商户订单号 | |||
| * @param keyFile 证书文件对象 | |||
| */ | |||
| WxEntPayQueryResult queryEntPay(String partnerTradeNo, File keyFile) throws WxErrorException; | |||
| } | |||
| @@ -369,6 +369,31 @@ public class WxMpPayServiceImpl implements WxMpPayService { | |||
| return result; | |||
| } | |||
| @Override | |||
| public WxEntPayQueryResult queryEntPay(String partnerTradeNo, File keyFile) throws WxErrorException { | |||
| XStream xstream = XStreamInitializer.getInstance(); | |||
| xstream.processAnnotations(WxEntPayQueryRequest.class); | |||
| xstream.processAnnotations(WxEntPayQueryResult.class); | |||
| WxEntPayQueryRequest request = new WxEntPayQueryRequest(); | |||
| request.setAppid(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/gettransferinfo"; | |||
| String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), request.getMchId()); | |||
| WxEntPayQueryResult result = (WxEntPayQueryResult) xstream.fromXML(responseContent); | |||
| if ("FAIL".equals(result.getResultCode())) { | |||
| throw new WxErrorException( | |||
| WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build()); | |||
| } | |||
| return result; | |||
| } | |||
| private String executeRequestWithKeyFile( String url, File keyFile, String requestStr, String mchId) throws WxErrorException { | |||
| try (FileInputStream inputStream = new FileInputStream(keyFile)) { | |||
| KeyStore keyStore = KeyStore.getInstance("PKCS12"); | |||
| @@ -0,0 +1,135 @@ | |||
| package me.chanjar.weixin.mp.bean.pay; | |||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||
| import me.chanjar.weixin.common.annotation.Required; | |||
| import org.apache.commons.lang3.builder.ToStringBuilder; | |||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||
| /** | |||
| * <pre> | |||
| * 企业付款请求对象 | |||
| * 注释中各行每个字段描述对应如下: | |||
| * <li>字段名 | |||
| * <li>变量名 | |||
| * <li>是否必填 | |||
| * <li>类型 | |||
| * <li>示例值 | |||
| * <li>描述 | |||
| * </pre> | |||
| * Created by Binary Wang on 2016/10/19. | |||
| * @author binarywang (https://github.com/binarywang) | |||
| */ | |||
| @XStreamAlias("xml") | |||
| public class WxEntPayQueryRequest { | |||
| /** | |||
| * <pre> | |||
| * Appid | |||
| * appid | |||
| * 是 | |||
| * wxe062425f740d30d8 | |||
| * String(32) | |||
| * 商户号的appid | |||
| * </pre> | |||
| */ | |||
| @XStreamAlias("appid") | |||
| private String appid; | |||
| /** | |||
| * <pre> | |||
| * 商户号 | |||
| * mch_id | |||
| * 是 | |||
| * 10000098 | |||
| * String(32) | |||
| * 微信支付分配的商户号 | |||
| * </pre> | |||
| */ | |||
| @XStreamAlias("mchid") | |||
| private String mchId; | |||
| /** | |||
| * <pre> | |||
| * 随机字符串 | |||
| * nonce_str | |||
| * 是 | |||
| * 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | |||
| * String(32) | |||
| * 随机字符串,不长于32位 | |||
| * </pre> | |||
| */ | |||
| @XStreamAlias("nonce_str") | |||
| private String nonceStr; | |||
| /** | |||
| * <pre> | |||
| * 签名 | |||
| * sign | |||
| * 是 | |||
| * C380BEC2BFD727A4B6845133519F3AD6 | |||
| * String(32) | |||
| *签名,详见签名算法 | |||
| * </pre> | |||
| */ | |||
| @XStreamAlias("sign") | |||
| private String sign; | |||
| /** | |||
| * <pre> | |||
| * 商户订单号 | |||
| * partner_trade_no | |||
| * 是 | |||
| * 10000098201411111234567890 | |||
| * String | |||
| * 商户订单号 | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("partner_trade_no") | |||
| private String partnerTradeNo; | |||
| public String getAppid() { | |||
| return appid; | |||
| } | |||
| public void setAppid(String appid) { | |||
| this.appid = appid; | |||
| } | |||
| public String getMchId() { | |||
| return mchId; | |||
| } | |||
| public void setMchId(String mchId) { | |||
| this.mchId = mchId; | |||
| } | |||
| 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; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); | |||
| } | |||
| } | |||
| @@ -0,0 +1,230 @@ | |||
| package me.chanjar.weixin.mp.bean.pay; | |||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||
| import org.apache.commons.lang3.builder.ToStringBuilder; | |||
| import org.apache.commons.lang3.builder.ToStringStyle; | |||
| /** | |||
| * 企业付款查询返回结果 | |||
| * Created by Binary Wang on 2016/10/19. | |||
| * @author binarywang (https://github.com/binarywang) | |||
| */ | |||
| @XStreamAlias("xml") | |||
| public class WxEntPayQueryResult { | |||
| /** | |||
| * 返回状态码 | |||
| */ | |||
| @XStreamAlias("return_code") | |||
| private String returnCode; | |||
| /** | |||
| * 返回信息 | |||
| */ | |||
| @XStreamAlias("return_msg") | |||
| private String returnMsg; | |||
| //############以下字段在return_code为SUCCESS的时候有返回 | |||
| /** | |||
| * 业务结果 | |||
| */ | |||
| @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("mchid") | |||
| private String mchId; | |||
| /** | |||
| * 付款单号 | |||
| */ | |||
| @XStreamAlias("detail_id") | |||
| private String detailId; | |||
| /** | |||
| * 转账状态 | |||
| */ | |||
| @XStreamAlias("status") | |||
| private String status; | |||
| /** | |||
| * 失败原因 | |||
| */ | |||
| @XStreamAlias("reason") | |||
| private String reason; | |||
| /** | |||
| * 收款用户openid | |||
| */ | |||
| @XStreamAlias("openid") | |||
| private String openid; | |||
| /** | |||
| * 收款用户姓名 | |||
| */ | |||
| @XStreamAlias("transfer_name") | |||
| private String transferName; | |||
| /** | |||
| * 付款金额 | |||
| */ | |||
| @XStreamAlias("payment_amount") | |||
| private Integer paymentAmount; | |||
| /** | |||
| * 转账时间 | |||
| */ | |||
| @XStreamAlias("transfer_time") | |||
| private String transferTime; | |||
| /** | |||
| * 付款描述 | |||
| */ | |||
| @XStreamAlias("desc") | |||
| private String desc; | |||
| @Override | |||
| public String toString() { | |||
| return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_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 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 getMchId() { | |||
| return mchId; | |||
| } | |||
| public void setMchId(String mchId) { | |||
| this.mchId = mchId; | |||
| } | |||
| public String getDetailId() { | |||
| return detailId; | |||
| } | |||
| public void setDetailId(String detailId) { | |||
| this.detailId = detailId; | |||
| } | |||
| public String getStatus() { | |||
| return status; | |||
| } | |||
| public void setStatus(String status) { | |||
| this.status = status; | |||
| } | |||
| public String getReason() { | |||
| return reason; | |||
| } | |||
| public void setReason(String reason) { | |||
| this.reason = reason; | |||
| } | |||
| public String getOpenid() { | |||
| return openid; | |||
| } | |||
| public void setOpenid(String openid) { | |||
| this.openid = openid; | |||
| } | |||
| public String getTransferName() { | |||
| return transferName; | |||
| } | |||
| public void setTransferName(String transferName) { | |||
| this.transferName = transferName; | |||
| } | |||
| public Integer getPaymentAmount() { | |||
| return paymentAmount; | |||
| } | |||
| public void setPaymentAmount(Integer paymentAmount) { | |||
| this.paymentAmount = paymentAmount; | |||
| } | |||
| public String getTransferTime() { | |||
| return transferTime; | |||
| } | |||
| public void setTransferTime(String transferTime) { | |||
| this.transferTime = transferTime; | |||
| } | |||
| public String getDesc() { | |||
| return desc; | |||
| } | |||
| public void setDesc(String desc) { | |||
| this.desc = desc; | |||
| } | |||
| } | |||
| @@ -91,4 +91,13 @@ public class WxMpPayServiceImplTest { | |||
| System.err.println(this.wxService.getPayService().entPay(request, keyFile)); | |||
| } | |||
| /** | |||
| * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#queryEntPay(String, File)}. | |||
| * @throws WxErrorException | |||
| */ | |||
| @Test | |||
| public final void testQueryEntPay() throws WxErrorException { | |||
| File keyFile = new File("E:\\dlt.p12"); | |||
| System.err.println(this.wxService.getPayService().queryEntPay("11212121", keyFile)); | |||
| } | |||
| } | |||