java 后台 配合移动端支付宝支付接口api +回调

本文详细介绍了支付宝支付接口的实现过程,包括支付接口、获取私钥公钥、获取orderString、异步通知处理、订单查询等功能的实现代码及流程。通过具体的代码示例,帮助开发者理解和掌握支付宝支付接口的使用。


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

    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头小孙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值