From 46a8676cf66f1886107e244a94ab77ed12e5042c Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Mon, 17 Apr 2017 14:25:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E5=B9=B3=E5=8F=B0SDK=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加微信SDK支付,预下单流程、参数(除开APPID为绑定APP之后发放的APPID)与公众号相同,预下单成功之后需要二次签名,格式需要严格按要求处理,用于SDK校验,代码注释中有说明 --- .../wxpay/service/impl/WxPayServiceImpl.java | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index c26d058392..ad33a2a4b2 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -196,17 +196,43 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W } Map payInfo = new HashMap<>(); - payInfo.put("appId", getConfig().getAppId()); - // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。 - // 但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 - payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); - payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); - payInfo.put("package", "prepay_id=" + prepayId); - payInfo.put("signType", "MD5"); - if ("NATIVE".equals(request.getTradeType())) { - payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); - } - payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + if ("NATIVE".equals(request.getTradeType())) + { + payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); + }//APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 + else if ("APP".equals(request.getTradeType())) + { + + String appId = getConfig().getAppId(); + SortedMap configMap = new TreeMap<>(); + // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 + String partnerid = getConfig().getMchId(); + configMap.put("prepayid", prepayId); + configMap.put("partnerid", partnerid); + configMap.put("package", "Sign=WXPay"); + configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); + configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); + configMap.put("appid", appId); + // 此map用于客户端与微信服务器交互 + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + payInfo.put("tradeSeqNo", prepayId); + payInfo.put("partnerid", partnerid); + payInfo.put("appid", appId); + payInfo.put("packageValue", "Sign=WXPay"); + payInfo.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("noncestr", String.valueOf(System.currentTimeMillis())); + } + else if("JSAPI".equals(request.getTradeType())) + { + + payInfo.put("appId", unifiedOrderResult.getAppid()); + // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 + payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); + payInfo.put("package", "prepay_id=" + prepayId); + payInfo.put("signType", "MD5"); + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + } return payInfo; } From b30fdab800f499661550663b2b6cac9bb14b0482 Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Tue, 18 Apr 2017 09:10:25 +0800 Subject: [PATCH 2/3] =?UTF-8?q?SDK=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=94=AF=E4=BB=98=EF=BC=8C=E5=A4=A7=E6=A6=82=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E8=BF=99=E4=B8=AA=E9=A1=B9=E7=9B=AE=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=EF=BC=8C=E6=A0=BC=E5=BC=8F=E8=BF=98=E6=9C=89=E4=B8=8D?= =?UTF-8?q?=E5=90=88=E9=80=82=E4=B9=8B=E5=A4=84=EF=BC=8C=E9=BA=BB=E7=83=A6?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前我用的是treemap,忘记导包所以报错,现在用这个项目里的加密方式,用普通的hashmap也行 --- .../wxpay/service/impl/WxPayServiceImpl.java | 68 +++++++++---------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index ad33a2a4b2..97a2627192 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -196,43 +196,37 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W } Map payInfo = new HashMap<>(); - if ("NATIVE".equals(request.getTradeType())) - { - payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); - }//APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 - else if ("APP".equals(request.getTradeType())) - { - - String appId = getConfig().getAppId(); - SortedMap configMap = new TreeMap<>(); - // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 - String partnerid = getConfig().getMchId(); - configMap.put("prepayid", prepayId); - configMap.put("partnerid", partnerid); - configMap.put("package", "Sign=WXPay"); - configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); - configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); - configMap.put("appid", appId); - // 此map用于客户端与微信服务器交互 - payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); - payInfo.put("tradeSeqNo", prepayId); - payInfo.put("partnerid", partnerid); - payInfo.put("appid", appId); - payInfo.put("packageValue", "Sign=WXPay"); - payInfo.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); - payInfo.put("noncestr", String.valueOf(System.currentTimeMillis())); - } - else if("JSAPI".equals(request.getTradeType())) - { - - payInfo.put("appId", unifiedOrderResult.getAppid()); - // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 - payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); - payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); - payInfo.put("package", "prepay_id=" + prepayId); - payInfo.put("signType", "MD5"); - payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); - } + if ("NATIVE".equals(request.getTradeType())){ + payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); + }else if ("APP".equals(request.getTradeType())){ + //APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 + String appId = getConfig().getAppId(); + Map configMap = new HashMap<>(); + // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 + String partnerid = getConfig().getMchId(); + configMap.put("prepayid", prepayId); + configMap.put("partnerid", partnerid); + configMap.put("package", "Sign=WXPay"); + configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); + configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); + configMap.put("appid", appId); + // 此map用于客户端与微信服务器交互 + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + payInfo.put("prepayId", prepayId); + payInfo.put("partnerId", partnerid); + payInfo.put("appId", appId); + payInfo.put("packageValue", "Sign=WXPay"); + payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); + }else if("JSAPI".equals(request.getTradeType())){ + payInfo.put("appId", unifiedOrderResult.getAppid()); + // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 + payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); + payInfo.put("package", "prepay_id=" + prepayId); + payInfo.put("signType", "MD5"); + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + } return payInfo; } From 2356a97c81b8a04deebb3247c62961ee7ff5e364 Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Tue, 18 Apr 2017 10:53:19 +0800 Subject: [PATCH 3/3] =?UTF-8?q?SDK=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按照要求修改过格式了 --- .../binarywang/wxpay/service/impl/WxPayServiceImpl.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index 97a2627192..5d442df906 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -196,10 +196,11 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W } Map payInfo = new HashMap<>(); - if ("NATIVE".equals(request.getTradeType())){ + if ("NATIVE".equals(request.getTradeType())) + { payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); }else if ("APP".equals(request.getTradeType())){ - //APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 + // APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 String appId = getConfig().getAppId(); Map configMap = new HashMap<>(); // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 @@ -218,7 +219,7 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W payInfo.put("packageValue", "Sign=WXPay"); payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); - }else if("JSAPI".equals(request.getTradeType())){ + }else if ("JSAPI".equals(request.getTradeType())){ payInfo.put("appId", unifiedOrderResult.getAppid()); // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); @@ -226,7 +227,7 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W payInfo.put("package", "prepay_id=" + prepayId); payInfo.put("signType", "MD5"); payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); - } + } return payInfo; }