* 增加获取微信刷脸调用凭证接口 * 增加微信刷脸接口 1. 获取刷脸支付凭证接口 2. 刷脸支付接口master
| @@ -0,0 +1,126 @@ | |||
| package com.github.binarywang.wxpay.bean.request; | |||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||
| import lombok.*; | |||
| import me.chanjar.weixin.common.annotation.Required; | |||
| /** | |||
| * <pre> | |||
| * 获取微信刷脸调用凭证请求对象类 | |||
| * 详见文档:https://pay.weixin.qq.com/wiki/doc/wxfacepay/develop/sdk-android.html#获取数据-getwxpayfacerawdata | |||
| * Created by Jmdhappy on 2019-09-04. | |||
| * </pre> | |||
| * | |||
| * @author <a href="https://github.com/jmdhappy/xxpay-master">XxPay</a> | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @Builder(builderMethodName = "newBuilder") | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| @XStreamAlias("xml") | |||
| public class WxPayFaceAuthInfoRequest extends BaseWxPayRequest { | |||
| /** | |||
| * <pre> | |||
| * 字段名:门店编号 | |||
| * 变量名:store_id | |||
| * 是否必填:是 | |||
| * 类型:string(32) | |||
| * 示例值:1001 | |||
| * 描述:门店编号, 由商户定义, 各门店唯一 | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("store_id") | |||
| private String storeId; | |||
| /** | |||
| * <pre> | |||
| * 字段名:门店名称 | |||
| * 变量名:store_name | |||
| * 是否必填:是 | |||
| * 类型:string(128) | |||
| * 示例值:骏易科技 | |||
| * 描述:门店名称,由商户定义。(可用于展示) | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("store_name") | |||
| private String storeName; | |||
| /** | |||
| * <pre> | |||
| * 字段名:终端设备编号 | |||
| * 变量名:device_id | |||
| * 是否必填:是 | |||
| * 类型:string(32) | |||
| * 示例值: | |||
| * 描述:终端设备编号,由商户定义。 | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("device_id") | |||
| private String deviceId; | |||
| /** | |||
| * <pre> | |||
| * 字段名:附加字段 | |||
| * 变量名:attach | |||
| * 是否必填:是 | |||
| * 类型:string | |||
| * 示例值: | |||
| * 描述:附加字段。字段格式使用Json | |||
| * </pre> | |||
| */ | |||
| @XStreamAlias("attach") | |||
| private String attach; | |||
| /** | |||
| * <pre> | |||
| * 字段名:初始化数据 | |||
| * 变量名:attach | |||
| * 是否必填:是 | |||
| * 类型:string(2048) | |||
| * 示例值: | |||
| * 描述:初始化数据。由微信人脸SDK的接口返回。 | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("rawdata") | |||
| private String rawdata; | |||
| /** | |||
| * <pre> | |||
| * 字段名:当前时间 | |||
| * 变量名:now | |||
| * 是否必填:否 | |||
| * 类型:String(10) | |||
| * 示例值:1239878956 | |||
| * 描述:取当前时间,10位unix时间戳。 例如:1239878956 | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("now") | |||
| private String now; | |||
| /** | |||
| * <pre> | |||
| * 字段名:接口版本号. | |||
| * 变量名:version | |||
| * 是否必填:是 | |||
| * 类型:String | |||
| * 示例值:1.0 | |||
| * 描述:版本号。固定为1 | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("version") | |||
| private String version; | |||
| @Override | |||
| protected void checkConstraints() { | |||
| //do nothing | |||
| } | |||
| } | |||
| @@ -0,0 +1,177 @@ | |||
| package com.github.binarywang.wxpay.bean.request; | |||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||
| import lombok.*; | |||
| import me.chanjar.weixin.common.annotation.Required; | |||
| /** | |||
| * <pre> | |||
| * 提交刷脸支付请求对象类 | |||
| * 详见文档:微信人脸支付商户开发文档 | |||
| * Created by Jmdhappy on 2019-09-05. | |||
| * </pre> | |||
| * | |||
| * @author <a href="https://github.com/jmdhappy/xxpay-master">XxPay</a> | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @Builder(builderMethodName = "newBuilder") | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| @XStreamAlias("xml") | |||
| public class WxPayFacepayRequest extends BaseWxPayRequest { | |||
| /** | |||
| * <pre> | |||
| * 字段名:设备号. | |||
| * 变量名:device_info | |||
| * 是否必填:否 | |||
| * 类型:String(32) | |||
| * 示例值:013467007045764 | |||
| * 描述:终端设备号(商户自定义,如门店编号) | |||
| * </pre> | |||
| */ | |||
| @XStreamAlias("device_info") | |||
| private String deviceInfo; | |||
| /** | |||
| * <pre> | |||
| * 字段名:商品描述. | |||
| * 变量名:body | |||
| * 是否必填:是 | |||
| * 类型:String(128) | |||
| * 示例值:image形象店-深圳腾大- QQ公仔 | |||
| * 描述:商品或支付单简要描述,格式要求:门店品牌名-城市分店名-实际商品名称 | |||
| * </pre> | |||
| **/ | |||
| @Required | |||
| @XStreamAlias("body") | |||
| private String body; | |||
| /** | |||
| * <pre> | |||
| * 字段名:商品详情. | |||
| * 变量名:detail | |||
| * 是否必填:否 | |||
| * 类型:String(8192) | |||
| * 示例值: | |||
| * 描述:商品详细列表,使用Json格式,传输签名前请务必使用CDATA标签将JSON文本串保护起来。</pre> | |||
| **/ | |||
| @XStreamAlias("detail") | |||
| private String detail; | |||
| /** | |||
| * <pre> | |||
| * 字段名:附加数据. | |||
| * 变量名:attach | |||
| * 是否必填:否 | |||
| * 类型:String(127) | |||
| * 示例值:说明 | |||
| * 描述:附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("attach") | |||
| private String attach; | |||
| /** | |||
| * <pre> | |||
| * 字段名:商户订单号. | |||
| * 变量名:out_trade_no | |||
| * 是否必填:是 | |||
| * 类型:String(32) | |||
| * 示例值:1217752501201407033233368018 | |||
| * 描述:商户系统内部的订单号,32个字符内、可包含字母;更换授权码必须要换新的商户订单号 其他说明见商户订单号 | |||
| * </pre> | |||
| **/ | |||
| @Required | |||
| @XStreamAlias("out_trade_no") | |||
| private String outTradeNo; | |||
| /** | |||
| * <pre> | |||
| * 字段名:总金额. | |||
| * 变量名:total_fee | |||
| * 是否必填:是 | |||
| * 类型:Int | |||
| * 示例值:888 | |||
| * 描述:订单总金额,单位为分,只能为整数,详见支付金额 | |||
| * </pre> | |||
| **/ | |||
| @Required | |||
| @XStreamAlias("total_fee") | |||
| private Integer totalFee; | |||
| /** | |||
| * <pre> | |||
| * 字段名:货币类型. | |||
| * 变量名:fee_type | |||
| * 是否必填:否 | |||
| * 类型:String(16) | |||
| * 示例值:CNY | |||
| * 描述:符合ISO4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("fee_type") | |||
| private String feeType; | |||
| /** | |||
| * <pre> | |||
| * 字段名:终端IP. | |||
| * 变量名:spbill_create_ip | |||
| * 是否必填:是 | |||
| * 类型:String(16) | |||
| * 示例值:127.0.0.1 | |||
| * 描述:调用微信支付API的机器IP | |||
| * </pre> | |||
| **/ | |||
| @Required | |||
| @XStreamAlias("spbill_create_ip") | |||
| private String spbillCreateIp; | |||
| /** | |||
| * <pre> | |||
| * 字段名:商品标记. | |||
| * 变量名:goods_tag | |||
| * 是否必填:否 | |||
| * 类型:String(32) | |||
| * 示例值:1234 | |||
| * 描述:商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("goods_tag") | |||
| private String goodsTag; | |||
| /** | |||
| * <pre> | |||
| * 字段名:用户标识. | |||
| * 变量名:openid | |||
| * 是否必填:是 | |||
| * 类型:String(128) | |||
| * 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o | |||
| * 描述:用户在商户appid 下的唯一标识 | |||
| * </pre> | |||
| */ | |||
| @Required | |||
| @XStreamAlias("openid") | |||
| private String openid; | |||
| /** | |||
| * <pre> | |||
| * 字段名:人脸凭证. | |||
| * 变量名:face_code | |||
| * 是否必填:是 | |||
| * 类型:String(128) | |||
| * 示例值: | |||
| * 描述:人脸凭证,用于刷脸支付 | |||
| * </pre> | |||
| **/ | |||
| @Required | |||
| @XStreamAlias("face_code") | |||
| private String faceCode; | |||
| @Override | |||
| protected void checkConstraints() { | |||
| //do nothing | |||
| } | |||
| } | |||
| @@ -0,0 +1,38 @@ | |||
| package com.github.binarywang.wxpay.bean.result; | |||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.NoArgsConstructor; | |||
| import java.io.Serializable; | |||
| /** | |||
| * <pre> | |||
| * 获取微信刷脸调用凭证返回结果. | |||
| * 详见文档:https://pay.weixin.qq.com/wiki/doc/wxfacepay/develop/sdk-android.html#获取数据-getwxpayfacerawdata | |||
| * </pre> | |||
| * | |||
| * @author Jmdhappy | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @NoArgsConstructor | |||
| @XStreamAlias("xml") | |||
| public class WxPayFaceAuthInfoResult extends BaseWxPayResult implements Serializable { | |||
| private static final long serialVersionUID = -65138145275211272L; | |||
| /** | |||
| * SDK调用凭证. | |||
| */ | |||
| @XStreamAlias("authinfo") | |||
| private String authinfo; | |||
| /** | |||
| * authinfo的有效时间, 单位秒. | |||
| */ | |||
| @XStreamAlias("expires_in") | |||
| private String expiresIn; | |||
| } | |||
| @@ -0,0 +1,245 @@ | |||
| package com.github.binarywang.wxpay.bean.result; | |||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import lombok.NoArgsConstructor; | |||
| /** | |||
| * <pre> | |||
| * 提交书刷脸支付接口响应结果对象类 | |||
| * Created by Jmdhappy on 2019-09-05. | |||
| * </pre> | |||
| * | |||
| * @author <a href="https://github.com/jmdhappy/xxpay-master">XxPay</a> | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @NoArgsConstructor | |||
| @XStreamAlias("xml") | |||
| public class WxPayFacepayResult extends BaseWxPayResult { | |||
| private static final long serialVersionUID = -4116580976046716911L; | |||
| /** | |||
| * <pre> | |||
| * 设备号. | |||
| * device_info | |||
| * 否 | |||
| * String(32) | |||
| * 013467007045764 | |||
| * 调用接口提交的终端设备号 | |||
| * </pre> | |||
| */ | |||
| @XStreamAlias("device_info") | |||
| private String deviceInfo; | |||
| /** | |||
| * <pre> | |||
| * 用户标识. | |||
| * openid | |||
| * 是 | |||
| * String(128) | |||
| * Y | |||
| * 用户在商户appid 下的唯一标识 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("openid") | |||
| private String openid; | |||
| /** | |||
| * <pre> | |||
| * 是否关注公众账号. | |||
| * is_subscribe | |||
| * 是 | |||
| * String(1) | |||
| * Y | |||
| * 用户是否关注公众账号,仅在公众账号类型支付有效,取值范围:Y或N;Y-关注;N-未关注 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("is_subscribe") | |||
| private String isSubscribe; | |||
| /** | |||
| * <pre> | |||
| * 用户子标识. | |||
| * sub_openid | |||
| * 否 | |||
| * String(128) | |||
| * Y | |||
| * 子商户appid下用户唯一标识,如需返回则请求时需要传sub_appid | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("sub_openid") | |||
| private String subOpenid; | |||
| /** | |||
| * <pre> | |||
| * 是否关注子公众账号. | |||
| * sub_is_subscribe | |||
| * 是 | |||
| * String(1) | |||
| * Y | |||
| * 用户是否关注子公众账号,仅在公众账号类型支付有效,取值范围:Y或N;Y-关注;N-未关注 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("sub_is_subscribe") | |||
| private String subsSubscribe; | |||
| /** | |||
| * <pre> | |||
| * 交易类型. | |||
| * trade_type | |||
| * 是 | |||
| * String(16) | |||
| * FACEPAY | |||
| * 支付类型为 FACEPAY(即刷脸支付) | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("trade_type") | |||
| private String tradeType; | |||
| /** | |||
| * <pre> | |||
| * 付款银行. | |||
| * bank_type | |||
| * 是 | |||
| * String(32) | |||
| * CMC | |||
| * 银行类型,采用字符串类型的银行标识,值列表详见银行类型 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("bank_type") | |||
| private String bankType; | |||
| /** | |||
| * <pre> | |||
| * 货币类型. | |||
| * fee_type | |||
| * 否 | |||
| * String(16) | |||
| * CNY | |||
| * 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("fee_type") | |||
| private String feeType; | |||
| /** | |||
| * <pre> | |||
| * 订单金额. | |||
| * total_fee | |||
| * 是 | |||
| * Int | |||
| * 888 | |||
| * 订单总金额,单位为分,只能为整数,详见支付金额 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("total_fee") | |||
| private Integer totalFee; | |||
| /** | |||
| * <pre> | |||
| * 现金支付货币类型. | |||
| * cash_fee_type | |||
| * 否 | |||
| * String(16) | |||
| * CNY | |||
| * 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("cash_fee_type") | |||
| private String cashFeeType; | |||
| /** | |||
| * <pre> | |||
| * 现金支付金额. | |||
| * cash_fee | |||
| * 是 | |||
| * Int | |||
| * 100 | |||
| * 订单现金支付金额,详见支付金额 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("cash_fee") | |||
| private Integer cashFee; | |||
| /** | |||
| * <pre> | |||
| * 微信支付订单号. | |||
| * transaction_id | |||
| * 是 | |||
| * String(32) | |||
| * 1217752501201407033233368018 | |||
| * 微信支付订单号 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("transaction_id") | |||
| private String transactionId; | |||
| /** | |||
| * <pre> | |||
| * 商户订单号. | |||
| * out_trade_no | |||
| * 是 | |||
| * String(32) | |||
| * 1217752501201407033233368018 | |||
| * 商户系统的订单号,与请求一致。 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("out_trade_no") | |||
| private String outTradeNo; | |||
| /** | |||
| * <pre> | |||
| * 商品详情. | |||
| * detail | |||
| * 否 | |||
| * String(8192) | |||
| * 与提交数据一致 | |||
| * 实际提交的返回 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("detail") | |||
| private String detail; | |||
| /** | |||
| * <pre> | |||
| * 商家数据包. | |||
| * attach | |||
| * 否 | |||
| * String(128) | |||
| * 123456 | |||
| * 商家数据包,原样返回 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("attach") | |||
| private String attach; | |||
| /** | |||
| * <pre> | |||
| * 营销详情. | |||
| * promotion_detail | |||
| * 否 | |||
| * String(6000) | |||
| * 示例见下文 | |||
| * 新增返回,单品优惠功能字段,需要接入请见详细说明 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("promotion_detail") | |||
| private String promotionDetail; | |||
| /** | |||
| * <pre> | |||
| * 支付完成时间. | |||
| * time_end | |||
| * 是 | |||
| * String(14) | |||
| * 20141030133525 | |||
| * 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。详见时间规则 | |||
| * </pre> | |||
| **/ | |||
| @XStreamAlias("time_end") | |||
| private String timeEnd; | |||
| } | |||
| @@ -704,4 +704,37 @@ public interface WxPayService { | |||
| * @throws WxPayException the wx pay exception | |||
| */ | |||
| String queryComment(WxPayQueryCommentRequest request) throws WxPayException; | |||
| /** | |||
| * <pre> | |||
| * 获取微信刷脸支付凭证. | |||
| * 接口请求链接:https://payapp.weixin.qq.com/face/get_wxpayface_authinfo | |||
| * 文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_5 | |||
| * </pre> | |||
| * | |||
| * @param request the request | |||
| * @return the wx pay get face authinfo result | |||
| * @throws WxPayException the wx pay exception | |||
| */ | |||
| WxPayFaceAuthInfoResult getWxPayFaceAuthInfo(WxPayFaceAuthInfoRequest request) throws WxPayException; | |||
| /** | |||
| * <pre> | |||
| * 提交刷脸支付. | |||
| * 文档地址:https://share.weiyun.com/5dxUgCw | |||
| * 应用场景: | |||
| * 用户在商超,便利店,餐饮等场景,在屏幕上通过刷脸完成支付。 | |||
| * 步骤1:用户在自助收银机上点击“刷脸支付”; | |||
| * 步骤2:发起人脸识别,摄像头自动抓取识别用户人脸,提示用户输入11位手机号码; | |||
| * 步骤3:商户收银系统提交刷脸支付; | |||
| * 步骤4:微信支付后台收到支付请求,验证人脸信息,返回支付结果给商户收银系统。 | |||
| * 是否需要证书:不需要。 | |||
| * </pre> | |||
| * | |||
| * @param request the request | |||
| * @return the wx pay facepay result | |||
| * @throws WxPayException the wx pay exception | |||
| */ | |||
| WxPayFacepayResult facepay(WxPayFacepayRequest request) throws WxPayException; | |||
| } | |||
| @@ -788,4 +788,25 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { | |||
| return responseContent; | |||
| } | |||
| @Override | |||
| public WxPayFaceAuthInfoResult getWxPayFaceAuthInfo(WxPayFaceAuthInfoRequest request) throws WxPayException { | |||
| request.checkAndSign(this.getConfig()); | |||
| String url = "https://payapp.weixin.qq.com/face/get_wxpayface_authinfo"; | |||
| String responseContent = this.post(url, request.toXML(), false); | |||
| WxPayFaceAuthInfoResult result = BaseWxPayResult.fromXML(responseContent, WxPayFaceAuthInfoResult.class); | |||
| result.checkResult(this, request.getSignType(), true); | |||
| return result; | |||
| } | |||
| @Override | |||
| public WxPayFacepayResult facepay(WxPayFacepayRequest request) throws WxPayException { | |||
| request.checkAndSign(this.getConfig()); | |||
| String url = this.getPayBaseUrl() + "/pay/facepay"; | |||
| String responseContent = this.post(url, request.toXML(), false); | |||
| WxPayFacepayResult result = BaseWxPayResult.fromXML(responseContent, WxPayFacepayResult.class); | |||
| result.checkResult(this, request.getSignType(), true); | |||
| return result; | |||
| } | |||
| } | |||