一 首先第一步需要去支付宝的开放平台做一些操作,输入下面的网址:网址 (需要登陆,扫码或者用户密码登陆)登陆网站以后 具体操作如下面视图:

开发者中心->研发服务(沙箱) -----这里需要开通沙箱支付宝,然后:

支付宝提供一键生成工具便于开发者生成一对RSA2密钥:https://docs.open.alipay.com/291/105971
按照文档操作配置就好
注意:生成时一定要选择PKCS8+2048,第一个坑
      
下面是代码
二.配置一个Config用于支付宝调用

package com.alipay.config;import java.io.FileWriter;
import java.io.IOException;public class AlipayConfig{// ↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号public static String app_id = "APPID";//例:2016082600317257// 应用私钥,您的PKCS8格式RSA2私钥public static String merchant_private_key = "应用私钥!!记住是私钥!!!不是公钥!!";// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑  直接粘贴就Ok// 对应APPID下的支付宝公钥。public static String alipay_public_key = "支付宝公钥,记住是支付宝公钥!!!!!!!";//?????????????????????????? 粘就完事了----// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问/*** 返回的时候此页面不会返回到用户页面,只会执行你写到控制器里的地址*/public static String notify_url = "你的服务器地址/项目名称/notify_url";// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问/*** 此页面是同步返回用户页面,也就是用户支付后看到的页面,上面的notify_url是异步返回商家操作,谢谢* 要是看不懂就找度娘,或者多读几遍,或者去看支付宝第三方接口API,不看API直接拿去就用,遇坑不怪别人*/public static String return_url = " 你的服务器地址/项目名称/return_url";//下面的都不需要更改(当然如果没有D盘的话------?)// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String charset = "gbk";// 支付宝网关public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";// 日志地址public static String log_path = "D:/logs/";// ↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑/*** 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)* * @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();}}}}
}

如果你是在本地测试,支付完成不会跳转回调页面,那么就需要外网了,推荐一个东西,叫内网穿透,只要你电脑tomcat启动,可以连接外网,可以从127.0.0.1:8080或者其他端口也行进入你的项目,就可以用;
【内网穿透】
某花生qiao,不免费6块大洋---------------------------NATAPP 有免费的(只是域名会强制变),不过测试足够了----------------------ngrok或者frp自行度娘
也有免费开源的,如果不想麻烦就用【NATAPP】吧,网址貌似是:natapp.cn

三.控制器Controller里的代码
pom.xml里的依赖

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

如果不是maven项目,下载jar包导入
下载地址:http://central.maven.org/maven2/com/pentahohub/nexus/alipay-sdk-java/20150820220052/alipay-sdk-java-20150820220052.jar
Controller代码

/*** 快捷支付调用支付宝支付接口*/
    @RequestMapping("alipaySum")
public Object alipayIumpSum(String ordId,HttpServletResponse response)//ordId  订单idthrows Exception {// 获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,AlipayConfig.merchant_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);/*SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");String out_trade_no = sdf.format(new Date());*/// 商户订单号,商户网站订单系统中唯一订单号,必填//Order  我的订单类Order order = orderService.getOrderByOrdId(ordId);// 付款金额,必填
//out_trade_no  订单号
//total_amount   订单金额
//subject    订单名称
//body  内容,这里我随便写的--
//alipayRequest.setBizContent("{\"out_trade_no\":\"" + order.getOrdCode() + "\","+ "\"total_amount\":\"" + order.getOrdMoney()+ "\"," + "\"subject\":\"" + order.getOrdName()+ "\"," + "\"body\":\"" + "勒布朗" + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");// 请求String result = alipayClient.pageExecute(alipayRequest).getBody();// System.out.println(result);AlipayConfig.logResult(result);// 记录支付日志response.setContentType("text/html; charset=gbk");PrintWriter out = response.getWriter();out.print(result);return null;
}

参数传入是必须有的,不然会报错,说订单信息有误
如果有其他额外参数,请参考支付宝第三方API文档,这里菜鸟能力有限,懒得去查,也懒得写了
支付宝第三方支付API地址:https://docs.open.alipay.com/api_1/alipay.trade.create/
支付完成回调------异步返回商家,也就是notify_url
代码:

