Springboot 服务端为App集成支付宝支付

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38773547/article/details/90371197

别整什么花里胡哨的,先去吧官方文档看一遍。

首先把准备的东西准备好,这里加上一个大佬写的的连接:https://blog.csdn.net/vbirdbest/article/details/80635194 前期准备工作所需要的都在这里了。

登录上蚂蚁金服,点开发中心->网页&移动应用去看一下你申请的应用状态是不是已上线。

 点击查看详情:

在左边导航栏找到应用信息,点开大概就可以看到你app的信息了。

 

你需要配置:应用网关,授权回调地址。

https://docs.open.alipay.com/291/106097/ 这是RSA密钥工具。具体使用可以去里面看一下。

上代码:

1、pom依赖:

		<!--支付宝支付依赖-->
		<dependency>
			<groupId>net.guerlab</groupId>
			<artifactId>sdk-alipay-starter</artifactId>
			<version>1.0.3</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.38</version>
		</dependency>

2、支付宝配置文件


import java.io.FileWriter;
import java.io.IOException;

/**
 * 支付宝支付基础配置文件
 */
public class AlipayConfig {

    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    public  String app_id = "";

    // 商户私钥,您的PKCS8格式RSA2私钥
    public  String merchant_private_key = "";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public  String alipay_public_key = "";

    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public  String notify_url = "";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    // public  String return_url = "";

    // 签名方式
    public  String signType = "RSA2";

    // 字符编码格式
    public  String charset = "utf-8";

    // 支付宝请求地址
    public  String gatewayUrl = "https://openapi.alipay.com/gateway.do";

    // 支付宝网关
    public  String log_path = "C:\\";

    //支付宝仅支持JSON格式
    public  String format="JSON";


    public String getApp_id() {
        return app_id;
    }

    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }

    public String getMerchant_private_key() {
        return merchant_private_key;
    }

    public void setMerchant_private_key(String merchant_private_key) {
        this.merchant_private_key = merchant_private_key;
    }

    public String getAlipay_public_key() {
        return alipay_public_key;
    }

    public void setAlipay_public_key(String alipay_public_key) {
        this.alipay_public_key = alipay_public_key;
    }

    public String getNotify_url() {
        return notify_url;
    }

    public void setNotify_url(String notify_url) {
        this.notify_url = notify_url;
    }

