From ba3af7d154b7680305058e3b573601c3c13b0055 Mon Sep 17 00:00:00 2001 From: jinyu Date: Fri, 21 Oct 2016 22:00:39 +0800 Subject: [PATCH] fixed micropay --- .../java/com/foxinmy/weixin4j/api/PayApi.java | 17 ++++---- .../weixin4j/payment/mch/MchPayPackage.java | 39 +++++++++++++------ .../com/foxinmy/weixin4j/util/DateUtil.java | 13 +++++++ 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java index 7da9f278..539d948a 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/PayApi.java @@ -14,7 +14,6 @@ import java.util.HashMap; import java.util.Map; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.weixin.WeixinResponse; @@ -107,12 +106,16 @@ public class PayApi extends MchApi { } String tradeType = payPackage.getTradeType().toUpperCase(); if (TradeType.MICROPAY.name().equals(tradeType)) { - super.declareMerchant(payPackage); - JSONObject _payPackage = (JSONObject) JSON.toJSON(payPackage); - // 不需要设置TradeType参数 - _payPackage.remove("trade_type"); - payPackage.setSign(weixinSignature.sign(_payPackage)); - String para = XmlStream.toXML(payPackage); + MchPayPackage _payPackage = new MchPayPackage(payPackage.getBody(), + payPackage.getDetail(), payPackage.getOutTradeNo(), + DateUtil.formatFee2Yuan(payPackage.getTotalFee()), null, + null, payPackage.getCreateIp(), null, null, + payPackage.getAuthCode(), null, payPackage.getAttach(), + null, null, payPackage.getGoodsTag(), + payPackage.getLimitPay(), payPackage.getSubAppId()); + super.declareMerchant(_payPackage); + _payPackage.setSign(weixinSignature.sign(_payPackage)); + String para = XmlStream.toXML(_payPackage); WeixinResponse response = weixinExecutor.post( getRequestUri("micropay_uri"), para); MICROPayRequest microPayRequest = response diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java index f11306fa..4df383da 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/MchPayPackage.java @@ -9,6 +9,7 @@ import javax.xml.bind.annotation.XmlRootElement; import com.alibaba.fastjson.annotation.JSONField; import com.foxinmy.weixin4j.payment.PayPackage; +import com.foxinmy.weixin4j.type.CurrencyType; import com.foxinmy.weixin4j.type.TradeType; /** @@ -32,6 +33,12 @@ public class MchPayPackage extends PayPackage { @XmlElement(name = "trade_type") @JSONField(name = "trade_type") private String tradeType; + /** + * 符合ISO 4217标准的三位字母代码,默认人民币:CNY 非必须 + */ + @XmlElement(name = "fee_type") + @JSONField(name = "fee_type") + private String feeType; /** * 用户在商户 appid 下的唯一 标识, trade_type 为 JSAPI 时,此参数必传 */ @@ -96,9 +103,9 @@ public class MchPayPackage extends PayPackage { public MchPayPackage(String body, String outTradeNo, double totalFee, String notifyUrl, String createIp, TradeType tradeType, String openId, String authCode, String productId, String attach) { - this(body, null, outTradeNo, totalFee, notifyUrl, createIp, tradeType, - openId, authCode, productId, attach, null, null, null, null, - null); + this(body, null, outTradeNo, totalFee, CurrencyType.CNY, notifyUrl, + createIp, tradeType, openId, authCode, productId, attach, null, + null, null, null, null); } /** @@ -118,6 +125,8 @@ public class MchPayPackage extends PayPackage { * 订单生成的机器IP 必填项 * @param tradeType * 交易类型 必填项 + * @param feeType + * 货币类型 非必填项 * @param openId * 用户ID tradeType=JSAPI时必填 * @param authCode @@ -139,13 +148,15 @@ public class MchPayPackage extends PayPackage { * openid和sub_openid可以选传其中之一,如果选择传sub_openid ,则必须传sub_appid */ public MchPayPackage(String body, String detial, String outTradeNo, - double totalFee, String notifyUrl, String createIp, - TradeType tradeType, String openId, String authCode, - String productId, String attach, Date timeStart, Date timeExpire, - String goodsTag, String limitPay, String subOpenId) { + double totalFee, CurrencyType feeType, String notifyUrl, + String createIp, TradeType tradeType, String openId, + String authCode, String productId, String attach, Date timeStart, + Date timeExpire, String goodsTag, String limitPay, String subOpenId) { super(body, detial, outTradeNo, totalFee, notifyUrl, createIp, attach, timeStart, timeExpire, goodsTag); - this.tradeType = tradeType.name(); + this.tradeType = tradeType != null ? tradeType.name() : null; + this.feeType = feeType == null ? CurrencyType.CNY.name() : feeType + .name(); this.openId = openId; this.authCode = authCode; this.productId = productId; @@ -157,6 +168,10 @@ public class MchPayPackage extends PayPackage { return tradeType; } + public String getFeeType() { + return feeType; + } + public String getOpenId() { return openId; } @@ -187,9 +202,9 @@ public class MchPayPackage extends PayPackage { @Override public String toString() { - return "MchPayPackage [tradeType=" + tradeType + ", openId=" + openId - + ", productId=" + productId + ", authCode=" + authCode - + ", limitPay=" + limitPay + ", subOpenId=" + subOpenId + ", " - + super.toString() + "]"; + return "MchPayPackage [tradeType=" + tradeType + ",feeType=" + feeType + + ", openId=" + openId + ", productId=" + productId + + ", authCode=" + authCode + ", limitPay=" + limitPay + + ", subOpenId=" + subOpenId + ", " + super.toString() + "]"; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java index e2e02c1d..e5f2e9f0 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java @@ -119,4 +119,17 @@ public final class DateUtil { return _fee.multiply(new BigDecimal("100")) .setScale(0, BigDecimal.ROUND_HALF_EVEN).intValue(); } + + /** + * 单位为分的金额格式化为元 + * + * @param fee + * 金额 单位为分 + * @return 四舍六入五成双的金额 + */ + public static double formatFee2Yuan(int fee) { + BigDecimal _fee = new BigDecimal(Integer.toString(fee)); + return _fee.divide(new BigDecimal("100")) + .setScale(0, BigDecimal.ROUND_HALF_EVEN).doubleValue(); + } }