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 855f302b..b78b1840 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 @@ -52,7 +52,7 @@ import com.foxinmy.weixin4j.xml.XmlStream; /** * 支付API - * + * * @className PayApi * @author jinyu(foxinmy@gmail.com) * @date 2014年10月28日 @@ -68,7 +68,7 @@ public class PayApi extends MchApi { * 统一下单接口
* 除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI * 、APP等不同场景生成交易串调起支付。 - * + * * @param payPackage * 包含订单信息的对象 * @see com.foxinmy.weixin4j.payment.mch.MchPayPackage @@ -82,14 +82,15 @@ public class PayApi extends MchApi { payPackage.declareWeixinPayAccount(weixinAccount); payPackage.setSign(weixinSignature.sign(payPackage)); String payJsRequestXml = XmlStream.toXML(payPackage); - WeixinResponse response = weixinExecutor.post(getRequestUri("order_create_uri"), payJsRequestXml); + WeixinResponse response = weixinExecutor.post( + getRequestUri("order_create_uri"), payJsRequestXml); return response.getAsObject(new TypeReference() { }); } /** * 创建支付请求对象 - * + * * @param payPackage * 支付详情 * @return 支付请求对象 @@ -100,88 +101,37 @@ public class PayApi extends MchApi { * @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest WAP支付 * @throws WeixinException */ - public MchPayRequest createPayRequest(MchPayPackage payPackage) throws WeixinException { - PrePay prePay = createPrePay(payPackage); + public MchPayRequest createPayRequest(MchPayPackage payPackage) + throws WeixinException { String tradeType = payPackage.getTradeType(); + if (TradeType.MICROPAY.name().equalsIgnoreCase(tradeType)) { + String para = XmlStream.toXML(payPackage); + WeixinResponse response = weixinExecutor.post( + getRequestUri("micropay_uri"), para); + MICROPayRequest microPayRequest = response + .getAsObject(new TypeReference() { + }); + microPayRequest.setPaymentAccount(weixinAccount); + return microPayRequest; + } + PrePay prePay = createPrePay(payPackage); if (TradeType.APP.name().equalsIgnoreCase(tradeType)) { return new APPPayRequest(prePay.getPrepayId(), weixinAccount); } else if (TradeType.JSAPI.name().equalsIgnoreCase(tradeType)) { return new JSAPIPayRequest(prePay.getPrepayId(), weixinAccount); } else if (TradeType.NATIVE.name().equalsIgnoreCase(tradeType)) { - return new NATIVEPayRequest(prePay.getPrepayId(), prePay.getCodeUrl(), weixinAccount); + return new NATIVEPayRequest(prePay.getPrepayId(), + prePay.getCodeUrl(), weixinAccount); } else if (TradeType.WAP.name().equalsIgnoreCase(tradeType)) { return new WAPPayRequest(prePay.getPrepayId(), weixinAccount); - } else if (TradeType.MICROPAY.name().equalsIgnoreCase(tradeType)) { - String para = XmlStream.toXML(payPackage); - WeixinResponse response = weixinExecutor.post(getRequestUri("micropay_uri"), para); - MICROPayRequest microPayRequest = response.getAsObject(new TypeReference() { - }); - microPayRequest.setPaymentAccount(weixinAccount); - return microPayRequest; } else { throw new WeixinException("unknown tradeType:" + tradeType); } } - /** - * 创建支付请求对象【完整参数】 - * - * @param body - * 商品描述 必填项 - * @param detail - * 商品名称明细列表 非必填项 - * @param outTradeNo - * 商户内部唯一订单号 必填项 - * @param totalFee - * 商品总额 单位元 必填项 - * @param notifyUrl - * 支付回调URL 必填项 - * @param createIp - * 订单生成的机器IP 必填项 - * @param tradeType - * 交易类型 必填项 - * @param openId - * 用户ID tradeType=JSAPI时必填 - * @param productId - * 产品ID tradeType=NATIVE时必填 - * @param attach - * 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 非必填项 - * @param timeStart - * 订单生成时间,格式为yyyyMMddHHmmss 非必填项 - * @param timeExpire - * 订单失效时间,格式为yyyyMMddHHmmss;注意:最短失效时间间隔必须大于5分钟 非必填项 - * @param goodsTag - * 商品标记,代金券或立减优惠功能的参数 非必填项 - * @param limitPay - * 指定支付方式:no_credit--指定不能使用信用卡支付 非必填项 - * @param subOpenId - * 用户在子商户appid下的唯一标识 非必填 - * openid和sub_openid可以选传其中之一,如果选择传sub_openid ,则必须传sub_appid - * @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest JS支付 - * @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest 扫码支付 - * @see com.foxinmy.weixin4j.payment.mch.MICROPayRequest 刷卡支付 - * @see com.foxinmy.weixin4j.payment.mch.APPPayRequest APP支付 - * @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest WAP支付 - * @throws WeixinException - */ - public MchPayRequest createPayRequest(String body, String detail, String outTradeNo, double totalFee, - String notifyUrl, String createIp, TradeType tradeType, String openId, String productId, String attach, - Date timeStart, Date timeExpire, String goodsTag, String limitPay, String subOpenId) - throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, totalFee, notifyUrl, createIp, tradeType, openId, - null, productId, attach); - payPackage.setTimeStart(timeStart); - payPackage.setTimeExpire(timeExpire); - payPackage.setGoodsTag(goodsTag); - payPackage.setLimitPay(limitPay); - payPackage.setDetail(detail); - payPackage.setSubOpenId(subOpenId); - return createPayRequest(payPackage); - } - /** * 创建JSAPI支付请求对象 - * + * * @param openId * 用户ID * @param body @@ -189,7 +139,7 @@ public class PayApi extends MchApi { * @param outTradeNo * 订单号 * @param totalFee - * 订单总额 按实际金额传入即可(元) 构造函数会转换为分 + * 订单总额(元) * @param notifyUrl * 支付通知地址 * @param createIp @@ -200,10 +150,12 @@ public class PayApi extends MchApi { * @return JSAPI支付对象 * @throws WeixinException */ - public MchPayRequest createJSPayRequest(String openId, String body, String outTradeNo, double totalFee, - String notifyUrl, String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, totalFee, notifyUrl, createIp, TradeType.JSAPI, - openId, null, null, attach); + public MchPayRequest createJSPayRequest(String openId, String body, + String outTradeNo, double totalFee, String notifyUrl, + String createIp, String attach) throws WeixinException { + MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, + totalFee, notifyUrl, createIp, TradeType.JSAPI, openId, null, + null, attach); return createPayRequest(payPackage); } @@ -211,18 +163,13 @@ public class PayApi extends MchApi { *

* 生成编辑地址请求 *

- * - * err_msg edit_address:ok获取编辑收货地址成功
- * edit_address:fail获取编辑收货地址失败
- * userName 收货人姓名
- * telNumber 收货人电话
- * addressPostalCode 邮编
- * proviceFirstStageName 国标收货地址第一级地址
- * addressCitySecondStageName 国标收货地址第二级地址
- * addressCountiesThirdStageName 国标收货地址第三级地址
- * addressDetailInfo 详细收货地址信息
- * nationalCode 收货地址国家码
- * + * + * err_msg edit_address:ok获取编辑收货地址成功
edit_address:fail获取编辑收货地址失败
+ * userName 收货人姓名
telNumber 收货人电话
addressPostalCode 邮编
+ * proviceFirstStageName 国标收货地址第一级地址
addressCitySecondStageName + * 国标收货地址第二级地址
addressCountiesThirdStageName 国标收货地址第三级地址
+ * addressDetailInfo 详细收货地址信息
nationalCode 收货地址国家码
+ * * @param url * 当前访问页的URL * @param oauthToken @@ -250,7 +197,7 @@ public class PayApi extends MchApi { /** * 创建Native支付(扫码支付)链接【模式一】 - * + * * @param productId * 与订单ID等价 * @return 支付链接 @@ -271,13 +218,14 @@ public class PayApi extends MchApi { map.put("nonce_str", noncestr); map.put("product_id", productId); String sign = weixinSignature.sign(map); - return String.format(getRequestUri("native_pay_uri"), sign, weixinAccount.getId(), weixinAccount.getMchId(), - productId, timestamp, noncestr); + return String.format(getRequestUri("native_pay_uri"), sign, + weixinAccount.getId(), weixinAccount.getMchId(), productId, + timestamp, noncestr); } /** * 创建Native支付(扫码支付)回调对象【模式一】 - * + * * @param productId * 商品ID * @param body @@ -302,17 +250,19 @@ public class PayApi extends MchApi { * * @throws WeixinException */ - public NativePayResponse createNativePayResponse(String productId, String body, String outTradeNo, double totalFee, - String notifyUrl, String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, totalFee, notifyUrl, createIp, TradeType.NATIVE, - null, null, productId, attach); + public NativePayResponse createNativePayResponse(String productId, + String body, String outTradeNo, double totalFee, String notifyUrl, + String createIp, String attach) throws WeixinException { + MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, + totalFee, notifyUrl, createIp, TradeType.NATIVE, null, null, + productId, attach); PrePay prePay = createPrePay(payPackage); return new NativePayResponse(weixinAccount, prePay.getPrepayId()); } /** * 创建Native支付(扫码支付)链接【模式二】 - * + * * @param productId * 商品ID * @param body @@ -337,16 +287,18 @@ public class PayApi extends MchApi { * * @throws WeixinException */ - public MchPayRequest createNativePayRequest(String productId, String body, String outTradeNo, double totalFee, - String notifyUrl, String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, totalFee, notifyUrl, createIp, TradeType.NATIVE, - null, null, productId, attach); + public MchPayRequest createNativePayRequest(String productId, String body, + String outTradeNo, double totalFee, String notifyUrl, + String createIp, String attach) throws WeixinException { + MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, + totalFee, notifyUrl, createIp, TradeType.NATIVE, null, null, + productId, attach); return createPayRequest(payPackage); } /** * 创建APP支付请求对象 - * + * * @param body * 商品描述 * @param outTradeNo @@ -366,16 +318,18 @@ public class PayApi extends MchApi { * APP支付 * @throws WeixinException */ - public MchPayRequest createAppPayRequest(String body, String outTradeNo, double totalFee, String notifyUrl, - String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, totalFee, notifyUrl, createIp, TradeType.APP, - null, null, null, attach); + public MchPayRequest createAppPayRequest(String body, String outTradeNo, + double totalFee, String notifyUrl, String createIp, String attach) + throws WeixinException { + MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, + totalFee, notifyUrl, createIp, TradeType.APP, null, null, null, + attach); return createPayRequest(payPackage); } /** * 创建WAP支付请求对象 - * + * * @param body * 商品描述 * @param outTradeNo @@ -395,16 +349,18 @@ public class PayApi extends MchApi { * * @throws WeixinException */ - public MchPayRequest createWAPPayRequest(String body, String outTradeNo, double totalFee, String notifyUrl, - String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, totalFee, notifyUrl, createIp, TradeType.WAP, - null, null, null, attach); + public MchPayRequest createWapPayRequest(String body, String outTradeNo, + double totalFee, String notifyUrl, String createIp, String attach) + throws WeixinException { + MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, + totalFee, notifyUrl, createIp, TradeType.WAP, null, null, null, + attach); return createPayRequest(payPackage); } /** * 提交被扫支付 - * + * * @param authCode * 扫码支付授权码 ,设备读取用户微信中的条码或者二维码信息 * @param body @@ -425,22 +381,22 @@ public class PayApi extends MchApi { * 提交被扫支付API * @throws WeixinException */ - public MchPayRequest createMICROPayRequest(String authCode, String body, String outTradeNo, double totalFee, - String createIp, String attach) throws WeixinException { - MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, totalFee, null, createIp, TradeType.MICROPAY, - null, null, null, attach); + public MchPayRequest createMicroPayRequest(String authCode, String body, + String outTradeNo, double totalFee, String createIp, String attach) + throws WeixinException { + MchPayPackage payPackage = new MchPayPackage(body, outTradeNo, + totalFee, null, createIp, TradeType.MICROPAY, null, null, null, + attach); return createPayRequest(payPackage); } /** * 订单查询 *

- * 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
- * 调用支付接口后,返回系统错误或未知交易状态情况;
- * 调用被扫支付API,返回USERPAYING的状态;
- * 调用关单或撤销接口API之前,需确认支付状态; + * 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
调用支付接口后,返回系统错误或未知交易状态情况;
+ * 调用被扫支付API,返回USERPAYING的状态;
调用关单或撤销接口API之前,需确认支付状态; *

- * + * * @param idQuery * 商户系统内部的订单号, transaction_id、out_trade_no 二 选一,如果同时存在优先级: * transaction_id> out_trade_no @@ -456,8 +412,10 @@ public class PayApi extends MchApi { Map map = createBaseRequestMap(idQuery); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = weixinExecutor.post(getRequestUri("order_query_uri"), param); - return ListsuffixResultDeserializer.deserialize(response.getAsString(), Order.class); + WeixinResponse response = weixinExecutor.post( + getRequestUri("order_query_uri"), param); + return ListsuffixResultDeserializer.deserialize(response.getAsString(), + Order.class); } /** @@ -471,7 +429,7 @@ public class PayApi extends MchApi { * 2.微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交 * ,要采用原来的退款单号。总退款金额不能超过用户实际支付金额。 *

- * + * * @param certificate * 后缀为*.p12的证书文件 * @param idQuery @@ -495,8 +453,9 @@ public class PayApi extends MchApi { * @since V3 * @throws WeixinException */ - public RefundResult applyRefund(InputStream certificate, IdQuery idQuery, String outRefundNo, double totalFee, - double refundFee, CurrencyType refundFeeType, String opUserId) throws WeixinException { + public RefundResult applyRefund(InputStream certificate, IdQuery idQuery, + String outRefundNo, double totalFee, double refundFee, + CurrencyType refundFeeType, String opUserId) throws WeixinException { WeixinResponse response = null; try { Map map = createBaseRequestMap(idQuery); @@ -513,7 +472,8 @@ public class PayApi extends MchApi { map.put("refund_fee_type", refundFeeType.name()); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - response = createSSLRequestExecutor(certificate).post(getRequestUri("refund_apply_uri"), param); + response = createSSLRequestExecutor(certificate).post( + getRequestUri("refund_apply_uri"), param); } finally { if (certificate != null) { try { @@ -529,7 +489,7 @@ public class PayApi extends MchApi { /** * 退款申请(全额退款) - * + * * @param certificate * 后缀为*.p12的证书文件 * @param idQuery @@ -541,19 +501,18 @@ public class PayApi extends MchApi { * 订单总金额,单位为元 * @see {@link #applyRefund(InputStream, IdQuery, String, double, double,CurrencyType, String)} */ - public RefundResult applyRefund(InputStream certificate, IdQuery idQuery, String outRefundNo, double totalFee) - throws WeixinException { - return applyRefund(certificate, idQuery, outRefundNo, totalFee, totalFee, null, null); + public RefundResult applyRefund(InputStream certificate, IdQuery idQuery, + String outRefundNo, double totalFee) throws WeixinException { + return applyRefund(certificate, idQuery, outRefundNo, totalFee, + totalFee, null, null); } /** - * 冲正订单(需要证书)
- * 当支付返回失败,或收银系统超时需要取消交易,可以调用该接口
- * 接口逻辑:支 付失败的关单,支付成功的撤销支付
- * 7天以内的单可撤销,其他正常支付的单 如需实现相同功能请调用退款接口
- * 调用扣款接口后请勿立即调用撤销,需要等待5秒以上。先调用查单接口,如果没有确切的返回,再调用撤销 - *
- * + * 冲正订单(需要证书)
当支付返回失败,或收银系统超时需要取消交易,可以调用该接口
接口逻辑:支 + * 付失败的关单,支付成功的撤销支付
7天以内的单可撤销,其他正常支付的单 + * 如需实现相同功能请调用退款接口
调用扣款接口后请勿立即调用撤销,需要等待5秒以上。先调用查单接口,如果没有确切的返回,再调用撤销
+ * * @param certificate * 后缀为*.p12的证书文件 * @param idQuery @@ -563,13 +522,14 @@ public class PayApi extends MchApi { * @since V3 * @throws WeixinException */ - public MerchantResult reverseOrder(InputStream certificate, IdQuery idQuery) throws WeixinException { + public MerchantResult reverseOrder(InputStream certificate, IdQuery idQuery) + throws WeixinException { try { Map map = createBaseRequestMap(idQuery); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = createSSLRequestExecutor(certificate).post(getRequestUri("order_reverse_uri"), - param); + WeixinResponse response = createSSLRequestExecutor(certificate) + .post(getRequestUri("order_reverse_uri"), param); return response.getAsObject(new TypeReference() { }); } finally { @@ -586,7 +546,7 @@ public class PayApi extends MchApi { /** * native支付URL转短链接:用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX),减小二维码数据量 * ,提升扫描速度和精确度。 - * + * * @param url * 具有native标识的支付URL * @return 转换后的短链接 @@ -604,7 +564,8 @@ public class PayApi extends MchApi { } map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = weixinExecutor.post(getRequestUri("longurl_convert_uri"), param); + WeixinResponse response = weixinExecutor.post( + getRequestUri("longurl_convert_uri"), param); map = XmlStream.xml2map(response.getAsString()); return map.get("short_url"); } @@ -615,7 +576,7 @@ public class PayApi extends MchApi { * 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;系统下单后,用户支付超时,系统退出不再受理,避免用户继续 * ,请调用关单接口,如果关单失败,返回已完 成支付请按正常支付处理。如果出现银行掉单,调用关单成功后,微信后台会主动发起退款。 *

- * + * * @param outTradeNo * 商户系统内部的订单号 * @return 处理结果 @@ -626,10 +587,12 @@ public class PayApi extends MchApi { * 关闭订单API */ public MerchantResult closeOrder(String outTradeNo) throws WeixinException { - Map map = createBaseRequestMap(new IdQuery(outTradeNo, IdType.TRADENO)); + Map map = createBaseRequestMap(new IdQuery(outTradeNo, + IdType.TRADENO)); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = weixinExecutor.post(getRequestUri("order_close_uri"), param); + WeixinResponse response = weixinExecutor.post( + getRequestUri("order_close_uri"), param); return response.getAsObject(new TypeReference() { }); } @@ -640,7 +603,7 @@ public class PayApi extends MchApi { * REVOKED;
* 2.微信在次日 9 点启动生成前一天的对账单,建议商户 9 点半后再获取;
* 3.对账单中涉及金额的字段单位为“元”。
- * + * * @param billDate * 下载对账单的日期 * @param billType @@ -655,7 +618,8 @@ public class PayApi extends MchApi { * 下载对账单API * @throws WeixinException */ - public File downloadBill(Date billDate, BillType billType, String billPath) throws WeixinException { + public File downloadBill(Date billDate, BillType billType, String billPath) + throws WeixinException { if (billDate == null) { Calendar now = Calendar.getInstance(); now.add(Calendar.DAY_OF_MONTH, -1); @@ -665,7 +629,8 @@ public class PayApi extends MchApi { billType = BillType.ALL; } String formatBillDate = DateUtil.fortmat2yyyyMMdd(billDate); - String fileName = String.format("weixin4j_bill_%s_%s_%s.txt", formatBillDate, billType.name().toLowerCase(), + String fileName = String.format("weixin4j_bill_%s_%s_%s.txt", + formatBillDate, billType.name().toLowerCase(), weixinAccount.getId()); File file = new File(String.format("%s/%s", billPath, fileName)); if (file.exists()) { @@ -676,14 +641,16 @@ public class PayApi extends MchApi { map.put("bill_type", billType.name()); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = weixinExecutor.post(getRequestUri("downloadbill_uri"), param); + WeixinResponse response = weixinExecutor.post( + getRequestUri("downloadbill_uri"), param); BufferedReader reader = null; BufferedWriter writer = null; try { - writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), Consts.UTF_8)); - reader = new BufferedReader( - new InputStreamReader(response.getBody(), Consts.UTF_8)); + writer = new BufferedWriter(new OutputStreamWriter( + new FileOutputStream(file), Consts.UTF_8)); + reader = new BufferedReader(new InputStreamReader( + response.getBody(), Consts.UTF_8)); String line = null; while ((line = reader.readLine()) != null) { writer.write(line); @@ -708,11 +675,11 @@ public class PayApi extends MchApi { /** * 退款查询 - * + * *

* 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。 *

- * + * * @param idQuery * 单号 refund_id、out_refund_no、 out_trade_no 、 transaction_id * 四个参数必填一个,优先级为: @@ -730,13 +697,15 @@ public class PayApi extends MchApi { Map map = createBaseRequestMap(idQuery); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = weixinExecutor.post(getRequestUri("refund_query_uri"), param); - return ListsuffixResultDeserializer.deserialize(response.getAsString(), RefundRecord.class); + WeixinResponse response = weixinExecutor.post( + getRequestUri("refund_query_uri"), param); + return ListsuffixResultDeserializer.deserialize(response.getAsString(), + RefundRecord.class); } /** * 接口上报 - * + * * @param interfaceUrl * 上报对应的接口的完整 URL, 类似: https://api.mch.weixin.q * q.com/pay/unifiedorder @@ -757,8 +726,9 @@ public class PayApi extends MchApi { * 接口测试上报API */ @SuppressWarnings("unchecked") - public XmlResult interfaceReport(String interfaceUrl, int executeTime, String outTradeNo, String ip, Date time, - XmlResult returnXml) throws WeixinException { + public XmlResult interfaceReport(String interfaceUrl, int executeTime, + String outTradeNo, String ip, Date time, XmlResult returnXml) + throws WeixinException { Map map = createBaseRequestMap(null); map.put("interface_url", interfaceUrl); map.put("execute_time_", Integer.toString(executeTime)); @@ -768,13 +738,14 @@ public class PayApi extends MchApi { map.putAll((Map) JSON.toJSON(returnXml)); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = weixinExecutor.post(getRequestUri("interface_report_uri"), param); + WeixinResponse response = weixinExecutor.post( + getRequestUri("interface_report_uri"), param); return response.getAsXmlResult(); } /** * 授权码查询OPENID接口 - * + * * @param authCode * 扫码支付授权码,设备读取用户微信中的条码或者二维码信息 * @return 查询结果 @@ -789,7 +760,8 @@ public class PayApi extends MchApi { map.put("auth_code", authCode); map.put("sign", weixinSignature.sign(map)); String param = XmlStream.map2xml(map); - WeixinResponse response = weixinExecutor.post(getRequestUri("authcode_openid_uri"), param); + WeixinResponse response = weixinExecutor.post( + getRequestUri("authcode_openid_uri"), param); return response.getAsObject(new TypeReference() { }); } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java index 1a9e301c..b579adb9 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java @@ -59,7 +59,10 @@ public class WeixinException extends Exception { buf.append(" >> ").append(desc); } if (buf.length() > 0) { - buf.append(" >> ").append(WeixinErrorUtil.getText(code)); + String text = getErrorText(); + if (StringUtil.isNotBlank(text)) { + buf.append(" >> ").append(text); + } return buf.toString(); } else { return super.getMessage(); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java index 23889aff..b163cf53 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java @@ -26,7 +26,7 @@ import com.foxinmy.weixin4j.xml.XmlStream; /** * 负责微信请求的执行 - * + * * @className WeixinRequestExecutor * @author jinyu(foxinmy@gmail.com) * @date 2015年8月15日 @@ -103,8 +103,7 @@ public class WeixinRequestExecutor { HttpHeaders headers = httpResponse.getHeaders(); WeixinResponse response = new WeixinResponse(httpResponse); logger.info("weixin response << " + httpResponse.getProtocol() - + httpResponse.getStatus().toString() + ":" - + response.getAsString()); + + httpResponse.getStatus() + ":" + response.getAsString()); String contentType = headers.getFirst(HttpHeaders.CONTENT_TYPE); String disposition = headers .getFirst(HttpHeaders.CONTENT_DISPOSITION); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java index 7fb2a1a2..adeb84d3 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java @@ -40,7 +40,6 @@ import com.foxinmy.weixin4j.type.BillType; import com.foxinmy.weixin4j.type.CurrencyType; import com.foxinmy.weixin4j.type.CustomsCity; import com.foxinmy.weixin4j.type.IdQuery; -import com.foxinmy.weixin4j.type.TradeType; import com.foxinmy.weixin4j.util.Weixin4jSettings; /** @@ -143,59 +142,6 @@ public class WeixinPayProxy { return payApi.createPayRequest(payPackage); } - /** - * 创建支付请求对象【完整参数】 - * - * @param body - * 商品描述 必填项 - * @param detail - * 商品名称明细列表 非必填项 - * @param outTradeNo - * 商户内部唯一订单号 必填项 - * @param totalFee - * 商品总额 单位元 必填项 - * @param notifyUrl - * 支付回调URL 必填项 - * @param createIp - * 订单生成的机器IP 必填项 - * @param tradeType - * 交易类型 必填项 - * @param openId - * 用户ID tradeType=JSAPI时必填 - * @param productId - * 产品ID tradeType=NATIVE时必填 - * @param attach - * 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 非必填项 - * @param timeStart - * 订单生成时间,格式为yyyyMMddHHmmss 非必填项 - * @param timeExpire - * 订单失效时间,格式为yyyyMMddHHmmss;注意:最短失效时间间隔必须大于5分钟 非必填项 - * @param goodsTag - * 商品标记,代金券或立减优惠功能的参数 非必填项 - * @param limitPay - * 指定支付方式:no_credit--指定不能使用信用卡支付 非必填项 - * @param subOpenId - * 用户在子商户appid下的唯一标识 非必填 - * openid和sub_openid可以选传其中之一,如果选择传sub_openid ,则必须传sub_appid - * @see com.foxinmy.weixin4j.api.PayApi - * @see com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest JS支付 - * @see com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest 扫码支付 - * @see com.foxinmy.weixin4j.payment.mch.MICROPayRequest 刷卡支付 - * @see com.foxinmy.weixin4j.payment.mch.APPPayRequest APP支付 - * @see com.foxinmy.weixin4j.payment.mch.WAPPayRequest WAP支付 - * @throws WeixinException - */ - public MchPayRequest createPayRequest(String body, String detail, - String outTradeNo, double totalFee, String notifyUrl, - String createIp, TradeType tradeType, String openId, - String productId, String attach, Date timeStart, Date timeExpire, - String goodsTag, String limitPay, String subOpenId) - throws WeixinException { - return payApi.createPayRequest(body, detail, outTradeNo, totalFee, - notifyUrl, createIp, tradeType, openId, productId, attach, - timeStart, timeExpire, goodsTag, limitPay, subOpenId); - } - /** * 创建JSAPI支付请求对象 * @@ -206,7 +152,7 @@ public class WeixinPayProxy { * @param outTradeNo * 订单号 * @param totalFee - * 订单总额 按实际金额传入即可(元) 构造函数会转换为分 + * 订单总额(元) * @param notifyUrl * 支付通知地址 * @param createIp @@ -391,10 +337,10 @@ public class WeixinPayProxy { * * @throws WeixinException */ - public MchPayRequest createWAPPayRequest(String body, String outTradeNo, + public MchPayRequest createWapPayRequest(String body, String outTradeNo, double totalFee, String notifyUrl, String createIp, String attach) throws WeixinException { - return payApi.createWAPPayRequest(body, outTradeNo, totalFee, + return payApi.createWapPayRequest(body, outTradeNo, totalFee, notifyUrl, createIp, attach); } @@ -422,10 +368,10 @@ public class WeixinPayProxy { * 提交被扫支付API * @throws WeixinException */ - public MchPayRequest createMICROPayRequest(String authCode, String body, + public MchPayRequest createMicroPayRequest(String authCode, String body, String outTradeNo, double totalFee, String createIp, String attach) throws WeixinException { - return payApi.createMICROPayRequest(authCode, body, outTradeNo, + return payApi.createMicroPayRequest(authCode, body, outTradeNo, totalFee, createIp, attach); } 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 39179786..f11306fa 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 @@ -13,7 +13,7 @@ import com.foxinmy.weixin4j.type.TradeType; /** * 支付订单详情 - * + * * @className MchPayPackage * @author jinyu(foxinmy@gmail.com) * @date 2014年10月21日 @@ -71,7 +71,7 @@ public class MchPayPackage extends PayPackage { /** * 微信支付 - * + * * @param body * 支付详情 必填 * @param outTradeNo @@ -103,39 +103,37 @@ public class MchPayPackage extends PayPackage { /** * 完整参数 - * + * * @param body - * 支付详情 必填 + * 商品描述 必填项 * @param detail - * 订单详情 非必填 + * 商品名称明细列表 非必填项 * @param outTradeNo - * 商户侧订单号 必填 + * 商户内部唯一订单号 必填项 * @param totalFee - * 支付金额(单位元) 必填 + * 商品总额 单位元 必填项 * @param notifyUrl - * 支付回调URL 必填 + * 支付回调URL 必填项 * @param createIp - * 发起支付的IP地址 必填 + * 订单生成的机器IP 必填项 * @param tradeType - * 支付类型 必填 + * 交易类型 必填项 * @param openId - * 用户唯一标识 公众号JSAPI支付必填 + * 用户ID tradeType=JSAPI时必填 * @param authCode - * 支付授权码 刷卡MICROPAY支付必填 + * 刷卡支付授权码 tradeType=MICROPAY时必填 * @param productId - * 商品ID 扫码NATIVE支付必填 + * 产品ID tradeType=NATIVE时必填 * @param attach - * 支付时附加信息 非必填 + * 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 非必填项 * @param timeStart - * 订单生成时间 非必填 + * 订单生成时间,格式为yyyyMMddHHmmss 非必填项 * @param timeExpire - * 订单失效时间 非必填 + * 订单失效时间,格式为yyyyMMddHHmmss;注意:最短失效时间间隔必须大于5分钟 非必填项 * @param goodsTag - * 商品标记 非必填 - * @param productId - * 商品ID native支付必填 + * 商品标记,代金券或立减优惠功能的参数 非必填项 * @param limitPay - * 指定支付方式 非必填 + * 指定支付方式:no_credit--指定不能使用信用卡支付 非必填项 * @param subOpenId * 用户在子商户appid下的唯一标识 非必填 * openid和sub_openid可以选传其中之一,如果选择传sub_openid ,则必须传sub_appid diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java index 0576a913..acbdd645 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/Redpacket.java @@ -126,42 +126,6 @@ public class Redpacket extends MerchantResult { public Redpacket(String outTradeNo, String sendName, String openId, double totalAmount, int totalNum, String wishing, String clientIp, String actName, String remark) { - this(null, null, outTradeNo, sendName, openId, totalAmount, totalNum, - wishing, clientIp, actName, remark); - } - - /** - * 红包 完整参数 - * - * @param msgAppId - * 触达用户appid 服务商模式下触达用户时的appid(可填服务商自己的appid或子商户的appid),服务商模式下必填, - * 服务商模式下填入的子商户appid必须在微信支付商户平台中先录入,否则会校验不过。 - * @param consumeMchId - * 常规模式下无效,服务商模式下选填,服务商模式下不填默认扣子商户的钱 - * @param outTradeNo - * 商户侧一天内不可重复的订单号 接口根据商户订单号支持重入 如出现超时可再调用 必填 - * @param sendName - * 红包发送者名称 必填 - * @param openid - * 接受收红包的用户的openid 必填 - * @param totalAmount - * 付款金额 单位为元,自动格式化为分 必填 - * @param totalNum - * 红包发放总人数 大于1视为裂变红包 必填 - * @param wishing - * 红包祝福语 必填 - * @param clientIp - * Ip地址 必填 - * @param actName - * 活动名称 必填 - * @param remark - * 备注 必填 - */ - public Redpacket(String msgAppId, String consumeMchId, String outTradeNo, - String sendName, String openId, double totalAmount, int totalNum, - String wishing, String clientIp, String actName, String remark) { - this.msgAppId = msgAppId; - this.consumeMchId = consumeMchId; this.outTradeNo = outTradeNo; this.sendName = sendName; this.openId = openId; @@ -214,6 +178,22 @@ public class Redpacket extends MerchantResult { return remark; } + public String getMsgAppId() { + return msgAppId; + } + + public void setMsgAppId(String msgAppId) { + this.msgAppId = msgAppId; + } + + public String getConsumeMchId() { + return consumeMchId; + } + + public void setConsumeMchId(String consumeMchId) { + this.consumeMchId = consumeMchId; + } + @Override public String toString() { return "Redpacket [msgAppId=" + msgAppId + ", consumeMchId=" diff --git a/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/PayTest.java b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/PayTest.java index d0810152..12d6cef2 100644 --- a/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/PayTest.java +++ b/weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/PayTest.java @@ -15,6 +15,7 @@ import com.foxinmy.weixin4j.http.weixin.XmlResult; import com.foxinmy.weixin4j.model.WeixinPayAccount; import com.foxinmy.weixin4j.payment.WeixinPayProxy; import com.foxinmy.weixin4j.payment.mch.MchPayPackage; +import com.foxinmy.weixin4j.payment.mch.MchPayRequest; import com.foxinmy.weixin4j.payment.mch.MerchantResult; import com.foxinmy.weixin4j.payment.mch.Order; import com.foxinmy.weixin4j.payment.mch.PrePay; @@ -29,7 +30,7 @@ import com.foxinmy.weixin4j.util.Weixin4jSettings; /** * 支付测试(商户平台) - * + * * @className PayTest * @author jinyu(foxinmy@gmail.com) * @date 2016年1月30日 @@ -150,4 +151,16 @@ public class PayTest { ip, time, returnXml); System.err.println(returnXml); } + + @Test + public void testMicroPay() throws WeixinException { + String authCode = "扫描码"; + String body = "商品描述"; + String outTradeNo = "M001"; + double totalFee = 1d; + String createIp = "127.0.0.1"; + MchPayRequest request = PAY.createMicroPayRequest(authCode, body, + outTradeNo, totalFee, createIp, null); + System.err.println(request); + } } diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/PayOldApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/PayOldApi.java index ee83a051..b18400e0 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/PayOldApi.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/PayOldApi.java @@ -59,7 +59,7 @@ import com.foxinmy.weixin4j.xml.ListsuffixResultDeserializer; /** * V2老支付API - * + * * @className PayOldApi * @author jinyu(foxinmy@gmail.com) * @date 2014年10月28日 @@ -111,13 +111,13 @@ public class PayOldApi extends MpApi { /** * 生成V2.x版本JSAPI支付字符串 - * + * * @param body * 支付详情 * @param outTradeNo * 订单号 * @param totalFee - * 订单总额 按实际金额传入即可(元) 构造函数会转换为分 + * 订单总额(元) * @param notifyUrl * 支付回调URL * @param createIp @@ -126,50 +126,20 @@ public class PayOldApi extends MpApi { */ public String createPayJsRequestJson(String body, String outTradeNo, double totalFee, String notifyUrl, String createIp) { - return createPayJsRequestJson(body, outTradeNo, totalFee, notifyUrl, - createIp, null, null, null, 0d, 0d, null); + PayPackageV2 payPackage = new PayPackageV2(getPayAccount() + .getPartnerId(), body, outTradeNo, totalFee, notifyUrl, + createIp); + return createPayJsRequestJson(payPackage); } /** * 生成V2.x版本JSAPI支付字符串 - * - * @param body - * 支付详情 - * @param outTradeNo - * 订单号 - * @param totalFee - * 订单总额 按实际金额传入即可(元) 构造函数会转换为分 - * @param notifyUrl - * 支付回调URL - * @param createIp - * 订单生成的机器 IP - * @param attach - * 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 - * @param timeStart - * 订单生成时间,格式为yyyyMMddHHmmss - * @param timeExpire - * 订单失效时间,格式为yyyyMMddHHmmss;注意:最短失效时间间隔必须大于5分钟 - * @param transportFee - * 物流费用 如有值 必须保证 transportFee+productFee=totalFee - * @param transportFee - * 商品费用 如有值 必须保证 transportFee+productFee=totalFee - * @param goodsTag - * 商品标记,代金券或立减优惠功能的参数 + * + * @param payPackage + * 支付信息 * @return 支付json串 */ - public String createPayJsRequestJson(String body, String outTradeNo, - double totalFee, String notifyUrl, String createIp, String attach, - Date timeStart, Date timeExpire, double transportFee, - double productFee, String goodsTag) { - PayPackageV2 payPackage = new PayPackageV2(getPayAccount() - .getPartnerId(), body, outTradeNo, totalFee, notifyUrl, - createIp); - payPackage.setAttach(attach); - payPackage.setTimeStart(timeStart); - payPackage.setTimeExpire(timeExpire); - payPackage.setTransportFee(transportFee); - payPackage.setProductFee(productFee); - payPackage.setGoodsTag(goodsTag); + public String createPayJsRequestJson(PayPackageV2 payPackage) { PayRequest payRequest = new PayRequest(getPayAccount().getId(), weixinOldSignature.sign(payPackage, getPayAccount() .getPartnerKey())); @@ -181,7 +151,7 @@ public class PayOldApi extends MpApi { /** * 创建V2.x NativePay支付链接 - * + * * @param productId * 与订单ID等价 * @return 支付链接 @@ -203,7 +173,7 @@ public class PayOldApi extends MpApi { /** * 订单查询 - * + * * @param idQuery * 订单号 * @return 订单信息 @@ -259,7 +229,7 @@ public class PayOldApi extends MpApi { * 交易时间超过 1 年的订单无法提交退款;
支持部分退款,部分退需要设置相同的订单号和不同的 out_refund_no。一笔退款失 * 败后重新提交,要采用原来的 out_refund_no。总退款金额不能超过用户实际支付金额。
*

- * + * * @param certificate * 证书文件(V2版本后缀为*.pfx) * @param idQuery @@ -275,7 +245,7 @@ public class PayOldApi extends MpApi { * 操作员帐号, 默认为商户号 * @param mopara * 如 opUserPasswd - * + * * @return 退款申请结果 * @see com.foxinmy.weixin4j.mp.oldpayment.RefundResultV2 * @since V2 @@ -370,7 +340,7 @@ public class PayOldApi extends MpApi { /** * 退款申请 - * + * * @param certificate * 证书文件(V2版本后缀为*.pfx) * @param idQuery @@ -399,7 +369,7 @@ public class PayOldApi extends MpApi { /** * 退款申请 - * + * * @param certificate * 证书文件(V2版本后缀为*.pfx) * @param idQuery @@ -452,7 +422,7 @@ public class PayOldApi extends MpApi { * REVOKED;
* 2.微信在次日 9 点启动生成前一天的对账单,建议商户 9 点半后再获取;
* 3.对账单中涉及金额的字段单位为“元”。
- * + * * @param billDate * 下载对账单的日期 为空则取前一天 * @param billType @@ -475,8 +445,9 @@ public class PayOldApi extends MpApi { billType = BillType.ALL; } String formatBillDate = DateUtil.fortmat2yyyyMMdd(billDate); - String fileName = String.format("weixin4j_bill_%s_%s_%s.txt", formatBillDate, - billType.name().toLowerCase(), getPayAccount().getId()); + String fileName = String.format("weixin4j_bill_%s_%s_%s.txt", + formatBillDate, billType.name().toLowerCase(), getPayAccount() + .getId()); File file = new File(String.format("%s/%s", billPath, fileName)); if (file.exists()) { return file; @@ -524,7 +495,7 @@ public class PayOldApi extends MpApi { /** * 退款查询
退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款 3 个工作日后重新查询退款状态 - * + * * @param idQuery * 单号 refund_id、out_refund_no、 out_trade_no 、 transaction_id * 四个参数必填一个,优先级为: @@ -550,7 +521,7 @@ public class PayOldApi extends MpApi { /** * 发货通知 - * + * * @param openId * 用户ID * @param transid @@ -590,7 +561,7 @@ public class PayOldApi extends MpApi { /** * 维权处理 - * + * * @param openId * 用户ID * @param feedbackId diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/oldpayment/PayPackageV2.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/oldpayment/PayPackageV2.java index 27dcf471..5e88e4bb 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/oldpayment/PayPackageV2.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/oldpayment/PayPackageV2.java @@ -13,7 +13,7 @@ import com.foxinmy.weixin4j.util.DateUtil; /** * V2支付的订单详情 - * + * * @className PayPackageV2 * @author jinyu(foxinmy@gmail.com) * @date 2014年8月17日 @@ -65,12 +65,56 @@ public class PayPackageV2 extends PayPackage { // jaxb required } + /** + * 支付信息 + * + * @param partner + * 商户号 必填 + * @param body + * 支付详情 必填 + * @param outTradeNo + * 订单号 必填 + * @param totalFee + * 订单总额(元) 必填 + * @param notifyUrl + * 支付回调URL 必填 + * @param createIp + * 订单生成的机器 IP 必填 + */ public PayPackageV2(String partner, String body, String outTradeNo, double totalFee, String notifyUrl, String createIp) { this(partner, body, outTradeNo, totalFee, notifyUrl, createIp, null, null, null, 0d, 0d, null); } + /** + * 支付信息 完整参数 + * + * @param partner + * 商户号 必填 + * @param body + * 支付详情 必填 + * @param outTradeNo + * 订单号 必填 + * @param totalFee + * 订单总额(元) 必填 + * @param notifyUrl + * 支付回调URL 必填 + * @param createIp + * 订单生成的机器 IP 必填 + * @param attach + * 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 + * @param timeStart + * 订单生成时间,格式为yyyyMMddHHmmss + * @param timeExpire + * 订单失效时间,格式为yyyyMMddHHmmss;注意:最短失效时间间隔必须大于5分钟 + * @param transportFee + * 物流费用 如有值 必须保证 transportFee+productFee=totalFee + * @param transportFee + * 商品费用 如有值 必须保证 transportFee+productFee=totalFee + * @param goodsTag + * 商品标记,代金券或立减优惠功能的参数 + */ public PayPackageV2(String partner, String body, String outTradeNo, double totalFee, String notifyUrl, String createIp, String attach, Date timeStart, Date timeExpire, double transportFee, @@ -80,8 +124,8 @@ public class PayPackageV2 extends PayPackage { setTotalFee(totalFee); setNotifyUrl(notifyUrl); setCreateIp(createIp); - setAttach(attach);; - setTimeStart(timeStart); + setAttach(attach); + setTimeStart(timeStart); setTimeExpire(timeExpire); setGoodsTag(goodsTag); this.bankType = "WX"; @@ -116,7 +160,7 @@ public class PayPackageV2 extends PayPackage { /** * 单位为元,自动格式化为分 - * + * * @param transportFee * 物流费用 单位为元 */ @@ -130,7 +174,7 @@ public class PayPackageV2 extends PayPackage { /** * 单位为元,自动格式化为分 - * + * * @param productFee * 商品 单位为元 */