From d4800dd3d4ecff39787cb09eb2c2c4e9c6a9c0b8 Mon Sep 17 00:00:00 2001 From: jinyu Date: Fri, 22 Jan 2016 10:23:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4JsPayRequestV2.java(=E6=97=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=94=AF=E4=BB=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/foxinmy/weixin4j/util/DigestUtil.java | 30 ++++++++ .../com/foxinmy/weixin4j/mp/api/Pay2Api.java | 13 ++-- .../mp/payment/v2/JsPayRequestV2.java | 72 ------------------- .../mp/payment/v2/NativePayResponseV2.java | 6 +- 4 files changed, 41 insertions(+), 80 deletions(-) delete mode 100644 weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DigestUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DigestUtil.java index a55d7b72..90767b6e 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DigestUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DigestUtil.java @@ -100,4 +100,34 @@ public final class DigestUtil { } return SHA1(MapUtil.toJoinString(obj, false, true, extra)); } + + /** + * package拼接签名(一般用于V2.x支付接口) + * + * @param signObj + * 签名对象 如 PayPackageV2 + * @param signKey + * 签名key + * @return + */ + public static String packageSign(Object signObj, String signKey) { + StringBuilder sb = new StringBuilder(); + // a.对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) 后, + // 使用 URL 键值 对的格式(即 key1=value1&key2=value2...)拼接成字符串 string1 + // 注意:值为空的参数不参与签名 + sb.append(MapUtil.toJoinString(signObj, false, false, null)); + // b---> + // 在 string1 最后拼接上 key=signKey 得到 stringSignTemp 字符串,并 对 + // stringSignTemp 进行 md5 运算 + // 再将得到的 字符串所有字符转换为大写 ,得到 sign 值 signValue。 + sb.append("&key=").append(signKey); + // c---> & d----> + String sign = DigestUtil.MD5(sb.toString()).toUpperCase(); + sb.delete(0, sb.length()); + // c.对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2 + sb.append(MapUtil.toJoinString(signObj, true, false, null)) + .append("&sign=").append(sign); + + return sb.toString(); + } } diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java index 5345080c..73196d4f 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java @@ -34,12 +34,12 @@ import com.foxinmy.weixin4j.http.weixin.WeixinSSLRequestExecutor; import com.foxinmy.weixin4j.model.Consts; import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.model.WeixinPayAccount; -import com.foxinmy.weixin4j.mp.payment.v2.JsPayRequestV2; import com.foxinmy.weixin4j.mp.payment.v2.OrderV2; import com.foxinmy.weixin4j.mp.payment.v2.PayPackageV2; import com.foxinmy.weixin4j.mp.payment.v2.RefundRecordV2; import com.foxinmy.weixin4j.mp.payment.v2.RefundResultV2; import com.foxinmy.weixin4j.mp.token.WeixinTokenCreator; +import com.foxinmy.weixin4j.payment.PayRequest; import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.TokenStorager; import com.foxinmy.weixin4j.type.BillType; @@ -146,12 +146,13 @@ public class Pay2Api extends MpApi { payPackage.setTransportFee(transportFee); payPackage.setProductFee(productFee); payPackage.setGoodsTag(goodsTag); - JsPayRequestV2 jsPayRequest = new JsPayRequestV2(weixinAccount, - payPackage); - jsPayRequest.setPaySign(DigestUtil.paysignSha(jsPayRequest, + PayRequest payRequest = new PayRequest(weixinAccount.getId(), + DigestUtil.packageSign(payPackage, + weixinAccount.getPartnerKey())); + payRequest.setPaySign(DigestUtil.paysignSha(payRequest, weixinAccount.getPaySignKey())); - jsPayRequest.setSignType(SignType.SHA1); - return JSON.toJSONString(jsPayRequest); + payRequest.setSignType(SignType.SHA1); + return JSON.toJSONString(payRequest); } /** diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java deleted file mode 100644 index 73effa32..00000000 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.foxinmy.weixin4j.mp.payment.v2; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; - -import com.alibaba.fastjson.annotation.JSONField; -import com.foxinmy.weixin4j.model.WeixinPayAccount; -import com.foxinmy.weixin4j.payment.PayRequest; -import com.foxinmy.weixin4j.util.DigestUtil; -import com.foxinmy.weixin4j.util.MapUtil; - -/** - * V2微信JS支付:get_brand_wcpay_request
所列参数均为非空字符串 - *

- * get_brand_wcpay_request:ok 支付成功
- * get_brand_wcpay_request:cancel 支付过程中用户取消
- * get_brand_wcpay_request:fail 支付失败 - *

- * - * @className JsPayRequestV2 - * @author jy - * @date 2014年8月17日 - * @since JDK 1.6 - * @see - */ -@XmlRootElement -@XmlAccessorType(XmlAccessType.FIELD) -public class JsPayRequestV2 extends PayRequest { - - private static final long serialVersionUID = -5972173459255255197L; - - protected JsPayRequestV2() { - // jaxb required - } - - public JsPayRequestV2(WeixinPayAccount weixinAccount, - PayPackageV2 payPackage) { - super(weixinAccount.getId(), ""); - this.setPackageInfo(package2string(payPackage, - weixinAccount.getPartnerKey())); - } - - @XmlTransient - @JSONField(serialize = false) - private String package2string(PayPackageV2 payPackage, String partnerKey) { - StringBuilder sb = new StringBuilder(); - // a.对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序) 后, - // 使用 URL 键值 对的格式(即 key1=value1&key2=value2...)拼接成字符串 string1 - // 注意:值为空的参数不参与签名 - sb.append(MapUtil.toJoinString(payPackage, false, false, null)); - // b---> - // 在 string1 最后拼接上 key=paternerKey 得到 stringSignTemp 字符串,并 对 - // stringSignTemp 进行 md5 运算 - // 再将得到的 字符串所有字符转换为大写 ,得到 sign 值 signValue。 - sb.append("&key=").append(partnerKey); - // c---> & d----> - String sign = DigestUtil.MD5(sb.toString()).toUpperCase(); - sb.delete(0, sb.length()); - // c.对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2 - sb.append(MapUtil.toJoinString(payPackage, true, false, null)) - .append("&sign=").append(sign); - - return sb.toString(); - } - - @Override - public String toString() { - return "JsPayRequestV2 [" + super.toString() + "]"; - } -} \ No newline at end of file diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java index f4b8152c..fa03f197 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java @@ -10,6 +10,7 @@ import javax.xml.bind.annotation.XmlRootElement; import com.alibaba.fastjson.annotation.JSONField; import com.foxinmy.weixin4j.model.WeixinPayAccount; +import com.foxinmy.weixin4j.payment.PayRequest; import com.foxinmy.weixin4j.util.DigestUtil; /** @@ -23,7 +24,7 @@ import com.foxinmy.weixin4j.util.DigestUtil; */ @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) -public class NativePayResponseV2 extends JsPayRequestV2 { +public class NativePayResponseV2 extends PayRequest { private static final long serialVersionUID = 6119895998783333012L; /** @@ -63,7 +64,8 @@ public class NativePayResponseV2 extends JsPayRequestV2 { */ public NativePayResponseV2(WeixinPayAccount weixinAccount, PayPackageV2 payPackage) { - super(weixinAccount, payPackage); + super(weixinAccount.getId(), DigestUtil.packageSign(payPackage, + weixinAccount.getPartnerKey())); this.retCode = "0"; this.retMsg = "OK"; Map map = new HashMap();