SpringBoot使用支付宝沙箱环境进行仿真支付

目录

一、进入支付宝开发平台—沙箱环境

二、点击沙箱进入沙箱环境

三、Java二维码生成技术

1、导入依赖

2、生成指定url对应的二维码图片

四、支付接口

1、保存好沙箱应用里面的公钥私钥

2、 测试接口

3、扫码

4、买家结果

5、卖家结果

五、回调接口

1、使用内网穿透功能开放本地服务器端口

2、回调接口代码

 3、测试

六、主动查询支付结果

1、测试

2、控制台打印


一、进入支付宝开发平台—沙箱环境

支付宝开放平台 (alipay.com)

最下方:

二、点击沙箱进入沙箱环境

安装支付宝沙箱APP

里面有商家和买家的指定账号

支付宝接口相关的id和密钥

三、Java二维码生成技术

1、导入依赖

        <!-- hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.23</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency>

2、生成指定url对应的二维码图片

void rememberMy(){QrCodeUtil.generate("https://4fb0-124-89-23-255.ngrok-free.app/user/test", 300, 300, FileUtil.file("D:/桌面/二维码.jpg"));}

生成成功

四、支付接口

1、保存好沙箱应用里面的公钥私钥

APP_ID,APP_PRIVATE_KEY,ALIPAY_PUBLIC_KEY,SEVER_URL 

public class AliyunPay {public static String APP_ID="20210001220478";public static String APP_PRIVATE_KEY="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCco/ygHVMgSu0vateztwuGE1udMHS6OX8DF95V5rKQWLQ5W8sCqgDcBulOGlydBZDnu9eximq31mwzTMMJjwl/O+x3GiwfYuQIADLUsPXNPMO9u978OIwEdfNZq5mg+PFU21ZTN3ZYTKYwVM4lRQJEa2dMVsfuhMaMm22yHdz9m8K77AvITl1mIqnr4TZEbtsBzF7BE8ryncRe3pudtWKgEpZ6iuOBe3cDa9O/ZrNY1ywDtD6BxGaszDWZksLbWM86oFTHdAnqzpQ7XEfDIryiSmk0O+kl/4JPyJPNS3mIl7raK4reovWELZsNs/DSyTqYE8hI80pipwBlS/dvULPTAgMBAAECggEAApHCDBJPEcGI4HU9Mop3GuzoXMy1rXRR/AgBMqGFHk8GLcaurs2BFBrc6tYN3NmBhfuTzyq5E2jl/3Vr4ZVCD585Ar8gKCekG+l86/Y3IfW0NEGHp9V5nn0cz8S70WMj+kNayCSpwUsIktRhSUU3g03LtPnbb7Mn2pirMoNmE9GRecG2HLkAUOyDfI1xePsiEUwIuWn5bbi13PsoJ7wVc1ylSZ9q1LIv9EKi/z8Z845eTtXt4jbbaB7rfS/3q4GZKrTj3kDvDCpc4JhlJgSQ9FkpGOourcbPVOloPllEOJO18hd2P2FCl5ffrIXtydGalT0glFL/y6PKQKBgG+ZOU8mTOBp8cxgS3Hxmg7zf3acN9rOj6HRyVGHQJq7ryf/A13D/lkqlpVGVwZEhPX5M5XjB3Igp8OLDJlXYxoL6y6px05KmSFjxFmgPOWnDS9Ty6EOLevpL+xYY4AVIEDhyT3eoWOasX8ZFoTCbPlUYy40RMt635tPkiOwyxHhawgg6WmwKBgQCprMoNmE9GRecG2HLkAUOyDfI1xePsiEUwIuWn5bbi13PsoJ7wVc1ylSZ9q1LIv9EKi/z8Z845eTtXt4jbbaB7rfS/3q4GZKrTj3kDvDCpc4JhlJgSQ9FkpGOourcbPVOloPllEOJO18hd2P2FCl5ffrIXtydGalT0glFL/y6PKQKBgG+ZOU8mTOBp8cxgS3Hxmg7zf3acN9rOj6HRyVGHQJq7ryf/A13D/lkqlpVGVwZEhPX5M5XjB3Igp8OLDJlXYxoL6y6px05Kmw9/T5Webk2ima77KOibl3Ss0vDNRRtiCB70nmFRFgu9IfqWD68J+H+NoN6wYZCTd7vPbIFu+LqPAoGAR36+ePIH3WWRDopgBwEdZEaKG+xxuPZGqRzbRl7+LCF7AGdB8aVF95Uvbd6l+F8TF22bQUQAWqlhvvlgGo3cBKFtMvgCvkDm1lRrOo6utogslS+G0JNxBQZb0/oxM7Ior+7fh52QroYwMJNBaDDRSU3afzG2w+4ENC9BUFOLa9kCgYEArC9q83LWZdvV9AePohtITH5CKUFv+vgSnhjcr8YKHooEeWAHkZ1fTctfSvxco/Oc4SWECrc5LN3m/lvKHKI/T5rkxOkLzjiRu1PwVzFevXdbE4m6poN7BliGb/GjltDcraXof/Fh2x0bwsn+92n6YcfIaShtLrALARujJW6/L5Y=";public static String ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8h31z6R1Pv9jcGxVbbNkYz5hU0wh7xWH2OfvZI5pfBt8Tw7aO74ikqdJygRvWbhDtUPAAxNAA/+Hxd8dmrgZsB8P8a9bmBTpt5xbnz5v83NkKpm3Arft69TF3svl8FgM0c485Qbpp1aEmj11n1eoHEWmFnAFmPsceW7Suh69xExRCf5VAW9h31z6R1Pv9jcGxVbbNkYz5hU0wh7xWH2OfvZI5pfBt8Tw7aO74ikqdJygRvWbhDtUPAAxNAA/+Hxd8dmrgZsB8P8a9bmBTeEUXEemvE6xjgguGjhH8UszM0zMTtwlkcAD9sON/ZcOuKf/OsHFwA6gnlH8pArTcyvR6QDJ0nkvQyWLffW/YwIDAQAB";public static String NOTIFY_URL="https://4fb0-124-89-23-255.ngrok-free.app/aliyun/notify";public static String SEVER_URL="https://openapi-sandbox.dl.alipaydev.com/gateway.do";
}

  扫码支付快速接入

