支付宝今年推出了新的转账接口alipay.fund.trans.uni.transfer(升级后安全性更高,功能更加强大) ,老转账接口alipay.fund.trans.toaccount.transfer将不再维护,新老接口的一个区别就是新接口采用的证书验签方式。

使用新接口要将sdk版本升级到最新版本,博主升级时最新版本是4.10.97。

接下来看集成步骤。

1.将支付宝开放平台里下载的3个证书放在resources下面

2.写支付宝支付的配置文件

alipay.properties

alipay.appId=你的应用id
alipay.serverUrl=https://openapi.alipay.com/gateway.do
alipay.privateKey=你的应用私钥
alipay.format=json
alipay.charset=UTF-8
alipay.signType=RSA2
alipay.appCertPath=/cert/appCertPublicKey_2021001164652941.crt
alipay.alipayCertPath=/cert/alipayCertPublicKey_RSA2.crt
alipay.alipayRootCertPath=/cert/alipayRootCert.crt

3.引入pom依赖

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

4.将配置信息注入AliPayBean

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;@Component
@PropertySource("classpath:/production/alipay.properties")
@ConfigurationProperties(prefix = "alipay")
@Data
public class AliPayBean {private String appId;private String privateKey;private String publicKey;private String serverUrl;private String domain;private String format;private String charset;private String signType;private String appCertPath;private String alipayCertPath;private String alipayRootCertPath;}

5.写配置类

