From 8619430ae50d3e93f21c041f178e1a06946128d4 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 26 Sep 2016 22:43:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9E=84=E9=80=A0=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=8F=82=E6=95=B0=E7=9A=84=E9=87=8D=E8=BD=BD=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E5=87=86=E5=A4=87=E6=9B=BF=E6=8D=A2=E5=8E=9F?= =?UTF-8?q?=E6=9C=89=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 13 ++++++- .../mp/api/impl/WxMpPayServiceImpl.java | 39 ++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 3a4128fe..8308c1d8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -65,9 +65,18 @@ public interface WxMpPayService { * 详见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN * * @param parameters the required or optional parameters + * @deprecated use me.chanjar.weixin.mp.api.WxMpPayService.getPayInfo(WxUnifiedOrderRequest) instead. */ + @Deprecated Map getPayInfo(Map parameters) throws WxErrorException; + /** + * 该接口调用“统一下单”接口,并拼装发起支付请求需要的参数 + * 详见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN + * + */ + Map getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException; + /** * 该接口调用“统一下单”接口,并拼装NATIVE发起支付请求需要的参数 * 详见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN @@ -79,7 +88,7 @@ public interface WxMpPayService { * @param body 商品描述 * @param ip 发起支付的客户端IP * @param notifyUrl 通知地址 - * @deprecated Use me.chanjar.weixin.mp.api.WxMpPayService.getPayInfo(Map) instead + * @deprecated Use me.chanjar.weixin.mp.api.WxMpPayService.getPayInfo(WxUnifiedOrderRequest) instead */ @Deprecated Map getNativePayInfo(String productId, String outTradeNo, double amt, String body, String ip, String notifyUrl) throws WxErrorException; @@ -95,7 +104,7 @@ public interface WxMpPayService { * @param body 商品描述 * @param ip 发起支付的客户端IP * @param notifyUrl 通知地址 - * @deprecated Use me.chanjar.weixin.mp.api.WxMpPayService.getPayInfo(Map) instead + * @deprecated Use me.chanjar.weixin.mp.api.WxMpPayService.getPayInfo(WxUnifiedOrderRequest) instead */ @Deprecated Map getJsapiPayInfo(String openId, String outTradeNo, double amt, String body, String ip, String notifyUrl) throws WxErrorException; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index b8ec8acb..637b6fd5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -9,6 +9,7 @@ import java.util.SortedMap; import java.util.TreeMap; import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; import org.joor.Reflect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -168,6 +169,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { } @Override + @Deprecated public Map getPayInfo(Map parameters) throws WxErrorException { WxMpPrepayIdResult wxMpPrepayIdResult = getPrepayId(parameters); @@ -477,7 +479,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { if (!TRADE_TYPES.contains(request.getTradeType())) { throw new IllegalArgumentException( - "trade_type目前必须为" + TRADE_TYPES + "其中之一"); +"trade_type目前必须为" + TRADE_TYPES + "其中之一"); } @@ -491,4 +493,39 @@ public class WxMpPayServiceImpl implements WxMpPayService { } } + @Override + public Map getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException { + WxUnifiedOrderResult unifiedOrderResult = this.unifiedOrder(request); + + if (!"SUCCESS".equalsIgnoreCase(unifiedOrderResult.getReturnCode()) + || !"SUCCESS".equalsIgnoreCase(unifiedOrderResult.getResultCode())) { + throw new WxErrorException(WxError.newBuilder().setErrorCode(-1) + .setErrorMsg("return_code:" + unifiedOrderResult.getReturnCode() + ";return_msg:" + + unifiedOrderResult.getReturnMsg() + ";result_code:" + unifiedOrderResult.getResultCode() + ";err_code" + + unifiedOrderResult.getErrCode() + ";err_code_des" + unifiedOrderResult.getErrCodeDes()) + .build()); + } + + String prepayId = unifiedOrderResult.getPrepayId(); + if (StringUtils.isBlank(prepayId)) { + throw new RuntimeException(String.format("Failed to get prepay id due to error code '%s'(%s).", + unifiedOrderResult.getErrCode(), unifiedOrderResult.getErrCodeDes())); + } + + Map payInfo = new HashMap<>(); + payInfo.put("appId", this.wxMpService.getWxMpConfigStorage().getAppId()); + // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 + payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("nonceStr", System.currentTimeMillis() + ""); + payInfo.put("package", "prepay_id=" + prepayId); + payInfo.put("signType", "MD5"); + if ("NATIVE".equals(request.getTradeType())) { + payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); + } + + String finalSign = this.createSign(payInfo, this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + payInfo.put("paySign", finalSign); + return payInfo; + } + }