最简单的springboot集成支付宝

1 注册沙箱

沙箱是一个模拟环境登录,百度蚂蚁金服开放平台,支付宝扫码登录如下

springboot写支付接口 springboot 支付宝_springboot写支付接口

springboot写支付接口 springboot 支付宝_java_02


然后沙箱需要注册一下,非常之简单,注册好以后进入到如下页面,选沙箱工具,然后下载一个生成密钥的工具。然后解压按照里面的readme生成公私密钥,

springboot写支付接口 springboot 支付宝_支付宝_03

选择沙箱应用 上传公钥即可。。沙箱到这里就基本完成了,里面还有沙箱版本的的android app可以下载下来。

springboot写支付接口 springboot 支付宝_java_04

java 程序

1 新建一个springboot项目

因为我们创建的是一个web工程,所以,仅仅演示支付宝的demo,只需要勾选web就足够了。

springboot写支付接口 springboot 支付宝_支付宝_05

2 添加alipay-sdk-java和fastjson

fastjson 的作用是用到了其中的JSON.toString方法。
alipay-sdk-java的作用不用说自然是支付宝的sdk,是必不可少的。

<dependency>
            <groupId>com.alipay.api</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>20170615110434</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.7</version>
        </dependency>

3 Config

新建一个支付宝的config文件,如下

因为支付宝支付完成以后会有一个回调函数返回商家页面

springboot写支付接口 springboot 支付宝_springboot写支付接口_06

该页面完成过一会儿结束以后会有一个回调,,因为回调地址必须是公网可以直接访问,这也就是下面用到了netapp映射的原因neturl即为映射的公网地址。

package com.example.pay.config.pay;

import org.springframework.context.annotation.Configuration;

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

/**
 * @author ligen
 * @title: AliPayConfig
 * @projectName demo
 * @description:
 * @date 2019/6/1014:20
 */
@Configuration
public class AliPayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
 //    netapp映射的地址,,,根据自己的需要修改
    private static String neturl = "http://g5kike.natappfree.cc";

    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 按照我文章图上的信息填写
    public static String app_id = "2016092800619078";

    // 商户私钥,您的PKCS8格式RSA2私钥  刚刚生成的私钥直接复制填写
    public static String merchant_private_key ="粘贴生成的私钥";

    // 支付宝公钥,对应APPID下的支付宝公钥。 按照我文章图上的信息填写支付宝公钥,别填成商户公钥
    public static String alipay_public_key = "粘贴生成的公钥";
    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,其实就是你的一个支付完成后返回的页面URL
    public static String notify_url = neturl+"/alipay/notify_url";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,其实就是你的一个支付完成后返回的页面URL
    public static String return_url = neturl+"/alipay/return_url";

    // 签名方式
    public static String sign_type = "RSA2";

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

    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

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


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static 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();
                }
            }
        }
    }
}

4 Service

调用支付宝的支付接口就是将一包数据通过支付宝SDK的一个接口发送给支付宝的服务器,然后他会返回给你一个输入密码确认支付的界面。
所以只需要干两件事

1 组装数据

数据最少有5项,注意map的key和value都是字符串

springboot写支付接口 springboot 支付宝_支付_07

2 创建客户端

创建一个 Client实例,其中的值即为我们Config中的值

springboot写支付接口 springboot 支付宝_支付_08

3 发送数据

这里面先将数据转化为request 最后将request通过Client发出去。用到了fastjson的toString方法。也就是前面导入fastjson依赖的原因

springboot写支付接口 springboot 支付宝_springboot_09

package com.example.pay.config.pay;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.example.pay.domain.AlipayVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author ligen
 * @title: AliPayService
 * @projectName demo
 * @description:
 * @date 2019/6/119:11
 */
@Service
public class AliPayService {
    Logger logger = LoggerFactory.getLogger("AliPayService.class");


    @Autowired
    AlipayVo staticVo;

    //    支付服务
    public String aliPay() throws AlipayApiException {

        // 构建支付数据信息
        Map<String, String> data = new HashMap<>();
        data.put("subject", staticVo.getSubject()); //订单标题
        data.put("out_trade_no", new SimpleDateFormat().format(new Date())); //商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复      //此处模拟订单号为时间
        data.put("timeout_express", staticVo.getTimout_express()); //该笔订单允许的最晚付款时间
        data.put("total_amount", staticVo.getTotle_amout()); //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
        data.put("product_code", "FAST_INSTANT_TRADE_PAY"); //销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY


        //构建客户端
        DefaultAlipayClient alipayRsa2Client = new DefaultAlipayClient(
                AliPayConfig.gatewayUrl,
                AliPayConfig.app_id,
                AliPayConfig.merchant_private_key,
                "json",
                AliPayConfig.charset,
                AliPayConfig.alipay_public_key,
                AliPayConfig.sign_type);
//        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();// APP支付
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 网页支付
//        AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();  //移动h5
        request.setNotifyUrl(AliPayConfig.notify_url);
        request.setReturnUrl(AliPayConfig.return_url);
        request.setBizContent(JSON.toJSONString(data));
        logger.info(JSON.toJSONString(data));
        String response = alipayRsa2Client.pageExecute(request).getBody();
        logger.info(response);
        return response;
    }
}

5 controller 层很简单 代码如下

package com.example.pay.controller;

import com.alipay.api.AlipayApiException;
import com.example.pay.config.pay.AliPayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**

  • @author ligen
  • @title: PayController
  • @projectName demo
  • @description:
  • @date 2019/6/1013:25
    */

@Api(tags = “支付宝测试”)
@RestController
public class PayController {

Logger logger = LoggerFactory.getLogger("PayController.class");

@Autowired
AliPayService aliPayService;

@ApiOperation("支付接口")
@RequestMapping(value = "alipay/toPay/{amount}", method = RequestMethod.GET)
public String alipay(@PathVariable(value = "amount") Integer amount) throws AlipayApiException {
    return aliPayService.aliPay(amount);
}

@ApiOperation("支付异步通知接口")
@GetMapping("alipay/notify_url")
public String notifyAlipay() {

    logger.info("----notify-----");
    return " a li pay notify ";
}

@ApiOperation("支付完成以后的回调接口")
@GetMapping("alipay/return_url")
public String returnAlipay() {
    logger.info("----return-----");
    return " a li pay return ";
}

}

6 运行

浏览器访问(我这里设置了端口号为1234) 路径最后面200是金额参数。

springboot写支付接口 springboot 支付宝_支付_10

会跳转到如下页面,

springboot写支付接口 springboot 支付宝_java_11

此时可以使用沙箱支付宝app支付了,这里我们使用账户登录。。。记住是付款用户登录,而不是收款用户。。。那么哪里看付款收款呢。

打开蚂蚁金服->开发者中心->沙箱 如下图

springboot写支付接口 springboot 支付宝_支付宝_12

登录第二个账号后如下图 密码默认都是111111

springboot写支付接口 springboot 支付宝_springboot_13

springboot写支付接口 springboot 支付宝_支付宝_14

如果设置了return url 将在该页面结束以后自动跳转至return url对应的页面,如下 我在return url只是返回了一个字符串。

springboot写支付接口 springboot 支付宝_java_15