/**
* 二次验签
*/
public boolean checkSign(HttpServletRequest request, String alipayPublicCertPath) throws AlipayApiException {
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
/**公钥模式验证签名
* boolean verify_result = AlipaySignature.rsaCheckV1(params, "publicKey", "UTF-8", "RSA2");
* **/
/**证书模式验签方法**/
boolean verify_result = AlipaySignature.rsaCertCheckV1(params, rechargeCommon.downloadCert(alipayPublicCertPath), "UTF-8", "RSA2");
return verify_result;
}
/**
* 证书模式
*/
public AlipayClient certAlipayClient(PaySetVO paySetVO) {
/** 初始化 **/
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
/** 支付宝网关 **/
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
/** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
certAlipayRequest.setAppId(paySetVO.getAliAppId());
/** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/
certAlipayRequest.setPrivateKey(paySetVO.getPrivateKey());
/** 应用公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setCertPath(rechargeCommon.downloadCert(paySetVO.getAliCertPath()));
/** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setAlipayPublicCertPath(rechargeCommon.downloadCert(paySetVO.getAliPublicCertPath()));
/** 支付宝根证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setRootCertPath(rechargeCommon.downloadCert(paySetVO.getAliRootCertPath()));
/** 设置签名类型 **/
certAlipayRequest.setSignType("RSA2");
/** 设置请求格式,固定值json **/
certAlipayRequest.setFormat("json");
/** 设置编码格式 **/
certAlipayRequest.setCharset("UTF-8");
AlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(certAlipayRequest);
} catch (AlipayApiException e1) {
e1.printStackTrace();
}
return alipayClient;
}
/**
* 公钥模式
*/
public AlipayClient alipayClient(PaySetVO paySetVO) {
AlipayClient alipayClient = new
DefaultAlipayClient("https://openapi.alipay.com/gateway.do", paySetVO.getAliAppId().trim(), paySetVO.getPrivateKey().trim(), "json", "UTF-8",
paySetVO.getPublicKey().trim(), "RSA2");
return alipayClient;
}
/**
* 支付宝小程序统一下单
* 1、在服务端调用 alipay.trade.create (统一收单交易创建接口),获得支付宝交易号 tradeNO
* 2、 在小程序端使用 tradeNO,调用 my.tradePay 接口唤起支付宝收银台,引导用户完成支付。
* 3、服务端处理回调信息
* 详见文档:https://opendocs.alipay.com/mini/00arkf
*/
public AlipayTradeCreateResponse miniAliPay(PaySetVO paySetVO, String notifyUrl, AlipayTradeCreateModel model) {
AlipayClient alipayClient = certAlipayClient(paySetVO);
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
/** 后台异步回调地址**/
request.setNotifyUrl(notifyUrl);
/** 设置业务参数 **/
AlipayTradeCreateModel alipayTradeCreateModel = new AlipayTradeCreateModel();
/** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
alipayTradeCreateModel.setOutTradeNo(model.getOutTradeNo());
/** 订单金额,精确到小数点后两位 **/
alipayTradeCreateModel.setTotalAmount(model.getTotalAmount());
/** 订单标题 **/
alipayTradeCreateModel.setSubject(model.getSubject());
/** 买家唯一id **/
alipayTradeCreateModel.setBuyerId(model.getBuyerId());
/** 将业务参数传至request中 **/
request.setBizModel(alipayTradeCreateModel);
AlipayTradeCreateResponse response = null;
try {
response = alipayClient.certificateExecute(request);
/**String trade_no = response.getTradeNo();获取返回的tradeNO。**/
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
}
/**
* 统一下单 h5
* 1、支付信息提交到服务端,服务端生成支付表单 返回到客户端
* 2、客户端拿到服务端返回from 表单 发起表单提交
* 3、服务端接收处理回调信息
* 详见文档 https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay?scene=common
*/
public AlipayTradeWapPayResponse doAliPay(PaySetVO paySetVO, AlipayTradeWapPayModel alipayTradeWapPayModel, AlipayTradeWapPayRequest alipayTradeWapPayRequest){
AlipayClient alipayClient = certAlipayClient(paySetVO);
/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.wap.pay(手机网站支付接口) **/
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl(alipayTradeWapPayRequest.getReturnUrl());
alipayRequest.setNotifyUrl(alipayTradeWapPayRequest.getNotifyUrl());
/** 设置业务参数 **/
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
/** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
model.setOutTradeNo(alipayTradeWapPayModel.getOutTradeNo());
/** 销售产品码,固定值:QUICK_WAP_WAY **/
model.setProductCode("QUICK_WAP_WAY");
/** 订单标题 **/
model.setSubject(alipayTradeWapPayModel.getSubject());
/** 订单金额,精确到小数点后两位 **/
model.setTotalAmount(alipayTradeWapPayModel.getTotalAmount());
/** 订单描述 **/
model.setBody(alipayTradeWapPayModel.getBody());
/** 业务扩展参数 **/
//ExtendParams extendParams = new ExtendParams();
/** 系统商编号,填写服务商的PID,返佣参数传值前提:传值账号需要签约返佣协议,用于isv商户。 **/
//extendParams.setSysServiceProviderId("2088511****07846");
/** 花呗参数,传值前提:必须有该接口花呗收款准入条件,且需签约花呗分期 **/
/** 指定可选期数,只支持3/6/12期,还款期数越长手续费越高 **/
// extendParams.setHbFqNum("3");
/** 指定手续费承担方式,手续费可以由用户全承担(该值为0),也可以商户全承担(该值为100),但不可以共同承担,即不可取0和100外的其他值。 **/
//extendParams.setHbFqSellerPercent("0");
//model.setExtendParams(extendParams);
/** 将业务参数传至request中 **/
alipayRequest.setBizModel(model);
AlipayTradeWapPayResponse wapPayResponse = null;
try {
wapPayResponse = alipayClient.pageExecute(alipayRequest);
/**获取需提交的form表单 客户端拿到submitFormData做表单提交 String submitFormData = response.getBody();**/
} catch (AlipayApiException e) {
e.printStackTrace();
}
return wapPayResponse;
// String form = "";
// try {
// //调用SDK生成表单
// form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
// } catch (AlipayApiException e) {
// e.printStackTrace();
// }
// //直接将完整的表单html输出到页面
// response.setContentType("text/html;charset=UTF-8");
// response.getWriter().write(form);//直接将完整的表单html输出到页面
// response.getWriter().flush();
// response.getWriter().close();
}
- List item
/**
* 订单查询`加粗样式`
*/
public AlipayTradeQueryResponse queryOrder(PaySetVO paySetVO, AlipayTradeQueryModel alipayTradeQueryModel) {
AlipayClient alipayClient = certAlipayClient(paySetVO);
/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.query(统一收单线下交易查询)**/
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
/** 设置业务参数 **/
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
/** 注:交易号(TradeNo)与订单号(OutTradeNo)二选一传入即可,如果2个同时传入,则以交易号为准 **/
/** 支付接口传入的商户订单号。如:2020061601290011200000140004 **/
model.setOutTradeNo(alipayTradeQueryModel.getOutTradeNo());
/** 异步通知/查询接口返回的支付宝交易号,如:2020061622001473951448314322 **/
model.setTradeNo(alipayTradeQueryModel.getTradeNo());
/** 将业务参数传至request中 **/
request.setBizModel(model);
/**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **/
//request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");
AlipayTradeQueryResponse response = null;
try {
/** 通过alipayClient调用API,获得对应的response类 **/
/** 证书模式 **/
response = alipayClient.certificateExecute(request);
/** 公钥模式 **/
//response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/
}
/**
* 单笔退款
*/
public AlipayTradeRefundResponse toRefund(PaySetVO paySetVO, AlipayTradeRefundModel alipayTradeRefundModel) {
AlipayClient alipayClient = certAlipayClient(paySetVO);
/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.refund(统一收单交易退款接口) **/
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
/** 设置业务参数 **/
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
/** 支付接口传入的商户订单号。如:2020061601290011200000140004 交易号二选一 **/
model.setOutTradeNo(alipayTradeRefundModel.getOutTradeNo());
/** 退款金额,退款总金额不能大于该笔订单支付最大金额 **/
model.setRefundAmount(alipayTradeRefundModel.getRefundAmount());
/** 异步通知/查询接口返回的支付宝交易号,如:2020061622001473951448314322 商户订单号二选一 **/
model.setTradeNo(alipayTradeRefundModel.getTradeNo());
/** 如需部分退款,则此参数必传,且每次请求不能重复,如:202006230001 **/
model.setOutRequestNo(WxCommonUtil.getSerialNumber());
/** 将业务参数传至request中 **/
request.setBizModel(model);
/**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **/
//request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");
AlipayTradeRefundResponse response = null;
try {
/** 通过alipayClient调用API,获得对应的response类 **/
/** 证书模式 **/
response = alipayClient.certificateExecute(request);
/** 公钥模式 **/
//response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/101 **/
return response;
}
/**
* 退款查询
*/
public AlipayTradeFastpayRefundQueryResponse queryRefund(PaySetVO paySetVO, AlipayTradeFastpayRefundQueryModel alipayTradeFastpayRefundQueryModel) throws AlipayApiException {
AlipayClient alipayClient = certAlipayClient(paySetVO);
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
/** 交易单号 和商户单号二选一**/
model.setTradeNo(alipayTradeFastpayRefundQueryModel.getTradeNo());
/**
* 退款时的流水号
* 请求退款接口时,传入的退款请求号,
* 如果在退款请求时未传入,则该值为创建交易时的外部交易号
* **/
model.setOutRequestNo(alipayTradeFastpayRefundQueryModel.getOutRequestNo());
/** 商户单号 和交易单号二选一**/
model.setOutTradeNo(alipayTradeFastpayRefundQueryModel.getOutTradeNo());
/** 将业务参数传至request中 **/
request.setBizModel(model);
AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
try {
/** 证书模式 **/
response = alipayClient.certificateExecute(request);
/** 公钥模式 **/
//response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/
return response;
}
/**
* 单笔转账
*/
public AlipayFundTransUniTransferResponse transfer(PaySetVO paySetVO, AlipayFundTransUniTransferModel alipayFundTransUniTransferModel, Participant payee) {
AlipayClient alipayClient = certAlipayClient(paySetVO);
/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.uni.transfer(单笔转账接口) **/
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
/** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
/** 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 **/
model.setOutBizNo(alipayFundTransUniTransferModel.getOutBizNo());
/** 转账金额,TRANS_ACCOUNT_NO_PWD产品取值最低0.1 **/
model.setTransAmount(alipayFundTransUniTransferModel.getTransAmount());
/** 产品码,单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD **/
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
/** 场景码,单笔无密转账到支付宝账户固定为:DIRECT_TRANSFER **/
model.setBizScene("DIRECT_TRANSFER");
/**备注**/
model.setRemark(alipayFundTransUniTransferModel.getRemark());
/** 转账业务的标题,用于在支付宝用户的账单里显示 **/
model.setOrderTitle(alipayFundTransUniTransferModel.getOrderTitle());
Participant participant = new Participant();
/** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/
participant.setIdentity(payee.getIdentity());
/** 参与方的标识类型:ALIPAY_USER_ID 支付宝的会员ID **/
participant.setIdentityType(payee.getIdentityType());
/** 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填 **/
participant.setName(payee.getName());
model.setPayeeInfo(participant);
/** 业务备注 **/
model.setRemark("单笔转账");
/** 将业务参数传至request中 **/
request.setBizModel(model);
AlipayFundTransUniTransferResponse response = null;
try {
/** 证书模式 **/
response = alipayClient.certificateExecute(request);
/** 公钥模式 **/
//response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/
return response;
}
/**
* 转账查询
*/
public AlipayFundTransCommonQueryResponse queryTransfer(PaySetVO paySetVO, AlipayFundTransCommonQueryModel alipayFundTransCommonQueryModel) throws AlipayApiException {
AlipayClient alipayClient = certAlipayClient(paySetVO);
/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.common.query(转账业务单据查询接口) **/
AlipayFundTransCommonQueryRequest request = new AlipayFundTransCommonQueryRequest();
/** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.common.query/ **/
AlipayFundTransCommonQueryModel model = new AlipayFundTransCommonQueryModel();
/** 固定值:TRANS_ACCOUNT_NO_PWD:单笔无密转账到支付宝账户 **/
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
/** 支付宝转账单据号,单笔转账接口返回 **/
model.setOrderId(alipayFundTransCommonQueryModel.getOrderId());
/** 描述特定的业务场景,如果传递了out_biz_no则该字段为必传,固定值:DIRECT_TRANSFER:B2C 现金红包、单笔无密转账 **/
model.setBizScene("DIRECT_TRANSFER");
/** 商户转账唯一订单号,单笔转账接口的入参 **/
model.setOutBizNo(alipayFundTransCommonQueryModel.getOutBizNo());
request.setBizModel(model);
AlipayFundTransCommonQueryResponse response = null;
try {
/** 证书模式 **/
response = alipayClient.certificateExecute(request);
/** 公钥模式 **/
//response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
/** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/
return response;
}
/**
* 查询用户是否已经关注生活号,支持生活号、内容号、财富号
* {
* "alipay_open_public_user_follow_query_response": {
* "code": "10000",
* "msg": "Success",
* "is_follow": "T"
* },
* "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
* }
* 用户是否关注,T代表已关注,F代表未关注
*/
public AlipayOpenPublicUserFollowQueryResponse queryFollowByOne(PaySetVO paySetVO, String aliUserId) {
AlipayClient alipayClient = certAlipayClient(paySetVO);
AlipayOpenPublicUserFollowQueryRequest request = new AlipayOpenPublicUserFollowQueryRequest();
AlipayOpenPublicUserFollowQueryModel model = new AlipayOpenPublicUserFollowQueryModel();
model.setUserId(aliUserId);
request.setBizModel(model);
AlipayOpenPublicUserFollowQueryResponse response = null;
try {
response = alipayClient.certificateExecute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return response;
}
-----------------------------------调用demo-----------------------------------------
/**
* 支付宝支付
*
* @param httpResponse,sellerId
* @return
*/
@GetMapping("/pay")
@ApiOperation("统一下单")
public void getPagePay(HttpServletResponse httpResponse, Integer sellerId) throws Exception {
PaySetVO paySetVO = paySetService.findAll(sellerId);
AlipayTradeWapPayModel wapPayModel = new AlipayTradeWapPayModel();
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl(wxApiConfig.getInterfacePath() + "alipay/callbackWeb");
alipayRequest.setNotifyUrl(wxApiConfig.getInterfacePath() + "alipay/callback");
String orderNum = WxCommonUtil.getTimeOrderNum();
wapPayModel.setOutTradeNo(orderNum);
wapPayModel.setBody("商品名称");
wapPayModel.setSubject("//商品标题/交易标题/订单标题/订单关键字等");
wapPayModel.setTotalAmount("0.01");
AlipayTradeWapPayResponse response= alipayApi.doAliPay(paySetVO, wapPayModel, alipayRequest);
response.getBody(); //返回到前端提交表单即可
}
/**
* 支付宝后台回调
*
* @param
* @return
*/
@PostMapping(value = "/callback")
public void alipayNotify(HttpServletRequest request, HttpServletResponse respons) throws Exception {
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
//交易状态
String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
log.info("-------out_trade_no-------" + out_trade_no);
log.info("-------trade_no-------" + trade_no);
PaySetVO paySetVO = paySetService.findAll(2);
if (alipayApi.checkSign(request, paySetVO.getAliPublicCertPath())) {//验证成功
//请在这里加上商户的业务逻辑程序代码
if (trade_status.equals("TRADE_FINISHED")) {
log.info("-------支付宝回调成功-------");
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
//如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
} else if (trade_status.equals("TRADE_SUCCESS")) {
log.info("-------支付宝回调成功-------");
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//如果有做过处理,不执行商户的业务程序
//注意:
//如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
}
respons.getWriter().println("success");
} else {//验证失败
respons.getWriter().println("failure");
}
}
/**
* 支付宝前台回调 也可以直接在retrun_url 配置成功页面地址
*
* @param request
* @return
*/
@GetMapping(value = "/callbackWeb")
public String callbackWeb(HttpServletRequest request) throws Exception {
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
PaySetVO paySetVO = paySetService.findAll(2);
if (alipayApi.checkSign(request, paySetVO.getAliPublicCertPath())) {//验证成功
//请在这里加上商户的业务逻辑程序代码
//该页面可做页面美工编辑
// out.clear();
// out.println("验证成功<br />");
log.info("-------支付宝前台回调成功-------");
return "交易成功";
} else {
//该页面可做页面美工编辑
// out.clear();
// out.println("验证失败");
log.info("-------支付宝前台回调失败-------");
return "交易失败";
}
}
/**
* 交易查询
* 商家可调用 alipay.trade.query(统一收单线下交易查询)接口,通过商户网站唯一订单号
* out_trade_no 或支付宝交易号 trade_no 查询对应订单支付情况
*
* @param out_trade_no or trade_no (二选一)
*/
@GetMapping("/queryOrder")
@ApiOperation("交易查询")
public AlipayTradeQueryResponse queryOrder(Integer sellerId, String out_trade_no) {
PaySetVO paySetVO = paySetService.findAll(sellerId);
AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel();
alipayTradeQueryModel.setOutTradeNo(out_trade_no);//订单号
AlipayTradeQueryResponse response = alipayApi.queryOrder(paySetVO, alipayTradeQueryModel);
if (response.isSuccess()) {
log.info("---查询成功----");
response.getTotalAmount();//交易的订单金额,单位为元,两位小数。该参数的值为支付时传入的total_amount
response.getOutTradeNo();//商家订单号
response.getTradeNo();//支付宝交易号
// 交易状态:WAIT_BUYER_PAY
// (交易创建,等待买家付款)、TRADE_CLOSED
// (未付款交易超时关闭,或支付完成后全额退款)
// 、TRADE_SUCCESS(交易支付成功)
// 、TRADE_FINISHED(交易结束,不可退款)
String trade_status = response.getTradeStatus();
} else {
String sub_code = response.getSubCode();//错误码
String sub_msg = response.getSubMsg();//错误码描述
}
return response;
}
/**
* 退款的途径按照支付途径原路返回;
* 支付渠道为花呗、余额等退款即时到账;
* 银行卡的退款时间以银行退款时间为准,一般情况下 2 小时内可到账;
* 开发者也可以在商家中心(b.alipay.com)中退款;
* 退款是否成功可以根据同步响应的 fund_change 参数来判断,返回值为 Y 则表示退款成功;
* 退款接口会根据外部请求号 out_request_no 幂等返回,因此同一笔交易需要多次部分退款时,必须使用不同的 out_request_no
* aphttps://opendocs.alipay.com/apis/api_1/alipay.trade.refund
*
* @param out_trade_no or trade_no (二选一)
* out_request_no,refund_amount
*/
@GetMapping("/refund")
@ApiOperation("订单退款")
public AlipayTradeRefundResponse refund(Integer sellerId, String out_trade_no, String refund_amount) throws AlipayApiException {
PaySetVO paySetVO = paySetService.findAll(sellerId);
AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel();
alipayTradeRefundModel.setRefundAmount(refund_amount);//退款金额
alipayTradeRefundModel.setOutTradeNo(out_trade_no);//订单号
AlipayTradeRefundResponse response = alipayApi.toRefund(paySetVO, alipayTradeRefundModel);
if (response.isSuccess() && response.getFundChange().equals("Y")) {
log.info("---退款成功----" + response);
//退款成功
response.getOutTradeNo();//退款商户单号
response.getTradeNo();//退款交易单号
response.getRefundFee();//退款总金额
response.getGmtRefundPay();//退款时间 Date类型
} else {
//退款异常
String sub_code = response.getSubCode();//错误码
String sub_msg = response.getSubMsg();//错误描述
}
return response;
}
/**
* 退款订单查询
*
* @param sellerId alipayTradeFastpayRefundQueryModel
* @return
*/
@GetMapping("/queryRefund")
@ApiOperation("订单退款查询")
public AlipayTradeFastpayRefundQueryResponse queryRefund(Integer sellerId, AlipayTradeFastpayRefundQueryModel alipayTradeFastpayRefundQueryModel) throws AlipayApiException {
PaySetVO paySetVO = paySetService.findAll(sellerId);
AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
/** 交易单号 和商户单号二选一**/
model.setTradeNo(alipayTradeFastpayRefundQueryModel.getTradeNo());
/**
* 退款时的流水号
* 请求退款接口时,传入的退款请求号,
* 如果在退款请求时未传入,则该值为创建交易时的外部交易号
* **/
model.setOutRequestNo(alipayTradeFastpayRefundQueryModel.getOutRequestNo());
/** 商户单号 和交易单号二选一**/
model.setOutTradeNo(alipayTradeFastpayRefundQueryModel.getOutTradeNo());
AlipayTradeFastpayRefundQueryResponse response = alipayApi.queryRefund(paySetVO, model);
if (response.isSuccess()) {
response.getTotalAmount();//该笔退款所对应的交易的订单金额
response.getRefundAmount();//本次退款请求,对应的退款金额
response.getOutTradeNo();//创建交易传入的商户订单号
response.getTradeNo();//支付宝交易号
response.getRefundReason();//退款原因
log.info("---退款成功---" + response);
} else {
//查询失败
response.getSubCode();//错误码码
response.getSubMsg();//错误描述
}
log.info("----订单退款查询结果---" + response);
return response;
}
/**
* 转账到余额
*
* @param sellerId
* @retrun
*/
@GetMapping("/transfer")
@ApiOperation("转账到余额")
public void transfer(Integer sellerId) throws AlipayApiException {
PaySetVO paySetVO = paySetService.findAll(sellerId);
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
//商户自定义的唯一订单号
model.setOutBizNo(WxCommonUtil.getTimeOrderNum());
//订单总金额,单位为元,精确到小数点后两位
model.setTransAmount("0.01");
//转账业务的标题,用于在支付宝用户的账单里显示 (选填)
model.setOrderTitle("测试转账");
//业务备注 (选填)
model.setRemark("测试转账");
//收款方账户(必填)
Participant payee = new Participant();
//参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID
// 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式 (必填)
payee.setIdentityType("ALIPAY_USER_ID");
//参与方的标识ID,比如支付宝用户UID。 (必填)
payee.setIdentity("2088612545861215");
AlipayFundTransUniTransferResponse response = alipayApi.transfer(paySetVO, model, payee);
if (response.isSuccess() && response.getStatus().equals("SUCCESS")) {
log.info("----测试转账成功------");
} else {
log.info("----测试转账失败 重新查单------");
String outBizNo = response.getOutBizNo();//商户订单号
String orderId = response.getOrder
Id();//支付宝转账订单号
//调用查询接口查询数据
AlipayFundTransCommonQueryModel queryModel = new AlipayFundTransCommonQueryModel();
queryModel.setOutBizNo(outBizNo); //商户订单号
queryModel.setOrderId(orderId);
AlipayFundTransCommonQueryResponse queryResponse = alipayApi.queryTransfer(paySetVO, queryModel);
if (response.isSuccess() && response.getStatus().equals("SUCCESS")) {
log.info("----查询转账订单---转账成功" + queryResponse);
} else {
log.info("----查询转账订单---转账失败" + queryResponse);
}
}
}
支付宝手机网站支付、支付查询、退款、退款查询、转账接口整合
最新推荐文章于 2024-08-14 14:06:14 发布