/*** p2p后台返回的操作* @param response,request* @throws Exception* @return void* @author 走起* @date 2019年10月16日*/
@RequestMapping("notify_url")
public void Notify(HttpServletResponse response, HttpServletRequest request) throws Exception {System.out.println("----------------------------notify_url------------------------");// 商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "GBK");// 付款金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "GBK");// 支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "GBK");// 交易说明String cus = new String(request.getParameter("body").getBytes("ISO-8859-1"), "GBK");// 交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "GBK");if (trade_status.equals("TRADE_SUCCESS")) {//支付成功商家操作//下面是我写的一个简单的插入操作,根据你的操作自行编写/*Map<Object, Object> map = new HashMap<Object, Object>();map.put("cuId", Integer.valueOf(cus));RepaymentPlan repaymentPlan = new RepaymentPlan();Integer id = Integer.valueOf(out_trade_no);double payablesCheck = Double.valueOf(total_amount);RepaymentPlan repayCheck = serviceMain.selectByPrimaryKey(id);double total = repayCheck.getPayables();if (Double.valueOf(total_amount) < repayCheck.getPayables()) {map.put("ubalance", total - Double.valueOf(total_amount));serviceMain.updateCusMoney(map);}repaymentPlan.setId(id);repaymentPlan.setActualPayment(total);repaymentPlan.setRepaymentStatus(1);int i = serviceMain.updateByPrimaryKeySelective(repaymentPlan);System.out.println("---------------------还款影响行数----------------------------" + i);*/}
}

关于代码中用到的Servlet的东西,请自行进行改进吧,还有不要像我一样把业务写在Controller里,要写在service里哦!

支付完成回调------同步返回用户的页面,也就是return_url,
代码:

/*** 同步通知的页面的Controller* * @param request,response* @throws InterruptedException*/
@RequestMapping("return_url")
public String Return_url() throws InterruptedException {return "alipayexit";
}

我这边就简单的返回了一个页面;
最后贴上请求支付接口的ftl的页面吧

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>订单</title><link type="text/css" rel="stylesheet" href="/css/style.css" /><script type="text/javascript" src="/scripts/function.js"></script>
</head>
<body>
<div id="header" class="wrap"><div id="logo"><img src="/images/logo.gif" /></div><div class="help"><a href="/good/toShopPing" class="shopping">购物车</a><a href="login.html">登录</a><a href="register.html">注册</a><a href="guestbook.html">留言</a><a href="/good/toPayInfo">我的订单</a></div><div class="navbar"><ul class="clearfix"><li class="current"><a href="#">首页</a></li><li><a href="#">图书</a></li><li><a href="#">百货</a></li><li><a href="#">品牌</a></li><li><a href="#">促销</a></li></ul></div>
</div>
<div id="childNav"><div class="wrap"><ul class="clearfix"><li class="first"><a href="#">音乐</a></li><li><a href="#">影视</a></li><li><a href="#">少儿</a></li><li><a href="#">动漫</a></li><li><a href="#">小说</a></li><li><a href="#">外语</a></li><li><a href="#">数码相机</a></li><li><a href="#">笔记本</a></li><li><a href="#">羽绒服</a></li><li><a href="#">秋冬靴</a></li><li><a href="#">运动鞋</a></li><li><a href="#">美容护肤</a></li><li><a href="#">家纺用品</a></li><li><a href="#">婴幼奶粉</a></li><li><a href="#">饰品</a></li><li class="last"><a href="#">Investor Relations</a></li></ul></div>
</div>
<div id="position" class="wrap">您现在的位置:<a href="index.html">订单中心</a> &gt; 我的订单
</div>
<div class="wrap"><div id="shopping"><form action="shopping-result.html"><table><tr><th>订单编号</th><th>商品详情</th><th>订单总额</th><th>支付方式</th><th>收货地址</th><th>支付状态</th><th>操作</th></tr><!--两层list循环  需要重新定义一个变量  :orderDetailList   --><#if orderList?exists><#list orderList as order><tr id="product_id_1" align="center"><td><a href="javaScript:showOrderDetail(${order.ordId})">${order.ordId}</a></td><#assign orderDetailList =order.orderDetailList /><td><#list orderDetailList as orderDetail>${orderDetail.goodName}<br/></#list></td><td class="price" id="price_id_1"><span>${order.ordMoney}</span><input type="hidden" value="99" /></td><#if order.ordPayType==1><td>银联</td><#elseif order.ordPayType==2><td>支付宝</td><#elseif order.ordPayType==3><td>微信</td></#if><td>${order.ordAdd}</td><td><#if order.ordStatus ==1>未付款<a href="/order/alipaySum?ordId=${order.ordId}">支付</a></#if></td><td><#if order.ordStatus ==2>已付款</#if></td><td class="delete"><a href="javascript:delShopping(1);">删除</a></td><#-- <td class="delete"><a href="/order/alipaySum?ordId=${order.ordId}">支付</a></td>--></tr></#list></#if></table></form></div><script type="text/javascript">function showOrderDetail(id) {location.href="/good/showOrderDetail?ordId="+id}</script>
</div></body>
</html>

