目录

  • 一、沙箱环境
    • 1. 配置密钥/证书
      • 系统默认密钥
      • 自定义密钥
  • 二、代码实现
    • 2.1 项目总体结构
    • 2.2 编码
      • 1. 添加相关依赖
      • 2. 配置文件:支付宝应用参数
      • 3. 配置文件类
      • 4. 初始化支付宝
      • 5. 调用 AliPayApi 中的接口
        • 扫码支付
        • 支付回调
        • 订单关闭
        • 支付退款
        • 订单查询
        • 退款查询
    • 2.3 测试
  • 三、总结

参考文档:

  • 官方文档:沙箱环境
  • IJPay 中的支付宝支付
  • 支付宝API参考文档
  • 支付宝开放功能

一、沙箱环境

记录一下犯的错误.
二级标题与官方文档的二级标题一致:方便于自己对比

1. 配置密钥/证书

系统默认密钥

使用 API 在线调试工具 调试 OpenAPI 必须使用 系统默认密钥。

不需要再配置 获取加签密钥/证书,系统的默认密钥在支付宝API 在线调试工具中可以看到,具体如下所示:

私钥:

公钥:

自定义密钥

官网文档:自定义密钥 里面写的很详细。

普通公钥与公钥证书二选一就行,普通公钥与公钥证书区别最主要区别是否涉及资金类支出接口接入。

需要注意的是:配置公钥证书组织与公司已经进行了更改

其他的与官方文档对应即可。

二、代码实现

2.1 项目总体结构

2.2 编码

省略了一个工具类:OrderCodeUtils:主要用于订单号生成。

1. 添加相关依赖

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.19</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- IJPay    --><dependency><groupId>com.github.javen205</groupId><artifactId>IJPay-AliPay</artifactId><version>2.8.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

2. 配置文件:支付宝应用参数

server:port: 1314alipay:# 应用编号appId: # 应用私钥privateKey: # 支付宝公钥 (如果是证书模式,公钥与私钥在CSR目录)publicKey: # 通知地址或回调地址  !回调地址一定是外网可以访问到的域名!domain: # 支付宝支付网关serviceUrl: # 应用公钥证书 (证书模式必须)
#  appCertPath:# 支付宝公钥证书 (证书模式必须)
#  aliPayCertPath:# 支付宝根证书 (证书模式必须)
#  aliPayRootCertPath:

3. 配置文件类

@Component
@Data
@ConfigurationProperties(prefix = "alipay")
public class AlipayProperties {private String appId;private String privateKey;private String publicKey;private String doMain;private String serviceUrl;
}

4. 初始化支付宝

为什么要初始化支付宝?
支付宝初始化的原因:IJPay 中默认是使用当前线程中的 appId 对应的配置

方法一:使用@PostConstruct注解

@PostConstruct注解原理解析:@PostConstruct注解的方法会在程序启动的时候执行

在启动类上添加@PostConstruct注解的方法:

@SpringBootApplication
public class AlipayApplication {public static void main(String[] args){SpringApplication.run(AlipayApplication.class, args);}@PostConstructpublic void aliPayInit() {AlipayProperties aliPayProperties = SpringUtil.getBean(AlipayProperties.class);AliPayApiConfig aliPayApiConfig = AliPayApiConfig.builder().setAppId(aliPayProperties.getAppId()).setAliPayPublicKey(aliPayProperties.getPublicKey()).setPrivateKey(aliPayProperties.getPrivateKey()).setServiceUrl(aliPayProperties.getServiceUrl()).setCharset("UTF-8").setSignType("RSA2").build();AliPayApiConfigKit.putApiConfig(aliPayApiConfig);}
}

方法二:使用方法拦截器

OrderController里面,添加初始化支付宝的方法

