import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
/**
* Created by Ca1 on 2017/6/28.
*/
@Api(value = "/alipay", description = "z")
@Controller
@RequestMapping("/apiNewMap")
public class AlipayApiController extends RisApiController {
@Autowired
private TaskService taskService;
@Autowired
private UserService userService;
@Autowired
private AlipayOrderService alipayOrderService;
@Autowired
private ShopOrderService shopOrderService;
/**
* 支付接口
*
* @return
* @throws Exception
*/
@ApiOperation(value = "支付接口",
notes = "支付接口",
tags = {"alipay"})
@RequestMapping(value = "/alipay.json", method = RequestMethod.POST)
@ResponseBody
public RisHttpResult alipay() throws Exception {
try {
AlipayUtil.alipay();
} catch (Exception e) {
e.printStackTrace();
return apiError("异常");
}
return apiSuccess(new RisEmpty());
}
/**
* 获取私钥公钥
*
* @return
* @throws Exception
*/
@ApiOperation(value = "获取私钥公钥",
notes = "获取私钥公钥",
tags = {"alipay"})
@RequestMapping(value = "/getAlipay.json", method = RequestMethod.POST)
@ResponseBody
public RisHttpResult getAlipay() throws Exception {
try {
AlipayVo alipayVo = new AlipayVo();
alipayVo.setAlipayPublicKey(alipayPublicKey);
alipayVo.setAppid(appid);
alipayVo.setPrivateKey(privateKey);
return apiSuccess(alipayVo);
} catch (Exception e) {
e.printStackTrace();
return apiError("异常");
}
}
/**
* 获取orderString
*
* @return
* @throws Exception
*/
@ApiOperation(value = "获取orderString ",
notes = "获取orderString ",
tags = {"alipay"})
@RequestMapping(value = "/getOrderString.json")
@ResponseBody
public RisHttpResult getOrderString(@ApiParam(required = true, value = "登录标识") @RequestParam String userSessionid, int taskId) throws Exception {
try {
if (!StringUtils.isBlank(userSessionid)) {
TaskVo task = taskService.selectTaskVosById(taskId);
if (task != null && task.getState() == 1) {
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appid, privateKey, "json", CHARSET, alipayPublicKey, "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(task.getTaskName());
model.setSubject("雇主支付");
model.setOutTradeNo(task.getOrderNumber());
//model.setTimeoutExpress("2m");
model.setTotalAmount(task.getTaskCost().toString());
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(AlipayUtil.webPath+"/apiNewMap/getMsg.json");
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
return apiSuccess(response.getBody());
} catch (AlipayApiException e) {
e.printStackTrace();
}
} else {
return apiError("任务不存在或已支付");
}
} else {
return apiUserExpireObject();
}
} catch (Exception e) {
e.printStackTrace();
return apiError("异常");
}
return apiError("网络错误");
}
/**
* 获取orderString
*
* @return
* @throws Exception
*/
@ApiOperation(value = "异步通知 ",
notes = "异步通知 ",
tags = {"alipay"})
@RequestMapping(value = "/getMsg.json")
@ResponseBody
public String getMsg(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
if (requestParams.size() > 0) {
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);
}
/**
* WAIT_BUYER_PAY 交易创建,等待买家付款
TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款
TRADE_SUCCESS 交易支付成功
TRADE_FINISHED 交易结束,不可退款
*/
String state = params.get("trade_status");
String orderNum = params.get("out_trade_no");
Task task = taskService.selectTaskByOrderNum(orderNum);
AlipayOrder alipayOrder = new AlipayOrder();
if (task != null && task.getState() == 1) {
switch (state) {
case "WAIT_BUYER_PAY":
break;
case "TRADE_CLOSED":
task.setState(5);
alipayOrder.setState(5);
break;
case "TRADE_SUCCESS":
task.setState(2);
alipayOrder.setState(2);
break;
case "TRADE_FINISHED":
task.setState(2);
alipayOrder.setState(2);
break;
}
taskService.updateTaskById(task);
alipayOrder.setBackTime(new Date());
alipayOrder.setOrderNumber(orderNum);
alipayOrder.setTaskId(task.getId());
alipayOrder.setChannelType(1);
alipayOrder.setOrderType(1);
alipayOrderService.insertAlipayOrder(alipayOrder);
}
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean flag = AlipaySignature.rsaCheckV1(params, alipayPublicKey, CHARSET, "RSA2");
if (flag) {
// TODO 验签成功后
String success = "success";
System.out.println(success);
Logger.getLogger(success);
response.getOutputStream().println(success);
return success;
//按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure
} else {
// TODO 验签失败则记录异常日志,并在response中返回failure.
String failure = "failure";
System.out.println(failure);
Logger.getLogger(failure);
response.getOutputStream().println(failure);
return failure;
}
}
/**
* 订单查询
*
* @return
* @throws Exception
*/
@ApiOperation(value = "订单查询 ",
notes = "订单查询 ",
tags = {"alipay"})
@RequestMapping(value = "/getOrderMsg.json", method = RequestMethod.POST)
@ResponseBody
public String getOrderMsg(@ApiParam(required = true, value = "订单") @RequestParam String orders) throws Exception {
// sdk初始化
AlipayClient alipayClient = new DefaultAlipayClient("https://alipay.trade.query", AlipayUtil.appid, AlipayUtil.privateKey, "json", "utf-8", AlipayUtil.alipayPublicKey, "RSA2");
AlipayTradeQueryRequest queryRequest = new AlipayTradeQueryRequest();
AlipayTradeQueryModel queryModel = new AlipayTradeQueryModel();
// tradeNo和outTradeNo二选一即可
//queryModel.setTradeNo(orders);
queryModel.setOutTradeNo(orders);
queryRequest.setBizModel(queryModel);
try {
AlipayTradeQueryResponse response = alipayClient.execute(queryRequest);
if (response.isSuccess()) {
System.out.println("查询成功:" + JSONObject.toJSONString(response));
return JSONObject.toJSONString(response);
} else {
System.out.println("查询失败:" + JSONObject.toJSONString(response));
return JSONObject.toJSONString(response);
}
} catch (AlipayApiException e) {
System.out.println("接口调用异常:" + JSONObject.toJSONString(e));
return JSONObject.toJSONString(e);
}
}
/**
* 获取orderString
*
* @return
* @throws Exception
*/
@ApiOperation(value = "异步通知(商城) ",
notes = "异步通知(商城) ",
tags = {"alipay"})
@RequestMapping(value = "/getShopMsg.json")
@ResponseBody
public String getShopMsg(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
if (requestParams.size() > 0) {
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);
}
/**
* WAIT_BUYER_PAY 交易创建,等待买家付款
TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款
TRADE_SUCCESS 交易支付成功
TRADE_FINISHED 交易结束,不可退款
*/
String state = params.get("trade_status");
String orderNum = params.get("out_trade_no");
ShoppingOrder shoppingOrder = shopOrderService.selectTaskByOrderNum(orderNum);
AlipayOrder alipayOrder = new AlipayOrder();
if (shoppingOrder != null && shoppingOrder.getType() == 1) {
switch (state) {
case "WAIT_BUYER_PAY":
break;
case "TRADE_CLOSED":
shoppingOrder.setType(5);
alipayOrder.setState(5);
break;
case "TRADE_SUCCESS":
shoppingOrder.setType(2);
alipayOrder.setState(2);
break;
case "TRADE_FINISHED":
shoppingOrder.setType(2);
alipayOrder.setState(2);
break;
}
shopOrderService.updateShoppingOrderById(shoppingOrder);
alipayOrder.setBackTime(new Date());
alipayOrder.setOrderNumber(orderNum);
alipayOrder.setTaskId(shoppingOrder.getId());
alipayOrder.setChannelType(1);
alipayOrder.setOrderType(2);
alipayOrderService.insertAlipayOrder(alipayOrder);
}
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean flag = AlipaySignature.rsaCheckV1(params, alipayPublicKey, CHARSET, "RSA2");
if (flag) {
// TODO 验签成功后
String success = "success";
System.out.println(success);
Logger.getLogger(success);
response.getOutputStream().println(success);
return success;
//按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure
} else {
// TODO 验签失败则记录异常日志,并在response中返回failure.
String failure = "failure";
System.out.println(failure);
Logger.getLogger(failure);
response.getOutputStream().println(failure);
return failure;
}
}
}
java 后台 配合移动端支付宝支付接口api +回调
最新推荐文章于 2024-12-14 10:39:58 发布
本文详细介绍了支付宝支付接口的实现过程,包括支付接口、获取私钥公钥、获取orderString、异步通知处理、订单查询等功能的实现代码及流程。通过具体的代码示例,帮助开发者理解和掌握支付宝支付接口的使用。
2154

被折叠的 条评论
为什么被折叠?



