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 0d30578b..defa1b13 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
@@ -1,5 +1,8 @@
package com.foxinmy.weixin4j.util;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -57,4 +60,26 @@ public final class DigestUtil {
byte[] data = StringUtil.getBytesUtf8(content);
return HexUtil.encodeHexString(getDigest(Consts.MD5).digest(data));
}
+
+ /**
+ * HMAC-SHA256签名
+ *
+ * @param content
+ * 待签名字符串
+ * @param key
+ * 支付密钥
+ * @return
+ * @throws InvalidKeyException
+ */
+ public static String HMACSHA256(String content, String key) throws InvalidKeyException{
+ try {
+ Mac mac = Mac.getInstance("HmacSHA256");
+ SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
+ mac.init(secret_key);
+ byte[] bytes = mac.doFinal(content.getBytes());
+ return HexUtil.encodeHexString(bytes);
+ } catch (NoSuchAlgorithmException e) {
+ }
+ return null;
+ }
}
diff --git a/weixin4j-base/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties b/weixin4j-base/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties
index 68ed23ca..1b69ff2e 100644
--- a/weixin4j-base/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties
+++ b/weixin4j-base/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties
@@ -1,59 +1,59 @@
-# \u5fae\u4fe1\u5546\u6237\u5e73\u53f0\u6587\u6863\u8bf4\u660e
+# \u5FAE\u4FE1\u5546\u6237\u5E73\u53F0\u6587\u6863\u8BF4\u660E
# https://pay.weixin.qq.com/
# https://pay.weixin.qq.com/wiki/doc/api/index.php
# ----------------------------------------------------------------------------
mch_base_url=https://api.mch.weixin.qq.com
-# \u53d1\u9001\u73b0\u91d1\u7ea2\u5305
+# \u53D1\u9001\u73B0\u91D1\u7EA2\u5305
redpack_send_uri={mch_base_url}/mmpaymkttransfers/sendredpack
-# \u53d1\u9001\u73b0\u91d1\u88c2\u53d8\u7ea2\u5305
+# \u53D1\u9001\u73B0\u91D1\u88C2\u53D8\u7EA2\u5305
groupredpack_send_uri={mch_base_url}/mmpaymkttransfers/sendgroupredpack
-# \u67e5\u8be2\u73b0\u91d1\u7ea2\u5305
+# \u67E5\u8BE2\u73B0\u91D1\u7EA2\u5305
redpack_query_uri={mch_base_url}/mmpaymkttransfers/gethbinfo
-# \u7edf\u4e00\u8ba2\u5355\u751f\u6210
+# \u7EDF\u4E00\u8BA2\u5355\u751F\u6210
order_create_uri={mch_base_url}/pay/unifiedorder
-# \u88ab\u626b\u652f\u4ed8
+# \u88AB\u626B\u652F\u4ED8
micropay_uri={mch_base_url}/pay/micropay
-# \u8ba2\u5355\u67e5\u8be2
+# \u8BA2\u5355\u67E5\u8BE2
order_query_uri={mch_base_url}/pay/orderquery
-# \u5173\u95ed\u8ba2\u5355
+# \u5173\u95ED\u8BA2\u5355
order_close_uri={mch_base_url}/pay/closeorder
-# \u5bf9\u8d26\u5355\u4e0b\u8f7d
+# \u5BF9\u8D26\u5355\u4E0B\u8F7D
downloadbill_uri={mch_base_url}/pay/downloadbill
-# \u9000\u6b3e\u67e5\u8be2
+# \u9000\u6B3E\u67E5\u8BE2
refund_query_uri={mch_base_url}/pay/refundquery
-# \u9000\u6b3e\u7533\u8bf7
+# \u9000\u6B3E\u7533\u8BF7
refund_apply_uri={mch_base_url}/secapi/pay/refund
-# \u51b2\u6b63\u64a4\u9500
+# \u51B2\u6B63\u64A4\u9500
order_reverse_uri={mch_base_url}/secapi/pay/reverse
-# \u957f\u94fe\u63a5\u8f6c\u6362
+# \u957F\u94FE\u63A5\u8F6C\u6362
longurl_convert_uri={mch_base_url}/tools/shorturl
-# \u53d1\u653e\u4ee3\u91d1\u5238
+# \u53D1\u653E\u4EE3\u91D1\u5238
coupon_send_uri={mch_base_url}/mmpaymkttransfers/send_coupon
-# \u67e5\u8be2\u4ee3\u91d1\u5238\u6279\u6b21\u4fe1\u606f
+# \u67E5\u8BE2\u4EE3\u91D1\u5238\u6279\u6B21\u4FE1\u606F
couponstock_query_uri={mch_base_url}/mmpaymkttransfers/query_coupon_stock
-# \u67e5\u8be2\u4ee3\u91d1\u5238\u8be6\u7ec6\u4fe1\u606f
+# \u67E5\u8BE2\u4EE3\u91D1\u5238\u8BE6\u7EC6\u4FE1\u606F
coupondetail_query_uri={mch_base_url}/mmpaymkttransfers/querycouponsinfo
-# \u53d1\u9001\u73b0\u91d1\u7ea2\u5305
+# \u53D1\u9001\u73B0\u91D1\u7EA2\u5305
redpack_send_uri={mch_base_url}/mmpaymkttransfers/sendredpack
-# \u67e5\u8be2\u73b0\u91d1\u7ea2\u5305
+# \u67E5\u8BE2\u73B0\u91D1\u7EA2\u5305
redpack_query_uri={mch_base_url}/mmpaymkttransfers/gethbinfo
-# \u4f01\u4e1a\u5411\u4e2a\u4eba\u4ed8\u6b3e
+# \u4F01\u4E1A\u5411\u4E2A\u4EBA\u4ED8\u6B3E
corppayment_send_uri={mch_base_url}/mmpaymkttransfers/promotion/transfers
-# \u4f01\u4e1a\u4ed8\u6b3e\u67e5\u8be2
+# \u4F01\u4E1A\u4ED8\u6B3E\u67E5\u8BE2
corppayment_query_uri={mch_base_url}/mmpaymkttransfers/gettransferinfo
-# \u63a5\u53e3\u4e0a\u62a5
+# \u63A5\u53E3\u4E0A\u62A5
interface_report_uri={mch_base_url}/payitil/report
-# \u6388\u6743\u7801\u67e5\u8be2OPENID\u63a5\u53e3
+# \u6388\u6743\u7801\u67E5\u8BE2OPENID\u63A5\u53E3
authcode_openid_uri={mch_base_url}/tools/authcodetoopenid
-# native\u652f\u4ed8url(\u6a21\u5f0f1)
+# native\u652F\u4ED8url(\u6A21\u5F0F1)
native_pay_uri=weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s
-# \u67e5\u8be2\u7ed3\u7b97\u8d44\u91d1
+# \u67E5\u8BE2\u7ED3\u7B97\u8D44\u91D1
settlement_query_uri={mch_base_url}/pay/settlementquery
-# \u67e5\u8be2\u6c47\u7387
+# \u67E5\u8BE2\u6C47\u7387
exchagerate_query_uri={mch_base_url}/pay/queryexchagerate
-# \u8ba2\u5355\u9644\u52a0\u4fe1\u606f\u63d0\u4ea4
+# \u8BA2\u5355\u9644\u52A0\u4FE1\u606F\u63D0\u4EA4
customsorder_declare_uri={mch_base_url}/mch/customs/customdeclareorder
-# \u8ba2\u5355\u9644\u52a0\u4fe1\u606f\u67e5\u8be2
+# \u8BA2\u5355\u9644\u52A0\u4FE1\u606F\u67E5\u8BE2
customsorder_query_uri={mch_base_url}/mch/customs/customdeclarequery
\ No newline at end of file
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/WeixinPayProxy.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/WeixinPayProxy.java
index b7bb54e7..72b14d15 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/WeixinPayProxy.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/WeixinPayProxy.java
@@ -167,31 +167,6 @@ public class WeixinPayProxy {
notifyUrl, createIp, attach);
}
- /**
- *
- * 生成编辑地址请求
- *
- *
- * err_msg edit_address:ok获取编辑收货地址成功 edit_address:fail获取编辑收货地址失败
- * userName 收货人姓名 telNumber 收货人电话 addressPostalCode 邮编
- * proviceFirstStageName 国标收货地址第一级地址 addressCitySecondStageName
- * 国标收货地址第二级地址 addressCountiesThirdStageName 国标收货地址第三级地址
- * addressDetailInfo 详细收货地址信息 nationalCode 收货地址国家码
- *
- * @param url
- * 当前访问页的URL
- * @param oauthToken
- * oauth授权时产生的token
- * @see PayApi
- * @see
- * 收货地址共享
- * @return 编辑地址请求JSON串
- */
- public String createAddressRequestJSON(String url, String oauthToken) {
- return payApi.createAddressRequestJSON(url, oauthToken);
- }
-
/**
* 创建Native支付(扫码支付)链接【模式一】
*
@@ -394,7 +369,7 @@ public class WeixinPayProxy {
* @param outTradeNo
* 商户系统内部的订单号,32个字符内、可包含字母;更换授权码必须要换新的商户订单号
* @param totalFee
- * 订单总金额,单位为分,只能为整数
+ * 订单总金额,单位元
* @param createIp
* 调用微信支付API的机器IP
* @param openId
@@ -417,6 +392,37 @@ public class WeixinPayProxy {
totalFee, createIp, openId, attach);
}
+ /**
+ * 押金支付请求
+ *
+ * @param code
+ * 授权码/人脸凭证
+ * @param body
+ * 商品或支付单简要描述,格式要求:门店品牌名-城市分店名-实际商品名称
+ * @param outTradeNo
+ * 商户系统内部的订单号,32个字符内、可包含字母;更换授权码必须要换新的商户订单号
+ * @param totalFee
+ * 订单总金额,单位元
+ * @param createIp
+ * 调用微信支付API的机器IP
+ * @param openId
+ * 用户在商户appid 下的唯一标识,人脸支付押金时提供
+ * @param attach
+ * 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据,非必填
+ * @param store
+ * 门店信息,仅在付款码支付押金时提供,非必填
+ * @param isFacePay
+ * 是否人脸押金支付,否则是付款码押金支付
+ * @return
+ * @throws WeixinException
+ */
+ public MchPayRequest createDepositPayRequest(String code, String body,
+ String outTradeNo, double totalFee, String createIp, String openId,
+ String attach, SceneInfoStore store, boolean isFacePay) throws WeixinException{
+
+ return payApi.createDepositPayRequest(code, body, outTradeNo, totalFee, createIp, openId, attach, store, isFacePay);
+ }
+
/**
* 订单查询
*
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/api/PayApi.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/api/PayApi.java
index 1db3a582..4ad38149 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/api/PayApi.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/api/PayApi.java
@@ -10,6 +10,7 @@ import com.foxinmy.weixin4j.pay.payment.face.PayfaceAuthinfo;
import com.foxinmy.weixin4j.pay.payment.face.PayfaceAuthinfoRequest;
import com.foxinmy.weixin4j.pay.payment.mch.*;
import com.foxinmy.weixin4j.pay.type.mch.BillType;
+import com.foxinmy.weixin4j.pay.type.mch.DepositType;
import com.foxinmy.weixin4j.pay.type.mch.RefundAccountType;
import com.foxinmy.weixin4j.pay.type.*;
import com.foxinmy.weixin4j.util.*;
@@ -87,17 +88,28 @@ public class PayApi extends MchApi {
null, payPackage.getCreateIp(), null, payPackage.getOpenId(),
payPackage.getAuthCode(), null, payPackage.getAttach(),
null, null, payPackage.getGoodsTag(),
- payPackage.getLimitPay(), payPackage.getSubAppId(), payPackage.getFaceCode());
-
+ payPackage.getLimitPay(), payPackage.getSubAppId(), payPackage.getFaceCode(),
+ payPackage.getDeposit());
+ // 默认为MD5签名
+ SignType signType= SignType.MD5;
super.declareMerchant(_payPackage);
- _payPackage.setSign(weixinSignature.sign(_payPackage));
+ // 默认为刷卡支付(付款码支付)的API地址
+ String url = getRequestUri("micropay_uri");
+ if(payPackage.getDeposit()==DepositType.Y){
+ // 押金支付只支持HMAC-SHA256签名
+ signType = SignType.HMAC$SHA256;
+ _payPackage.setSignType("HMAC-SHA256");
+ // 如果是押金支付,改为押金支付的API地址
+ url = TradeType.MICROPAY.name().equals(tradeType) ? getRequestUri("deposit_micropay_uri") :
+ getRequestUri("deposit_facepay_uri");
+ }else if(TradeType.FACEPAY.name().equals(tradeType)){
+ url = getRequestUri("facepay_url");
+ }
+ _payPackage.setSign(weixinSignature.sign(_payPackage, signType));
String para = XmlStream.toXML(_payPackage);
- String url = TradeType.MICROPAY.name().equals(tradeType) ? getRequestUri("micropay_uri") :
- getRequestUri("facepay_url");
+
WeixinResponse response = weixinExecutor.post(url, para);
- MICROPayRequest microPayRequest = response
- .getAsObject(new TypeReference() {
- });
+ MICROPayRequest microPayRequest = response.getAsObject(new TypeReference() {});
microPayRequest.setPaymentAccount(weixinAccount);
return microPayRequest;
}
@@ -147,42 +159,6 @@ public class PayApi extends MchApi {
return createPayRequest(payPackage);
}
- /**
- *
- * 生成编辑地址请求
- *
- *
- * err_msg edit_address:ok获取编辑收货地址成功 edit_address:fail获取编辑收货地址失败
- * userName 收货人姓名 telNumber 收货人电话 addressPostalCode 邮编
- * proviceFirstStageName 国标收货地址第一级地址 addressCitySecondStageName
- * 国标收货地址第二级地址 addressCountiesThirdStageName 国标收货地址第三级地址
- * addressDetailInfo 详细收货地址信息 nationalCode 收货地址国家码
- *
- * @param url
- * 当前访问页的URL
- * @param oauthToken
- * oauth授权时产生的token
- * @see
- * 收货地址共享
- * @return 编辑地址请求JSON串
- */
- public String createAddressRequestJSON(String url, String oauthToken) {
- Map map = new HashMap();
- map.put("appId", weixinAccount.getId());
- map.put("timeStamp", DateUtil.timestamp2string());
- map.put("nonceStr", RandomUtil.generateString(16));
- map.put("url", url);
- map.put("accessToken", oauthToken);
- String sign = DigestUtil.SHA1(MapUtil.toJoinString(map, false, true));
- map.remove("url");
- map.remove("accessToken");
- map.put("scope", "jsapi_address");
- map.put("signType", SignType.SHA1.name().toLowerCase());
- map.put("addrSign", sign);
- return JSON.toJSONString(map);
- }
-
/**
* 创建Native支付(扫码支付)链接【模式一】
*
@@ -814,4 +790,26 @@ public class PayApi extends MchApi {
payPackage.setFaceCode(faceCode);
return createPayRequest(payPackage);
}
+
+ public MchPayRequest createDepositPayRequest(String code, String body, String outTradeNo, double totalFee,
+ String createIp, String openId, String attach, SceneInfoStore store,
+ boolean isFacePay) throws WeixinException {
+ MchPayPackage payPackage;
+ if(isFacePay) {
+ payPackage = new MchPayPackage(body, outTradeNo, totalFee, null, createIp, TradeType.FACEPAY,
+ openId, null, null, attach);
+ payPackage.setFaceCode(code);
+ payPackage.setDeposit(DepositType.Y);
+ return createPayRequest(payPackage);
+ }else{
+ payPackage = new MchPayPackage(body, outTradeNo, totalFee, null, createIp, TradeType.MICROPAY,
+ openId, code, null, attach);
+ payPackage.setDeposit(DepositType.Y);
+ if (store != null) {
+ payPackage.setSceneInfo(String.format("{\"store_info\":\"%s\"}",
+ JSON.toJSONString(store)));
+ }
+ return createPayRequest(payPackage);
+ }
+ }
}
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfoRequest.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfoRequest.java
index c2d2a20d..913c3b72 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfoRequest.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfoRequest.java
@@ -14,7 +14,7 @@ import java.util.Map;
*
* @className PayfaceAuthinfoRequest
* @author kit(kit_21cn@21cn.com)
- * @date 2015年12月25日
+ * @date 2019年9月18日
* @since JDK 1.6
* @see
* 获取调用凭证-get-wxpayface-authinfo
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MchPayPackage.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MchPayPackage.java
index 79730533..1934e8fc 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MchPayPackage.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MchPayPackage.java
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.pay.payment.PayPackage;
import com.foxinmy.weixin4j.pay.type.CurrencyType;
import com.foxinmy.weixin4j.pay.type.TradeType;
+import com.foxinmy.weixin4j.pay.type.mch.DepositType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@@ -76,10 +77,18 @@ public class MchPayPackage extends PayPackage {
@XmlElement(name = "scene_info")
@JSONField(name = "scene_info")
private String sceneInfo;
-
+ /**
+ * 人脸凭证,用于旧版人脸支付。
+ */
@XmlElement(name = "face_code")
@JSONField(name = "face_code")
private String faceCode;
+ /**
+ * 是否押金人脸支付,Y-是,N-普通人脸支付
+ */
+ @XmlElement(name = "deposit")
+ @JSONField(name = "deposit")
+ private DepositType deposit;
protected MchPayPackage() {
// jaxb required
@@ -114,7 +123,7 @@ public class MchPayPackage extends PayPackage {
String openId, String authCode, String productId, String attach) {
this(body, null, outTradeNo, totalFee, CurrencyType.CNY, notifyUrl,
createIp, tradeType, openId, authCode, productId, attach, null,
- null, null, null, null, null);
+ null, null, null, null, null, null);
}
/**
@@ -157,12 +166,15 @@ public class MchPayPackage extends PayPackage {
* openid和sub_openid可以选传其中之一,如果选择传sub_openid ,则必须传sub_appid
* @param faceCode
* 人脸凭证,用于旧版刷脸支付。
+ * @param depositType
+ * 是否押金支付
*/
public MchPayPackage(String body, String detial, String outTradeNo,
double totalFee, CurrencyType feeType, String notifyUrl,
String createIp, TradeType tradeType, String openId,
String authCode, String productId, String attach, Date timeStart,
- Date timeExpire, String goodsTag, String limitPay, String subOpenId, String faceCode) {
+ Date timeExpire, String goodsTag, String limitPay, String subOpenId, String faceCode,
+ DepositType depositType) {
super(body, detial, outTradeNo, totalFee, notifyUrl, createIp, attach,
timeStart, timeExpire, goodsTag);
this.tradeType = tradeType != null ? tradeType.name() : null;
@@ -174,6 +186,7 @@ public class MchPayPackage extends PayPackage {
this.limitPay = limitPay;
this.subOpenId = subOpenId;
this.faceCode = faceCode;
+ this.deposit = depositType;
}
public String getTradeType() {
@@ -228,12 +241,27 @@ public class MchPayPackage extends PayPackage {
this.faceCode = faceCode;
}
+ public DepositType getDeposit() {
+ return deposit;
+ }
+
+ public void setDeposit(DepositType deposit) {
+ this.deposit = deposit;
+ }
+
@Override
public String toString() {
- return "MchPayPackage [tradeType=" + tradeType + ",feeType=" + feeType
- + ", openId=" + openId + ", productId=" + productId
- + ", authCode=" + authCode + ", limitPay=" + limitPay
- + ", subOpenId=" + subOpenId + ", sceneInfo=" + sceneInfo
- + ", " + super.toString() + "]";
+ return "MchPayPackage{" +
+ "tradeType='" + tradeType + '\'' +
+ ", feeType='" + feeType + '\'' +
+ ", openId='" + openId + '\'' +
+ ", productId='" + productId + '\'' +
+ ", authCode='" + authCode + '\'' +
+ ", limitPay='" + limitPay + '\'' +
+ ", subOpenId='" + subOpenId + '\'' +
+ ", sceneInfo='" + sceneInfo + '\'' +
+ ", faceCode='" + faceCode + '\'' +
+ ", deposit=" + deposit +
+ '}';
}
}
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MerchantResult.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MerchantResult.java
index a2a940b4..ddebf2e2 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MerchantResult.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MerchantResult.java
@@ -2,7 +2,7 @@ package com.foxinmy.weixin4j.pay.payment.mch;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.http.weixin.XmlResult;
-import com.foxinmy.weixin4j.type.SignType;
+import com.foxinmy.weixin4j.pay.type.SignType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@@ -135,12 +135,6 @@ public class MerchantResult extends XmlResult {
return signType;
}
- @JSONField(serialize = false)
- public SignType getFormatSignType() {
- return signType != null ? SignType.valueOf(signType.toUpperCase())
- : null;
- }
-
public void setSignType(String signType) {
this.signType = signType;
}
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinPaymentSignature.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinPaymentSignature.java
index 98200f04..45b8aa10 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinPaymentSignature.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinPaymentSignature.java
@@ -1,8 +1,11 @@
package com.foxinmy.weixin4j.pay.sign;
+import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.pay.type.SignType;
import com.foxinmy.weixin4j.util.DigestUtil;
+import java.security.InvalidKeyException;
+
/**
* 微信支付签名实现
*
@@ -23,14 +26,27 @@ public class WeixinPaymentSignature extends AbstractWeixinSignature {
this.paySignKey = paySignKey;
}
- @Override
- public SignType getSignType() {
- return SignType.MD5;
- }
-
@Override
public String sign(Object obj) {
StringBuilder sb = join(obj).append("&key=").append(paySignKey);
return DigestUtil.MD5(sb.toString()).toUpperCase();
}
+
+ @Override
+ public String sign(Object obj, SignType signType) {
+ if(signType==null){
+ return sign(obj);
+ }
+ switch (signType){
+ case HMAC$SHA256:
+ StringBuilder sb = join(obj).append("&key=").append(paySignKey);
+ try {
+ return DigestUtil.HMACSHA256(sb.toString(), paySignKey).toUpperCase();
+ }catch (InvalidKeyException e){
+ throw new RuntimeException("商户支付密钥有误", e);
+ }
+ default:
+ return sign(obj);
+ }
+ }
}
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinSignature.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinSignature.java
index 88920e85..8c02344f 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinSignature.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinSignature.java
@@ -17,27 +17,29 @@ public interface WeixinSignature {
*
* @return
*/
- public boolean encoder();
+ boolean encoder();
/**
* 是否转换小写
*
* @return
*/
- public boolean lowerCase();
+ boolean lowerCase();
/**
- * 签名类型
- *
- * @return
- */
- public SignType getSignType();
-
- /**
- * 签名
+ * 签名(默认的MD5签名)
*
* @param obj
* @return
*/
- public String sign(Object obj);
+ String sign(Object obj);
+
+ /**
+ * 签名(指定签名算法)
+ *
+ * @param obj
+ * @param signType
+ * @return
+ */
+ String sign(Object obj, SignType signType);
}
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/SignType.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/SignType.java
index 4335ec4b..d961b1c1 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/SignType.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/SignType.java
@@ -10,5 +10,5 @@ package com.foxinmy.weixin4j.pay.type;
* @see
*/
public enum SignType {
- SHA1, MD5, HMAC$SHA256
+ MD5, HMAC$SHA256
}
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/DepositType.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/DepositType.java
new file mode 100644
index 00000000..08524415
--- /dev/null
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/DepositType.java
@@ -0,0 +1,20 @@
+package com.foxinmy.weixin4j.pay.type.mch;
+
+/**
+ * 是否押金支付
+ *
+ * @className DepositType
+ * @author kit(kit_21cn@21cn.com)
+ * @date 2019年9月21日
+ * @since JDK 1.6
+ */
+public enum DepositType {
+ /**
+ * 是
+ */
+ Y,
+ /**
+ * 否
+ */
+ N;
+}
diff --git a/weixin4j-pay/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties b/weixin4j-pay/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties
index 736d4544..635bb53b 100644
--- a/weixin4j-pay/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties
+++ b/weixin4j-pay/src/main/resources/com/foxinmy/weixin4j/payment/weixin.properties
@@ -57,4 +57,8 @@ customsorder_query_uri={mch_base_url}/mch/customs/customdeclarequery
# \u5237\u8138\u652F\u4ED8\u4EA4\u4E92\u6D41\u7A0B--\u83B7\u53D6\u8C03\u7528\u51ED\u8BC1
get_wxpayface_authinfo_uri={payapp_base_url}/face/get_wxpayface_authinfo
# \u65E7\u7248\u5237\u8138\u652F\u4ED8\u63A5\u53E3
-facepay_url={mch_base_url}/pay/facepay
\ No newline at end of file
+facepay_url={mch_base_url}/pay/facepay
+# \u652F\u4ED8\u62BC\u91D1\uFF08\u4EBA\u8138\uFF09
+deposit_facepay_uri={mch_base_url}/deposit/facepay
+# \u652F\u4ED8\u62BC\u91D1\uFF08\u4ED8\u6B3E\u7801\uFF09
+deposit_micropay_uri={mch_base_url}/deposit/micropay
\ No newline at end of file