@RestController
@RequestMapping(value = "/aliPay")
@Slf4j
public class OrderController {@Autowiredprivate AlipayProperties alipayProperties;public AliPayApiConfig getApiConfig() {AliPayApiConfig aliPayApiConfig = AliPayApiConfig.builder().setAppId(alipayProperties.getAppId()).setAliPayPublicKey(alipayProperties.getPublicKey()).setPrivateKey(alipayProperties.getPrivateKey()).setServiceUrl(alipayProperties.getServiceUrl()).setCharset("UTF-8").setSignType("RSA2")// 证书模式// .setAppCertPath(alipayProperties.getAppCertPath())// .setAliPayCertPath(alipayProperties.getAliPayCertPath())// .setAliPayRootCertPath(alipayProperties.getAliPayRootCertPath())// 普通公钥方式.build();// 证书模式// .buildByCert();return aliPayApiConfig;}
}

设置OrderController的拦截器AliPayInterceptor

public class AliPayInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws AlipayApiException {if (HandlerMethod.class.equals(handler.getClass())) {HandlerMethod method = (HandlerMethod) handler;Object methodBean = method.getBean();AliPayApiConfigKit.setThreadLocalAliPayApiConfig(((OrderController) methodBean).getApiConfig());return true;}return false;}
}

AlipayConfig 继承WebMvcConfigurationSupport类,并配置拦截器

@Configuration
public class AlipayConfig extends WebMvcConfigurationSupport {@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AliPayInterceptor()).addPathPatterns("/aliPay/**");super.addInterceptors(registry);}
}

5. 调用 AliPayApi 中的接口

OrderController里面,编写URL请求方法。

此处,以调用 付款码支付 为例子。

扫码支付

这里会返回一个URL,到 二维码制作 中生成二维码,使用支付宝提供的 沙箱版支付宝钱包 ,登录买家账号,发起购买。

