在官网注册支付宝开放平台账号:支付宝开放平台 (alipay.com)

进入沙箱环境查看APPID、应用公钥以及应用私钥等相关应用信息

导入相关maven依赖

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>2.2.1</version>
</dependency>

在yml中配置支付相关参数

alibabapay:app-id: protocol: gateway-host: "openapi.alipaydev.com"#支付宝公钥alibaba-public-key: #商户私钥merchant-private-key: sign-type: "RSA2"notify-url: return-url: 

读取配置类

@Component
@ConfigurationProperties(prefix = "alibabapay")
@Data
public class AlipayProperties {private String appId;private String protocol;private String gatewayHost;private String alibabaPublicKey;private String merchantPrivateKey;private String signType;private String notifyUrl;private String returnUrl;public Config getOptions() {Config config = new Config();config.protocol = protocol;config.gatewayHost = gatewayHost;config.signType = signType;config.appId = appId;//应用私钥config.merchantPrivateKey = merchantPrivateKey;//支付宝公钥config.alipayPublicKey = alibabaPublicKey;//可设置异步通知接收服务地址(可选)config.notifyUrl = notifyUrl;return config;}
}

AlipayConfig 配置类

package com.alipay.config;
public class AlipayConfig {// 商户appidpublic static String APPID = "";// 私钥 pkcs8格式的public static String RSA_PRIVATE_KEY = "";// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://商户网关地址/alipay.trade.wap.pay-JAVA-UTF-8/notify_url.jsp";// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址public static String return_url = "http://商户网关地址/alipay.trade.wap.pay-JAVA-UTF-8/return_url.jsp";// 请求网关地址public static String URL = "https://openapi.alipay.com/gateway.do";// 编码public static String CHARSET = "UTF-8";// 返回格式public static String FORMAT = "json";// 支付宝公钥public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjrEVFMOSiNJXaRNKicQuQdsREraftDA9Tua3WNZwcpeXeh8Wrt+V9JilLqSa7N7sVqwpvv8zWChgXhX/A96hEg97Oxe6GKUmzaZRNh0cZZ88vpkn5tlgL4mH/dhSr3Ip00kvM4rHq9PwuT4k7z1DpZAf1eghK8Q5BgxL88d0X07m9X96Ijd0yMkXArzD7jg+noqfbztEKoH3kPMRJC2w4ByVdweWUT2PwrlATpZZtYLmtDvUKG/sOkNAIKEMg3Rut1oKWpjyYanzDgS7Cg3awr1KPTl9rHCazk15aNYowmYtVabKwbGVToCAGK+qQ1gT3ELhkGnf3+h53fukNqRH+wIDAQAB";// 日志记录目录定义在 logFile 中public static String log_path = "/log";// RSA2public static String SIGNTYPE = "RSA2";
}

支付宝官方调用示例

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.factory.Factory.Payment;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.kernel.util.ResponseChecker;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse;
public class Main {public static void main(String[] args) throws Exception {// 1. 设置参数(全局只需设置一次)Factory.setOptions(getOptions());try {// 2. 发起API调用(以创建当面付收款二维码为例)AlipayTradePrecreateResponse response = Payment.FaceToFace().preCreate("Apple iPhone11 128G", "2234567890", "5799.00");// 3. 处理响应或异常if (ResponseChecker.success(response)) {System.out.println("调用成功");} else {System.err.println("调用失败,原因:" + response.msg + "," + response.subMsg);}} catch (Exception e) {System.err.println("调用遭遇异常,原因:" + e.getMessage());throw new RuntimeException(e.getMessage(), e);}}private static Config getOptions() {Config config = new Config();config.protocol = "https";config.gatewayHost = "openapi.alipay.com";config.signType = "RSA2";config.appId = "<-- 请填写您的AppId,例如:2019091767145019 -->";// 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中config.merchantPrivateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->";//注:证书文件路径支持设置为文件系统中的路径或CLASS_PATH中的路径,优先从文件系统中加载,加载失败后会继续尝试从CLASS_PATH中加载config.merchantCertPath = "<-- 请填写您的应用公钥证书文件路径,例如:/foo/appCertPublicKey_2019051064521003.crt -->";config.alipayCertPath = "<-- 请填写您的支付宝公钥证书文件路径,例如:/foo/alipayCertPublicKey_RSA2.crt -->";config.alipayRootCertPath = "<-- 请填写您的支付宝根证书文件路径,例如:/foo/alipayRootCert.crt -->";//注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可// config.alipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->";//可设置异步通知接收服务地址(可选)config.notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址,例如:https://www.test.com/callback -->";//可设置AES密钥,调用AES加解密相关接口时需要(可选)config.encryptKey = "<-- 请填写您的AES密钥,例如:aa4BtZ4tspm2wnXLb1ThQA== -->";return config;}
}

第三方代理调用

Factory.Payment.FaceToFace()// 调用agent扩展方法,设置app_auth_token,完成第三方代调用.agent("ca34ea491e7146cc87d25fca24c4cD11").preCreate("Apple iPhone11 128G", "2234567890", "5799.00");

设置独立的异步通知地址

Factory.Payment.FaceToFace()// 调用asyncNotify扩展方法,可以为每次API调用,设置独立的异步通知地址// 此处设置的异步通知地址的优先级高于全局Config中配置的异步通知地址.asyncNotify("https://www.test.com/callback").preCreate("Apple iPhone11 128G", "2234567890", "5799.00");

支付类异步通知验签

Map<String, String> parameters = new HashMap<>();
parameters.put("charset", "UTF-8");
parameters.put("sign", "GM0CbuqaEivqgb......");
parameters.put("app_id", "2018091261392200");
parameters.put("sign_type", "RSA2");
parameters.put("isv_ticket", "");
parameters.put("timestamp", "2020-03-25 16:27:08");
//... ... 接收到的所有参数放入一个Map中
Factory.Payment.Common().verifyNotify(parameters);

动态扩展 SDK 功能满足个性化需求

当 SDK 的 API 声明中的参数不满足个性化需求时,可按如下方式追加可选业务参数:

List<Object> goodsDetailList = new ArrayList<>();
Map<String, Object> goodsDetail = new HashMap<>();
goodsDetail.put("goods_id", "apple-01");
goodsDetail.put("goods_name", "Apple iPhone11 128G");
goodsDetail.put("quantity", 1);
goodsDetail.put("price", "5799.00");
goodsDetailList.add(goodsDetail);
Factory.Payment.FaceToFace()// 调用optional扩展方法,完成可选业务参数(biz_content下的可选字段)的设置.optional("seller_id", "2088102146225135").optional("discountable_amount", "8.88").optional("goods_detail", goodsDetailList).preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
Map<String, Object> optionalArgs = new HashMap<>();
optionalArgs.put("seller_id", "2088102146225135");
optionalArgs.put("discountable_amount", "8.88");
optionalArgs.put("goods_detail", goodsDetailList);
Factory.Payment.FaceToFace()// 也可以调用batchOptional扩展方法,批量设置可选业务参数(biz_content下的可选字段).batchOptional(optionalArgs).preCreate("Apple iPhone11 128G", "2234567890", "5799.00");

当想要调用的 OpenAPI 在 SDK 中没有对应的 API 与之对应时,可按如下方式调用 OpenAPI:

注意:生成 Form 表单类的 OpenAPI(老版 SDK 中需要使用 pageExecute)本调用方式暂不支持。

//设置系统参数(OpenAPI中非biz_content里的参数)
Map<String, String> textParams = new HashMap<>();
textParams.put("app_auth_token", "201712BB_D0804adb2e743078d1822d536956X34");
//设置业务参数(OpenAPI中biz_content里的参数)
Map<String, Object> bizParams = new HashMap<>();
bizParams.put("subject", "Iphone6 16G");
bizParams.put("out_trade_no", UUID.randomUUID().toString());
bizParams.put("total_amount", "0.10");
bizParams.put("buyer_id", "2088002656718920");
Map<String, String> extendParams = new HashMap<>();
extendParams.put("hb_fq_num", "3");
extendParams.put("hb_fq_seller_percent", "3");
bizParams.put("extend_params", extendParams);
AlipayOpenApiGenericResponse response = Factory.Util.Generic().execute("alipay.trade.create", textParams, bizParams);

请求示例

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl("");
request.setReturnUrl("");
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "20210817010101004");
bizContent.put("total_amount", 0.01);
bizContent.put("subject", "测试商品");
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
//bizContent.put("time_expire", "2022-08-01 22:00:00");商品明细信息,按需传入
//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);request.setBizContent(bizContent.toString());
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}

