需要阿里的jar包,可以自行去支付宝开发平台下载,下面分享仅作参考,欢迎各位大佬指教
1.工具类
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayFundTransOrderQueryRequest;
import com.alipay.api.response.AlipayFundTransOrderQueryResponse;
import com.ssm.pojo.MessageBean;//自定义返回对象
import java.util.Map;
import java.util.HashMap;
import com.alibaba.fastjson.JSON;
/**
* alipay支付
*/
public class AlipayUtil {
public static String URL = "https://openapi.alipay.com/gateway.do";// 支付宝网关
public static String ALIPAY_APPID = ConfigUtil.getProperty("alipay.appid"); // appId
public static String notify_url = ConfigUtil.getProperty("notify_url");// 回调地址
public static String APP_PRIVATE_KEY = "";
public static String ALIPAY_PUBLIC_KEY = "";
public static String FORMAT = "JSON";
public static String CHARSET = "utf-8";
public static String SIGN_TYPE = "RSA2";
static {
try {
Resource resource = (Resource) new ClassPathResource("alipay_private_key_pkcs8.pem");
APP_PRIVATE_KEY = FileUtil.readInputStream2String(((ClassPathResource) resource).getInputStream());
resource = (Resource) new ClassPathResource("alipay_public_key.pem");
ALIPAY_PUBLIC_KEY = FileUtil.readInputStream2String(((ClassPathResource) resource).getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
private static AlipayClient alipayClient = null;
public static AlipayClient getAlipayClient() {
if (alipayClient == null) {
synchronized (AlipayUtil.class) {
if (null == alipayClient) {
alipayClient = new DefaultAlipayClient(URL, ALIPAY_APPID, APP_PRIVATE_KEY, FORMAT, CHARSET,
ALIPAY_PUBLIC_KEY, SIGN_TYPE);
}
}
}
return alipayClient;
}
/**
* 提现查询
*
* @throws AlipayApiException
*/
public static boolean queryTransfer(String out_biz_no) throws AlipayApiException {
AlipayFundTransOrderQueryRequest request = new AlipayFundTransOrderQueryRequest();
Map<String, Object> param = new HashMap<>();
param.put("out_biz_no", out_biz_no);
request.setBizContent(JSON.toJSONString(param));
AlipayFundTransOrderQueryResponse response;
response = AlipayUtil.getAlipayClient().execute(request);
if (response.isSuccess()) {
return true;
}
return false;
}
/**
* 提现的返回提示
*/
public static MessageBean alipaySubCode(String subCode) {
MessageBean returnMessage = new MessageBean();
returnMessage.setCode("000");
switch (subCode) {
default:
returnMessage.setMessage("系统繁忙,请稍后再试");
break;
case "PAYEE_ACC_OCUPIED":
returnMessage.setMessage("该手机号对应多个支付宝账户,请传入收款方姓名确定正确的收款账号");
break;
case "PERMIT_NON_BANK_LIMIT_PAYEE":
returnMessage.setMessage("请您登录支付宝站内或手机客户端完善身份信息后,重试。");
break;
case "EXCEED_LIMIT_PERSONAL_SM_AMOUNT":
returnMessage.setMessage("超出限额,单笔提现最多5万元。");
break;
case "EXCEED_LIMIT_ENT_SM_AMOUNT":
returnMessage.setMessage("超出限额,单笔提现最多10万元。");
break;
case "EXCEED_LIMIT_UNRN_DM_AMOUNT":
returnMessage.setMessage("您的账户未实名,单日最多可提现1000元。");
break;
case "PAYEE_USER_INFO_ERROR":
returnMessage.setMessage("支付宝账号和姓名不匹配,请确认姓名是否正确");
break;
}
return returnMessage;
}
}
2.service层
import java.util.Map;
import com.ssm.pojo.OrderInfoBean;
import com.ssm.pojo.RefundApplyBean;
/**
* @Title: AlipayService.java
* @Package com.ssm.service
* @Description:
* @author du
* @date 2018/1/13 15:08
*/
public interface AlipayService {
/**
* 支付下订单
* @param order
* @throws Exception
*/
public String orderPay(OrderInfoBean order) throws Exception;
/**
*
* @param map
* @throws Exception
* 商家交易编号
*/
public Map<String, Object> orderPayQuery(Map<String,Object> map) throws Exception;
/**
* 订单退款
*
* @param bean
* @throws Exception
*/
public String orderPayRefund(RefundApplyBean bean) throws Exception;
}
实现类
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.ssm.dao.CarInfoDao;
import com.ssm.dao.UserDao;
import com.ssm.service.JpushService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.ssm.mobile.dao.OrderDao;
import com.ssm.mobile.dao.ProductDao;
import com.ssm.mobile.mapper.RefundApplyBeanMapper;
import com.ssm.mobile.service.AlipayService;
import com.ssm.pojo.OrderInfoBean;
import com.ssm.pojo.ProductInfoBean;
import com.ssm.pojo.RefundApplyBean;
import com.ssm.util.AlipayUtil;
import com.ssm.util.DatetimeUtil;
import com.ssm.util.PayUtil;
import com.ssm.util.TransUtil;
import javax.annotation.Resource;
@Service(value = "alipayService")
public class AlipayServiceImpl implements AlipayService {
@Autowired
private ProductDao productDao;
@Autowired
private OrderDao orderDao;
@Autowired
private RefundApplyBeanMapper refundApplyBeanMapper;
@Autowired
private UserDao userDao;
@Autowired
private JpushService jpushService;
@Autowired
private CarInfoDao carInfoDao;
/**
* 支付下订单
*/
@Override
public String orderPay(OrderInfoBean order) throws Exception {
AlipayTradeAppPayRequest requests = new AlipayTradeAppPayRequest();
Map<String, Object> param = new HashMap<>();
param.put("body", "xxx");
param.put("notify_url", AlipayUtil.notify_url);
param.put("out_trade_no", order.getOrderCode());
param.put("payment_type", 1);
param.put("product_code", "QUICK_MSECURITY_PAY");
param.put("subject", "xxx");
param.put("total_amount", order.getPrice());
param.put("timestamp", DatetimeUtil.formatDateTime(new Date()));
param.put("version", "1.0");
requests.setBizContent(JSON.toJSONString(param));
String orderStr = null;
AlipayTradeAppPayResponse response = AlipayUtil.getAlipayClient().sdkExecute(requests);
orderStr = response.getBody();
if (response.isSuccess()) {
order.setChargeChannel("alipay");
orderDao.updateOrder(TransUtil.transBean2Map(order));
}
//修改支付状态
param.clear();
param.put("orderId",order.getOrderId());
orderPayQuery(param);
return orderStr;
}
/**
* 退款
*/
@Override
public String orderPayRefund(RefundApplyBean bean) throws Exception {
String refundStr = null;
OrderInfoBean orderBean = new OrderInfoBean();
orderBean.setOrderId(bean.getOrderId());
Map<String, Object> orderMap = orderDao.getOrderById(TransUtil.transBean2Map(orderBean));
String orderId = orderMap.get("orderId").toString();
// 退款
AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
Map<String, Object> param = new HashMap<>();
param.put("out_trade_no", orderMap.get("orderCode"));
param.put("refund_amount", bean.getApplyAmount());
param.put("refund_reason", bean.getApplyReason());
param.put("out_request_no", PayUtil.getRefundNo());
alipayRequest.setBizContent(JSON.toJSONString(param));
AlipayTradeRefundResponse refundResponse= AlipayUtil.getAlipayClient().execute(alipayRequest);
//用户ID
String userId = orderMap.get("receiverId").toString();
//查詢退款
AlipayTradeFastpayRefundQueryRequest alipayRequests = new AlipayTradeFastpayRefundQueryRequest();
String out_request_no = param.get("out_request_no").toString();
param.clear();
param.put("out_trade_no", orderMap.get("orderCode"));
param.put("out_request_no", out_request_no);
alipayRequests.setBizContent(JSON.toJSONString(param));
AlipayTradeFastpayRefundQueryResponse response = AlipayUtil.getAlipayClient().execute(alipayRequests);
if (refundResponse.isSuccess() && response.isSuccess()) {
param.clear();
param.put("refundState", "2");
param.put("orderId", orderId);
orderDao.updateOrder(param);
// 退款交易账户表
RefundApplyBean rfb = new RefundApplyBean();
rfb.setApplyId(Integer.valueOf(bean.getApplyId()));
rfb.setApplyCreatTime(DatetimeUtil.formatDateTime(new Date()));
rfb.setApplyStatus("2");
refundApplyBeanMapper.updateByPrimaryKey(rfb);
// TODO ali退款,推送,新消息类型
String text="尊敬的用户,您于"+rfb.getApplyCreatTime()+"申请的退款,申请单号为"+bean.getApplyId()+"退款成功,请查看您的个人账户";
String exId =2+"_"+ userId;
Map mapUser=userDao.getUserByPrimaryKey(userId);
String driverName= mapUser.get("loginName").toString();
String driverTel= mapUser.get("tel").toString();
jpushService.pushMessage(userId, "", "新消息", "退款成功", "退款成功", text, exId, "", "");
// TODO 给货主推送,新消息类型
//用户ID
String productId=orderMap.get("productId").toString();
ProductInfoBean productInfoBean=new ProductInfoBean();
productInfoBean.setProductId(productId);
Map<String,Object> productMap=productDao.getProductById(TransUtil.transBean2Map(productInfoBean));
String productUserId=productMap.get("userId").toString();
String exIdP =2+"_"+ productUserId;
String textP="尊敬的用户,您发布的订单号为"+productMap.get("productId").toString()+"的订单,于"+rfb.getApplyCreatTime()+",用户:"+driverName+",电话("+driverTel+")已经退款,请悉知.";
jpushService.pushMessage(productUserId, "", "新消息", "已退款","已退款成功", textP, exIdP, "", "");
} else {
if("ACQ.TRADE_STATUS_ERROR".equals(refundResponse.getSubCode())){
refundStr="您的订单已全额退款";
}else{
refundStr = "系统繁忙,请稍后再试";
}
}
return refundStr;
}
/**
* 支付订单查询
*/
@Override
public Map<String, Object> orderPayQuery(Map<String, Object> map) throws Exception {
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
// 只需要传入业务参数
Map<String, Object> param = new HashMap<String, Object>();
Map<String, Object> orderMap = orderDao.getOrderById(map);
param.put("out_trade_no", orderMap.get("orderCode").toString());
alipayRequest.setBizContent(JSON.toJSONString(param));
map.remove("orderId");
map.put("productId", orderMap.get("productId").toString());
Map<String, Object> productMap=productDao.getProductById(map);
String orderId = orderMap.get("orderId").toString();
String userId=productMap.get("userId").toString();
String receiverId=orderMap.get("receiverId").toString();
param.clear();
param.put("carId",orderMap.get("carId").toString());
Map<String,Object> carInfoBean=carInfoDao.getCarById(param);
String carPan=carInfoBean.get("licensePlate").toString();
String carModel=carInfoBean.get("carModel").toString();
Map<String, Object> userBean=userDao.getUserByPrimaryKey(receiverId);
String driveTel=userBean.get("tel").toString();
String driveName=userBean.get("loginName").toString();
String text="尊敬的用户,您于"+productMap.get("createTime")+"发布的订单为"+orderMap.get("productId")+"的订单交易成功,请联系"+driveName+"("+driveTel+"车牌:"+carPan+"车型:"+carModel+")"+"确认装车";
// 返回提交支付宝订单交易查询信息
Map<String, String> restmap = new HashMap<String, String>();
// 查询状态
boolean flag = false;
AlipayTradeQueryResponse alipayResponse = AlipayUtil.getAlipayClient().execute(alipayRequest);
if (alipayResponse.isSuccess()) {
// 调用成功,则处理业务逻辑
if ("10000".equals(alipayResponse.getCode())) {
// 订单创建成功
flag = true;
restmap.put("order_no", alipayResponse.getOutTradeNo());
restmap.put("trade_no", alipayResponse.getTradeNo());
restmap.put("buyer_logon_id", alipayResponse.getBuyerLogonId());
restmap.put("trade_status", alipayResponse.getTradeStatus());
}
if ("TRADE_SUCCESS".equals(alipayResponse.getTradeStatus())){
param.clear();
param.put("paidState", "1");
param.put("orderId", orderId);
orderDao.updateOrder(param);
// TODO 推送,通知类型,跳转消息页面
String exId =2+"_"+ userId;
jpushService.pushMessage(userId, "", "通知", "用户已付款", "交易成功", text, exId, "", "");
}
}
if (flag) {
// 订单查询成功
param.clear();
param.put("data", restmap);
param.put("msg", "订单查询成功");
} else {
// 订单查询失败
param.clear();
param.put("msg", alipayResponse.getSubMsg());
}
return param;
}
}