diff --git a/pom.xml b/pom.xml
index 7b2fd0af..8d90565a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,7 @@
weixin4j-server
weixin4j-example
weixin4j-serverX
+ weixin4j-pay
UTF-8
diff --git a/weixin4j-pay/pom.xml b/weixin4j-pay/pom.xml
index 1104d1bd..aa887ef8 100644
--- a/weixin4j-pay/pom.xml
+++ b/weixin4j-pay/pom.xml
@@ -10,6 +10,7 @@
4.0.0
weixin4j-pay
weixin4j-pay
+ 1.0.0-SNAPSHOT
https://github.com/foxinmy/weixin4j/tree/master/weixin4j-pay
微信支付商户平台API
@@ -36,7 +37,7 @@
com.foxinmy
weixin4j-base
- ${project.version}
+ 1.9.0-SNAPSHOT
junit
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 d7e7a7ef..7d5f0ebc 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
@@ -774,7 +774,18 @@ public class PayApi extends MchApi {
});
}
- public PayfaceAuthinfo getWxPayfaceAuthinfo(String rawdata){
-
+ /**
+ * 微信刷脸支付,获取调用凭证
+ *
+ * @param request
+ * @return
+ * @see
+ * 获取调用凭证-get-wxpayface-authinfo
+ */
+ public PayfaceAuthinfo getWxPayfaceAuthinfo(PayfaceAuthinfoRequest request) throws WeixinException {
+ WeixinResponse response = weixinExecutor.post(
+ getRequestUri("get_wxpayface_authinfo_uri"), request.toRequestString());
+ return response.getAsObject(new TypeReference() {});
}
}
diff --git a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MICROPayRequest.java b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MICROPayRequest.java
index 04521a9a..8bf5d703 100644
--- a/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MICROPayRequest.java
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/MICROPayRequest.java
@@ -3,7 +3,7 @@ package com.foxinmy.weixin4j.pay.payment.mch;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.pay.model.WeixinPayAccount;
import com.foxinmy.weixin4j.pay.payment.PayRequest;
-import com.foxinmy.weixin4j.type.TradeType;
+import com.foxinmy.weixin4j.pay.type.TradeType;
import javax.xml.bind.annotation.XmlTransient;
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/mch/PayfaceAuthinfoRequest.java
new file mode 100644
index 00000000..b9325289
--- /dev/null
+++ b/weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/PayfaceAuthinfoRequest.java
@@ -0,0 +1,115 @@
+package com.foxinmy.weixin4j.pay.payment.mch;
+
+import com.foxinmy.weixin4j.pay.model.WeixinPayAccount;
+import com.foxinmy.weixin4j.pay.type.SignType;
+import com.foxinmy.weixin4j.util.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信刷脸支付, 获取调用凭证(get_wxpayface_authinfo)API接口请求参数封装
+ *
+ * @className PayfaceAuthinfoRequest
+ * @author kit(kit_21cn@21cn.com)
+ * @date 2015年12月25日
+ * @since JDK 1.6
+ * @see
+ * 获取调用凭证-get-wxpayface-authinfo
+ */
+public class PayfaceAuthinfoRequest {
+ private WeixinPayAccount payAccount;
+ /**
+ * 门店编号, 由商户定义, 各门店唯一。
+ */
+ private String storeId;
+ /**
+ * 门店名称,由商户定义。(可用于展示)
+ */
+ private String storeName;
+ /**
+ * 终端设备编号,由商户定义。
+ */
+ private String deviceId;
+ /**
+ * 附加字段。字段格式使用Json
+ */
+ private String attach;
+
+ private String nonceStr = RandomUtil.generateString(16);
+
+ private String now = DateUtil.timestamp2string();
+ /**
+ * 初始化数据。由微信人脸SDK的接口返回。
+ *
+ * @see
+ * * 获取数据-getwxpayfacerawdata
+ */
+ private String rawdata;
+
+ public PayfaceAuthinfoRequest(WeixinPayAccount account, String storeId, String storeName, String deviceId,
+ String rawdata){
+ this.payAccount = account;
+ this.deviceId = deviceId;
+ this.rawdata = rawdata;
+ this.storeId = storeId;
+ this.storeName = storeName;
+ }
+
+ public void setAttach(String attach) {
+ this.attach = attach;
+ }
+
+ public String toRequestString(){
+ StringBuilder content = new StringBuilder();
+ content.append("");
+ content.append(String.format("%s", payAccount.getId()));
+ content.append(String.format("%s", payAccount.getMchId()));
+ if(StringUtil.isNotBlank(payAccount.getSubId())){
+ content.append(String.format("%s", payAccount.getSubId()));
+ }
+ if(StringUtil.isNotBlank(payAccount.getSubMchId())){
+ content.append(String.format("%s", payAccount.getSubMchId()));
+ }
+ content.append(String.format("%s", now));
+ content.append("1");
+ content.append(String.format("%s", SignType.MD5.name()));
+ content.append(String.format("%s", nonceStr));
+ content.append(String.format("%s", getRequestSign()));
+ content.append(String.format("%s", storeId));
+ content.append(String.format("%s", storeName));
+ content.append(String.format("%s", deviceId));
+ content.append(String.format("%s", rawdata));
+ if(StringUtil.isNotBlank(attach)){
+ content.append(String.format("", attach));
+ }
+ content.append("");
+ return content.toString();
+ }
+
+ private String getRequestSign(){
+ Map map = new HashMap();
+ map.put("appid", payAccount.getId());
+ map.put("mch_id", payAccount.getMchId());
+ if(StringUtil.isNotBlank(payAccount.getSubId())) {
+ map.put("sub_appid", payAccount.getSubId());
+ }
+ if(StringUtil.isNotBlank(payAccount.getSubMchId())){
+ map.put("sub_mch_id", payAccount.getSubMchId());
+ }
+ map.put("now", now);
+ map.put("version", "1");
+ map.put("sign_type", SignType.MD5.name());
+ map.put("nonce_str", nonceStr);
+ map.put("store_id", storeId);
+ map.put("store_name", storeName);
+ map.put("device_id", deviceId);
+ map.put("rawdata", rawdata);
+ if(StringUtil.isNotBlank(attach)) {
+ map.put("attach", attach);
+ }
+ return DigestUtil.MD5(
+ String.format("%s&key=%s", MapUtil.toJoinString(map, false, true),
+ payAccount.getPaySignKey())).toUpperCase();
+ }
+}