响应示例

// 响应为表单格式,可嵌入页面,具体以返回的结果为准
<form name="submit_form" method="post" action="https://openapi.alipay.com/gateway.do?charset=UTF-8&method=alipay.trade.page.pay&sign=k0w1DePFqNMQWyGBwOaEsZEJuaIEQufjoPLtwYBYgiX%2FRSkBFY38VuhrNumXpoPY9KgLKtm4nwWz4DEQpGXOOLaqRZg4nDOGOyCmwHmVSV5qWKDgWMiW%2BLC2f9Buil%2BEUdE8CFnWhM8uWBZLGUiCrAJA14hTjVt4BiEyiPrtrMZu0o6%2FXsBu%2Fi6y4xPR%2BvJ3KWU8gQe82dIQbowLYVBuebUMc79Iavr7XlhQEFf%2F7WQcWgdmo2pnF4tu0CieUS7Jb0FfCwV%2F8UyrqFXzmCzCdI2P5FlMIMJ4zQp%2BTBYsoTVK6tg12stpJQGa2u3%2BzZy1r0KNzxcGLHL%2BwWRTx%2FCU%2Fg%3D%3D&notify_url=http%3A%2F%2F114.55.81.185%2Fopendevtools%2Fnotify%2Fdo%2Fbf70dcb4-13c9-4458-a547-3a5a1e8ead04&version=1.0&app_id=2014100900013222&sign_type=RSA&timestamp=2021-02-02+14%3A11%3A40&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json">
<input type="submit" value="提交" style="display:none" >
</form>
<script>document.forms[0].submit();</script>

