SpringBoot 配置支付宝接口
支付宝今年推出了新的转账接口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 配置支付宝接口相关推荐
- springboot 配置webservice接口
导入依赖的jar <!-- webservice cxf --><dependency><groupId>org.apache.cxf</groupId> ...
- springboot+调用支付宝第三方接口(沙箱环境)
springboot+调用支付宝第三方接口(沙箱环境) 大神勿喷!! 网址:https://developers.alipay.com/platform/developerIndex.htm 沙箱环境 ...
- SpringBoot整合支付宝支付接口 详解 (有源文件)
目录 1.简介与支付接口运行原理 2.基本配置说明 3.支付接口实现 4.整合后沙箱测试 1.简介与支付接口运行原理 简介: 现在与钱有关的项目都离不开支付,现在就来介绍一下如何对接支付宝接口.演示项 ...
- c#分页_使用Kotlin搭配Springboot开发RESTFul接口(二)自定义配置、跨域、分页
前言 上一篇文章请看这里:使用Kotlin搭配Springboot开发RESTFul接口与服务部署 上一篇文章介绍了Kotlin搭配Springboot的开发流程,从搭建项目.ORM.Controll ...
- SpringBoot配置swagger-ui可视化接口文档
SpringBoot配置swagger-ui [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://g ...
- Springboot整支付宝网站支付、APP支付、单笔转账给用户、退款功能
一.概述 最近在写项目,遇到了要调用支付宝支付的地方(后台管理页面的网站支付,APP内的用户支付,APP内用户提现也就是单笔转账给用户.退款).研究了好久,全部调通了,下面把我的代码分享出来. 首先那 ...
- SpringBoot集成支付宝沙箱手机网站支付详细流程和踩坑分享
描述 本文主要讲解SpringBoot集成支付宝沙箱手机网站支付,即网页点击按钮发起支付,跳转到沙箱app付款 由于其他博客的流程大多笼统,有时候并不能找到正确的集成方式,本文尽可能详细的阐述付款,异 ...
- Springboot实现支付宝沙箱支付功能
我们在做开发时很多时候会涉及到支付功能,常见会对接支付宝和微信支付,本文将对JAVA对接支付宝进行详细的讲解. 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳 ...
- springboot 集成支付宝支付
最简单的springboot集成支付宝 1 注册沙箱 沙箱是一个模拟环境登录,百度蚂蚁金服开放平台,支付宝扫码登录如下 然后沙箱需要注册一下,非常之简单,注册好以后进入到如下页面,选沙箱工具,然后下载 ...
最新文章
- 杭州往事之与L项目SME Cathy小聚
- 做出仿iphone的圆角效果,以及shpe的各个属性
- NHibernate之旅(10):探索父子(一对多)关联查询
- Python 基础常用数据结构
- 在python中、如果异常并未被处理或捕捉_python异常处理(一)
- 【Web安全】从xxe到phar反序列化
- 清除Console口和Telnet密码教程
- U-Boot 之二 详解使用 eclipse + J-Link 进行编译及在线调试
- LT8920无线通讯程序
- 解题报告 树形图计数
- 少儿编程100讲轻松学python(一)-python怎么打开
- java学习(56):接口之间的继承续
- 数据库调优过程(五):物理分表,及写入方案调整
- jdk1.8 ConcurrentHashMap
- 微信官方都辟谣,可真有技术人用 AI、大数据实现头像添加圣诞帽了!
- unicode字符串解析
- 数据库系统工程师怎么备考?
- 计算机网络数据链路层之MAC协议概述
- 智邦科技下一代新技术发布会@MWC上海
- Open Explorer Plugin for Eclipse (eclipse 插件 在ecli