#1248 增加微信刷脸支付支持相关接口

* 增加获取微信刷脸调用凭证接口

* 增加微信刷脸接口
1. 获取刷脸支付凭证接口
2. 刷脸支付接口
This commit is contained in:
dingzhiwei 2019-10-24 09:25:31 +08:00 committed by Binary Wang
parent d184ff8303
commit 8dffbd4fdb
6 changed files with 640 additions and 0 deletions

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}