异常示例

{"alipay_trade_page_pay_response": {"code": "20000","msg": "Service Currently Unavailable","sub_code": "isp.unknow-error","sub_msg": "系统繁忙"},"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}

Java中SpringBoot项目集成Easy版支付宝支付相关推荐

  1. java中ssm付款代码,ssm实现支付宝支付功能(图文详解)

    目录 1.支付宝沙箱环境测试 2.支付宝整合到ssm环境 3.微信支付整合到ssm环境 一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 2.下载解压导入eclipse readme.tx ...

  2. java中SpringBoot项目定时将MySql数据同步到ES中

    项目所用依赖 <modelVersion>4.0.0</modelVersion><artifactId>tm-shop-model</artifactId& ...

  3. springboot项目集成docker

    文章目录 一.docker常用命令 0.拉取镜像到本地仓库 1.查看所有镜像 2.创建一个新的容器并运行,返回的是容器的ID -- CONTAINER ID: 3.查看运行中的docker实例 4.查 ...

  4. springboot项目集成大数据第三方dolphinscheduler调度器

    文章目录 摘要 项目背景 功能要求 功能说明 1.1用例图 1.2业务流程分析 1.3业务ER图 1.4 管理任务流程图 1.5功能设计详细说明点 1.6页面原型 三.本人相关其他文章链接 摘要 ①d ...

  5. 01.基于Irises的springboot项目框架(简版)

    01.基于Irises的springboot项目框架(简版) 介绍 基于Irises搭建的springboot单体应用框架(简版),支持Mybatis-plus.sql分析与打印.swagger.kk ...

  6. 一、springboot项目集成大众点评cat

    一. 什么是CAT 1.cat简介 Cat是基于Java开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务 • CAT作为服务端项目基础组件,提供了java, c/c++, node, p ...

  7. Springboot项目集成Minio文件服务器(下)

    Springboot项目集成Minio文件服务器(下) 1.配置依赖 在pom文件里面配置Minio的相关依赖. <!--添加minio的依赖--><dependency>&l ...

  8. springboot项目集成dolphinscheduler调度器 实现datax数据同步任务

    Datax安装及基本使用请查看上一篇文章: 文章目录 Datax概述 1.概述 2.功能清单 3.==说明==:本项目只支持mysql及hbase之间的数据同步 代码模块 配置文件 pom.xml D ...

  9. Android项目内简单集成微信和支付宝支付功能

    最近自己公司的项目需要集成微信和支付宝支付,我是个初学者,然后就开始在网上各种搜索相关Demo.最后找了一个自我感觉还不错的Demo,挺适合初学者使用的.在使用之前一定要在微信平台和蚂蚁金服申请权限, ...

  10. springboot项目集成log4j2打成jar包 ,引入外边的log4j2文件,运行日志无法打印

    springboot项目集成log4j2打成jar包 ,引入外边的log4j2文件,运行日志无法打印 问题描述 因为项目中已经有log4j2文件,所以打的jar中也有,在application.yml ...

最新文章

  1. windows连接linux系统telnet端口23无法连接的问题
  2. C#字符串处理(String与StringBuilder)
  3. sparkstreaming(1)——实战
  4. 关于DDD中Domain的思考
  5. HTML标签的分类与特点
  6. python multiprocessing.Semaphore应用
  7. el-table固定列之后没有出现滚动条_一道经典的MySQL面试题,答案出现三次反转...
  8. 【Vegas原创】Exchange报550 5.7.1 Unable to relay for …错误的分析
  9. 【精选】OCR精选10个问题 百度paddleocr
  10. DBeaver执行SQL脚本
  11. 人脸识别打卡机怎么调sj_人脸识别考勤机怎么代打卡
  12. 大学生个人网页设计 HTML个人网页制作 web个人网站模板 简单静态HTML个人网页作品
  13. 双目测距理论及其python实现
  14. IDEA鼠标光标变黑块问题解决
  15. 从键盘输入一个不多于3位的正整数,要求:求出它是几位数;分别打印出每一位数字;按逆序打印出各位数字
  16. ElementUI日期组件(DatePicker )图标定制
  17. 【Java基础】实例与实例化
  18. Django Migration Error with MySQL: BLOB/TEXT column *** used in key specification without a key leng
  19. 往期课程 | 翻阅指南
  20. execve系统调用_系统调用execve的入口sys_execve() | 学步园

热门文章

  1. linux下安装MP4Box
  2. html 超链接下载文件问题 如何修改文件名称
  3. 纯原生js自定义弹窗
  4. 英语学习必备:Eudic欧路词典 for Mac增强版
  5. 年会抽奖(Java 含彩蛋)
  6. 斐讯路由器K2最新刷机教程
  7. 批量删除新浪微博关注
  8. 黑马程序员_JavaWeb013
  9. abc计算机机房建设标准,ABC级数据中心机房建设要求
  10. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法.