特别注意: 回调地址一定是外网可以访问到的域名,可以使用外网端口映射相关的工具来处理。(我买的是花生壳Http,6元),也可以找度娘。

    /*** 扫码支付** @return java.lang.String* @date 2022/2/9 11:34*/@GetMapping(value = "/tradePreCreatePay")public String tradePreCreatePay() {String notifyUrl = alipayProperties.getDoMain() + "/aliPay/aliPayNotifyUrl";AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();model.setSubject("Javen 支付宝扫码支付测试");model.setTotalAmount("10");model.setStoreId("123");model.setTimeoutExpress("5m");String orderNo = OrderCodeUtils.getRandom();model.setOutTradeNo(orderNo);try {AlipayTradePrecreateResponse response = AliPayApi.tradePrecreatePayToResponse(model, notifyUrl);String resultStr = response.getBody();JSONObject jsonObject = JSONObject.parseObject(resultStr);return jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");} catch (Exception e) {e.printStackTrace();}return null;}

支付回调

    /*** 支付回调** @param request 请求体* @return java.lang.String* @date 2022/2/9 11:34*/@PostMapping(value = "/aliPayNotifyUrl")public String aliPayNotifyUrl(HttpServletRequest request) {try {// 获取支付宝POST过来反馈信息Map<String, String> params = AliPayApi.toMap(request);// 遍历打印出反馈信息// for (Map.Entry<String, String> entry : params.entrySet()) {//     System.out.println(entry.getKey() + " = " + entry.getValue());// }boolean verifyResult = AlipaySignature.rsaCheckV1(params, alipayProperties.getPublicKey(), "UTF-8", "RSA2");if (verifyResult) {// TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理System.out.println("notify_url 验证成功succcess");return "success";} else {System.out.println("notify_url 验证失败");// TODOreturn "failure";}} catch (AlipayApiException e) {e.printStackTrace();return "failure";}}

订单关闭

    /*** 关闭订单** @param outTradeNo 商家内部订单号* @date 2022/2/9 11:53* @return java.lang.String*/@GetMapping(value = "/tradeClose")public String tradeClose(@RequestParam("outTradeNo") String outTradeNo){try {AlipayTradeCloseModel closeModel = new AlipayTradeCloseModel();closeModel.setOutTradeNo(outTradeNo);return AliPayApi.tradeCloseToResponse(closeModel).getBody();} catch (AlipayApiException e){e.printStackTrace();}return null;}

支付退款

    /*** 支付退款** @param outTradeNo 商家内部订单号* @date 2022/2/9 15:38* @return java.lang.String*/@GetMapping(value = "/tradeRefund")public String tradeRefund(@RequestParam("outTradeNo") String outTradeNo){try {AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel();refundModel.setOutTradeNo(outTradeNo);refundModel.setRefundAmount("10");refundModel.setRefundReason("退款测试");return AliPayApi.tradeRefundToResponse(refundModel).getBody();} catch (AlipayApiException e) {e.printStackTrace();}return null;}

订单查询

    /*** 订单查询** @param outTradeNo 商家内部订单号* @date 2022/2/9 15:37* @return java.lang.String*/@GetMapping(value = "/tradeQuery")public String tradeQuery(@RequestParam("outTradeNo") String outTradeNo){AlipayTradeQueryModel queryModel = new AlipayTradeQueryModel();queryModel.setOutTradeNo(outTradeNo);try {AlipayTradeQueryResponse queryResponse = AliPayApi.tradeQueryToResponse(queryModel);return queryResponse.getBody();} catch (AlipayApiException e) {e.printStackTrace();}return null;}

退款查询

    /*** 退款查询** @param outTradeNo 商户内部交易号* @date 2022/2/9 15:47* @return java.lang.String*/@GetMapping(value = "/refundQuery")public String refundQuery(@RequestParam("outTradeNo") String outTradeNo){AlipayTradeFastpayRefundQueryModel refundQueryModel = new AlipayTradeFastpayRefundQueryModel();refundQueryModel.setOutTradeNo(outTradeNo);refundQueryModel.setOutRequestNo(outTradeNo);try {return AliPayApi.tradeRefundQueryToResponse(refundQueryModel).getBody();} catch (AlipayApiException e) {e.printStackTrace();}return null;}

2.3 测试

### 扫码支付
GET http://localhost:1314/aliPay/tradePreCreatePay### 关闭订单
GET http://localhost:1314/aliPay/tradeClose?outTradeNo=1491259312927019008### 支付退款
GET http://localhost:1314/aliPay/tradeRefund?outTradeNo=1491238575935721472### 订单查询
GET http://localhost:1314/aliPay/tradeQuery?outTradeNo=1491259312927019008### 退款查询
GET http://localhost:1314/aliPay/refundQuery?outTradeNo=1491238575935721472

三、总结

  1. 相比较于微信支付,阿里的支付宝开发文档支付实在是太友好了。
  2. 支付流程的话,与微信支付差不多。
  3. 写的有错误的地方,欢迎指正。
  4. 附上:微信支付总结

支付宝:沙箱环境简单使用相关推荐

  1. SpringBoot - 支付宝支付之沙箱环境简单使用

    一.创建应用 使用沙箱环境,可以直接忽略这里,这里只是顺带介绍如何创建应用. 1.进入支付宝开放平台 支付宝开放平台 2.完善信息 3.接入应用 支付宝使用的加密方式 1.对称加密 - 不安全 即加密 ...

  2. 支付宝沙箱环境 电脑支付

    项目场景: java语言,jdk1.8也可以使用 .支付宝沙箱环境电脑支付. 电脑端生成二维码,手机端扫描支付 AlipayConfig: APP 中接收数据代码: package com.hc;/* ...

  3. 支付宝沙箱环境对接(当面付)

    支付宝沙箱环境对接(当面付) 第一步: 好好阅读以下的文档: 沙箱登录:https://openhome.alipay.com/platform/appDaily.htm 沙箱环境使用说明:https ...

  4. android 支付宝沙箱测试环境,Android支付宝沙箱环境使用教程

    Android支付宝沙箱环境使用教程 网上好多支付宝教程,但是好像没看到支付宝沙箱环境的使用教程,尤其是在做Android支付宝测试的时候,沙箱拿来测试挺好的,正式使用的时候更换里面的个别数据就可以了 ...

  5. 支付宝沙箱环境+SpringBoot+内网穿透整合开发

    目录 1.查看沙箱账号 2.内网穿透 3.沙箱环境整合SpringBoot开发 下面我将以实际案例详细介绍如何使用沙箱环境进行支付宝支付对接的开发 1.查看沙箱账号 首先什么是沙箱账号? 沙箱账号是指 ...

  6. 支付宝沙箱环境接口使用详解

    最近在做一个模拟支付宝的支付功能,用到了支付宝沙箱模拟环境,具体使用步骤如下,仅供参考: 一.注册支付宝沙箱环境账号 1.既然使用人家提供的东西,必须要注册一个他家的账号,使用万能的百度找到支付宝沙箱 ...

  7. 支付宝沙箱环境的使用----详细教程

    支付宝沙箱环境的使用----详细教程 支付宝的沙箱环境不需要商家认证,相对于微信沙箱门槛比较低,开发的时候方便我们在本地测试 这个教程带大家完成客户端支付 手机准备环境 客户端调试----支付宝沙箱环 ...

  8. 支付宝沙箱环境的H5收不到手机验证码

    支付宝沙箱环境的H5收不到手机验证码? 解决方法: 我使用支付宝沙箱环境的H5老是收不到手机验证码,http://www.yayihouse.com/yayishuwu/chapter/1457

  9. Vue对接支付宝沙箱环境

    文章目录 前言 一.支付宝沙箱环境是什么? 二.安装所需要的环境 1.引入环境以及工具 2.安装Express框架 3.对接支付宝沙箱环境 总结 前言 此文章仅供学习参考,这里我们对接的环境是Vue. ...

  10. python如何接入支付宝沙箱环境

    最近的项目需要对接支付宝,因为之前没有接触过支付宝支付的功能,折腾了好久才把问题测地解决了,现在把详细的过程贴出来让广大同学少走弯路. 目前,支付宝有两种状态,一种是用于支付的正式环境,也就是平时我们 ...

最新文章

  1. 解决虚拟机vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
  2. c语言中用于判断ch是否是字符的表达式,最新C语言复习题集资料
  3. MySQL高级-索引是什么
  4. PTA —— 基础编程题目集 —— 编程题 —— 7-1 厘米换算英尺英寸 (15 分)
  5. 项目中的模块剥离成项目_使用MCEBuddy 2从电视录制中剥离广告
  6. glove中文词向量_《GloVe:Global Vectors for Word Representation》学习
  7. Esxi直接使用vmdk文件创建虚机
  8. JAVA环境变量安装
  9. 前后端分离 -- 深入浅出 Spring Boot + Vue 实现工程项目进度管理系统 Vue不过如此~
  10. 运放使用总结篇(1) 运算放大器基本概念简介
  11. 状态机工作流.实列.报销审批流程(二)
  12. “细雨湿衣看不见,闲花落地听无声”---超强作文
  13. [雅礼集训]xiz(字符串匹配)
  14. Android分屏显示(多窗口支持) 开发总结
  15. Charles手机的代理配置与证书的安装
  16. 关于商品详情页接口流程编排框架的一点实践
  17. jmeter压测学习11-模拟浏览器访问web页面
  18. PHP app登录qq,APP配置QQ登录的详细教程
  19. 2020年机器视觉,就业前景如何?
  20. 大学计算机基础知识判断题,大学计算机基础知识考试试题及答案

热门文章

  1. java 新特性_Java 9的14个新特性总结
  2. HaaS UI小程序解决方案应用分发之三:应用和版本管理
  3. php httponly_php如何设置httponly
  4. 笔记本本地连接图标不显示,只链接无线网
  5. pow函数有四样写法,你知道吗
  6. 时间序列-ARIMA模型
  7. Reaver 基本用法示例
  8. 洛谷 P4147 玉蟾宫 P1169 [ZJOI2007]棋盘制作(求最大子矩阵)
  9. 程序人生:给你讲十个特别有哲理的故事
  10. 你什么都没错,只是太老了。