From 1f220728918c58bef3834d7ca938d9a4211e10b2 Mon Sep 17 00:00:00 2001 From: egan Date: Wed, 21 Nov 2018 22:44:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/egzosn/pay/ali/api/AliPayService.java | 11 +- .../pay/ali/before/api/AliPayService.java | 13 +- .../com/egzosn/pay/common/util/DateUtils.java | 13 +- .../java/com/egzosn/pay/common/util/Util.java | 20 ++ .../egzosn/pay/fuiou/api/FuiouPayService.java | 8 +- .../pay/payoneer/api/PayoneerPayService.java | 7 +- .../pay/paypal/api/PayPalPayService.java | 5 +- .../egzosn/pay/union/api/UnionPayService.java | 240 +++++++++--------- .../wx/youdian/api/WxYouDianPayService.java | 6 +- .../com/egzosn/pay/wx/api/WxPayService.java | 46 ++-- .../egzosn/pay/wx/bean/WxTransactionType.java | 37 +++ 11 files changed, 227 insertions(+), 179 deletions(-) diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java index 3d94e2b..8189525 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java @@ -11,6 +11,7 @@ import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.UriVariables; import com.egzosn.pay.common.util.DateUtils; import com.egzosn.pay.common.util.MatrixToImageWriter; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import java.awt.image.BufferedImage; @@ -176,7 +177,7 @@ public class AliPayService extends BasePayService { bizContent.put("seller_id", payConfigStorage.getSeller()); bizContent.put("subject", order.getSubject()); bizContent.put("out_trade_no", order.getOutTradeNo()); - bizContent.put("total_amount", order.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + bizContent.put("total_amount", Util.conversionAmount(order.getPrice()).toString()); switch ((AliTransactionType) order.getTransactionType()) { case PAGE: case DIRECT: @@ -381,7 +382,7 @@ public class AliPayService extends BasePayService { if (!StringUtils.isEmpty(refundOrder.getRefundNo())) { bizContent.put("out_request_no", refundOrder.getRefundNo()); } - bizContent.put("refund_amount", refundOrder.getRefundAmount().setScale(2, BigDecimal.ROUND_HALF_UP)); + bizContent.put("refund_amount", Util.conversionAmount(refundOrder.getRefundAmount())); //设置请求参数的集合 parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 @@ -441,9 +442,7 @@ public class AliPayService extends BasePayService { Map bizContent = new TreeMap<>(); bizContent.put("bill_type", billType); //目前只支持日账单 - DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - df.setTimeZone(TimeZone.getTimeZone("GMT+8")); - bizContent.put("bill_date", df.format(billDate)); + bizContent.put("bill_date", DateUtils.formatDay(billDate)); //设置请求参数的集合 parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 @@ -501,7 +500,7 @@ public class AliPayService extends BasePayService { bizContent.put("payee_type", order.getTransferType().getType()); } bizContent.put("payee_account", order.getPayeeAccount()); - bizContent.put("amount", order.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP)); + bizContent.put("amount", Util.conversionAmount(order.getAmount())); bizContent.put("payer_show_name", order.getPayerName()); bizContent.put("payee_real_name", order.getPayeeName()); bizContent.put("remark", order.getRemark()); diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java index 7faac11..dff7756 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java @@ -11,6 +11,8 @@ import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.UriVariables; +import com.egzosn.pay.common.util.DateUtils; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import java.awt.image.BufferedImage; @@ -176,7 +178,7 @@ public class AliPayService extends BasePayService { orderInfo = orderInfo + "&out_trade_no=\"" + order.getOutTradeNo() + "\""; orderInfo = orderInfo + "&subject=\"" + order.getSubject() + "\""; orderInfo = orderInfo + "&body=\"" + order.getBody() + "\""; - orderInfo = orderInfo + "&total_fee=\"" + order.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString() + "\""; + orderInfo = orderInfo + "&total_fee=\"" + Util.conversionAmount(order.getPrice()).toString() + "\""; orderInfo = orderInfo + "¬ify_url=\"" + this.payConfigStorage.getNotifyUrl() + "\""; orderInfo = orderInfo + "&service=\"mobile.securitypay.pay\""; orderInfo = orderInfo + "&payment_type=\"1\""; @@ -207,7 +209,7 @@ public class AliPayService extends BasePayService { // 商品详情 orderInfo.put("body", order.getBody()); // 商品金额 - orderInfo.put("total_fee", order.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString() ); + orderInfo.put("total_fee", Util.conversionAmount(order.getPrice()).toString() ); // 服务器异步通知页面路径 orderInfo.put("notify_url", payConfigStorage.getNotifyUrl() ); // 服务接口名称, 固定值 @@ -222,7 +224,12 @@ public class AliPayService extends BasePayService { // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。 // 该参数数值不接受小数点,如1.5h,可转换为90m。 // TODO 2017/2/6 11:05 author: egan 目前写死,这一块建议配置 - orderInfo.put("it_b_pay", "30m"); + + if (null != order.getExpirationTime()) { + orderInfo.put("timeout_express", DateUtils.minutesRemaining(order.getExpirationTime()) + "m"); + }else { + orderInfo.put("it_b_pay", "30m"); + } // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空 orderInfo.put("return_url", payConfigStorage.getReturnUrl()); diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java index 812cae9..34ebd7a 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/DateUtils.java @@ -15,11 +15,18 @@ import java.util.TimeZone; */ public final class DateUtils { public static final DateFormat YYYY_MM_DD_HH_MM_SS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - public static final DateFormat YYYY_MM_DD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public static final DateFormat YYYY_MM_DD = new SimpleDateFormat("yyyy-MM-dd"); + public static final DateFormat YYYYMMDD = new SimpleDateFormat("yyyyMMdd"); + public static final DateFormat YYYYMMDDHHMMSS = new SimpleDateFormat("yyyyMMddHHmmss"); + public static final DateFormat MMDD = new SimpleDateFormat("MMdd"); static { - YYYY_MM_DD_HH_MM_SS.setTimeZone(TimeZone.getTimeZone("GMT+8")); - YYYY_MM_DD.setTimeZone(TimeZone.getTimeZone("GMT+8")); + TimeZone timeZone = TimeZone.getTimeZone("GMT+8"); + YYYY_MM_DD_HH_MM_SS.setTimeZone(timeZone); + YYYY_MM_DD.setTimeZone(timeZone); + YYYYMMDD.setTimeZone(timeZone); + YYYYMMDDHHMMSS.setTimeZone(timeZone); + MMDD.setTimeZone(timeZone); } public static final String format(Date date){ diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/Util.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/Util.java index e815768..ddfc6d6 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/Util.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/Util.java @@ -1,5 +1,6 @@ package com.egzosn.pay.common.util; +import java.math.BigDecimal; import java.math.BigInteger; public class Util{ @@ -610,4 +611,23 @@ public class Util{ return bt; } + + /** + * 元转分 + * @param amount 元的金额 + * @return 分的金额 + */ + public static final int conversionCentAmount(BigDecimal amount){ + return amount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + } + /** + * 元,两位小数 + * @param amount 元的金额 + * @return 元的金额 两位小数 + */ + public static final BigDecimal conversionAmount(BigDecimal amount){ + return amount.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + } \ No newline at end of file diff --git a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java b/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java index 03ad0b3..eb48071 100644 --- a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java +++ b/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayService.java @@ -5,6 +5,8 @@ import com.egzosn.pay.common.bean.*; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.UriVariables; +import com.egzosn.pay.common.util.DateUtils; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import java.awt.image.BufferedImage; @@ -163,7 +165,7 @@ public class FuiouPayService extends BasePayService { //商户订单号 parameters.put("order_id", order.getOutTradeNo()); //交易金额 - parameters.put("order_amt", order.getPrice().multiply(new BigDecimal(100)).setScale( 0, BigDecimal.ROUND_HALF_UP).intValue()); + parameters.put("order_amt", Util.conversionCentAmount(order.getPrice())); //交易币种 // parameters.put("cur_type", null == order.getCurType() ? FuiouCurType.CNY:order.getCurType()); //支付类型 @@ -174,7 +176,7 @@ public class FuiouPayService extends BasePayService { parameters.put("back_notify_url", StringUtils.isBlank(payConfigStorage.getNotifyUrl()) ? "" : payConfigStorage.getNotifyUrl()); if (null != order.getExpirationTime()){ - parameters.put("order_valid_time", ((order.getExpirationTime().getTime() - System.currentTimeMillis())/1000/60 + "m")); + parameters.put("order_valid_time", DateUtils.minutesRemaining(order.getExpirationTime()) + "m"); }else { //超时时间 1m-15天,m:分钟、h:小时、d天、1c当天有效, parameters.put("order_valid_time", "30m"); @@ -388,7 +390,7 @@ public class FuiouPayService extends BasePayService { //原订单号 params.put("origin_order_id", refundOrder.getTradeNo()); //退款金额 - params.put("refund_amt", refundOrder.getRefundAmount().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); + params.put("refund_amt", Util.conversionCentAmount(refundOrder.getRefundAmount())); //备注 params.put("rem", ""); params.put("md5", createSign(SignUtils.parameters2MD5Str(params, "|"), payConfigStorage.getInputCharset())); diff --git a/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java index 548327f..49e5b71 100644 --- a/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java +++ b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java @@ -11,9 +11,10 @@ import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.HttpHeader; import com.egzosn.pay.common.http.HttpStringEntity; import com.egzosn.pay.common.http.UriVariables; +import com.egzosn.pay.common.util.DateUtils; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.payoneer.bean.PayoneerTransactionType; import org.apache.http.Header; -import org.apache.http.client.utils.DateUtils; import org.apache.http.entity.ContentType; import org.apache.http.message.BasicHeader; @@ -176,7 +177,7 @@ public class PayoneerPayService extends BasePayService im public Map orderInfo(PayOrder order) { Map params = new HashMap<>(7); params.put("payee_id", order.getAuthCode()); - params.put("amount", order.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP)); + params.put("amount", Util.conversionAmount(order.getPrice())); params.put("client_reference_id", order.getOutTradeNo()); if (null == order.getCurType()) { order.setCurType(CurType.USD); @@ -416,7 +417,7 @@ public class PayoneerPayService extends BasePayService im payOrder.setOutTradeNo(order.getOutNo()); Map info = orderInfo(payOrder); - info.put("payout_date", DateUtils.formatDate(new Date(), "yyyy-MM-dd")); + info.put("payout_date", DateUtils.formatDay(new Date())); info.put("group_id", order.getPayerName()); HttpStringEntity entity = new HttpStringEntity(JSON.toJSONString(info), ContentType.APPLICATION_JSON); entity.setHeaders(authHeader()); diff --git a/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java b/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java index 508922b..0a0a1ab 100644 --- a/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java +++ b/pay-java-paypal/src/main/java/com/egzosn/pay/paypal/api/PayPalPayService.java @@ -9,6 +9,7 @@ import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpHeader; import com.egzosn.pay.common.http.HttpStringEntity; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.paypal.bean.PayPalTransactionType; import com.egzosn.pay.paypal.bean.order.*; @@ -151,7 +152,7 @@ public class PayPalPayService extends BasePayService{ order.setCurType(CurType.USD); } amount.setCurrency(order.getCurType().name()); - amount.setTotal(order.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + amount.setTotal(Util.conversionAmount(order.getPrice()).toString()); Transaction transaction = new Transaction(); if (!StringUtils.isEmpty(order.getSubject())){ @@ -262,7 +263,7 @@ public class PayPalPayService extends BasePayService{ if (null != refundOrder.getRefundAmount() && BigDecimal.ZERO.compareTo( refundOrder.getRefundAmount()) > 0){ Amount amount = new Amount(); amount.setCurrency(refundOrder.getCurType().name()); - amount.setTotal(refundOrder.getRefundAmount().toString()); + amount.setTotal(Util.conversionAmount(refundOrder.getRefundAmount()).toString()); request.put("amount", amount); request.put("description", refundOrder.getDescription()); } diff --git a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java index 3885979..50ee41b 100644 --- a/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java +++ b/pay-java-union/src/main/java/com/egzosn/pay/union/api/UnionPayService.java @@ -8,13 +8,15 @@ import com.egzosn.pay.common.bean.result.PayException; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.http.UriVariables; +import com.egzosn.pay.common.util.DateUtils; import com.egzosn.pay.common.util.MatrixToImageWriter; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.CertDescriptor; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.sign.encrypt.RSA; import com.egzosn.pay.common.util.sign.encrypt.RSA2; -import com.egzosn.pay.union.bean.UnionTransactionType; import com.egzosn.pay.union.bean.SDKConstants; +import com.egzosn.pay.union.bean.UnionTransactionType; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -27,10 +29,10 @@ import java.util.*; /** * @author Actinia - *
- * email hayesfu@qq.com
- * create 2017 2017/11/5
- * 
+ *
+ *         email hayesfu@qq.com
+ *         create 2017 2017/11/5
+ *         
*/ public class UnionPayService extends BasePayService { /** @@ -44,74 +46,74 @@ public class UnionPayService extends BasePayService { /** * 交易请求地址 */ - private static final String FRONT_TRANS_URL= "https://gateway.%s/gateway/api/frontTransReq.do"; - private static final String BACK_TRANS_URL= "https://gateway.%s/gateway/api/backTransReq.do"; - private static final String SINGLE_QUERY_URL= "https://gateway.%s/gateway/api/queryTrans.do"; - private static final String BATCH_TRANS_URL= "https://gateway.%s/gateway/api/batchTrans.do"; - private static final String FILE_TRANS_URL= "https://filedownload.%s/"; - private static final String APP_TRANS_URL= "https://gateway.%s/gateway/api/appTransReq.do"; - private static final String CARD_TRANS_URL= "https://gateway.%s/gateway/api/cardTransReq.do"; - public static final DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); - static { - df.setTimeZone(TimeZone.getTimeZone("GMT+8")); - } + private static final String FRONT_TRANS_URL = "https://gateway.%s/gateway/api/frontTransReq.do"; + private static final String BACK_TRANS_URL = "https://gateway.%s/gateway/api/backTransReq.do"; + private static final String SINGLE_QUERY_URL = "https://gateway.%s/gateway/api/queryTrans.do"; + private static final String BATCH_TRANS_URL = "https://gateway.%s/gateway/api/batchTrans.do"; + private static final String FILE_TRANS_URL = "https://filedownload.%s/"; + private static final String APP_TRANS_URL = "https://gateway.%s/gateway/api/appTransReq.do"; + private static final String CARD_TRANS_URL = "https://gateway.%s/gateway/api/cardTransReq.do"; /** * 构造函数 + * * @param payConfigStorage 支付配置 */ - public UnionPayService (UnionPayConfigStorage payConfigStorage) { + public UnionPayService(UnionPayConfigStorage payConfigStorage) { super(payConfigStorage); } - public UnionPayService (UnionPayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { + public UnionPayService(UnionPayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { super(payConfigStorage, configStorage); } + /** * 设置支付配置 + * * @param payConfigStorage 支付配置 */ @Override public UnionPayService setPayConfigStorage(UnionPayConfigStorage payConfigStorage) { super.setPayConfigStorage(payConfigStorage); - if (!payConfigStorage.isCertSign()){ + if (!payConfigStorage.isCertSign()) { return this; } CertDescriptor certDescriptor = payConfigStorage.getCertDescriptor(); - if (!payConfigStorage.isKeyPrivateInit()){ + if (!payConfigStorage.isKeyPrivateInit()) { certDescriptor.initPrivateSignCert(payConfigStorage.getKeyPrivate(), payConfigStorage.getKeyPrivateCertPwd(), "PKCS12"); } - if (!payConfigStorage.isKeyPublicInit()){ + if (!payConfigStorage.isKeyPublicInit()) { certDescriptor.initPublicCert(payConfigStorage.getAcpMiddleCert()); certDescriptor.initRootCert(payConfigStorage.getAcpRootCert()); } return this; } + /** * 根据是否为沙箱环境进行获取请求地址 * * @return 请求地址 */ public String getReqUrl() { - return (payConfigStorage.isTest() ? TEST_BASE_DOMAIN : RELEASE_BASE_DOMAIN) ; + return (payConfigStorage.isTest() ? TEST_BASE_DOMAIN : RELEASE_BASE_DOMAIN); } - public String getFrontTransUrl () { - return String.format(FRONT_TRANS_URL, getReqUrl()); + public String getFrontTransUrl() { + return String.format(FRONT_TRANS_URL, getReqUrl()); } - public String getBackTransUrl () { + public String getBackTransUrl() { return String.format(BACK_TRANS_URL, getReqUrl()); } - public String getSingleQueryUrl () { - return String.format(SINGLE_QUERY_URL,getReqUrl()); + public String getSingleQueryUrl() { + return String.format(SINGLE_QUERY_URL, getReqUrl()); } - public String getFileTransUrl () { + public String getFileTransUrl() { return String.format(FILE_TRANS_URL, getReqUrl()); } @@ -148,7 +150,6 @@ public class UnionPayService extends BasePayService { * 回调校验 * * @param result 回调回来的参数集 - * * @return 签名校验 true通过 */ @Override @@ -169,21 +170,21 @@ public class UnionPayService extends BasePayService { * @return 签名校验 true通过 */ @Override - public boolean signVerify (Map params, String sign) { + public boolean signVerify(Map params, String sign) { SignUtils signUtils = SignUtils.valueOf(payConfigStorage.getSignType()); String data = SignUtils.parameterText(params, "&", "signature"); - switch (signUtils){ + switch (signUtils) { case RSA: - data = SignUtils.SHA1.createSign(data,"", payConfigStorage.getInputCharset()); - return RSA.verify(data, sign, verifyCertificate(genCertificateByStr((String)params.get(SDKConstants.param_signPubKeyCert))).getPublicKey(), payConfigStorage.getInputCharset()); + data = SignUtils.SHA1.createSign(data, "", payConfigStorage.getInputCharset()); + return RSA.verify(data, sign, verifyCertificate(genCertificateByStr((String) params.get(SDKConstants.param_signPubKeyCert))).getPublicKey(), payConfigStorage.getInputCharset()); case RSA2: - data = SignUtils.SHA256.createSign(data,"", payConfigStorage.getInputCharset()); - return RSA2.verify(data, sign, verifyCertificate(genCertificateByStr((String)params.get(SDKConstants.param_signPubKeyCert))).getPublicKey(), payConfigStorage.getInputCharset()); + data = SignUtils.SHA256.createSign(data, "", payConfigStorage.getInputCharset()); + return RSA2.verify(data, sign, verifyCertificate(genCertificateByStr((String) params.get(SDKConstants.param_signPubKeyCert))).getPublicKey(), payConfigStorage.getInputCharset()); case SHA1: case SHA256: case SM3: - String before = signUtils.createSign(payConfigStorage.getKeyPublic(),"",payConfigStorage.getInputCharset()); + String before = signUtils.createSign(payConfigStorage.getKeyPublic(), "", payConfigStorage.getInputCharset()); return signUtils.verify(data, sign, "&" + before, payConfigStorage.getInputCharset()); default: return false; @@ -210,68 +211,66 @@ public class UnionPayService extends BasePayService { * @see PayOrder 支付订单信息 */ @Override - public Map orderInfo(PayOrder order) { + public Map orderInfo(PayOrder order) { Map params = this.getCommonParam(); - UnionTransactionType type = (UnionTransactionType)order.getTransactionType(); + UnionTransactionType type = (UnionTransactionType) order.getTransactionType(); //设置交易类型相关的参数 type.convertMap(params); params.put(SDKConstants.param_orderId, order.getOutTradeNo()); - switch (type){ + switch (type) { case WAP: case WEB: case B2B: - params.put(SDKConstants.param_txnAmt,conversion(order.getPrice())); + params.put(SDKConstants.param_txnAmt, Util.conversionCentAmount(order.getPrice())); params.put("orderDesc", order.getSubject()); // 订单超时时间。 // 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。 // 此时间建议取支付时的北京时间加15分钟。 // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。 - if (null != order.getExpirationTime()){ + if (null != order.getExpirationTime()) { params.put(SDKConstants.param_payTimeout, order.getExpirationTime()); - }else { - params.put(SDKConstants.param_payTimeout, df.format(System.currentTimeMillis() + 30 * 60 * 1000)); + } else { + params.put(SDKConstants.param_payTimeout, DateUtils.YYYYMMDDHHMMSS.format(System.currentTimeMillis() + 30 * 60 * 1000)); } params.put(SDKConstants.param_frontUrl, payConfigStorage.getReturnUrl()); break; case CONSUME: - params.put(SDKConstants.param_txnAmt,conversion(order.getPrice())); + params.put(SDKConstants.param_txnAmt, Util.conversionCentAmount(order.getPrice())); params.put(SDKConstants.param_qrNo, order.getAuthCode()); break; default: } - return setSign(params); + return setSign(params); } - - - /** - * 生成并设置签名 + * 生成并设置签名 + * * @param parameters 请求参数 * @return 请求参数 */ - private Map setSign(Map parameters){ + private Map setSign(Map parameters) { SignUtils signUtils = SignUtils.valueOf(payConfigStorage.getSignType()); String signStr; - switch (signUtils){ + switch (signUtils) { case RSA: parameters.put(SDKConstants.param_signMethod, SDKConstants.SIGNMETHOD_RSA); parameters.put(SDKConstants.param_certId, payConfigStorage.getCertDescriptor().getSignCertId()); - signStr = SignUtils.SHA1.createSign( SignUtils.parameterText(parameters, "&", "signature"),"", payConfigStorage.getInputCharset()); + signStr = SignUtils.SHA1.createSign(SignUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset()); parameters.put(SDKConstants.param_signature, RSA.sign(signStr, payConfigStorage.getCertDescriptor().getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset())); break; case RSA2: parameters.put(SDKConstants.param_signMethod, SDKConstants.SIGNMETHOD_RSA); parameters.put(SDKConstants.param_certId, payConfigStorage.getCertDescriptor().getSignCertId()); - signStr = SignUtils.SHA256.createSign( SignUtils.parameterText(parameters, "&", "signature"),"", payConfigStorage.getInputCharset()); + signStr = SignUtils.SHA256.createSign(SignUtils.parameterText(parameters, "&", "signature"), "", payConfigStorage.getInputCharset()); parameters.put(SDKConstants.param_signature, RSA2.sign(signStr, payConfigStorage.getCertDescriptor().getSignCertPrivateKey(payConfigStorage.getKeyPrivateCertPwd()), payConfigStorage.getInputCharset())); break; case SHA1: @@ -279,7 +278,7 @@ public class UnionPayService extends BasePayService { case SM3: String key = payConfigStorage.getKeyPrivate(); signStr = SignUtils.parameterText(parameters, "&", "signature"); - key = signUtils.createSign(key,"",payConfigStorage.getInputCharset()) + "&"; + key = signUtils.createSign(key, "", payConfigStorage.getInputCharset()) + "&"; parameters.put(SDKConstants.param_signature, signUtils.createSign(signStr, key, payConfigStorage.getInputCharset())); break; default: @@ -291,12 +290,12 @@ public class UnionPayService extends BasePayService { } - /** * 验证证书链 + * * @param cert 需要验证的证书 */ - private X509Certificate verifyCertificate (X509Certificate cert) { + private X509Certificate verifyCertificate(X509Certificate cert) { try { cert.checkValidity();//验证有效期 X509Certificate middleCert = payConfigStorage.getCertDescriptor().getPublicCert(); @@ -307,8 +306,7 @@ public class UnionPayService extends BasePayService { Set trustAnchors = new HashSet(); trustAnchors.add(new TrustAnchor(rootCert, null)); - PKIXBuilderParameters pkixParams = new PKIXBuilderParameters( - trustAnchors, selector); + PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(trustAnchors, selector); Set intermediateCerts = new HashSet(); intermediateCerts.add(rootCert); @@ -317,8 +315,7 @@ public class UnionPayService extends BasePayService { pkixParams.setRevocationEnabled(false); - CertStore intermediateCertStore = CertStore.getInstance("Collection", - new CollectionCertStoreParameters(intermediateCerts)); + CertStore intermediateCertStore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(intermediateCerts)); pkixParams.addCertStore(intermediateCertStore); CertPathBuilder builder = CertPathBuilder.getInstance("PKIX"); @@ -337,6 +334,7 @@ public class UnionPayService extends BasePayService { } return null; } + /** * 获取输出二维码,用户返回给支付端, * @@ -344,19 +342,19 @@ public class UnionPayService extends BasePayService { * @return 返回图片信息,支付时需要的 */ @Override - public BufferedImage genQrPay (PayOrder order) { - Map params = orderInfo(order); - String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,String.class); - Map response = UriVariables.getParametersToMap(responseStr); - if(response.isEmpty()){ - throw new PayErrorException(new PayException("failure", "响应内容有误!",responseStr)); + public BufferedImage genQrPay(PayOrder order) { + Map params = orderInfo(order); + String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class); + Map response = UriVariables.getParametersToMap(responseStr); + if (response.isEmpty()) { + throw new PayErrorException(new PayException("failure", "响应内容有误!", responseStr)); } - if(this.verify(response)){ - if(SDKConstants.OK_RESP_CODE.equals(response.get(SDKConstants.param_respCode))){ + if (this.verify(response)) { + if (SDKConstants.OK_RESP_CODE.equals(response.get(SDKConstants.param_respCode))) { //成功,获取tn号 - return MatrixToImageWriter.writeInfoToJpgBuff((String)response.get(SDKConstants.param_qrCode)); + return MatrixToImageWriter.writeInfoToJpgBuff((String) response.get(SDKConstants.param_qrCode)); } - throw new PayErrorException(new PayException((String)response.get(SDKConstants.param_respCode), (String)response.get(SDKConstants.param_respMsg), responseStr)); + throw new PayErrorException(new PayException((String) response.get(SDKConstants.param_respCode), (String) response.get(SDKConstants.param_respMsg), responseStr)); } throw new PayErrorException(new PayException("failure", "验证签名失败", responseStr)); } @@ -368,9 +366,9 @@ public class UnionPayService extends BasePayService { * @return 返回支付结果 */ @Override - public Map microPay (PayOrder order) { - Map params = orderInfo(order); - String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,String.class); + public Map microPay(PayOrder order) { + Map params = orderInfo(order); + String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class); return UriVariables.getParametersToMap(responseStr); } @@ -385,11 +383,10 @@ public class UnionPayService extends BasePayService { X509Certificate x509Cert = null; try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); - InputStream tIn = new ByteArrayInputStream( - x509CertString.getBytes("ISO-8859-1")); + InputStream tIn = new ByteArrayInputStream(x509CertString.getBytes("ISO-8859-1")); x509Cert = (X509Certificate) cf.generateCertificate(tIn); } catch (Exception e) { - throw new PayErrorException(new PayException("证书加载失败", "gen certificate error:"+e.getLocalizedMessage() )); + throw new PayErrorException(new PayException("证书加载失败", "gen certificate error:" + e.getLocalizedMessage())); } return x509Cert; } @@ -402,7 +399,7 @@ public class UnionPayService extends BasePayService { * @return 返回输出消息 */ @Override - public PayOutMessage getPayOutMessage (String code, String message) { + public PayOutMessage getPayOutMessage(String code, String message) { return PayTextOutMessage.TEXT().content(code.toLowerCase()).build(); } @@ -414,16 +411,15 @@ public class UnionPayService extends BasePayService { * @return 返回输出消息 */ @Override - public PayOutMessage successPayOutMessage (PayMessage payMessage) { + public PayOutMessage successPayOutMessage(PayMessage payMessage) { return getPayOutMessage("ok", null); } /** * 获取输出消息,用户返回给支付端, 针对于web端 * - * @param orderInfo 发起支付的订单信息 - * @param method 请求方式 "post" "get", - * + * @param orderInfo 发起支付的订单信息 + * @param method 请求方式 "post" "get", * @return 获取输出消息,用户返回给支付端, 针对于web端 * @see MethodType 请求类型 */ @@ -431,9 +427,9 @@ public class UnionPayService extends BasePayService { public String buildRequest(Map orderInfo, MethodType method) { StringBuffer sf = new StringBuffer(); sf.append(""); - sf.append("
"); + sf.append(""); if (null != orderInfo && 0 != orderInfo.size()) { - for ( Map.Entry entry: orderInfo.entrySet()) { + for (Map.Entry entry : orderInfo.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); sf.append(""); @@ -449,20 +445,18 @@ public class UnionPayService extends BasePayService { } - /** * 交易查询接口 * * @param tradeNo 支付平台订单号 * @param outTradeNo 商户单号 - * * @return 返回查询回来的结果集,支付方原值返回 */ @Override public Map query(String tradeNo, String outTradeNo) { - Map params = this.getCommonParam(); + Map params = this.getCommonParam(); UnionTransactionType.QUERY.convertMap(params); - params.put(SDKConstants.param_orderId,outTradeNo); + params.put(SDKConstants.param_orderId, outTradeNo); this.setSign(params); String responseStr = getHttpRequestTemplate().postForObject(this.getSingleQueryUrl(), params, String.class); JSONObject response = UriVariables.getParametersToMap(responseStr); @@ -483,35 +477,37 @@ public class UnionPayService extends BasePayService { /** - * 消费撤销/退货接口 - * @param origQryId 原交易查询流水号. - * @param orderId 退款单号 + * 消费撤销/退货接口 + * + * @param origQryId 原交易查询流水号. + * @param orderId 退款单号 * @param refundAmount 退款金额 - * @param type UnionTransactionType.REFUND 或者UnionTransactionType.CONSUME_UNDO + * @param type UnionTransactionType.REFUND 或者UnionTransactionType.CONSUME_UNDO * @return 返回支付方申请退款后的结果 */ - public Map unionRefundOrConsumeUndo (String origQryId, String orderId, BigDecimal refundAmount,UnionTransactionType type) { - return unionRefundOrConsumeUndo(new RefundOrder(orderId, origQryId,refundAmount ), type); + public Map unionRefundOrConsumeUndo(String origQryId, String orderId, BigDecimal refundAmount, UnionTransactionType type) { + return unionRefundOrConsumeUndo(new RefundOrder(orderId, origQryId, refundAmount), type); } /** - * 消费撤销/退货接口 - * @param refundOrder 退款订单信息 - * @param type UnionTransactionType.REFUND 或者UnionTransactionType.CONSUME_UNDO + * 消费撤销/退货接口 + * + * @param refundOrder 退款订单信息 + * @param type UnionTransactionType.REFUND 或者UnionTransactionType.CONSUME_UNDO * @return 返回支付方申请退款后的结果 */ - public Map unionRefundOrConsumeUndo (RefundOrder refundOrder,UnionTransactionType type) { - Map params = this.getCommonParam(); + public Map unionRefundOrConsumeUndo(RefundOrder refundOrder, UnionTransactionType type) { + Map params = this.getCommonParam(); type.convertMap(params); params.put(SDKConstants.param_orderId, refundOrder.getRefundNo()); - params.put(SDKConstants.param_txnAmt, conversion(refundOrder.getRefundAmount())); + params.put(SDKConstants.param_txnAmt, Util.conversionCentAmount(refundOrder.getRefundAmount())); params.put(SDKConstants.param_origQryId, refundOrder.getTradeNo()); this.setSign(params); - String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(),params,String.class); - JSONObject response = UriVariables.getParametersToMap(responseStr); - if(this.verify(response)){ - if(SDKConstants.OK_RESP_CODE.equals(response.getString(SDKConstants.param_respCode))){ + String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class); + JSONObject response = UriVariables.getParametersToMap(responseStr); + if (this.verify(response)) { + if (SDKConstants.OK_RESP_CODE.equals(response.getString(SDKConstants.param_respCode))) { // String origRespCode = response.getString(SDKConstants.param_origRespCode); //交易成功,更新商户订单状态 //TODO @@ -522,6 +518,7 @@ public class UnionPayService extends BasePayService { } throw new PayErrorException(new PayException("failure", "验证签名失败", response.toJSONString())); } + /** * 交易关闭接口 * @@ -530,7 +527,7 @@ public class UnionPayService extends BasePayService { * @return 返回支付方交易关闭后的结果 */ @Override - public Map close (String tradeNo, String outTradeNo) { + public Map close(String tradeNo, String outTradeNo) { return Collections.emptyMap(); } @@ -546,13 +543,11 @@ public class UnionPayService extends BasePayService { */ @Deprecated @Override - public Map refund (String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { + public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { return refund(new RefundOrder(tradeNo, outTradeNo, refundAmount, totalAmount)); } - - @Override public Map refund(RefundOrder refundOrder) { return unionRefundOrConsumeUndo(refundOrder, UnionTransactionType.REFUND); @@ -566,12 +561,11 @@ public class UnionPayService extends BasePayService { * @return 返回支付方查询退款后的结果 */ @Override - public Map refundquery (String tradeNo, String outTradeNo) { + public Map refundquery(String tradeNo, String outTradeNo) { return Collections.emptyMap(); } - /** * 查询退款 * @@ -591,19 +585,19 @@ public class UnionPayService extends BasePayService { * @return 返回fileContent 请自行将数据落地 */ @Override - public Map downloadbill (Date billDate, String billType) { - Map params = this.getCommonParam(); + public Map downloadbill(Date billDate, String billType) { + Map params = this.getCommonParam(); UnionTransactionType.FILE_TRANSFER.convertMap(params); - DateFormat df = new SimpleDateFormat("MMdd"); - params.put(SDKConstants.param_settleDate,df.format(billDate)); - params.put(SDKConstants.param_fileType,billType); + + params.put(SDKConstants.param_settleDate, DateUtils.MMDD.format(billDate)); + params.put(SDKConstants.param_fileType, billType); params.remove(SDKConstants.param_backUrl); params.remove(SDKConstants.param_currencyCode); this.setSign(params); - String responseStr = getHttpRequestTemplate().postForObject(this.getFileTransUrl(),params,String.class); - JSONObject response = UriVariables.getParametersToMap(responseStr); - if(this.verify(response)){ - if(SDKConstants.OK_RESP_CODE.equals(response.get(SDKConstants.param_respCode))){ + String responseStr = getHttpRequestTemplate().postForObject(this.getFileTransUrl(), params, String.class); + JSONObject response = UriVariables.getParametersToMap(responseStr); + if (this.verify(response)) { + if (SDKConstants.OK_RESP_CODE.equals(response.get(SDKConstants.param_respCode))) { return response; } @@ -619,7 +613,6 @@ public class UnionPayService extends BasePayService { * 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} * @param outTradeNoBillType 商户单号或者 账单类型 * @param transactionType 交易类型 - * * @return 返回支付方对应接口的结果 */ @Override @@ -627,12 +620,5 @@ public class UnionPayService extends BasePayService { return Collections.emptyMap(); } - /** - * 元转分 - * @param amount 元的金额 - * @return 分的金额 - */ - public int conversion(BigDecimal amount){ - return amount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); - } + } diff --git a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java index 8d2bd4b..701b734 100644 --- a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java +++ b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java @@ -8,6 +8,7 @@ import com.egzosn.pay.common.bean.result.PayError; import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.util.MatrixToImageWriter; +import com.egzosn.pay.common.util.Util; import com.egzosn.pay.common.util.sign.SignUtils; import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.wx.youdian.bean.YdPayError; @@ -224,7 +225,7 @@ public class WxYouDianPayService extends BasePayService data = new TreeMap<>(); data.put("access_token", getAccessToken()); - data.put("paymoney", order.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + data.put("paymoney", Util.conversionAmount(order.getPrice()).toString()); String apbNonce = SignUtils.randomStr(); String sign = createSign(SignUtils.parameterText(data, "") + apbNonce, payConfigStorage.getInputCharset()); data.put("PayMoney", data.remove("paymoney")); @@ -272,8 +273,7 @@ public class WxYouDianPayService extends BasePayService { public static final String CIPHER_ALGORITHM = "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING"; public static final String FAILURE = "failure"; public static final String APPID = "appid"; - private static final DateFormat downloadbillDf = new SimpleDateFormat("yyyyMMdd"); private static final String HMAC_SHA256 = "HMAC-SHA256"; private static final String HMACSHA256 = "HMACSHA256"; - private static final DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + private static final String RETURN_MSG_CODE = "return_msg"; + - { - TimeZone timeZone = TimeZone.getTimeZone("GMT+8"); - downloadbillDf.setTimeZone(timeZone); - df.setTimeZone(timeZone); - } @@ -197,15 +192,15 @@ public class WxPayService extends BasePayService { // parameters.put("detail", order.getBody());// 购买支付信息 parameters.put("out_trade_no", order.getOutTradeNo());// 订单号 parameters.put("spbill_create_ip", StringUtils.isEmpty(order.getSpbillCreateIp()) ? "192.168.1.150" : order.getSpbillCreateIp() ); - parameters.put("total_fee", conversion( order.getPrice()));// 总金额单位为分 + parameters.put("total_fee", Util.conversionCentAmount( order.getPrice()));// 总金额单位为分 if (StringUtils.isNotEmpty(order.getAddition())){ parameters.put("attach", order.getAddition()); } parameters.put("notify_url", payConfigStorage.getNotifyUrl()); parameters.put("trade_type", order.getTransactionType().getType()); if (null != order.getExpirationTime()){ - parameters.put("time_start", df.format(new Date())); - parameters.put("time_expire", df.format(order.getExpirationTime())); + parameters.put("time_start", DateUtils.YYYYMMDDHHMMSS.format(new Date())); + parameters.put("time_expire", DateUtils.YYYYMMDDHHMMSS.format(order.getExpirationTime())); } ((WxTransactionType) order.getTransactionType()).setAttribute(parameters, order); @@ -217,7 +212,7 @@ public class WxPayService extends BasePayService { JSONObject result = requestTemplate.postForObject(getUrl(order.getTransactionType()), requestXML, JSONObject.class); if (!SUCCESS.equals(result.get(RETURN_CODE))) { - throw new PayErrorException(new WxPayError(result.getString(RETURN_CODE), result.getString("return_msg"), result.toJSONString())); + throw new PayErrorException(new WxPayError(result.getString(RETURN_CODE), result.getString(RETURN_MSG_CODE), result.toJSONString())); } return result; } @@ -239,7 +234,7 @@ public class WxPayService extends BasePayService { // 对微信返回的数据进行校验 if (verify(result)) { //如果是扫码支付或者刷卡付无需处理,直接返回 - if (WxTransactionType.NATIVE == order.getTransactionType() || WxTransactionType.MICROPAY == order.getTransactionType() || WxTransactionType.MWEB == order.getTransactionType()) { + if (((WxTransactionType)order.getTransactionType()).isReturn()) { return result; } @@ -263,7 +258,7 @@ public class WxPayService extends BasePayService { params.put(SIGN, paySign); return params; } - throw new PayErrorException(new WxPayError(result.getString(RETURN_CODE), result.getString("return_msg"), "Invalid sign value")); + throw new PayErrorException(new WxPayError(result.getString(RETURN_CODE), result.getString(RETURN_MSG_CODE), "Invalid sign value")); } @@ -352,7 +347,7 @@ public class WxPayService extends BasePayService { @Override public String buildRequest(Map orderInfo, MethodType method) { if (!SUCCESS.equals(orderInfo.get(RETURN_CODE))) { - throw new PayErrorException(new WxPayError((String) orderInfo.get(RETURN_CODE), (String) orderInfo.get("return_msg"))); + throw new PayErrorException(new WxPayError((String) orderInfo.get(RETURN_CODE), (String) orderInfo.get(RETURN_MSG_CODE))); } if (WxTransactionType.MWEB.name().equals(orderInfo.get("trade_type"))) { return String.format("",orderInfo.get("mweb_url"), StringUtils.isEmpty(payConfigStorage.getReturnUrl()) ? "" : "&redirect_url=" + URLEncoder.encode(payConfigStorage.getReturnUrl())); @@ -459,8 +454,8 @@ public class WxPayService extends BasePayService { setParameters(parameters, "transaction_id", refundOrder.getTradeNo()); setParameters(parameters, "out_trade_no", refundOrder.getOutTradeNo()); setParameters(parameters, "out_refund_no", refundOrder.getRefundNo()); - parameters.put("total_fee", conversion(refundOrder.getTotalAmount())); - parameters.put("refund_fee", conversion(refundOrder.getRefundAmount())); + parameters.put("total_fee", Util.conversionCentAmount(refundOrder.getTotalAmount())); + parameters.put("refund_fee", Util.conversionCentAmount(refundOrder.getRefundAmount())); parameters.put("op_user_id", payConfigStorage.getPid()); //设置签名 @@ -520,7 +515,7 @@ public class WxPayService extends BasePayService { parameters.put("bill_type", billType); //目前只支持日账单 - parameters.put("bill_date", downloadbillDf.format(billDate)); + parameters.put("bill_date", DateUtils.YYYYMMDD.format(billDate)); //设置签名 setSign(parameters); @@ -531,7 +526,7 @@ public class WxPayService extends BasePayService { Map ret = new HashMap(); ret.put(RETURN_CODE, SUCCESS); - ret.put("return_msg", "ok"); + ret.put(RETURN_MSG_CODE, "ok"); ret.put("data", respStr); return ret; } @@ -596,7 +591,7 @@ public class WxPayService extends BasePayService { parameters.put("mch_id", payConfigStorage.getPid()); parameters.put("partner_trade_no", order.getOutNo()); - parameters.put("amount", conversion(order.getAmount())); + parameters.put("amount", Util.conversionCentAmount(order.getAmount())); if (!StringUtils.isEmpty(order.getRemark())){ parameters.put("desc", order.getRemark()); } @@ -681,14 +676,7 @@ public class WxPayService extends BasePayService { return getHttpRequestTemplate().postForObject(getUrl(QUERY_BANK), XML.getMap2Xml(parameters), JSONObject.class); } - /** - * 元转分 - * @param amount 元的金额 - * @return 分的金额 - */ - public int conversion(BigDecimal amount){ - return amount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); - } + public String keyPublic(String content){ try { diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java index c7028c5..d399d37 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/bean/WxTransactionType.java @@ -32,6 +32,16 @@ public enum WxTransactionType implements TransactionType { public void setAttribute(Map parameters, PayOrder order) { parameters.put("product_id", order.getOutTradeNo()); } + + /** + * 是否直接返回 + * + * @return 是否直接返回 + */ + @Override + public boolean isReturn() { + return true; + } }, /** * 移动支付 @@ -54,6 +64,15 @@ public enum WxTransactionType implements TransactionType { sceneInfo.put("h5_info", value); parameters.put("scene_info", sceneInfo.toJSONString()); } + /** + * 是否直接返回 + * + * @return 是否直接返回 + */ + @Override + public boolean isReturn() { + return true; + } }, /** * 刷卡付 @@ -65,6 +84,15 @@ public enum WxTransactionType implements TransactionType { parameters.remove("notify_url"); parameters.remove("trade_type"); } + /** + * 是否直接返回 + * + * @return 是否直接返回 + */ + @Override + public boolean isReturn() { + return true; + } }, // TODO 2017/3/8 19:14 author: egan 交易辅助接口 /** @@ -113,6 +141,15 @@ public enum WxTransactionType implements TransactionType { public String getMethod() { return this.method; } + + /** + * 是否直接返回 + * @return 是否直接返回 + */ + public boolean isReturn(){ + return false; + } + public void setAttribute(Map parameters, PayOrder order){ }