SpringBoot整合支付宝APP支付

前言

现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付,老习惯,功能做完之后做个复盘记录,这边主要讲解支付宝APP支付

所需条件

1、创建蚂蚁金服开放平台公司账号

2、选择开发中心---->移动应用

SpringBoot整合支付宝APP支付_第1张图片

3、选择支付接入

SpringBoot整合支付宝APP支付_第2张图片

4、创建应用

SpringBoot整合支付宝APP支付_第3张图片

5、查看应用appId

SpringBoot整合支付宝APP支付_第4张图片

6、添加功能

两个功能:支付宝授权功能和APP支付功能

SpringBoot整合支付宝APP支付_第5张图片

SpringBoot整合支付宝APP支付_第6张图片

7、功能签约

SpringBoot整合支付宝APP支付_第7张图片

开发流程

引入支付宝支付SDK



    com.alipay.sdk
    alipay-sdk-java
    3.7.4.ALL

 

1、支付宝参数配置类

/**
 * AlipayConfig.java
 * com.prereadweb.order.config
 * Copyright (c) 2019, 北京聚智未来科技有限公司版权所有.
 */
package com.prereadweb.order.config;

/**
 * @Description: 支付宝支付配置文件
 * @author: Administrator
 * @date: 2019/6/11 17:01
 */
public class AlipayConfig {

    // APPID
    public static String app_id = "你应用的APPID";

    // 生成公钥时对应的私钥(填自己的)
    public static String private_key = "你的秘钥";

    //异步回调接口:得放到服务器上,且使用域名解析 IP
    public static String notify_url = "回调函数接口";


    //支付宝网关(注意沙箱alipaydev,正式则为 alipay)不需要修改
    public static String url = "https://openapi.alipay.com/gateway.do";

    //编码类型
    public static String charset = "UTF-8";

    //数据类型
    public static String format = "json";

    // 公钥
    public static String public_key = "你的公钥";

    //签名类型
    public static String signtype = "RSA2";

}

 

2、下单接口

controller层

    /**
     * @Function: 去支付
     * @author:   YangXueFeng
     * @Date:     2019/6/11 16:10
     */
    @RequestMapping("/gotopay")
    public Object goToPay(@Param("orderId") Long orderId){
        return alipayViewService.setGotoPayInfos(orderId);
    }

 

service层

/**
     * @Function: 去支付
     * @author:   YangXueFeng
     * @Date:     2019/6/11 16:11
     */
    @Override
    public Map setGotoPayInfos(Long orderId) {
        Map map = new HashMap<>();
        if(Util.isEmpty(orderId)){
            map.put("code", UserStatusEnum.EMPTY.intKey());
            map.put("msg", UserStatusEnum.EMPTY.value());
            return map;
        }
        /* 查询订单信息 */
        PayParameterForm payParameter = orderMapper.getPayParameter(orderId);
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.url, AlipayConfig.app_id, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.public_key, AlipayConfig.signtype);//支付宝需要的参数serverUrl、appId、private_key、format、charset、public_key、signType
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody(payParameter.getTitle());//商品信息
        model.setSubject(payParameter.getTitle());//商品名称
        model.setOutTradeNo(String.valueOf(payParameter.getOrderId()));//订单号
        model.setTimeoutExpress("30m");//支付超时时间
/*
        model.setTotalAmount(String.valueOf(payParameter.getActualPrice()));// 支付金额
*/
        model.setTotalAmount(String.valueOf(0.01));// 支付金额
        request.setBizModel(model);
        // 回调地址(充值订单)
        request.setNotifyUrl(AlipayConfig.notify_url);// 回调地址
        //这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = null;
        try {
            response = alipayClient.sdkExecute(request);
            map.put("code", UserStatusEnum.SUCCESS.intKey());
            map.put("msg", UserStatusEnum.SUCCESS.value());
            Map dataMap = new HashMap<>();
            dataMap.put("payPath", response.getBody());
            map.put("data", dataMap);
            return map;
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        map.put("code", UserStatusEnum.ERROR.intKey());
        map.put("msg", UserStatusEnum.ERROR.value());
        return map;
    }

 

3、回调接口

controller层

/**
     * @Function: 支付宝异步通知回调
     * @author:   YangXueFeng
     * @Date:     2019/6/11 20:02
     */
    @ResponseBody
    @RequestMapping("/notify")
    public String notify(HttpServletRequest request, HttpServletResponse response) {
        return alipayViewService.notify(request, response);
    }

 

service层

/**
     * @Function: 支付宝异步回调接口
     * @author:   YangXueFeng
     * @Date:     2019/6/11 20:03
     */
    @Override
    public String notify(HttpServletRequest request, HttpServletResponse response) {
        Map params = new HashMap();
        //从支付宝回调的request域中取值
        Map requestParams = request.getParameterMap();

        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = iter.next();
            String[] values = 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);
        }
        //商品订单号
        String out_trade_no = request.getParameter("out_trade_no");            // 商户订单号
        // 当前交易状态
        String tradeStatus = request.getParameter("trade_status");            //交易状态
        // 支付金额
        String totalAmount = request.getParameter("total_amount");            //交易状态
        // 支付时间
        String payDate = request.getParameter("gmt_payment");            //交易状态
        //3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
        boolean signVerified = false;
        try {
            //3.1调用SDK验证签名
            signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.public_key, AlipayConfig.charset, AlipayConfig.signtype);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        //返回状态存入redis中
        //对验签进行处理
        if (signVerified) {
            //验签通过
            if(tradeStatus.equals("TRADE_SUCCESS")) {
                //支付成功后的业务处理
                OrderEntity order = orderMapper.getOrderInfo(Long.valueOf(out_trade_no));
                if(!Util.isEmpty(order)){
                    order.setStatus(CalculatStaticConstant.CHECK_ONE);
                    order.setCompleteTime(DateUtil.currentDate());
                    orderMapper.updateOrder(order);
                }
                /* 添加支付信息 */
                OrderPayEntity orderPay = new OrderPayEntity();
                orderPay.setId(Long.valueOf(IdUtils.getPrimaryKey()));
                orderPay.setOrderId(order.getId());
                orderPay.setUserId(order.getUserId());
                orderPay.setPayPrice(Double.valueOf(totalAmount));
                orderPay.setPayType(PayTypeEnum.ALI_PAY.intKey());
                orderPay.setStatus(CalculatStaticConstant.CHECK_ONE);
                orderPay.setPayTime(payDate);
                orderMapper.saveOrderPay(orderPay);
                RedisUtil.set("ali"+out_trade_no, tradeStatus,300);
                return "success";
            }
        } else {  //验签不通过
            System.err.println("验签失败");
            return "failure";
        }
        return "failure";
    }

 

此处回调函数接口要有返回值,成功后返回success(success是小写,别大写),此处如果没有返回值的话,支付宝会一直进行回调通知

至此,支付宝APP支付OK

你可能感兴趣的:(第三方支付)