支付宝推出了新的转账接口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/ga...
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;@Bean(name = {"alipayClient"})public AlipayClient alipayClientService() throws Exception{ CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); //设置网关地址 certAlipayRequest.setServerUrl(aliPayBean.getServerUrl()); //设置利用Id certAlipayRequest.setAppId(aliPayBean.getAppId()); //设置利用私钥 certAlipayRequest.setPrivateKey(aliPayBean.getPrivateKey()); //设置申请格局,固定值json certAlipayRequest.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 { //local String 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:支付宝工具类
- @Date:2020-08-26
*/
@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); // 这里和一般的接口调用不同,应用的是sdkExecute AlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliPayRequest); return aliResponse.getBody();}/** * 转账接口 * * @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;
}
作者:李秀才
原文链接:https://blog.csdn.net/qq_3355...