From fdc7f38d8ccddfbf027fd36cd5c048e9f8d3d53f Mon Sep 17 00:00:00 2001 From: Kit Date: Thu, 19 Sep 2019 11:31:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B7=E8=84=B8=E6=94=AF=E4=BB=98=E5=87=AD?= =?UTF-8?q?=E8=AF=81=E8=8E=B7=E5=BE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/weixin/WeixinRequestExecutor.java | 12 +++++--- .../foxinmy/weixin4j/pay/WeixinPayProxy.java | 30 +++++++++++++++++++ .../com/foxinmy/weixin4j/pay/api/PayApi.java | 1 + .../pay/payment/face/PayfaceAuthinfo.java | 8 +++++ .../{mch => face}/PayfaceAuthinfoRequest.java | 10 ++++--- 5 files changed, 53 insertions(+), 8 deletions(-) rename weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/{mch => face}/PayfaceAuthinfoRequest.java (93%) diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java index c058041d..1002d472 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java @@ -39,6 +39,7 @@ import com.foxinmy.weixin4j.logging.InternalLogLevel; import com.foxinmy.weixin4j.logging.InternalLogger; import com.foxinmy.weixin4j.logging.InternalLoggerFactory; import com.foxinmy.weixin4j.util.Consts; +import com.foxinmy.weixin4j.util.StringUtil; import org.bouncycastle.jce.provider.BouncyCastleProvider; import static java.util.regex.Pattern.CASE_INSENSITIVE; @@ -218,10 +219,13 @@ public class WeixinRequestExecutor { try { XmlResult xmlResult = XmlMessageConverter.GLOBAL.convert( XmlResult.class, response); - if (!SUCCESS_CODE.contains(String.format(",%s,", xmlResult - .getResultCode().toLowerCase()))) { - throw new WeixinException(xmlResult.getErrCode(), - xmlResult.getErrCodeDes()); + // 微信最新的刷脸支付API中已没有返回resultCode,需做非空判断,否则抛异常 + if(StringUtil.isNotBlank(xmlResult.getResultCode())) { + if (!SUCCESS_CODE.contains(String.format(",%s,", xmlResult + .getResultCode().toLowerCase()))) { + throw new WeixinException(xmlResult.getErrCode(), + xmlResult.getErrCodeDes()); + } } } catch (IOException e) { ; 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 6e68c7e3..7c0f80a8 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 @@ -7,6 +7,8 @@ import com.foxinmy.weixin4j.http.weixin.XmlResult; import com.foxinmy.weixin4j.pay.model.WeixinPayAccount; import com.foxinmy.weixin4j.model.paging.Pageable; import com.foxinmy.weixin4j.pay.payment.coupon.*; +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.sign.WeixinSignature; import com.foxinmy.weixin4j.pay.type.*; @@ -815,5 +817,33 @@ public class WeixinPayProxy { return customsApi.queryCustomsOrder(idQuery, customsCity); } + /** + * 微信刷脸支付,获取调用凭证 + * + * @param storeId + * 门店编号, 由商户定义, 各门店唯一。 + * @param storeName + * 门店名称,由商户定义。(可用于展示) + * @param deviceId + * 终端设备编号,由商户定义。 + * @param rawdata + * 初始化数据。由微信人脸SDK的接口返回。 + * @return SDK调用凭证 + * @throws WeixinException + * @see + * 获取数据-getwxpayfacerawdata + * @see + * 获取调用凭证-get-wxpayface-authinfo + * @see PayfaceAuthinfo + */ + public PayfaceAuthinfo getWxPayfaceAuthinfo(String storeId, String storeName, String deviceId, + String rawdata) throws WeixinException { + PayfaceAuthinfoRequest request = new PayfaceAuthinfoRequest(this.weixinPayAccount, storeId, storeName, deviceId, + rawdata); + return payApi.getWxPayfaceAuthinfo(request); + } + public final static String VERSION = Consts.VERSION; } 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 7d5f0ebc..c326b3d0 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 @@ -7,6 +7,7 @@ import com.foxinmy.weixin4j.http.weixin.WeixinResponse; import com.foxinmy.weixin4j.http.weixin.XmlResult; import com.foxinmy.weixin4j.pay.model.WeixinPayAccount; 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.RefundAccountType; diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfo.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfo.java index ff17d707..2fdd46bf 100644 --- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfo.java +++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfo.java @@ -33,4 +33,12 @@ public class PayfaceAuthinfo extends MerchantResult { * 人脸支付凭证(getWxpayfaceCode) */ private String authinfo; + + @Override + public String toString() { + return "PayfaceAuthinfo{" + + "expiresIn=" + expiresIn + + ", authinfo='" + authinfo + '\'' + + '}'; + } } diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/PayfaceAuthinfoRequest.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfoRequest.java similarity index 93% rename from weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/PayfaceAuthinfoRequest.java rename to weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfoRequest.java index b9325289..33e78e4b 100644 --- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/PayfaceAuthinfoRequest.java +++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/face/PayfaceAuthinfoRequest.java @@ -1,6 +1,7 @@ -package com.foxinmy.weixin4j.pay.payment.mch; +package com.foxinmy.weixin4j.pay.payment.face; import com.foxinmy.weixin4j.pay.model.WeixinPayAccount; +import com.foxinmy.weixin4j.pay.sign.WeixinPaymentSignature; import com.foxinmy.weixin4j.pay.type.SignType; import com.foxinmy.weixin4j.util.*; @@ -47,6 +48,8 @@ public class PayfaceAuthinfoRequest { */ private String rawdata; + private WeixinPaymentSignature paymentSignature; + public PayfaceAuthinfoRequest(WeixinPayAccount account, String storeId, String storeName, String deviceId, String rawdata){ this.payAccount = account; @@ -54,6 +57,7 @@ public class PayfaceAuthinfoRequest { this.rawdata = rawdata; this.storeId = storeId; this.storeName = storeName; + this.paymentSignature = new WeixinPaymentSignature(account.getPaySignKey()); } public void setAttach(String attach) { @@ -108,8 +112,6 @@ public class PayfaceAuthinfoRequest { if(StringUtil.isNotBlank(attach)) { map.put("attach", attach); } - return DigestUtil.MD5( - String.format("%s&key=%s", MapUtil.toJoinString(map, false, true), - payAccount.getPaySignKey())).toUpperCase(); + return paymentSignature.sign(map); } }