springboot对接支付宝native支付

172 阅读2分钟

在Spring Boot中集成支付宝Native支付需要以下步骤:

注册支付宝账号并创建应用程序,然后获取应用程序的appid、私钥和公钥。 在Spring Boot项目中添加alipay-sdk依赖:

<groupId>com.alipay.sdk\</groupId>
<artifactId>alipay-sdk-java\</artifactId>
<version>4.11.0.ALL\</version>
</dependency>

创建一个AlipayClient对象,用于调用支付宝的接口。AlipayClient的创建需要传入以下参数:appid、私钥、公钥、格式类型、字符编码、支付宝网关和加密类型。

        import com.alipay.api.AlipayClient;
        import com.alipay.api.DefaultAlipayClient;

        public class AlipayUtil {
        private String appid = "xxxxx";
        private String privateKey = "xxxxx";
        private String publicKey = "xxxxx";
        private String format = "json";
        private String charset = "UTF-8";
        private String gatewayUrl = "<https://openapi.alipay.com/gateway.do>";
        private String signType = "RSA2";

            public AlipayClient getAlipayClient() {
                return new DefaultAlipayClient(gatewayUrl, appid, privateKey, format, charset,                publicKey, signType);
            }

        }

        创建一个支付页面,在页面中调用支付宝的接口生成订单信息,并返回到页面。

        @RequestMapping("alipay")
        public String alipay(Model model) throws AlipayApiException {
        // 创建AlipayClient对象
        AlipayClient alipayClient = alipayUtil.getAlipayClient();

            // 创建AlipayTradeWapPayRequest对象,并设置支付宝支付页面的参数
            AlipayTradePayRequest payRequest = new AlipayTradePayRequest();
            payRequest.setNotifyUrl(payConfig.getNotifyUrl());

            // 设置订单信息
            AlipayTradePayModel payModel = new AlipayTradePayModel();
            // 商户订单号,需要保证在商户端不重复,建议用UUID生成
            payModel.setOutTradeNo("xxxxx");
            // 订单总金额,单位为元,精确到小数点后两位
            payModel.setTotalAmount("0.01");
            // 订单标题
            payModel.setSubject("xxxxx");
            // 订单描述
            payModel.setBody("xxxxx");
            // 销售产品码,与支付宝签约的产品码名称
            payModel.setProductCode("NATIVE");
            // 设置订单参数
            payRequest.setBizModel(payModel);

            // 调用支付宝的接口生成支付信息
            AlipayTradePayResponse response = alipayClient.execute(payRequest);
            if (response.isSuccess()) {
                String qrCode = response.getQrCode();
                model.addAttribute("qrCode", qrCode);
                return "pay/alipay";
            } else {
                // 抛出异常或者进行其他处理
                throw new Exception("支付宝生成订单失败");
            }

        }
        ```
   

扫码支付完成后支付宝会调用notifyUrl指定的接口。在接口中验证订单的有效性,并进行相关操作,例如给用户加钱等。


    @PostMapping("alipay/notify")
    public String alipayNotify(HttpServletRequest request) throws AlipayApiException {
    // 获取支付宝POST过来反馈信息
    Map\<String, String> params = new HashMap\<String, String>();
    Map\<String, String\[]> requestParams = request.getParameterMap();
    for (String key : requestParams.keySet()) {
    String\[] values = requestParams.get(key);
    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(key, valueStr);
    }

        // 调用SDK验证签名
        boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(),
                alipayConfig.getCharset(), alipayConfig.getSignType());

        if (signVerified) {
            // 验证通过后进行相关操作
            String outTradeNo = params.get("out_trade_no");
            String tradeNo = params.get("trade_no");
            String totalAmount = params.get("total_amount");
            // ...
            // 返回success表示接收成功
            return "success";
        } else {
            // 返回failure表示接收失败
            return "failure";
        }

    }

以上是集成支付宝Native支付的步骤。具体实现中需要注意的细节可以参考支付宝官方文档和样例代码。