springboot实现支付宝支付功能

这篇具有很好参考价值的文章主要介绍了springboot实现支付宝支付功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

支付系统中容易出现的问题

1,用户在页面下订单后,价格被篡改;
解决方案:通过后端计算订单的总金额

2,订单重复处理。用户支付成功后,支付宝会短时间内多次调用我们的回调接口,如果出现网络波动等原因会导致多次回调请求同时到达,同时对订单做处理,导致用户充一次钱,服务续费了两个月。
解决方案:对订单数据加乐观锁,避免订单被多次修改。(之前接手一个老项目就发现了这种情况)

3,掉单情况。用户支付完成了,回到平台一看,订单状态还处于未支付。这是因为用户虽然支付成功了,但是支付宝回调我们接口的时候可能没有回调成功,或者回调成功了但是订单状态修改没有成功,就会导致订单状态没有变更。用户一看钱付了,购买的服务却没有成功,要炸毛了。
解决方案:用户支付成功回到平台后,前端要开启一个轮询,调用查询订单的状态接口,后端然后去支付宝查看该订单是否实际支付成功,如果支付成功,及时更改订单的状态。还有一种方式是后端可以开启一个定时任务,定时30秒查询订单表最近5分钟未支付的订单,然后去查看实际的支付状态,如果支付成功再修改订单的状态以及后续的业务处理,这种方式适合业务比较小的平台。
支付系统中最重要的就是要保证支付订单和业务处理只能被修改一次,以及可能出现订单状态修改不及时的情况。

开发测试过程中可能出现页面渲染不出来的情况
参考解决方案:https://blog.csdn.net/weixin_51324855/article/details/124098732
支付系统开发好后,在生产环境下可能会出现重复支付和掉单的问题
参考一:
参考二:
参考三:

一,实现支付宝支付功能步骤

1,创建一个springboot项目

2,注册入驻支付宝成为开发人员
地址给你准备好了:https://open.alipay.com/platform/home.htm?from=wwwalipay

3,进入沙箱应用,获取配置到项目中的配置信息 (重要!!!)

4,下载支付宝开放平台开发助手,生成应用公钥和应用私钥 (重要!!!私钥要配置到项目中)
开发助手下载地址:https://opendocs.alipay.com/common/02kipl

5,springboot中配置支付宝支付信息,编写代码。

6,测试支付功能。

创建springboot项目省略

二,入驻支付宝成为开发人员

搜索支付宝,进入支付宝首页—》我是开发者—》注册登录(第一次登录时要求你必须入驻,直接入驻就行了)

地址给你准备好了:https://open.alipay.com/platform/home.htm?from=wwwalipay
直接登录注册就可以了

springboot实现支付宝支付功能

三,进入沙箱应用

简单解释下沙箱,就是模拟的支付系统,支付的钱都是假的。

1,沙箱中操作说明

登录—》控制台—》沙箱—》沙箱应用

登录之后,页面是这个样子的
springboot实现支付宝支付功能
springboot实现支付宝支付功能

2,沙箱其他信息说明

下面分别是生成的买家和卖家的支付宝账号

支付宝客户端沙箱版,用来模拟扫码支付的,账号是上面的沙箱版买家账号(买家扫码向卖家支付),建议手机扫码下载一个,登录买家账号
springboot实现支付宝支付功能

springboot实现支付宝支付功能

四,下载支付宝开发助手生成秘钥

1,生成秘钥

开发助手下载地址:https://opendocs.alipay.com/common/02kipl

下载后直接安装,打开后直接生成秘钥,生成秘钥后电脑会有两个文件,分别保存有应用公钥和应用私钥
springboot实现支付宝支付功能
springboot实现支付宝支付功能

2,配置秘钥

将应用公钥复制下来,然后到沙箱应用中配置生成支付宝公钥

springboot实现支付宝支付功能

五,springboot中配置环境

1,引入jar包

		<!-- 支付宝支付jar包 -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.1.0</version>
        </dependency>

2,application.properties

# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,在沙箱应用中获取
appId:2021000119675024
# 商户私钥,您的PKCS8格式RSA2私钥,通过开发助手生成的应用私钥
privateKey:
# 支付宝公钥,在沙箱应用获取,通过应用公钥生成支付宝公钥
publicKey:
# 服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数
notifyUrl:http://localhost:8081/alipay/success
# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
returnUrl: http://localhost:8081/alipay/success
# 签名方式
signType: RSA2
# 字符编码格式
charset: utf-8
# 支付宝网关,在沙箱应用中获取
gatewayUrl: https://openapi.alipaydev.com/gateway.do

3,接收请求参数的实体类

实体类总的属性只能是下划线连接,不能使用驼峰命名

@Data
public class AlipayBean implements Serializable {

    /**
     * 商户订单号
     */
    private String out_trade_no;

    /**
     * 订单名称
     */
    private String subject;

    /**
     * 付款金额
     */
    private String total_amount;

    /**
     * 商品描述
     */
    private String body;

    /**
     * 产品编号,支付方式不同,传的数据不同
     */
     //如果是PC网页支付,这个是必传参数
    private String product_code = "FAST_INSTANT_TRADE_PAY";
    //如果是扫码支付,这个是选传参数
    //private String product_code = "FACE_TO_FACE_PAYMENT";
}

4,支付接口

支付宝各种支付接口说明:https://opendocs.alipay.com/open/194/106078

我这里只说PC网页支付和扫码支付,详细的支付需要查看支付宝官方的文档

参数封装类不同,使用AlipayClient就要调用不同的方法,具体可以在支付宝

AlipayTradePagePayRequest	pageExecute 	是PC网页支付,类似使用电脑在淘宝买东西的支付方式
AlipayClient.pageExecute(pagePayRequest)

AlipayTradePrecreateRequest		execute  	扫码支付
AlipayClient.pageExecute(precreateRequest)
PC网页支付还是扫码支付,我们都需要传参,查看支付宝官方文档得知:
扫码支付必传3个参数:out_trade_no、subject、total_amount
而PC支付必传4个参数:out_trade_no、subject、total_amount、product_code 
根据支付方式不同对AlipayBean 中的属性进行改造

项目代码写好后,调用支付接口,支付宝返回来的信息可能会出现参数不正确的错误信息,
这个时候就要检查你的传参是否符合支付宝文档的要求,参数是否使用下划线,是否漏了必传参数
@Controller
@RequestMapping("/alipay")
public class AlipayController {

	//获取配置文件中的配置信息
    //应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    @Value("${appId}")
    private String appId;

    //商户私钥 您的PKCS8格式RSA2私钥
    @Value("${privateKey}")
    private String privateKey;

    //支付宝公钥
    @Value("${publicKey}")
    private String publicKey;

    //服务器异步通知页面路径
    @Value("${notifyUrl}")
    private String notifyUrl;

    //页面跳转同步通知页面路径
    @Value("${returnUrl}")
    private String returnUrl;

    //签名方式
    @Value("${signType}")
    private String signType;

    //字符编码格式
    @Value("${charset}")
    private String charset;

    //支付宝网关
    @Value("${gatewayUrl}")
    private String gatewayUrl;

    private final String format = "json";

	//PC网页段支付,返回的是支付宝账号的登录页面
    @RequestMapping("/pay")
    @ResponseBody
    public String pay(AlipayBean alipayBean) throws AlipayApiException {
    	//模拟数据
		alipayBean.setOut_trade_no(UUID.randomUUID().toString().replaceAll("-",""));
        alipayBean.setSubject("订单名称");
        alipayBean.setTotal_amount(String.valueOf(new Random().nextInt(100)));
        alipayBean.setBody("商品描述");

        AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, privateKey, format, charset, publicKey, signType);
        //PC网页支付使用AlipayTradePagePayRequest传参,下面调用的是pageExecute方法
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(returnUrl);
        alipayRequest.setNotifyUrl(notifyUrl);
        alipayRequest.setBizContent(JSON.toJSONString(alipayBean));
        log.info("封装请求支付宝付款参数为:{}", JSON.toJSONString(alipayRequest));
        
