用springboot完成支付宝实现在线支付【杭州多测师_王sir】

发布时间 2023-09-22 16:20:38作者: 多测师_王sir

一、这里简单介绍下沙箱环境,它是支付宝开放平台为开发者提供的安全低门槛的测试环境,开发者在沙箱环境中调用接口无需具备所需的商业资质,无需绑定和开通产品,即可实现支付功能。合理使用沙箱环境,可以让研发流程与商业流程并行,加速项目的交付。沙箱环境的支付用法与生产环境基本一致,仅需修改少量配置即可。

二、支付流程
网页端可以通过调用支付接口alipay.trade.page.pay(统一收单下单并支付页面接口)来实现支付,具体调用可以参考下面的时序图。

三、这里值得注意的是支付是否成功可以通过两种方式来得知:
通过支付宝的异步通知来获取交易的支付结果。
通过调用支付宝的alipay.trade.query(统一收单线下交易查询接口)查询交易的支付结果。
四、添加依赖
首先我们需要在项目的pom.xml文件中添加支付宝的Java SDK依赖;

<!-- 支付宝支付Java SDK -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.38.72.ALL</version>
</dependency>

五、订单管理接口实现
接下来我们需要实现支付宝订单管理的接口,先创建alipay_order表,用于存储订单信息;

CREATE TABLE `alipay_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(64) NOT NULL COMMENT '订单ID',
  `subject` varchar(255) DEFAULT NULL COMMENT '订单标题/商品标题/交易标题',
  `total_amount` decimal(10,2) DEFAULT NULL COMMENT '订单总金额',
  `trade_status` varchar(255) DEFAULT NULL COMMENT '交易状态',
  `trade_no` varchar(255) DEFAULT NULL COMMENT '支付宝交易号',
  `buyer_id` varchar(255) DEFAULT NULL COMMENT '买家支付宝账号',
  `gmt_payment` datetime DEFAULT NULL COMMENT '交易付款时间',
  `buyer_pay_amount` decimal(10,2) DEFAULT NULL COMMENT '用户在交易中支付的金额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='支付宝支付订单表';

六、支付相关的controller代码:

/**
 * @description 支付宝支付Controller
 * @date 2023/9/22
 */
@Controller
@Api(tags = "AlipayController")
@Tag(name = "AlipayController", description = "支付宝支付相关接口")
@RequestMapping("/alipay")
public class AlipayController {

    @Autowired
    private AlipayConfig alipayConfig;
    @Autowired
    private AlipayService alipayService;

    @ApiOperation("支付宝电脑网站支付")
    @RequestMapping(value = "/pay", method = RequestMethod.GET)
    public void pay(AliPayParam aliPayParam, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=" + alipayConfig.getCharset());
        response.getWriter().write(alipayService.pay(aliPayParam));
        response.getWriter().flush();
        response.getWriter().close();
    }

    @ApiOperation("支付宝手机网站支付")
    @RequestMapping(value = "/webPay", method = RequestMethod.GET)
    public void webPay(AliPayParam aliPayParam, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=" + alipayConfig.getCharset());
        response.getWriter().write(alipayService.webPay(aliPayParam));
        response.getWriter().flush();
        response.getWriter().close();
    }

    @ApiOperation(value = "支付宝异步回调",notes = "必须为POST请求,执行成功返回success,执行失败返回failure")
    @RequestMapping(value = "/notify", method = RequestMethod.POST)
    public String notify(HttpServletRequest request){
        Map<String, String> params = new HashMap<>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (String name : requestParams.keySet()) {
            params.put(name, request.getParameter(name));
        }
        return alipayService.notify(params);
    }

    @ApiOperation(value = "支付宝统一收单线下交易查询",notes = "订单支付成功返回:TRADE_SUCCESS")
    @RequestMapping(value = "/query", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult<String> query(String outTradeNo,String tradeNo){
        return CommonResult.success(alipayService.query(outTradeNo,tradeNo));
    }
}

七、项目演示效果
接下来我们可以运行下SpringBoot项目,演示下支付的流程
首先我们需要访问下项目的Swagger接口文档页面:http://localhost:8080/swagger-ui/
然后调用创建订单接口来创建订单,记住返回结果中的三个重要参数,oderId对应支付API的outTradeNo参数
然后调用支付宝电脑网站支付接口,传入这三个参数
复制请求地址后,直接在浏览器中打开,此时会直接跳转到支付宝支付页面,输入支付宝沙箱环境的测试账号密码即可支付
沙箱环境的测试账号密码,在支付宝沙箱应用的开发者控制台可以获取,记住要使用买家账号
支付成功后我们可以通过支付宝统一收单线下交易查询来查询支付结果,返回TRADE_SUCCESS代表支付成功

八、参考资料
支付宝官方文档:https://opendocs.alipay.com/open/065yhr
电脑网站支付快速接入:https://opendocs.alipay.com/open/270/105899
手机网站支付快速接入:https://opendocs.alipay.com/open/203/105285