//    public String getReturn_url() {
//        return return_url;
//    }
//
//    public void setReturn_url(String return_url) {
//        this.return_url = return_url;
//    }


    public String getSignType() {
        return signType;
    }

    public void setSignType(String signType) {
        this.signType = signType;
    }

    public String getCharset() {
        return charset;
    }

    public void setCharset(String charset) {
        this.charset = charset;
    }

    public String getGatewayUrl() {
        return gatewayUrl;
    }

    public void setGatewayUrl(String gatewayUrl) {
        this.gatewayUrl = gatewayUrl;
    }

    public String getLog_path() {
        return log_path;
    }

    public void setLog_path(String log_path) {
        this.log_path = log_path;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    public  void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

3、service层:



import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

public interface ALiservice {

    /**
     *  统一下单
     * @param total_fee 总价
     * @param oid 订单ID
     * @return
     * @throws Exception
     */
    Map pay(String total_fee, String oid) throws Exception;

    /**
     * 支付回调
     * @param request
     * @param response
     */
    void paymentCallback(HttpServletRequest request, HttpServletResponse response);
}

4、serviceImpl层:



import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@Service
public class ALiserviceImpl implements ALiservice {
    private static final Logger logger = LoggerFactory.getLogger("MainLogger");
   

    AlipayConfig alipayConfig = new AlipayConfig();
    /**
     * app支付接口2.0
     *
     * @param total_fee 总价
     * @param oid       订单ID
     * @return
     * @throws Exception
     */

    @Override
    public Map pay(String total_fee, String oid) throws Exception {

        try {
            System.out.println("-----------------------------支付宝预支付开始------------------------------------");
            // 封装请求客户端  实例化客户端  这个顺序不要动
            AlipayClient client = new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getApp_id(), alipayConfig.getMerchant_private_key(),
                    alipayConfig.getFormat(), alipayConfig.getCharset(),alipayConfig.getAlipay_public_key(),alipayConfig.getSignType());
            //	支付请求 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
            AlipayTradeAppPayRequest payRequest = new AlipayTradeAppPayRequest();
            // SDK已经封装掉了公共参数,这里只需要传入业务参数。
            // 以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
            AlipayTradePayModel model = new AlipayTradePayModel();
            model.setSubject("测试支付宝");  //订单名称
            model.setBody("测试支付宝支付");       //设置商品描述
            String out_trade_no = jinOrderMapper.selectOrderNum(oid);  //获取订单号
            System.out.println("商户订单号------------" + out_trade_no);
            model.setOutTradeNo(out_trade_no);      //设置商户网站唯一订单号
            model.setTotalAmount(total_fee);        //设置总金额
            model.setTimeoutExpress("90m");         //设置超时关闭该订单时间
            model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码
            payRequest.setBizModel(model);          //封装好的额外参数放到主请求中
            payRequest.setNotifyUrl(alipayConfig.getNotify_url());//设置异步通知地址
            //支付宝请求应答
            AlipayTradeAppPayResponse responses = client.sdkExecute(payRequest);
            System.out.println("-----------------------------支付宝应答处理开始------------------------------------");
            System.out.println(responses.getBody()); // 就是orderString 可以直接给客户端请求,无需再做处理
            Map<String, String> data = new HashMap<>();
            data.put("body",responses.getBody());   //支付表单
            return data;
        } catch (Exception e) {
            e.printStackTrace();
        }
        throw new Exception("下单失败");
    }

    /**
     *支付回调
     * @param request
     * @param response
     */
    @Override
    public void paymentCallback(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("---------------------------支付宝进入异步通知--------------------------");
        String resultFail = "fail";
        //获取支付宝GET过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        System.out.println("返回的map----------------" + requestParams);
        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不相等也可以使用这段代码转化
            /*try {
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), "GBK");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }*/
            params.put(name, valueStr);
        }

        logger.info("params={}", params);

        boolean signVerified = false; //调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipay_public_key(), alipayConfig.getCharset(), alipayConfig.getSignType());
        } catch (AlipayApiException e) {
            logger.error("【支付宝异步通知】支付宝回调通知失败 e={} params={}", e, params);
            responseBody(response, resultFail);
            return;
            //e.printStackTrace();
        }
        if (!signVerified) {
            logger.error("【支付宝异步通知】验证签名错误 params={} ", params);
            responseBody(response, resultFail);
            return;
        }
        BigDecimal trade_price = new BigDecimal(request.getParameter("total_amount"));
        //商户订单号
        String out_trade_no = params.get("out_trade_no");
        //支付宝交易号
        String trade_no = params.get("trade_no");
        //交易状态
        String trade_status = params.get("trade_status");
        // 支付成功修改订单状态
        if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
            //业务处理,主要是更新订单状态

            System.out.println("---------------------------支付成功--------------------------");
        }
        responseBody(response, resultFail);
        return;
    }
    private void responseBody(HttpServletResponse response, String contentBody) {
        try {
            response.setContentType("type=text/javascript;charset=UTF-8");
            String s = contentBody;
            response.getWriter().write(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return;
    }
}

5、controller 层:


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@RestController
@RequestMapping("/alipay")
public class AlipayController {
    @Autowired
    ALiserviceImpl aLiservice;

    /**
     * 支付
     * @param total_fee
     * @param oid
     * @return
     * @throws Exception
     */
   @PostMapping("/apppay")
   public Map pay( @RequestParam(value = "total_fee") String total_fee,@RequestParam(value = "oid") String oid) throws Exception {
        return aLiservice.pay(total_fee,oid);
   }

    /**
     * 回调
     * @param request
     * @param response
     * @return
     */
    @PostMapping("/alipayNotify")
    public void alipayNotify(HttpServletRequest request, HttpServletResponse response) {
         aLiservice.paymentCallback(request,response);
    }

}

 代码就这些,比微信的要简单。

你去请求支付宝返回的数据大概是这个样子的:

 

这个不用处理直接返回给安卓就行了。

要想知道他能不能调起支付宝支付。你可以安装一个APK:地址-》https://openclub.alipay.com/club/history/read/769

常见的错误就是系统繁忙ALIN10146  自查方案 地址-》:https://openclub.alipay.com/club/history/read/6918

----------------------------------------------------------------------------。-。-。-。-。-。-。-。-。-。-。-。-。-。-。-。。-。-。-

华丽结束

展开阅读全文

没有更多推荐了,返回首页