        // 调用SDK生成表单
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        log.info("请求支付宝付款返回参数为:{}", result);
        return result;
    }

	/**
     * 手机扫码支付
     * @param alipayBean
     * @return
     * @throws Exception
     */
    @RequestMapping("/pay2")
    @ResponseBody
    public Result pay2(AlipayBean alipayBean) throws Exception {
        //接口模拟数据
        alipayBean.setOut_trade_no("20210817010101003");
        alipayBean.setSubject("订单名称");
        alipayBean.setTotal_amount(String.valueOf(new Random().nextInt(100)));
        alipayBean.setBody("商品描述");

        AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, privateKey, format, charset, publicKey, signType);
        //扫码支付使用AlipayTradePrecreateRequest传参,下面调用的是execute方法
        AlipayTradePrecreateRequest precreateRequest = new AlipayTradePrecreateRequest();
        precreateRequest.setReturnUrl(returnUrl);
        precreateRequest.setNotifyUrl(notifyUrl);
        precreateRequest.setBizContent(JSON.toJSONString(alipayBean));
        log.info("封装请求支付宝付款参数为:{}", JSON.toJSONString(precreateRequest));

        AlipayTradePrecreateResponse response = null;
        try {
            response = alipayClient.execute(precreateRequest);
        } catch (AlipayApiException e) {
            throw new Exception(String.format("下单失败 错误代码:[%s], 错误信息:[%s]", e.getErrCode(), e.getErrMsg()));
        }
        log.info("AlipayTradePrecreateResponse = {}", response.getBody());

        /*
        {
        "code": "10000",
        "msg": "Success",
        "out_trade_no": "815259610498863104",
        "qr_code": "https://qr.alipay.com/bax09455sq1umiufbxf4503e"
        }
        */
        if (!response.isSuccess()) {
            throw new Exception(String.format("下单失败 错误代码:[%s], 错误信息:[%s]", response.getCode(), response.getMsg()));
        }
        // TODO 下单记录保存入库
        // 返回结果,主要是返回 qr_code,前端根据 qr_code 进行重定向或者生成二维码引导用户支付
        JSONObject jsonObject = new JSONObject();
        //支付宝响应的订单号
        String outTradeNo = response.getOutTradeNo();
        jsonObject.put("outTradeNo",outTradeNo);
        //二维码地址,页面使用二维码工具显示出来就可以了
        jsonObject.put("qrCode",response.getQrCode());
        return Result.ok(jsonObject);
    }

    @RequestMapping("/success")
    @ResponseBody
    public String success(){
        return "交易成功!";
    }

    @RequestMapping(value = "/index")
    public String payCoin(){
        return "index.html";
    }
}

5,写一个简单的页面index.html

不要页面,直接接口工具请求也可以

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/alipay/pay" method="post">
    订单号:<input type="text" name="out_trade_no" required><br/>
    订单名称:<input type="text" name="subject" required><br/>
    付款金额:<input type="text" name="total_amount" required><br/>
    商品描述:<input type="text" name="body"><br/>
    <input type="submit" value="下单"> <input type="reset" value="重置">
</form>

</body>
</html>

六,测试

启动springboot项目,地址栏输入localhost:8081,下单后自动跳到登录页面,需要登录买方的账号,就是沙箱应用生成的账号,支付密码111111,有没有支付成功,可以到沙箱应用查看账号的金额是否发生变动。

1,测试PC网页支付

springboot实现支付宝支付功能
springboot实现支付宝支付功能
springboot实现支付宝支付功能
springboot实现支付宝支付功能

2,测试扫码支付

1,首先手机上先下载沙盒版支付宝,安装到手机上,怎么下载看上面沙箱应用的说明
2,下载后登录沙箱版生成的买方账号。
3,调用扫码支付的接口
4,网上搜一个二维码在线生成器
5,用沙箱版扫码支付
springboot实现支付宝支付功能