import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.FileCopyUtils;import java.io.InputStream;@Configuration
public class AliConfig {@Value("${custom.http.proxyHost}")private String proxyHost;@Value("${custom.http.proxyPort}")private int proxyPort;@Value("${spring.profiles.active}")private String activeEnv;@Autowiredprivate AliPayBean aliPayBean;//from www.fhadmin.cn@Bean(name = {"alipayClient"})public AlipayClient alipayClientService() throws Exception{CertAlipayRequest certAlipayRequest = new CertAlipayRequest();//设置网关地址certAlipayRequest.setServerUrl(aliPayBean.getServerUrl());//设置应用IdcertAlipayRequest.setAppId(aliPayBean.getAppId());//设置应用私钥certAlipayRequest.setPrivateKey(aliPayBean.getPrivateKey());//设置请求格式,固定值jsoncertAlipayRequest.setFormat(aliPayBean.getFormat());//设置字符集certAlipayRequest.setCharset(aliPayBean.getCharset());//设置签名类型certAlipayRequest.setSignType(aliPayBean.getSignType());//如果是生产环境或者预演环境,则使用代理模式if ("prod".equals(activeEnv) || "stage".equals(activeEnv) || "test".equals(activeEnv)) {//设置应用公钥证书路径certAlipayRequest.setCertContent(getCertContentByPath(aliPayBean.getAppCertPath()));//设置支付宝公钥证书路径certAlipayRequest.setAlipayPublicCertContent(getCertContentByPath(aliPayBean.getAlipayCertPath()));//设置支付宝根证书路径certAlipayRequest.setRootCertContent(getCertContentByPath(aliPayBean.getAlipayRootCertPath()));certAlipayRequest.setProxyHost(proxyHost);certAlipayRequest.setProxyPort(proxyPort);}else {//localString serverPath = this.getClass().getResource("/").getPath();//设置应用公钥证书路径certAlipayRequest.setCertPath(serverPath+aliPayBean.getAppCertPath());//设置支付宝公钥证书路径certAlipayRequest.setAlipayPublicCertPath(serverPath+aliPayBean.getAlipayCertPath());//设置支付宝根证书路径certAlipayRequest.setRootCertPath(serverPath+aliPayBean.getAlipayRootCertPath());}return new DefaultAlipayClient(certAlipayRequest);}public String getCertContentByPath(String name){InputStream inputStream = null;String content = null;try{inputStream = this.getClass().getClassLoader().getResourceAsStream(name);content = new String(FileCopyUtils.copyToByteArray(inputStream));}catch (Exception e){e.printStackTrace();}return content;}}

6.写支付工具类

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
/*** @description:支付宝工具类* from www.fhadmin.cn*/
@Slf4j
@Service
public class AliPayUtils {@Autowired@Qualifier("alipayClient")private AlipayClient alipayClient;/*** 交易查询接口* @param request* @return* @throws Exception*/public boolean isTradeQuery(AlipayTradeQueryModel model) throws AlipayApiException {AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();request.setBizModel(model);AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.certificateExecute(request);if(alipayTradeQueryResponse.isSuccess()){return true;} else {return false;}}/*** app支付* @param model* @param notifyUrl* @return* @throws AlipayApiException*/public String startAppPay(AlipayTradeAppPayModel model, String notifyUrl)  throws AlipayApiException {AlipayTradeAppPayRequest aliPayRequest = new AlipayTradeAppPayRequest();model.setProductCode("QUICK_MSECURITY_PAY");aliPayRequest.setNotifyUrl(notifyUrl);aliPayRequest.setBizModel(model);// 这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliPayRequest);return aliResponse.getBody();}/*** 转账接口*from www.fhadmin.cn* @param transferParams* @return AlipayFundTransToaccountTransferResponse*/public AlipayFundTransUniTransferResponse doTransferNew(TransferParams transferParams) throws Exception {String title = (StringUtils.isNotBlank(transferParams.getRemark()) ? transferParams.getRemark() : "转账");//转账请求入参AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();//转账参数BizContentForUniTransfer bizContent = new BizContentForUniTransfer();bizContent.setOut_biz_no(transferParams.getOutBizNo());bizContent.setTrans_amount(MathUtil.changeF2Y(Math.abs(Integer.parseInt(transferParams.getAmount()))));bizContent.setProduct_code("TRANS_ACCOUNT_NO_PWD");bizContent.setBiz_scene("DIRECT_TRANSFER");bizContent.setOrder_title(title);Participant participant = new Participant();participant.setIdentity(transferParams.getPayeeAccount());participant.setIdentity_type(transferParams.getPayeeType());participant.setName((StringUtils.isNotBlank(transferParams.getPayeeRealName()) ? transferParams.getPayeeRealName() : StringUtils.EMPTY));bizContent.setPayee_info(participant);bizContent.setRemark(title);request.setBizContent(JSON.toJSONString(bizContent));//转账请求返回AlipayFundTransUniTransferResponse response = null;try {response = alipayClient.certificateExecute(request);} catch (Exception e) {log.info("doTransfer exception,异常信息:{}", e.toString());log.info("doTransfer exception,支付宝返回信息:{}", JSONObject.toJSONString(response));}log.info("doTransfer,AlipayFundTransUniTransferResponse:{}", JSONObject.toJSONString(response));return response;}
}

Tips:转账用到的类

@Data
public class TransferParams {/*** 应用编号*/private Long appId;/*** 创建人id*/private Long createdBy;/*** 转账业务订单号*/private String outBizNo;/*** 收款方识别方式*/private String payeeType;/*** 收款方账号,可以是支付宝userId或者支付宝loginId*/private String payeeAccount;/*** 转账金额,单位分*/private String amount;/*** 付款方名称*/private String payerShowName;/*** 收款方名称*/private String payeeRealName;/*** 备注*/private String remark;/*** 支付宝转账流水号*/private String orderId;
}
import lombok.Data;import java.math.BigDecimal;/*** 支付宝转账参数*/
@Data
public class BizContentForUniTransfer {/*** 业务订单号*/private String out_biz_no;/*** 订单总金额,单位为元,精确到小数点后两位,*/private BigDecimal trans_amount;/*** 业务产品码,* 单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD;* 单笔无密转账到银行卡固定为:TRANS_BANKCARD_NO_PWD;* 收发现金红包固定为:STD_RED_PACKET;*/private String product_code;/*** 描述特定的业务场景,可传的参数如下:* DIRECT_TRANSFER:单笔无密转账到支付宝/银行卡, B2C现金红包;* PERSONAL_COLLECTION:C2C现金红包-领红包*/private String biz_scene;/*** 转账业务的标题,用于在支付宝用户的账单里显示*/private String order_title;/*** 原支付宝业务单号。C2C现金红包-红包领取时,传红包支付时返回的支付宝单号;* B2C现金红包、单笔无密转账到支付宝/银行卡不需要该参数。*/private String original_order_id;/*** 业务备注*/private String remark;/*** 转账业务请求的扩展参数,支持传入的扩展参数如下:* 1、sub_biz_scene 子业务场景,红包业务必传,取值REDPACKET,C2C现金红包、B2C现金红包均需传入;* 2、withdraw_timeliness为转账到银行卡的预期到账时间,可选(不传入则默认为T1),* 取值T0表示预期T+0到账,取值T1表示预期T+1到账,因到账时效受银行机构处理影响,支付宝无法保证一定是T0或者T1到账;*/private String business_params;/*** 支付收款对象*/private Participant payee_info;
}
@Data
public class Participant {/*** 参与方的唯一标识*/private String identity;/*** 参与方的标识类型,目前支持如下类型:* 1、ALIPAY_USER_ID 支付宝的会员ID* 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式*/private String identity_type;/*** 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。* 当identity_type=ALIPAY_LOGON_ID时,本字段必填。*/private String name;
}

SpringBoot 配置支付宝接口相关推荐

