https://b.alipay.com/登录支付宝商家服务开通支付,进入开放平台,查看开放平台密钥的APPID(应用ID),应用公钥,支付宝公钥,授权回调地址。
初次支付可能还没有设置应用密钥,可以使用支付宝的工具,获取应用公钥和应该私钥。设置应该公钥,私钥自己保存。
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--支付宝sdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.4.ALL</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.45</version>
</dependency>
</dependencies>
工具类
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
public class AlipayUtil {
/**
* map转obejct
*/
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
if (map == null)
return null;
Object obj = beanClass.newInstance();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
int mod = field.getModifiers();
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
field.setAccessible(true);
field.set(obj, map.get(field.getName()));
}
return obj;
}
/**
* obejct转map
* @param obj
* @return
* @throws Exception
*/
public static Map<String, Object> objectToMap(Object obj) throws Exception {
if(obj == null){
return null;
}
Map<String, Object> map = new HashMap<String, Object>();
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj));
}
return map;
}
}
配置信息
/*
支付宝配置信息
*/
public class AlipayConfig {
public static String open_api_domain = "https://openapi.alipay.com/gateway.do";//支付宝网关
public static String mcloud_api_domain="http://mcloudmonitor.com/gateway.do";//系统商户保障网关
public static String pid="2088102177389651";//商户的uid
public static String appid="2016092600602700";//商户应用的appid
//RSA私钥公钥和支付宝公钥
public static String private_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC6glV6xtCY9oERms9DBLb249rPQ4TJELwvsgDLX9fT31zCiMSOizyL5dglaH2s/uGJ6uEtvRzixq9DYy/NCrdh7gavvdvfx0ANagJt7Be+ZquiLB9noqsOY4NweH+PE95I8zBMpkQJc24F1r7iCpiyQ/vpNJnAQQRyKrD/wukT4aLWItJgCMPaw1Cy3qdWNUxF0Xkv9cF0Hk543W179QtrNCxgtAyzCZg+QtjntYdbO9oySZHLzHZQpjhmoi4E02SH28fz+cikCCzjtnY9pcs3qYW+gFnkgbemEiBwqWQjKgzQm27hIPiHJ9KiVCszy7Cr0L4uv9YRUR5C3qstJk2TAgMBAAECggEAJ6g04sFJc2zers6bCWYEPWTfjriNkG8lhIK11oiPjLZus9J+8Mw8WIbLudCJAHLFpBy0OpR+gt26QHrjnBaOPZ1uAIo/KUrlnLSQxayws8SC9B2ro86bzphsR0rn3JVd62cCOxoTV2sa1tT9i3SzWRxJgSG1G4L3ngrjzc403wv6NAbHzjuRp3kd4fSOnh6uAqQX2Z04LhoRIsFtLO+V3jk8xMUBP4WzXIqbFVbRe8mtvtPfKGpVTK4OKBcENn3qXrpTHsNOxzclwa4ujFVsDCKjt6t0uavtX7UX9dqVQ+PrdQhdA+uGOfPE3TELnjliCpLqdWnABaRURaY1GClQmQKBgQD9Kvhq1vmZHM8nF5KeThw0yHWrHv0rFG+5+pcvHaYUBoEPbROo87hoIC/GZDnxka9H2SHo7daADLmYqZd6rzDGKtD36ta6FxsobEZ8VaNbbWzD1ncMefLuz25447s2fUIbFpUZLx9wURXm4VkBzCpr4rwRxoT8h03Mir74sklH3wKBgQC8mHbZasIxy7MRSDcZpRwMDpkQMF2mbJLosNuZ54tWTS7OI9FdzcasNY2h2GCCbnZxdHFh/IVodZMa5R/I7fJoDANpc0uOEoogd5XjxzMOx+Q/pneO1UNQymVFzKGM927kK3NdpRAY+//ULz7cxj2Z4XpuDMZxbGR3eNhiuYBAzQKBgQDEu8+vtr7frPONfVQCkNB6dAx8neg+wfLQo1s40eFtTmCcjDbq4/o5cEmv8dLVVlDPlHw1dh1qBHl1mNSOEfXlCQC6p1OV6L7B+uILXMFFGxOaW97HYzzVN3yxlMa24T+trS7QEz5rGZfbguKX8wBENj3P0mUlmD9s46TjvigUIQKBgQCCK3GMqwUSPZiAyylMyAtNvx2icN+SqMnVVYyc85XWoTs3CL3PUuJXpjb1iFVEcV3K/SXtDdA+wzgfjhmcI6/2ZKROOkfh7aXstt1789en0gwWap2GtmfZ8Xho7s5qb7XYQq1D61PrCrQPDfUDiMin11sbbjHhw4CsfXpM2eBN2QKBgGyGhE8U4TANCrP6t2ZRgu/RCAILhDyLOhRcwM+cDShJuQtm/7f3sIBlbcTOQq2OUynZwZn2zqnamtMj7p3IiObzx/ctH2DkrYA094SvkWVVq2Nf4MgyGof4iHofrECg3wW/4eltj57hCoGts0HvAhcnhaHEzb4iIEEbuas/6A2M";
public static String public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuoJVesbQmPaBEZrPQwS29uPaz0OEyRC8L7IAy1/X099cwojEjos8i+XYJWh9rP7hierhLb0c4savQ2MvzQq3Ye4Gr73b38dADWoCbewXvmaroiwfZ6KrDmODcHh/jxPeSPMwTKZECXNuBda+4gqYskP76TSZwEEEciqw/8LpE+Gi1iLSYAjD2sNQst6nVjVMRdF5L/XBdB5OeN1te/ULazQsYLQMswmYPkLY57WHWzvaMkmRy8x2UKY4ZqIuBNNkh9vH8/nIpAgs47Z2PaXLN6mFvoBZ5IG3phIgcKlkIyoM0Jtu4SD4hyfSolQrM8uwq9C+Lr/WEVEeQt6rLSZNkwIDAQAB";
//SHA256withRsa对应支付宝公钥
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwY8HbGnBgRPuTUwLtbokkX/ZIqhUqjk+S5HGVRVz5X2TeAr7rAV6/+IZRT5L/Y5iab+kcE2n5jc2aOLO5r3WWb85gNIPI+BuXop0ANYVGrtXeP1IgLO+66vI9uggDTs9uzUXlTZ/c5/PA8yXJJO+2+NbQdln1m3BGw3f+gGCyRpc6Rp3TWoze29d64CbHQBNWXAT85u4M6h+12WH2sb5JORCV95dcfAxyxel69TQIornT8kh+PkFC0SK/MujQ+wahcV6Tx0DQrrHwYfQEcEIewVDDSlThT5FZjNfA8CFdNj8n8zRLgx6J1VtiGNmqL9GCcA+hjum4k05206aqcXcZwIDAQAB";
//签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
public static String sign_type = "RSA2";
// 编码
public static String charset = "UTF-8";
// 返回格式
public static String format = "json";
// 日志记录目录
public static String log_path = "/log";
// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "";
}
所有支付的api接入
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.*;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import java.util.HashMap;
import java.util.Map;
public class Alipay {
public static AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
/**
* 应用场景 当面付条形码支付
* @param data
* @throws AlipayApiException
*/
public Map microPay(Map<Object,String> data) throws Exception {
/***
* 商户订单号
* 订单标题
* 订单总金额,单位为元,不能超过1亿元(如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】)
* 付款条码(用户支付宝钱包手机app点击“付款”产生的付款条码)
* 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
* 支付超时,线下扫码交易定义为5分钟
*/
String outTradeNo = data.get("outTradeNo");
String subject = data.get("subject");
String totalAmount = data.get("totalAmount");
String authCode = data.get("authCode");
String timeoutExpress = data.get("timeoutExpress");
//获得初始化的AlipayClient
//AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradePayRequest alipayTradePayRequest = new AlipayTradePayRequest(); //创建API对应的request类
AlipayTradePayModel alipayTradePayModel = new AlipayTradePayModel();
alipayTradePayModel.setOutTradeNo(outTradeNo);
alipayTradePayModel.setSubject(subject);
alipayTradePayModel.setTotalAmount(totalAmount);
alipayTradePayModel.setAuthCode(authCode);
alipayTradePayModel.setTimeoutExpress(timeoutExpress);
alipayTradePayRequest.setBizModel(alipayTradePayModel);
AlipayTradePayResponse alipayTradePayResponse = alipayClient.execute(alipayTradePayRequest); //通过alipayClient调用API,获得对应的response类
return AlipayUtil.objectToMap(alipayTradePayResponse);
}
/*
* 应用场景 当面付生成支付二维码
* (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,需保证商户系统端不能重复,建议通过数据库sequence生成,
* (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
* (必填) 订单总金额,单位为元,不能超过1亿元 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
* 支付超时,定义为120分钟 120m
*/
public Map barCodePay(Map<Object,String> data) throws Exception {
String outTradeNo = data.get("outTradeNo");
String subject = data.get("subject");
String totalAmount = data.get("totalAmount");
String timeoutExpress = data.get("timeoutExpress");
//获得初始化的AlipayClient
//AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradePrecreateRequest alipayTradePrecreateRequest = new AlipayTradePrecreateRequest();//创建API对应的request类
AlipayTradePrecreateModel alipayTradePrecreateModel = new AlipayTradePrecreateModel();
alipayTradePrecreateModel.setOutTradeNo(outTradeNo);
alipayTradePrecreateModel.setSubject(subject);
alipayTradePrecreateModel.setTotalAmount(totalAmount);
alipayTradePrecreateModel.setTimeoutExpress(timeoutExpress);
alipayTradePrecreateRequest.setBizModel(alipayTradePrecreateModel);
AlipayTradePrecreateResponse alipayTradePrecreateResponse = alipayClient.execute(alipayTradePrecreateRequest);
return AlipayUtil.objectToMap(alipayTradePrecreateResponse);
}
/**
* 先生成订单信息 再由原生ios android调起支付宝客户端
* 应用场景 APP支付
* @param data
* @throws AlipayApiException
*/
public Map appCreateOrder(Map<Object,String> data)throws Exception{
//实例化客户端
//AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, "json", "utf-8", AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
String body = data.get("body");
String subject = data.get("subject");
String outTradeNo = data.get("outTradeNo");
String timeoutExpress = data.get("timeoutExpress");
String totalAmount = data.get("totalAmount");
model.setBody(body);
model.setSubject(subject);
model.setOutTradeNo(outTradeNo);
model.setTimeoutExpress(timeoutExpress);
model.setTotalAmount(totalAmount);
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("http://.....");
AlipayTradeAppPayResponse response = null;
try {
//这里和普通的接口调用不同,使用的是sdkExecute
response = alipayClient.sdkExecute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return AlipayUtil.objectToMap(response);//就是orderString 可以直接给客户端请求,无需再做处理。
}
/**
* 应用场景 手机网站支付
* @param data
* @throws AlipayApiException
*/
public Map wapPay(Map<Object,String> data) throws Exception {
// 商户订单号,商户网站订单系统中唯一订单号,必填
String outTradeNo = data.get("outTradeNo");
// 订单名称,必填
String subject = data.get("subject");
// 付款金额,必填
String totalAmount = data.get("totalAmount");
// 商品描述,可空
String body = data.get("body");
// 超时时间 可空
String timeoutExpress = data.get("timeoutExpress");
// 页面返回地址
String returnUrl = data.get("returnUrl");
// 销售产品码 必填
String productCode="QUICK_WAP_WAY";
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
//调用RSA签名方式
//AlipayClient client = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradeWapPayRequest alipayRequest=new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(outTradeNo);
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setBody(body);
model.setTimeoutExpress(timeoutExpress);
model.setProductCode(productCode);
alipayRequest.setBizModel(model);
// 设置异步通知地址
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
// 设置同步地址
alipayRequest.setReturnUrl(returnUrl);
// 调用SDK生成表单
String form = alipayClient.pageExecute(alipayRequest).getBody();
Map map = new HashMap();
map.put("form",form);
// response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
// response.getWriter().write(form);//直接将完整的表单html输出到页面
// response.getWriter().flush();
// response.getWriter().close();
return map;
}
/**
* 应用场景 电脑网站支付
* @param data
* @throws AlipayApiException
*/
public Map pcPay(Map<Object,String> data) throws AlipayApiException {
// 商户订单号,商户网站订单系统中唯一订单号,必填
String outTradeNo = data.get("outTradeNo");
// 订单名称,必填
String subject = data.get("subject");
// 付款金额,必填
String totalAmount = data.get("totalAmount");
// 商品描述,可空
String body = data.get("body");
// 超时时间 可空
String timeoutExpress = data.get("timeoutExpress");
// 页面返回地址
String returnUrl = data.get("returnUrl");
// 销售产品码 必填
String productCode="FAST_INSTANT_TRADE_PAY";
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
//调用RSA签名方式
//AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();//创建API对应的request
alipayTradePagePayRequest.setNotifyUrl(AlipayConfig.notify_url);
alipayTradePagePayRequest.setReturnUrl(returnUrl);
AlipayTradePagePayModel alipayTradePagePayModel = new AlipayTradePagePayModel();
alipayTradePagePayModel.setOutTradeNo(outTradeNo);
alipayTradePagePayModel.setSubject(subject);
alipayTradePagePayModel.setTotalAmount(totalAmount);
alipayTradePagePayModel.setProductCode(productCode);
alipayTradePagePayModel.setBody(body);
alipayTradePagePayModel.setTimeoutExpress(timeoutExpress);
alipayTradePagePayRequest.setBizModel(alipayTradePagePayModel);
String form = alipayClient.pageExecute(alipayTradePagePayRequest).getBody(); //调用SDK生成表单
Map map = new HashMap();
map.put("form",form);
return map;
}
/**
* 账单下载
* @param data
* @return
* @throws Exception
*/
public Map downloadBill(Map<Object,String> data) throws Exception {
// 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;
// trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单;
String billType = data.get("billType");
// 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。
String billDate = data.get("billDate");
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
AlipayClient client = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayDataDataserviceBillDownloadurlQueryRequest alipayRequest = new AlipayDataDataserviceBillDownloadurlQueryRequest();
AlipayDataDataserviceBillDownloadurlQueryModel model =new AlipayDataDataserviceBillDownloadurlQueryModel();
model.setBillType(billType);
model.setBillDate(billDate);
alipayRequest.setBizModel(model);
AlipayDataDataserviceBillDownloadurlQueryResponse alipayResponse = client.execute(alipayRequest);
return AlipayUtil.objectToMap(alipayResponse);
}
/**
* 支付撤销
* @param data
* @return
* @throws Exception
*/
public Map cancel(Map<Object,String> data) throws Exception {
//商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
//商户订单号,和支付宝交易号二选一
String outTradeNo = data.get("outTradeNo");
//支付宝交易号,和商户订单号二选一
String tradeNo = data.get("tradeNo");
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //获得初始化的AlipayClient
AlipayTradeCancelRequest alipayTradeCancelRequest = new AlipayTradeCancelRequest();//创建API对应的request类
AlipayTradeCancelModel alipayTradeCancelModel = new AlipayTradeCancelModel();
alipayTradeCancelModel.setOutTradeNo(outTradeNo);
alipayTradeCancelModel.setTradeNo(tradeNo);
AlipayTradeCancelResponse alipayTradeCancelResponse = alipayClient.execute(alipayTradeCancelRequest);//通过alipayClient调用API,获得对应的response类
return AlipayUtil.objectToMap(alipayTradeCancelResponse);
}
/**
* 关闭支付接口
* @param data
* @return
* @throws Exception
*/
public Map close(Map<Object,String> data) throws Exception {
//商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
//商户订单号,和支付宝交易号二选一
String outTradeNo = data.get("outTradeNo");
//支付宝交易号,和商户订单号二选一
String tradeNo = data.get("tradeNo");
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
AlipayClient client = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradeCloseRequest alipayRequest=new AlipayTradeCloseRequest();
AlipayTradeCloseModel model =new AlipayTradeCloseModel();
model.setOutTradeNo(outTradeNo);
model.setTradeNo(tradeNo);
alipayRequest.setBizModel(model);
AlipayTradeCloseResponse alipayResponse=client.execute(alipayRequest);
return AlipayUtil.objectToMap(alipayResponse);
}
/**
* 回调处理
* @param params
* @return
* @throws AlipayApiException
*/
public boolean notify(Map params) throws AlipayApiException {
// //获取支付宝POST过来反馈信息
// Map<String,String> params = new HashMap<String,String>();
// Map requestParams = request.getParameterMap();
// for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
// String name = (String) iter.next();
// String[] values = (String[]) requestParams.get(name);
// String valueStr = "";
// for (int i = 0; i < values.length; i++) {
// valueStr = (i == values.length - 1) ? valueStr + values[i]
// : valueStr + values[i] + ",";
// }
// //乱码解决,这段代码在出现乱码时使用。
// //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
// params.put(name, valueStr);
// }
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
return flag;
}
/**
* 订单查询
* @param data
* @return
* @throws Exception
*/
public Map query(Map<Object,String> data) throws Exception {
//商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
//商户订单号,和支付宝交易号二选一
String outTradeNo = data.get("outTradeNo");
//支付宝交易号,和商户订单号二选一
String tradeNo = data.get("tradeNo");
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
AlipayClient client = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
AlipayTradeQueryModel model=new AlipayTradeQueryModel();
model.setOutTradeNo(outTradeNo);
model.setTradeNo(tradeNo);
alipayRequest.setBizModel(model);
AlipayTradeQueryResponse alipayTradePayResponse = client.execute(alipayRequest);
return AlipayUtil.objectToMap(alipayTradePayResponse);
}
/**
* 退款查询
* @param data
* @return
* @throws Exception
*/
public Map refundQuery(Map<Object,String> data) throws Exception {
//商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
//商户订单号,和支付宝交易号二选一
String outTradeNo = data.get("outTradeNo");
//支付宝交易号,和商户订单号二选一
String tradeNo = data.get("tradeNo");
//请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号
String outRequestNo = data.get("outRequestNo");
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
AlipayClient client = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();
AlipayTradeFastpayRefundQueryModel model=new AlipayTradeFastpayRefundQueryModel();
model.setOutTradeNo(outTradeNo);
model.setTradeNo(tradeNo);
model.setOutRequestNo(outRequestNo);
alipayRequest.setBizModel(model);
AlipayTradeFastpayRefundQueryResponse alipayResponse=client.execute(alipayRequest);
return AlipayUtil.objectToMap(alipayResponse);
}
/**
* 退款
* @param data
* @return
* @throws Exception
*/
public Map refund(Map<Object,String> data) throws Exception {
//商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
//商户订单号,和支付宝交易号二选一
String outTradeNo = data.get("outTradeNo");
//支付宝交易号,和商户订单号二选一
String tradeNo = data.get("tradeNo");
//退款金额,不能大于订单总金额
String refundAmount = data.get("outTradeNo");
//退款的原因说明
String refundReason = data.get("outTradeNo");
//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
String outRequestNo = data.get("outTradeNo");
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
AlipayClient client = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradeRefundRequest alipayTradeRefundRequest = new AlipayTradeRefundRequest();
AlipayTradeRefundModel model=new AlipayTradeRefundModel();
model.setOutTradeNo(outTradeNo);
model.setTradeNo(tradeNo);
model.setRefundAmount(refundAmount);
model.setRefundReason(refundReason);
model.setOutRequestNo(outRequestNo);
alipayTradeRefundRequest.setBizModel(model);
AlipayTradeRefundResponse alipayTradeRefundResponse =client.execute(alipayTradeRefundRequest);
return AlipayUtil.objectToMap(alipayTradeRefundResponse);
}
public static void main(String[] args) throws Exception {
Map<Object,String> map = new HashMap<Object,String>();
map.put("body","23131313131313");
map.put("outTradeNo","23131313131313");
map.put("subject","hahaha");
map.put("totalAmount","100");
map.put("timeoutExpress","30m");
map.put("returnUrl","https://www.baidu.com");
Alipay aliAppPay = new Alipay();
System.out.println("返回内容"+aliAppPay.pcPay(map));
}
}
人脸识别配置
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Logger;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePayModel;
import com.alipay.api.request.AlipayTradePayRequest;
import com.alipay.api.request.ZolozAuthenticationCustomerSmilepayInitializeRequest;
import com.alipay.api.response.AlipayTradePayResponse;
import com.alipay.api.response.ZolozAuthenticationCustomerSmilepayInitializeResponse;
import com.alipay.zoloz.smile2pay.service.Zoloz;
import com.alipay.zoloz.smile2pay.service.ZolozCallback;
import org.slf4j.LoggerFactory;
public class AlipaySmile {
Logger log = (Logger) LoggerFactory.getLogger(AlipaySmile.class);
private static final String TAG = "smiletopay";
private Zoloz zoloz;
// 值为"1000"调用成功
// 值为"1003"用户选择退出
// 值为"1004"超时
// 值为"1005"用户选用其他支付方式
static final String CODE_SUCCESS = "1000";
static final String CODE_EXIT = "1003";
static final String CODE_TIMEOUT = "1004";
static final String CODE_OTHER_PAY = "1005";
static final String TXT_EXIT = "已退出刷脸支付";
static final String TXT_TIMEOUT = "操作超时";
static final String TXT_OTHER_PAY = "已退出刷脸支付";
static final String TXT_OTHER = "抱歉未支付成功,请重新支付";
//刷脸支付相关
static final String SMILEPAY_CODE_SUCCESS = "10000";
static final String SMILEPAY_SUBCODE_LIMIT = "ACQ.PRODUCT_AMOUNT_LIMIT_ERROR";
static final String SMILEPAY_SUBCODE_BALANCE_NOT_ENOUGH = "ACQ.BUYER_BALANCE_NOT_ENOUGH";
static final String SMILEPAY_SUBCODE_BANKCARD_BALANCE_NOT_ENOUGH = "ACQ.BUYER_BANKCARD_BALANCE_NOT_ENOUGH";
static final String SMILEPAY_TXT_LIMIT = "刷脸支付超出限额,请选用其他支付方式";
static final String SMILEPAY_TXT_EBALANCE_NOT_ENOUGH = "账户余额不足,支付失败";
static final String SMILEPAY_TXT_BANKCARD_BALANCE_NOT_ENOUGH = "账户余额不足,支付失败";
static final String SMILEPAY_TXT_FAIL = "抱歉未支付成功,请重新支付";
static final String SMILEPAY_TXT_SUCCESS = "刷脸支付成功";
/**
* mock数据,真实商户请填写真实信息.
*/
private Map mockInfo() {
Map merchantInfo = new HashMap();
//以下信息请根据真实情况填写
//商户 Pid
merchantInfo.put("merchantId", "");
//ISV PID
merchantInfo.put("partnerId", "");
//添加刷脸付功能的appid
merchantInfo.put("appId", "");
//机具编号,便于关联商家管理的机具
merchantInfo.put("deviceNum", "TEST_ZOLOZ_TEST");
//商户的门店编号
merchantInfo.put("storeCode", "TEST");
//支付宝门店编号
merchantInfo.put("alipayStoreCode", "TEST");
return merchantInfo;
}
/**
* 发起刷脸支付请求,先zolozGetMetaInfo获取本地app信息,然后调用服务端获取刷脸付协议.
*/
private void smilePay(Map<Object,String> data)throws Exception{
//调用zolozGetMetaInfo完成设备信息采集
zoloz.zolozGetMetaInfo(mockInfo(), new ZolozCallback() {
// 解析zolozGetMetaInfo返回的结果,如果成功,则请求商户服务端调用人脸初始化接口
@Override
public void response(Map smileToPayResponse) {
if(smileToPayResponse!=null){
String code = (String)smileToPayResponse.get("code");
String metaInfo = (String)smileToPayResponse.get("metainfo");
if (CODE_SUCCESS.equalsIgnoreCase(code) && metaInfo != null){
// 将metaInfo发送给商户服务端,由商户服务端发起刷脸初始化OpenAPI的调用
//正式接入请上传metaInfo到服务端,不要忘记UrlEncode,使用服务端使用的sdk从服务端访问openapi获取zimId和zimInitClientData;
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.public_key,AlipayConfig.sign_type);
ZolozAuthenticationCustomerSmilepayInitializeRequest request
= new ZolozAuthenticationCustomerSmilepayInitializeRequest();
// zolozGetMetaInfo接口返回的metainfo对象中加入业务参数
com.alibaba.fastjson.JSONObject zimmetainfo = JSON.parseObject(metaInfo);
com.alibaba.fastjson.JSONObject merchantInfo = zimmetainfo.getJSONObject("merchantInfo");
merchantInfo.put("pay_amount", data.get("totalAmount"));//可选,支付币种订单金额,值为double类型
merchantInfo.put("pay_currency", "CNY");//可选,支付币种,目前仅支持 人民币:CNY
// com.alibaba.fastjson.JSONObject extInfo = new com.alibaba.fastjson.JSONObject();
//
// /* start: 如果是姓名+身份证号方式的刷脸支付,请加入以下代码 */
// extInfo.put("certNo", "身份证号"); //必填,当前被认证用户的身份证号
// extInfo.put("certName", "身份证姓名");//必填,当前被认证用户的姓名(保持和身份证一致)
// extInfo.put("certType", "IDCARD"); //必填,写为IDCARD,表明身份证
// extInfo.put("bizType", "8"); //必填,固定写为8,表明基于姓名和身份证号的刷脸支付场景
// /* end: -------------------------------------------- */
//
// zimmetainfo.put("extInfo", extInfo);
request.setBizContent(zimmetainfo.toJSONString());
try {
ZolozAuthenticationCustomerSmilepayInitializeResponse response = alipayClient.execute(request);
if (response != null && SMILEPAY_CODE_SUCCESS.equals(response.getCode())) {
try {
ZolozAuthenticationCustomerSmilepayInitializeResponse zolozResponse
= (ZolozAuthenticationCustomerSmilepayInitializeResponse)response;
String result = zolozResponse.getResult();
com.alibaba.fastjson.JSONObject resultJson = com.alibaba.fastjson.JSON.parseObject(result);
String zimId = resultJson.getString("zimId");
String zimInitClientData = resultJson.getString("zimInitClientData");
data.put("zimId",zimId);
data.put("zimInitClientData",zimInitClientData);
//人脸调用
smile(data);
} catch (Exception e) {
log.info(TXT_OTHER);
}
} else {
log.info(TXT_OTHER);
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
}
}
});
}
/**
* 发起刷脸支付请求.
* zimId 刷脸付token,从服务端获取,不要mock传入
* zimInitClientData 刷脸付协议,从服务端获取,不要mock传入
*/
private void smile(Map<Object,String> data) {
// 将上一步中initialize接口返回的zimInitClientData对象和zimId作为入參
Map params = new HashMap();
params.put("zim.init.resp", data.get("zimInitClientData"));
/* start: 如果是预输入手机号方案,请加入以下代码,填入会员绑定的手机号,必须与支付宝帐号对应的手机号一致 用于会员刷脸付方案。填入用户登录会员系统的手机号 */
//params.put("phone_number", "1381XXXXX");
/* end: --------------------------------------------- */
/* 可选:smile_mode用于指定选择刷脸模式,值为int类型,0:主屏幕显示(默认值);1:双面屏机具,副屏幕显示 */
params.put("smile_mode", 0);
zoloz.zolozVerify(data.get("zimId"), params, new ZolozCallback() {
@Override
public void response(Map smileToPayResponse) {
if(smileToPayResponse!=null){
String code = (String)smileToPayResponse.get("code");
String fToken = (String)smileToPayResponse.get("ftoken");
String subCode = (String)smileToPayResponse.get("subCode");
String msg = (String)smileToPayResponse.get("msg");
//刷脸成功
if (CODE_SUCCESS.equalsIgnoreCase(code) && fToken != null){
try {
data.put("fToken",fToken);
pay(data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
});
}
/**
* 发起刷脸支付请求.
* ftoken 刷脸返回的token
*
*/
private void pay(Map<Object,String> data) throws Exception{
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.open_api_domain, AlipayConfig.appid, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
AlipayTradePayRequest alipayTradePayRequest = new AlipayTradePayRequest(); //创建API对应的request类
AlipayTradePayModel alipayTradePayModel = new AlipayTradePayModel();
//auth_code和scene填写需要注意
alipayTradePayModel.setAuthCode(data.get("fToken")); // 人脸zolozVerify接口返回的ftoken
alipayTradePayModel.setScene("security_code");//对于刷脸付,必须写为security_code
alipayTradePayModel.setSubject(data.get("subject"));
alipayTradePayModel.setTimeoutExpress(data.get("timeoutExpress"));
alipayTradePayModel.setTotalAmount(data.get("totalAmount"));
alipayTradePayRequest.setBizModel(alipayTradePayModel);
AlipayTradePayResponse alipayTradePayResponse = alipayClient.execute(alipayTradePayRequest); //通过alipayClient调用API,获得对应的response类
System.out.print(alipayTradePayResponse.getBody());
if (alipayTradePayResponse != null && SMILEPAY_CODE_SUCCESS.equals(alipayTradePayResponse.getCode())) {
}
}
}