七,可能出现的问题

1,问题1:付款时显示订单已付款

原因: 向支付宝提交的订单号重复,且之前的订单号已支付过

解决办法: 换个订单号就行

2,问题2: 触发点击事件时界面显示404NotFound

原因1:支付宝网关填写有错误或者支付宝沙箱环境不稳定造成的

解决办法1:查看郁闷了配置文件中gatewayUrl是不是支付宝沙箱支付的网关 如下:

gatewayUrl: https://openapi.alipaydev.com/gateway.do

原因2:支付宝沙箱环境不稳定造成的

解决办法2:在404NotFound界面一直点击刷新,重复提交几次就行了

3,问题3:输入支付密码后显示,抱歉网络系统繁忙,请稍后再试

springboot实现支付宝支付功能
原因:沙箱支付环境不稳定或者沙箱环境正在维护中

解决办法:等一天,尽量避开周日到周一一点,这个问题就自动解决了

4,问题4:付款时跳转到504

原因:网速过慢

解决办法:切换到更快的网络付款就行

5,问题5:付款时显示支付存在钓鱼风险!

springboot实现支付宝支付功能
原因:浏览器环境的问题

解决办法1:换一个未登录支付宝开放平台以及未调用过沙箱支付接口的浏览器,重新提交付款

解决办法2:把浏览器上打开的所有沙箱支付、支付宝官方等的页面全部关闭,然后Crtl+Shift+delete,清空浏览器缓存

6,问题6:付款时显示订单信息无法识别,请联系卖家

springboot实现支付宝支付功能
原因1:AliPayBean里封装的实体字段写的有问题

请求支付宝api就是要 _ 拼接的,不能使用驼峰拼接

解决办法1:AliPayBean文件与以下保持一致,字段名用_连接

package com.htu.domain;/*** 支付实体对象* 根据支付宝接口协议,其中的属性名,必须使用下划线,不能修改*/
public class AlipayBean {/*** 商户订单号,必填**/private String out_trade_no;/*** 订单名称,必填*/private String subject;/*** 付款金额,必填* 根据支付宝接口协议,必须使用下划线*/private String total_amount;/*** 商品描述,可空*/private String body;/*** 超时时间参数*/private String timeout_express= "10m";/*** 产品编号*/private String product_code= "FAST_INSTANT_TRADE_PAY";public AlipayBean(){}public AlipayBean(String out_trade_no, String subject, String total_amount, String body, String timeout_express, String product_code){this.out_trade_no = out_trade_no;this.subject = subject;this.total_amount = total_amount;this.body = body;this.timeout_express = timeout_express;this.product_code = product_code;}public String getOut_trade_no() {return out_trade_no;}public void setOut_trade_no(String out_trade_no) {this.out_trade_no = out_trade_no;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getTotal_amount() {return total_amount;}public void setTotal_amount(String total_amount) {this.total_amount = total_amount;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getTimeout_express() {return timeout_express;}public void setTimeout_express(String timeout_express) {this.timeout_express = timeout_express;}public String getProduct_code() {return product_code;}public void setProduct_code(String product_code) {this.product_code = product_code;}@Overridepublic String toString(){return "AlipayBean{" +"out_trade_no='" + out_trade_no + '\'' +", subject='" + subject + '\'' +", total_amount='" + total_amount + '\'' +", body='" + body + '\'' +", timeout_express='" + timeout_express + '\'' +", product_code='" + product_code + '\'' +'}';}
}

原因2:向后端穿的订单号与金额不规范,如订单编号或者金额中出现了字母或符号

解决办法2:订单编号和订单金额只能有数字组成文章来源地址https://www.toymoban.com/news/detail-415499.html

到了这里,关于springboot实现支付宝支付功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 帝国CMS商城系统实现在线支付后发送订单邮件提醒功能