  1. springboot 配置webservice接口

    导入依赖的jar <!-- webservice cxf --><dependency><groupId>org.apache.cxf</groupId> ...

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

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

  3. SpringBoot整合支付宝支付接口 详解 (有源文件)

    目录 1.简介与支付接口运行原理 2.基本配置说明 3.支付接口实现 4.整合后沙箱测试 1.简介与支付接口运行原理 简介: 现在与钱有关的项目都离不开支付,现在就来介绍一下如何对接支付宝接口.演示项 ...

  4. c#分页_使用Kotlin搭配Springboot开发RESTFul接口(二)自定义配置、跨域、分页

    前言 上一篇文章请看这里:使用Kotlin搭配Springboot开发RESTFul接口与服务部署 上一篇文章介绍了Kotlin搭配Springboot的开发流程,从搭建项目.ORM.Controll ...

  5. SpringBoot配置swagger-ui可视化接口文档

    SpringBoot配置swagger-ui [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://g ...

  6. Springboot整支付宝网站支付、APP支付、单笔转账给用户、退款功能

    一.概述 最近在写项目,遇到了要调用支付宝支付的地方(后台管理页面的网站支付,APP内的用户支付,APP内用户提现也就是单笔转账给用户.退款).研究了好久,全部调通了,下面把我的代码分享出来. 首先那 ...

  7. SpringBoot集成支付宝沙箱手机网站支付详细流程和踩坑分享

    描述 本文主要讲解SpringBoot集成支付宝沙箱手机网站支付,即网页点击按钮发起支付,跳转到沙箱app付款 由于其他博客的流程大多笼统,有时候并不能找到正确的集成方式,本文尽可能详细的阐述付款,异 ...

  8. Springboot实现支付宝沙箱支付功能

    我们在做开发时很多时候会涉及到支付功能,常见会对接支付宝和微信支付,本文将对JAVA对接支付宝进行详细的讲解. 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳 ...

  9. springboot 集成支付宝支付

    最简单的springboot集成支付宝 1 注册沙箱 沙箱是一个模拟环境登录,百度蚂蚁金服开放平台,支付宝扫码登录如下 然后沙箱需要注册一下,非常之简单,注册好以后进入到如下页面,选沙箱工具,然后下载 ...

最新文章

  1. 杭州往事之与L项目SME Cathy小聚
  2. 做出仿iphone的圆角效果,以及shpe的各个属性
  3. NHibernate之旅(10):探索父子(一对多)关联查询
  4. Python 基础常用数据结构
  5. 在python中、如果异常并未被处理或捕捉_python异常处理(一)
  6. 【Web安全】从xxe到phar反序列化
  7. 清除Console口和Telnet密码教程
  8. U-Boot 之二 详解使用 eclipse + J-Link 进行编译及在线调试
  9. LT8920无线通讯程序
  10. 解题报告 树形图计数
  11. 少儿编程100讲轻松学python(一)-python怎么打开
  12. java学习(56):接口之间的继承续
  13. 数据库调优过程(五):物理分表,及写入方案调整
  14. jdk1.8 ConcurrentHashMap
  15. 微信官方都辟谣,可真有技术人用 AI、大数据实现头像添加圣诞帽了!
  16. unicode字符串解析
  17. 数据库系统工程师怎么备考?
  18. 计算机网络数据链路层之MAC协议概述
  19. 智邦科技下一代新技术发布会@MWC上海
  20. Open Explorer Plugin for Eclipse (eclipse 插件 在ecli

热门文章

  1. js 获取页面鼠标选中的文字
  2. 小目标检测常用解决方法
  3. 使用node中fs模块创建和删除文件夹
  4. Jabber 协议 概述(转载)
  5. 去哪儿网任务系统演进
  6. 字节跳动Java后端笔试题
  7. Java学习第十六天——字符流读写文件、字符缓冲流拷贝文件
  8. JavaScript中的浏览器缓存机制问题
  9. VCSA 6.7安装进度卡在第一阶段80%
  10. Qt构造函数的初始化问题