找到预下单的代码实例,这里已经写好了,如下:

public void pay() {//设置商品属性Model tmpModel = new Model();tmpModel.setOutTradeNo(String.valueOf(UUID.randomUUID()));tmpModel.setTotalAmount("32");tmpModel.setSubject("2024.1.4-2024.2.4电费32元");//填写公钥密钥AlipayClient alipayClient = new DefaultAlipayClient(AliyunPay.SEVER_URL,AliyunPay.APP_ID,AliyunPay.APP_PRIVATE_KEY,"json","GBK",AliyunPay.ALIPAY_PUBLIC_KEY,"RSA2");AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();//填写回调接口地址,必须为公网可以访问的地址request.setNotifyUrl(AliyunPay.NOTIFY_URL);JSONObject bizContent = new JSONObject();//将商品的属性填写进去bizContent.put("out_trade_no", tmpModel.getOutTradeNo());bizContent.put("total_amount", tmpModel.getTotalAmount());bizContent.put("subject", tmpModel.getSubject());商品明细信息,按需传入//JSONArray goodsDetail = new JSONArray();//JSONObject goods1 = new JSONObject();//goods1.put("goods_id", "goodsNo1");//goods1.put("goods_name", "子商品1");//goods1.put("quantity", 1);//goods1.put("price", 0.01);//goodsDetail.add(goods1);//bizContent.put("goods_detail", goodsDetail);扩展信息,按需传入//JSONObject extendParams = new JSONObject();//extendParams.put("sys_service_provider_id", "2088511833207846");//bizContent.put("extend_params", extendParams);结算信息,按需传入//JSONObject settleInfo = new JSONObject();//JSONArray settleDetailInfos = new JSONArray();//JSONObject settleDetail = new JSONObject();//settleDetail.put("trans_in_type", "defaultSettle");//settleDetail.put("amount", 0.01);//settleDetailInfos.add(settleDetail);//settleInfo.put("settle_detail_infos", settleDetailInfos);//bizContent.put("settle_info", settleInfo);二级商户信息,按需传入//JSONObject subMerchant = new JSONObject();//subMerchant.put("merchant_id", "2088000603999128");//bizContent.put("sub_merchant", subMerchant);业务参数信息,按需传入//JSONObject businessParams = new JSONObject();//businessParams.put("busi_params_key", "busiParamsValue");//bizContent.put("business_params", businessParams);营销信息,按需传入//JSONObject promoParams = new JSONObject();//promoParams.put("promo_params_key", "promoParamsValue");//bizContent.put("promo_params", promoParams);request.setBizContent(bizContent.toString());AlipayTradePrecreateResponse response = null;try {response = alipayClient.execute(request);} catch (AlipayApiException e) {throw new RuntimeException(e);}if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}log.info("支付订单号:"+response.getOutTradeNo());//根据返回的response.getQrCode()二维码链接生成二维码QrCodeUtil.generate(response.getQrCode(), 300, 300, FileUtil.file("D:/桌面/"+tmpModel.getSubject()+".jpg"));}

2、 测试接口

访问成功

控制台打印如下信息表示成功 

3、扫码

代码成功会生成指定位置二维码

使用沙箱支付宝买家账号去扫码

4、买家结果

如图可以看出名称、价格与输入的商品名称价格一致

5、卖家结果

卖家这里也收款成功:

测试成功 

五、回调接口

回调接口用来接受支付宝成功支付的异步通知结果

1、使用内网穿透功能开放本地服务器端口

以下均免费

ngrok内网穿透,国内无法访问

cpolar内网穿透,国内可以访问

2、回调接口代码

官网文档

    /*** 支付宝异步调用通知* @param request* @return*/@PostMapping("/notify")public  Result<String> notify(HttpServletRequest request) {log.info("支付宝异步通知");log.info("异步通知参数:{}",request.getParameter("out_trade_no"));//TODO 业务代码return  Result.success(request.getParameter("out_trade_no"));}

 3、测试

根据刚才的测试,回调接口收到了支付宝的通知,以及商家订单号表示支付成功

六、主动查询支付结果

官方文档找到查询交易

代码如下:

public Boolean query(String outTradeNo) {//填写公钥私钥AlipayClient alipayClient = new DefaultAlipayClient(AliyunPay.SEVER_URL,AliyunPay.APP_ID,AliyunPay.APP_PRIVATE_KEY,"json","GBK",AliyunPay.ALIPAY_PUBLIC_KEY,"RSA2");AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();//将要查询的订单号填进去request.setBizContent("{" +"  \"out_trade_no\":\""+outTradeNo+"\"," +"  \"query_options\":[" +"    \"trade_settle_info\"" +"  ]" +"}");AlipayTradeQueryResponse response = null;try {response = alipayClient.execute(request);} catch (AlipayApiException e) {throw new RuntimeException(e);}//根据交易成功与否返回true或falseif(response.isSuccess()){return true;} else {return false;}

1、测试

查询上文支付例子中已经支付的订单号

 返回为true,测试成功

2、控制台打印

表示已经支付 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-select 多选,选有一个未选择的选项

多选有未选择这个选项后。会出现一个情况&#xff0c;绑定的数据为[‘未选择’,‘cpu1’,‘cpu2’] 进行一个处理&#xff0c;选择&#xff08;未选择&#xff09;就清除&#xff08;其它的选择&#xff09;&#xff0c;选择&#xff08;cpu&#xff09;就清除&#xff08;未选…

RocketMQ快速入门

RocketMQ快速入门 RocketMQ提供了发送多种发送消息的模式&#xff0c;例如同步消息&#xff0c;异步消息&#xff0c;顺序消息&#xff0c;延迟消息&#xff0c;事务消息等&#xff0c;我们一一学习 1.1 消息发送和监听的流程 我们先搞清楚消息发送和监听的流程&#xff0c;然…

自制c++题目《模板综合》

1.输出结果&#xff1a; 2.主函数不允许改变 int arr[5] { 5,2,3,1,4}; char arr1[5] { a,c,b,e,d }; good <int>a(arr,5); good <char>b(arr1,5); bad<int>(1,2); bad<float>(1.1, 1.2); 自制c题目《模板综合》 王赫辰/c语言 - Gitee.com

引导和服务

目录 一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 二、系统初始化进程 1、init进程&#xff08;串行启动&#xff09; 2、Systemd&#xff08;并行启动&#xff09; 3、Centos6与Centos7的区别&#xff1a; 4、Systemd单元类型 5、运行级别所…

EFCore8泛化关系在数据库中的体现

如图&#xff0c;在关系数据库中&#xff0c;数据表达为一张表&#xff0c;用一个字段“Discriminator”来做区分&#xff1a; 要达到这样的效果&#xff08;数据库中的结构&#xff09;&#xff0c;需要在XXContext中将继承关系的三个类都加上&#xff1a; public DbSet<P…

在 Mac 上轻松安装和配置 JMeter

Apache JMeter 是一个开源的负载测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;确定服务器的性能和稳定性。在本文中&#xff0c;我们将讨论如何下载和安装 JMeter。 安装 Java&#xff08;已安装 Java 的此步骤可跳过&#xff09; 要安装 Java&#xff0c;请按…

想学鸿蒙,又怕找不到工作?能有前途吗?

鸿蒙有没有前途&#xff0c;能不能找到工作&#xff1f;其实这与市场行情有关&#xff0c;这几年的互联网大家都已经感受到了&#xff0c;十分悲凉。不管是前端还是Android等开发行业&#xff0c;不是被裁员就是内卷严重&#xff0c;这几年倒下了无数家中小型互联网企业。 而作…

腾讯云2024年最新优惠活动整理汇总

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为用户提供优质、高效的服务。为了更好地满足用户需求&#xff0c;腾讯云经常推出各种优惠活动&#xff0c;本文将对腾讯云最新优惠活动进行整理汇总&#xff0c;帮助用户更好地了解和利用这些福利。 一、腾讯云新用…

kali2.0安装VMware Tools 和自定义改变分辨率

kali2.0安装VMware Tools 和自定义改变分辨率 VMware Tools 简介&#xff1a;VMware Tools安装&#xff1a;自定义改变分辨率&#xff1a;xrandr命令修改分辨率&#xff1a; 前言&#xff1a; 因为kali2.0比较老 所以需要手动安装 WMware Tools 进行复制粘贴操作&#xff01; …

企业需要专业的合同档案管理系统吗

文书合同是企业与供应商、客户、员工等签订的重要文件&#xff0c;具有法律效力和约束力。合同档案管理系统可以帮助企业有效管理合同文件&#xff0c;提高合同管理的效率和准确性。 专久智能合同档案管理系统具备以下优点&#xff1a; 1. 文件安全性&#xff1a;合同文件经过专…

力扣刷题-二叉树-合并二叉树

617.合并二叉树&#xff08;经典&#xff09; 合并二叉树是操作两棵树的题目里面很经典的&#xff0c;如何对两棵树遍历以及处理&#xff1f; 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并…

NE555学习笔记-2024

实物图片 NE555引脚图 内部时序图 示列1&#xff0c;红外接收电路 红外接收电路的工作原理&#xff1a;在上述电路中&#xff0c;TSOP1738构成了该电路的主要组成部分&#xff0c;旨在检测来自任何来源的红外信号。这用于检测38 KHz范围的信号&#xff0c;因此命名为“TSOP173…

探秘Spring Bean的秘境:作用域篇【beans 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘Spring Bean的秘境&#xff1a;作用域篇【beans 三】 前言单例作用域如何声明单例Bean&#xff1a;特点&#xff1a; 原型作用域如何声明原型Bean&#xff1a;特点&#xff1a; 会话作用域如何声明…

【KingbaseES】实现MySql函数Space

CREATE OR REPLACE FUNCTION SPACE(input_length integer) RETURNS text AS $$ BEGIN RETURN REPEAT( , input_length) AS SPACES; END; $$ LANGUAGE plpgsql;

深度学习课程实验二深层神经网络搭建及优化

一、 实验目的 1、学会训练和搭建深层神经网络&#xff1b; 2、掌握超参数调试正则化及优化。 二、 实验步骤 初始化 1、导入所需要的库 2、搭建神经网络模型 3、零初始化 4、随机初始化 5、He初始化 6、总结三种不同类型的初始化 正则化 1、导入所需要的库 2、使用非正则化…

实验笔记之——基于Linux服务器复现Instant-NGP及常用的tmux指令

之前博客实现了基于windows来复现Instant-NGP&#xff0c;本博文在linux服务器上测试 实验笔记之——基于windows复现Instant-NGP-CSDN博客文章浏览阅读444次&#xff0c;点赞15次&#xff0c;收藏7次。之前博客对NeRF-SLAM进行了调研&#xff0c;本博文先复现一下Intant-NGP。…

C++基础语法——基本知识、数据类型、运算符及程序流程结构

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; >第1阶段-C基础入门 ---------第2阶段实战-通讯…

Java基础进阶(学习笔记)

注&#xff1a;本篇的代码和PPT图片来源于黑马程序员&#xff0c;本篇仅为学习笔记 static static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 修饰成员的特点&#xff1a; 被其修饰的成员, 被该类的所有对象所共享 多了一种调用方式, 可以通过…

OpenHarmony源码转换器—多线程特性转换

本文讨论了如何将多线程的 Java 代码转换为 OpenHarmony ArkTS 代码​ 一、简介 Java 内存共享模型 以下示例伪代码和示意图展示了如何使用内存共享模型解决生产者消费者问题。 生产者消费者与共享内存间交互示意图 为了避免不同生产者或消费者同时访问一块共享内存的容器时…

数字信号处理期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…