如何在spring boot+maven项目中调用支付宝第三方接口(沙箱环境)相关推荐

  1. 调用支付宝第三方接口(沙箱环境) Spring Boot+Maven

    调用支付宝第三方接口(沙箱环境) Spring Boot+Maven 一.蚂蚁金服开放平台的操作 网址:https://open.alipay.com/platform/home.htm 支付宝扫码登 ...

  2. springboot+调用支付宝第三方接口(沙箱环境)

    springboot+调用支付宝第三方接口(沙箱环境) 大神勿喷!! 网址:https://developers.alipay.com/platform/developerIndex.htm 沙箱环境 ...

  3. 如何在Spring Boot应用程序中使用配置文件

    你好朋友, 在本教程中,我们将学习如何在Spring Boot应用程序中使用配置文件. 我们将在本教程中讨论以下几点: 1.什么是Spring Boot Profile,为什么我们需要分析 2.如何使 ...

  4. spring boot maven项目返回值乱码的解决方法

    spring boot maven项目返回值乱码的解决方法 1.先看乱码效果: spring boot maven项目,返回值乱码,如下图: 控制台打印log乱码,如下图: 有swagger的话,sw ...

  5. Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...

    问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...

  6. Spring Boot+JSP项目中静态资源配置

    Spring Boot静态资源配置说明 在 Spring Boot 中,默认情况下,一共有5个位置可以放静态资源,五个路径分别如下: classpath:/META-INF/resources/ cl ...

  7. 【spring boot】使用RestTemplate调用微信code2Session接口

    前言 spring boot 2.1.1.RELEASE 使用RestTemplate调用微信code2Session接口 spring boot中使用RestTemplate,参考这里. 调用方法 ...

  8. Idea在Maven项目中使用支付宝沙箱环境

    进入支付宝开发者中心注册账号点击进入 进入后会看到如下页面,点研发服务 进入之后先下载密匙生成器: 安装好后打开,点生成密匙 复制应用公匙 使用应用公匙生成支付宝公匙 得到支付宝公匙 然后我们开始下载 ...

  9. .Net调用支付宝Alipay接口沙箱测试

    这是我的第一篇博客,注册博客园多年,但是今天刚开通博客功能,目的是想记录一下这两天研究AliPay,电脑网站支付,在网上找到的知识点很少,也可能大家都没遇到这个问题,所以我想写下来共以后用得着的同学参 ...

最新文章

  1. Spring Boot 最最最常用的注解梳理
  2. 档案盒正面标签制作_包材工艺丨浅述模内标签印刷及材料的选择
  3. 基于UDP的DDos反射放大攻击
  4. 技术人生:遇到挫折,不可轻言放弃。
  5. 大数据分析之环境部署
  6. C#中oracle数据库的连接方法
  7. 【遥感数字图像处理】实验:遥感图像显示与数据输入/输出(Erdas版)
  8. Samba 3.0.25 颁布发表
  9. 统一建模语言UML轻松入门(1)――基本概念
  10. c语言小程序 祝你生日快乐!
  11. 散乱插值及MATLAB绘图函数
  12. Unity安装 ILRuntime插件
  13. 杭州-千岛湖(入门篇骑行)
  14. STC89C52引脚图
  15. 企业实践|分布式系统可观测性之应用业务指标监控
  16. JavaScript 各种事件、方法、参数详解示例及常见问题等(全)
  17. HC-05,HC-06AT指令
  18. 鸿蒙系统就是个垃圾系统,华为鸿蒙系统是什么?鸿蒙系统和安卓系统有什么区别?...
  19. EPLAN2022——端子
  20. 计算机7层网络以及每层协议

热门文章

  1. 【时间序列异常检测算法】——传统异常检测算法介绍及代码实现
  2. 电脑给手机传音乐,手机上找不到文件解决办法。
  3. Muu云课堂V2 v2.5.7
  4. 徐良汪苏泷解约恐赔千万 网友称:冰三尺非一日寒
  5. MySQL数据库(9):数据类型-时间日期类型
  6. 华院计算|维托里斯—最长寿的数学家
  7. bug生命周期你们公司是如何管理bug的
  8. python中def什么时候用_Python中定义函数def的使用方法
  9. TerminateProcess
  10. python爬虫库的常见用法_$python爬虫系列(2)—— requests和BeautifulSoup库的基本用法...