    本文实例讲述了帝国CMS商城系统实现在线支付后发送订单邮件提醒功能。分享给大家供大家参考,具体如下: 帝国CMS是个强大的内容管理系统,其商城的功能也很强大,当用户下单,支付后我们怎么知道有用户下单了呢?因为我们不能时时刻刻都在网站后台,不断的刷新页面去看

    2023年04月24日
    浏览(57)
  • SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址。 下面是回调接口实现 根据官网给的参数进行业务处理 这就完成了,微信支付回调你的地址,并且把支付的信息传进来,剩下就要根据自己业务进行操作。

    2024年02月11日
    浏览(65)
  • 数商云采购管理系统支付结算功能详解,实现建筑工程企业采购业务智能化管理

    建筑工程行业企业过去受技术、场地等限制,一直采用传统的采购方式,再加上整个行业内部信息相对割裂、采购面临层层传播、中间沟通亦面临多层税费等问题,为建筑工程采购工作增添了不少困难。 随着互联网时代的发展,在大数据、云计算的数字化信息平台冲击以及市

    2024年02月02日
    浏览(52)
  • SpringBoot对接微信小程序支付功能开发(一,下单功能)

    1,接入前准备: 接入模式选择直连模式; 申请小程序,得到APPID,并开通微信支付; 申请微信商户号,得到mchid,并绑定APPID; 配置商户API key,下载并配置商户证书,根据微信官方文档操作:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml 上面都配置完之后会得到:小

    2024年02月10日
    浏览(64)
  • 基于Java+SpringBoot+Vue+Uniapp小程序前后端分离租房管理系统设计与实现(支持支付宝支付、有需求解析文档50页、演示视频)

    博主介绍: ✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品: 《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-

    2024年02月06日
    浏览(44)
  • 【业务功能篇104】 补充【业务功能篇99】微服务-springcloud-springboot-电商订单模块--整合支付

    在前面我们业务功能篇98-99中,我们介绍了电商项目中的订单模块服务,那么最后就是需要进行支付动作,那么我们这里就通过订阅第三方平台支付宝的支付调用接口功能,来进一步完成订单提交后的支付动作,支付宝的接口使用可以登录官网开发指南详情去了解 在我们对应

    2024年02月09日
    浏览(50)
  • SpringBoot+Vue实现一个系统登录功能

    1. 创建一个Spring Boot项目,添加Web和Security依赖。 2. 创建一个User实体类,用于存储用户信息。 3. 创建一个UserDetailsService接口的实现类,用于加载用户信息。 4. 创建一个WebSecurityConfig类,继承WebSecurityConfigurerAdapter,并重写configure方法,配置SpringSecurity。 5. 在Vue项目中创建一个

    2024年01月15日
    浏览(36)
  • 【微信小程序支付功能】uniapp实现微信小程序支付功能

    场景 :要实现公司微信小程序的电商模块微信支付功能 一.实现步骤和思路 在登录状态,登录的时候获取到code,利用code获取到 openid: https://blog.csdn.net/weixin_45308405/article/details/128868377?spm=1001.2014.3001.5501 在manifest.json文件“App模块配置”项的“Payment(支付)”下,勾选“微信支付

    2024年02月11日
    浏览(61)
  • springboot实现支付宝支付(沙箱环境)

    进入支付宝控制台:https://open.alipay.com/develop/manage 找到沙箱 这里可以看到 应用id 可以看到 应用私钥 和 支付宝公钥 ,获取这三后就可以开始敲代码了 依赖: 在resources/templates目录下创建一个pay.html文件,用于展示支付宝支付页面。 创建同步通知页面 在resources/templates目录下创建

    2024年02月08日
    浏览(46)
  • Java如何实现支付功能

    Java 可以通过以下几种方式实现支付功能: 使用第三方支付平台的 SDK,如支付宝、微信等,这些 SDK 提供了 Java 的接口可以直接使用。 使用 Java 的网络编程技术,如 HttpClient 等,发起网络请求直接调用支付接口。 使用 Java 的第三方库如 Spring 框架,封装了支付接口的调用。 推

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包