springboot接入支付宝支付

在springboot项目中接入支付宝支付

    • 一、在官网申请开通
    • 二、编写代码

一、在官网申请开通

进入支付宝开放平台
在这里插入图片描述
支付宝扫码登录注册,填写相关信息。
因为我们是开发者,所以支付宝给我们提供一个完整的沙箱环境,只要登录开放平台就会给我们提供一个测试的商家账号和支付账号
在这里插入图片描述
这里需设置下开发者的密钥我们选择系统默认,第一个点击启用即可
在这里插入图片描述
设置好之后,点击查看。
在这里插入图片描述
可以看见沙箱环境下有商家信息买家信息
在这里插入图片描述

二、编写代码

将下面的代码复制到你的系统即可。注意:将里面的信息改成你自己的哦!

0、引入jar

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

1、支付宝支付

/*** 支付配置信息* @author cxt* @date 2021/11/20*/
public class AlipayConfig {// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,开发时使用沙箱提供的APPID,生产环境改成自己的APPIDpublic static String APP_ID = "2021******2179"; // 写你的AppID// 商户私钥,您的PKCS8格式RSA2私钥public static String APP_PRIVATE_KEY = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCurNMo4AdLzKibsfGiz469NmXaGgypz2LBcKUwyXG4Cn0UAGDnxX+7+sshGyxMYrEczETZ8rRR6d7M4ZzyFGeHZN4aHCsUT7MyIVu+OtUpZr+H4zVllKbia7rCZgkWd8/r+kpxY1ikFhxWpu+hPi32ylA+9FdKPXSJrOq************************"; // 写你商户私钥// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhiWEgdjid1gy2nqKcNcoJTr7f9om6WNI6qaNnv0KW3vjjBHnrgnZIGHuI3XFpPyii0rtkVpRTEZcD1JBq21rPfPmS3EW7AVqdjPWTuz/7EgH2OvR4Sk/pvS9Lg7IqnJwG29r43WYwQ22x+K+CZSzTKmf5Vzk8m2cKumogvTyNf26+c/SIYVn4************************"; // 写你的支付宝公钥// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String CHARSET = "utf-8";// 支付宝网关,这是沙箱的网关public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问(开发环境时可以使用内网穿透工具,有很多,自行度)public static String notify_url = "http://pcfapi.natappfree.cc/ih/diagnose/pay/alipay/callback"; // 写你接受通知的接口地址// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问(其实就是支付成功后返回的页面)public static String return_url = "http://172.16.16.102:8080/#/seeDoctor"; // 写你在支付成功之后进入的页面地址// 支付宝网关public static String log_path = "C:\\";
}
/*** @author: cxt* @time: 2021/11/18*/
@RestController
@Api(tags = "支付接口")
@RequestMapping("/ih/diagnose/pay")
public class PayController {private PayService payService;// "支付宝支付接口"@PostMapping("/alipay")public void alipay(@RequestParam String registerId, @RequestParam boolean isAppoint, HttpServletResponse response) {try {payService.alipay(registerId, isAppoint, response);} catch (IOException e) {e.printStackTrace();}}// TODO 可以不写这个接口,个人认为作用不大// "支付验证"@PostMapping("/alipay/check")public boolean alipayCheck(@RequestParam String registerId) {return payService.alipayCheck(registerId);}/*** 支付宝异步付款结果通知*/@PostMapping("/alipay/callback")public void alipayCallback(HttpServletRequest request) {try {payService.alipayCallback(request);} catch (Exception e) {e.printStackTrace();}}/*** 支付宝退款* 注意:支付宝服务器发送的url是没有登录状态的,需要在系统中设置放过登录校验,不然接收不到通知*/@PostMapping("/alipay/refund/callback")public boolean alipayRefundCallback(@RequestParam String outTradeNo, @RequestParam String tradeNo,@RequestParam String refundAmount, @RequestParam String subject) {boolean result = false;try {result = payService.alipayRefund(outTradeNo, tradeNo, refundAmount, subject);} catch (AlipayApiException e) {e.printStackTrace();}return result;}// 退费查询@PostMapping("/alipay/refund/alipayRefundSelect")public boolean alipayRefundCallback(@RequestParam String outRequestNo, @RequestParam String tradeNo) {return payService.alipayRefundSelect(outRequestNo, tradeNo);}@Autowiredpublic void setPayService(PayService payService) {this.payService = payService;}
}
/*** @author cxt* @date 2021/11/20*/
@Service
public class PayService {/*** 支付宝支付*/public void alipay(String registerId, boolean isAppoint, HttpServletResponse response) throws IOException {DefaultAlipayClient client = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID, AlipayConfig.APP_PRIVATE_KEY,"json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.sign_type);AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_url);// todo 查询金额相关信息// 付款金额,必填String total_amount = String.valueOf(0.1);// 订单名称,必填String subject = "测试的名称";// 商品描述,可空String body = "就诊日期:" + new Date();JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", registerId);bizContent.put("total_amount", total_amount);bizContent.put("subject", subject);bizContent.put("body", body);bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");alipayRequest.setBizContent(bizContent.toString());// 生成请求页面String form = "";try {form = client.pageExecute(alipayRequest).getBody();} catch (AlipayApiException e) {e.printStackTrace();}response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);response.getWriter().write(form);response.getWriter().flush();response.getWriter().close();}/*** 支付校验** @param registerId 订单号* @return*/public boolean alipayCheck(String registerId) {AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID,AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.sign_type);AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", registerId);request.setBizContent(bizContent.toString());AlipayTradeQueryResponse response = null;try {response = alipayClient.execute(request);if (response.isSuccess()) {// TODO 异步通知接收不到,先用同步更新状态,上线时删除 --- 开始if (response.getTradeNo() != null) {// update 订单表}// TODO 异步通知接收不到,先用同步更新状态,上线时删除 --- 结束return true;}} catch (AlipayApiException e) {e.printStackTrace();}return false;}/*** 异步付款结果通知* 注意:支付宝服务器发送的url是没有登录状态的,需要在系统中设置放过登录校验,不然接收不到通知*/public void alipayCallback(HttpServletRequest request) throws Exception {String tradeStatus = request.getParameter("trade_status"); // 交易状态String orderNo = request.getParameter("out_trade_no"); // 获取订单号String tradeNo = request.getParameter("trade_no"); // 支付宝交易凭证号Map<String, String> map = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();if (requestParams.isEmpty()) {throw new Exception("系统异常,异步通知参数为空");}for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = iter.next();String[] values = requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}map.put(name, valueStr);}// 校验boolean signVerified = AlipaySignature.rsaCheckV1(map, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.sign_type);if (signVerified) {if (tradeStatus.equals("TRADE_SUCCESS")) {// 支付成功 -> 自己实现改订单状态// update 订单表   orderNo, tradeNo} else {// 其他可能触发的异步通知log.debug(tradeStatus);}}}/*** 支付宝退费** @param outTradeNo   订单号* @param tradeNo      交易支付凭证号* @param refundAmount 交易金额* @param refundReason 退费原因*/public boolean alipayRefund(String outTradeNo, String tradeNo, String refundAmount, String refundReason) throws AlipayApiException {// 获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID,AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.sign_type);// 设置请求参数AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", outTradeNo);bizContent.put("trade_no", tradeNo);bizContent.put("refund_amount", refundAmount);bizContent.put("refund_reason", refundReason);alipayRequest.setBizContent(bizContent.toString());boolean result = false;AlipayTradeRefundResponse response = alipayClient.execute(alipayRequest);boolean b = response.isSuccess();if (!b) {// 退款失败,重试三次for (int i = 0; i < 3; i++) {AlipayTradeRefundResponse loopResponse = alipayClient.execute(alipayRequest);boolean loopResult = loopResponse.isSuccess();if (loopResult) {result = true;break;}}if (!result) {log.error("订单:{},退款失败", outTradeNo);}} else {log.info("订单:{},退款成功", outTradeNo);result = true;}return result;}/*** 支付宝退款查询** @param outRequestNo 订单号* @param tradeNo      交易支付凭证号*/public boolean alipayRefundSelect(String outRequestNo, String tradeNo) {// 获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APP_ID,AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.sign_type);// 设置请求参数AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();JSONObject bizContent = new JSONObject();bizContent.put("trade_no", tradeNo);bizContent.put("out_request_no", outRequestNo);alipayRequest.setBizContent(bizContent.toString());boolean result = false;try {AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(alipayRequest);if (!response.isSuccess()) {for (int i = 0; i < 3; i++) {AlipayTradeFastpayRefundQueryResponse loopResponse = alipayClient.execute(alipayRequest);if (loopResponse.isSuccess()) {result = true;break;}}} else {log.info("已退款");result = true;}} catch (AlipayApiException e) {e.printStackTrace();}return result;}}

vue前端代码调用接口

// 点击挂号按钮调用
register(doctorId) {this.$http.post(`/ih/patient/diagnose/register/quick?doctorId=${doctorId}`).then((res) => {if (res.status == 200) {// 支付this.alipay(res.data.registerId);}});},
// 调用支付接口
alipay(registerId){this.$http.post(`/ih/diagnose/pay/alipay?registerId=${registerId}&isAppoint=false`).then((res) => {document.querySelector("body").innerHTML = res.data; // 查找到当前页面的body,将后台返回的form替换掉他的内容document.forms[0].submit(); // 执行submit表单提交,让页面重定向,跳转到支付宝页面});},

这样就在页面看跳转到了支付界面,支付成功之后就会返回到你指定的页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/354033.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

golang对接支付宝支付

本文采用沙箱环境 1. 开启沙箱 文档&#xff1a;https://docs.open.alipay.com/200/105311/ 沙箱地址&#xff1a;https://openhome.alipay.com/platform/appDaily.htm 2. 生成应用公钥和秘钥&#xff08;已弃用&#xff09; 本文中的签名方法默认为 RSA2&#xff0c;采用支…

Flutter支付宝支付

_。插件选型&#xff1a; 1.tobias 2.flutter_alipay 3.alipay_kit 4.sy_flutter_alipay 因为flutter项目的flutter sdk是2.53 有空安全&#xff0c;所以排除掉三年没更新的sy_flutter_alipay&#xff0c; flutter_alipay排除掉的原因是本项目的dart sdk版本太低不支持…

如何测试支付宝手机充值的这个功能,写出测试用例

有人在面试软件测试的时候&#xff0c;被问到如何测试支付宝手机充值的这个功能&#xff0c;写出测试用例。 其实无论测试什么&#xff0c;我们首先的需要梳理软件业务的流程&#xff0c;来看看支付宝充值都有哪些流程&#xff1f; 首先&#xff0c;面试官如果给出的是这样一…

p2p银行充值功能模块 支付宝调用

银行充值简介 用户要想要投标的话&#xff0c;那么需要往p2p平台上进行充值 使用支付宝沙箱 调用支付宝充值接口进行测试 用户余额页面展示用户的余额 点击充值调用跳转到银行充值页面 输入密码&#xff0c;密码正确调转到支付宝支付平台 登录账号密码进行充值 充值成功记录到…

抓包抖音充值接口,实现微信支付宝充值抖币收款通道

前段时间搞了个抖音充值的通道&#xff0c;现在搞个YY充值的。 接下来这段时间的安排就是把各个这种平台的充值接口全分析一遍做成接口。 相比抖音的充值抖币接口&#xff0c;yy充值y币的风控就小很多&#xff0c;可以忽略不计&#xff0c;所以开发上也顺利很多。 把调用的相…

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图&#xff0c;接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

Django对接支付宝实现支付宝充值金币功能

很多网站里都有金币、积分之类的虚拟货币&#xff0c;获取这些往往需要充值。那么问题来了&#xff0c;如何在Django中对接支付宝实现支付宝充值金币的功能呢&#xff1f;网上很多资料都是电商的&#xff0c;那些都会带有订单系统之类比较复杂&#xff0c;而充值金币功能不需要…

抓包抖音充值页面实现微信支付宝充值抖币,可提供api

抖币充值系统重写升级: 1.支持配置扫码配置多个CK 2.支持生成 微信/支付宝 支付二维码 扫码充值 3.支持 微信/支付宝 APP 直接唤醒充值 体验如下: 需要的小伙伴可私信 留言&#xff01; 整个开发流程思路是以下几步&#xff1a; 1.抓包分析抖音的充值的整个流程&#xff0…

如何使用支付宝充值美区App store的礼品卡

如何使用支付宝充值礼品卡 可能很多人不知道&#xff0c;支付宝可以给美区App Store 充钱&#xff0c;无需信用卡直接购买美区 Apple ID、Google Play、Spotify、Hulu礼品卡&#xff0c;下面就给大家介绍怎么购买 1.城市切换为&#xff1a;旧金山&#xff08;国际-> 北美洲…

p2p金融项目+支付宝充值

目录 前言 下载服务端SDK 时序图&#xff1a; 按照支付宝时序图的过程去做&#xff1a; 第一步&#xff1a; 第二步--2&#xff1a;生成充值记录&#xff08;状态&#xff1a;充值中&#xff09; 第四步&#xff1a;调支付宝的支付接口 第七八步&#xff1a;&#xff0…

RecyclerView实现仿支付宝充值界面

参考博客&#xff1a;https://www.jianshu.com/p/b4bb52cdbeb7 非常感谢上面这位博主的博客给了我非常好的灵感&#xff01;&#xff01;&#xff01; 下面我就先贴一下效果图&#xff1a; 布局代码&#xff1a; <?xml version"1.0" encoding"utf-8"…

JAVA端实现支付宝充值

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a;用户充值到平台 GitHub地址&#xff1a;https://github.com/wubiaowp/SpringCloud2.0.git 一、申请开发者账号-APPID、商户私钥、支付宝公钥、配置回调地址&#xff08;配置沙箱环境-测试&#xff09; 二…

discuz网站没备案无执照接入支付宝充值功能

discuz个人网站没备案无执照接入支付宝充值功能 文章目录 事情是这样的一、支付宝当面付是什么&#xff1f;二、如何申请当面付接口1.登录 支付宝商家中心2.点击“产品中心”&#xff0c;支付产品中选择当面付3.点击“立即开通”4.按步骤填写 三、创建应用及生成公钥和私钥1.登…

android约束布局充值页面,Android学习之RecylerView实习仿支付宝充值界面

今天周末&#xff0c;闲来无事&#xff0c;做了一个仿支付宝充值界面&#xff0c;主要知识点用RecylerView的GridlayoutManager布局管理器&#xff0c;实现不同数据类型&#xff0c;填充不同布局&#xff0c;功能包括单击选中&#xff0c;双击取消&#xff0c;支持可输入金额等…

DISCUZ插件微信支付宝充值积分69.220517最新版【收集免费】

DISCUZ应用中心成熟的微信支付宝积分充值插件&#xff0c;拥有大批使用的站长用户&#xff0c;稳定运行于用于各类站点&#xff0c;反馈优秀&#xff0c;收益丰厚&#xff1b; 一直被模仿&#xff0c;从未被超越。 DZ的积分体系功能已经十分强大&#xff0c;可以做很多事&…

Django对接支付宝实现支付宝充值金币功能示例

很多网站里都有金币、积分之类的虚拟货币&#xff0c;获取这些往往需要充值。那么问题来了&#xff0c;如何在Django中对接支付宝实现支付宝充值金币的功能呢&#xff1f;网上很多资料都是电商的&#xff0c;那些都会带有订单系统之类比较复杂&#xff0c;而充值金币功能不需要…

第9章集 合

文章目录 9.1 Java集合框架9.1.1 集合接口与实现分离9.1.3 迭代器9.1.4 泛型实用方法 9.2 集合框架中的接口9.3.1 链表9.3.2 数组列表9.3.3散列集9.3.4 树集9.3.5 队列与双端队列9.3.6 优先队列 9.4 映射9.4.1 基本映射操作9.4.2 更新映射条目9.4.3 映射视图9.4.4 弱散列映射9.…

MySQL数据库性能优化技巧介绍

MySQL是目前最流行和广泛使用的开源关系型数据库之一&#xff0c;随着数据量的增长和访问负载的提高&#xff0c;优化数据库性能变得至关重要&#xff0c;以确保系统能够高效地处理大量的并发请求。本文将记录一些MySQL数据库性能优化的技巧&#xff0c;提高数据库的运行效率&a…

基于kubesphere的k8s环境部署单点版本的rook-ceph

文章目录 前言一、rook-ceph是什么&#xff1f;二、开始部署1.环境准备2.软件包准备3.下载rook-ceph文件4. 部署operator5.创建ceph集群6.创建工具容器&#xff0c;检查集群状态7.准备dashboard的nodeport端口映射服务8.准备prometheus的metric端口映射服务 总结 前言 基于kub…

记录使用Echarts-gl实现3D地图

一、前言 最近项目需要做个大屏展示的&#xff0c;开始做了第一版用户觉得地图太过于单调了&#xff0c;给我发了一个视频&#xff0c;让我参考着做。我看着视频上的地图旋转了方向、地图有标记、看着像是3D的&#xff08;视频上的地图使用多个图层叠加起来、CSS样式做了旋转&…