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(); + } +}