胖头猫游戏提供热门游戏下载和手游攻略!

Spring Boot 接入支付宝全攻略

发布时间:2024-10-25浏览:94

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

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

接下来看集成步骤。

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

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

alipay.properties

alipay.appId=你的应用idalipay.serverUrl=https://openapi.alipay.com/gateway.doalipay.privateKey=你的应用私钥alipay.format=jsonalipay.charset=UTF-8alipay.signType=RSA2alipay.appCertPath=/cert/appCertPublicKey_2021001164652941.crtalipay.alipayCertPath=/cert/alipayCertPublicKey_RSA2.crtalipay.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

importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.PropertySource;importorg.springframework.stereotype.Component;@Component@PropertySource("classpath:/production/alipay.properties")@ConfigurationProperties(prefix="alipay")@DatapublicclassAliPayBean{privateStringappId;privateStringprivateKey;privateStringpublicKey;privateStringserverUrl;privateStringdomain;privateStringformat;privateStringcharset;privateStringsignType;privateStringappCertPath;privateStringalipayCertPath;privateStringalipayRootCertPath;}

5.写配置类

importcom.alipay.api.AlipayClient;importcom.alipay.api.CertAlipayRequest;importcom.alipay.api.DefaultAlipayClient;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.util.FileCopyUtils;importjava.io.InputStream;@ConfigurationpublicclassAliConfig{@Value("${custom.http.proxyHost}")privateStringproxyHost;@Value("${custom.http.proxyPort}")privateintproxyPort;@Value("${spring.profiles.active}")privateStringactiveEnv;@AutowiredprivateAliPayBeanaliPayBean;@Bean(name={"alipayClient"})publicAlipayClientalipayClientService()throwsException{CertAlipayRequestcertAlipayRequest=newCertAlipayRequest();//设置网关地址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{//localStringserverPath=this.getClass().getResource("/").getPath();//设置应用公钥证书路径certAlipayRequest.setCertPath(serverPath+aliPayBean.getAppCertPath());//设置支付宝公钥证书路径certAlipayRequest.setAlipayPublicCertPath(serverPath+aliPayBean.getAlipayCertPath());//设置支付宝根证书路径certAlipayRequest.setRootCertPath(serverPath+aliPayBean.getAlipayRootCertPath());}returnnewDefaultAlipayClient(certAlipayRequest);}publicStringgetCertContentByPath(Stringname){InputStreaminputStream=null;Stringcontent=null;try{inputStream=this.getClass().getClassLoader().getResourceAsStream(name);content=newString(FileCopyUtils.copyToByteArray(inputStream));}catch(Exceptione){e.printStackTrace();}returncontent;}}

6.写支付工具类

importcom.alipay.api.AlipayApiException;importcom.alipay.api.AlipayClient;importcom.alipay.api.domain.AlipayTradeAppPayModel;importcom.alipay.api.domain.AlipayTradeQueryModel;importcom.alipay.api.request.AlipayTradeAppPayRequest;importcom.alipay.api.request.AlipayTradeQueryRequest;importcom.alipay.api.response.AlipayTradeAppPayResponse;importcom.alipay.api.response.AlipayTradeQueryResponse;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.stereotype.Service;/***@description:支付宝工具类*@Date:2020-08-26*/@Slf4j@ServicepublicclassAliPayUtils{@Autowired@Qualifier("alipayClient")privateAlipayClientalipayClient;/***交易查询接口*@paramrequest*@return*@throwsException*/publicbooleanisTradeQuery(AlipayTradeQueryModelmodel)throwsAlipayApiException{AlipayTradeQueryRequestrequest=newAlipayTradeQueryRequest();request.setBizModel(model);AlipayTradeQueryResponsealipayTradeQueryResponse=alipayClient.certificateExecute(request);if(alipayTradeQueryResponse.isSuccess()){returntrue;}else{returnfalse;}}/***app支付*@parammodel*@paramnotifyUrl*@return*@throwsAlipayApiException*/publicStringstartAppPay(AlipayTradeAppPayModelmodel,StringnotifyUrl)throwsAlipayApiException{AlipayTradeAppPayRequestaliPayRequest=newAlipayTradeAppPayRequest();model.setProductCode("QUICK_MSECURITY_PAY");aliPayRequest.setNotifyUrl(notifyUrl);aliPayRequest.setBizModel(model);//这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponsealiResponse=alipayClient.sdkExecute(aliPayRequest);returnaliResponse.getBody();}/***转账接口**@paramtransferParams*@returnAlipayFundTransToaccountTransferResponse*/publicAlipayFundTransUniTransferResponsedoTransferNew(TransferParamstransferParams)throwsException{Stringtitle=(StringUtils.isNotBlank(transferParams.getRemark())?transferParams.getRemark():"转账");//转账请求入参AlipayFundTransUniTransferRequestrequest=newAlipayFundTransUniTransferRequest();//转账参数BizContentForUniTransferbizContent=newBizContentForUniTransfer();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);Participantparticipant=newParticipant();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));//转账请求返回AlipayFundTransUniTransferResponseresponse=null;try{response=alipayClient.certificateExecute(request);}catch(Exceptione){log.info("doTransfer exception,异常信息:{}",e.toString());log.info("doTransfer exception,支付宝返回信息:{}",JSONObject.toJSONString(response));}log.info("doTransfer,AlipayFundTransUniTransferResponse:{}",JSONObject.toJSONString(response));returnresponse;}}

Tips:转账用到的类

@DatapublicclassTransferParams{/***应用编号*/privateLongappId;/***创建人id*/privateLongcreatedBy;/***转账业务订单号*/privateStringoutBizNo;/***收款方识别方式*/privateStringpayeeType;/***收款方账号,可以是支付宝userId或者支付宝loginId*/privateStringpayeeAccount;/***转账金额,单位分*/privateStringamount;/***付款方名称*/privateStringpayerShowName;/***收款方名称*/privateStringpayeeRealName;/***备注*/privateStringremark;/***支付宝转账流水号*/privateStringorderId;}importlombok.Data;importjava.math.BigDecimal;/***支付宝转账参数*/@DatapublicclassBizContentForUniTransfer{/***业务订单号*/privateStringout_biz_no;/***订单总金额,单位为元,精确到小数点后两位,*/privateBigDecimaltrans_amount;/***业务产品码,*单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD;*单笔无密转账到银行卡固定为:TRANS_BANKCARD_NO_PWD;*收发现金红包固定为:STD_RED_PACKET;*/privateStringproduct_code;/***描述特定的业务场景,可传的参数如下:* DIRECT_TRANSFER:单笔无密转账到支付宝/银行卡, B2C现金红包;* PERSONAL_COLLECTION:C2C现金红包-领红包*/privateStringbiz_scene;/***转账业务的标题,用于在支付宝用户的账单里显示*/privateStringorder_title;/***原支付宝业务单号。C2C现金红包-红包领取时,传红包支付时返回的支付宝单号;* B2C现金红包、单笔无密转账到支付宝/银行卡不需要该参数。*/privateStringoriginal_order_id;/***业务备注*/privateStringremark;/***转账业务请求的扩展参数,支持传入的扩展参数如下:* 1、sub_biz_scene 子业务场景,红包业务必传,取值REDPACKET,C2C现金红包、B2C现金红包均需传入;*2、withdraw_timeliness为转账到银行卡的预期到账时间,可选(不传入则默认为T1),*取值T0表示预期T+0到账,取值T1表示预期T+1到账,因到账时效受银行机构处理影响,支付宝无法保证一定是T0或者T1到账;*/privateStringbusiness_params;/***支付收款对象*/privateParticipantpayee_info;}@DatapublicclassParticipant{/***参与方的唯一标识*/privateStringidentity;/***参与方的标识类型,目前支持如下类型:*1、ALIPAY_USER_ID支付宝的会员ID* 2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式*/privateStringidentity_type;/***参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。*当identity_type=ALIPAY_LOGON_ID时,本字段必填。*/privateStringname;}

原文链接:https://blog.csdn.net/qq_33556185/article/details/110445827

用户评论

陌離

这游戏名字听起来像是教人编程的,没想到是关于支付宝接入的,学到了!

    有14位网友表示赞同!

古巷青灯

看完这个标题,感觉自己对支付宝接入流程有了更清晰的认识。

    有19位网友表示赞同!

々爱被冰凝固ゝ

如果真的秒懂了,那这游戏肯定很实用,适合刚入门的开发者。

    有14位网友表示赞同!

熟悉看不清

之前接入支付宝总是遇到问题,这游戏应该能帮我解决不少难题。

    有14位网友表示赞同!

反正是我

编程游戏化学习,这个点子不错,希望更多这样的教学游戏。

    有18位网友表示赞同!

你那刺眼的温柔

我是个编程小白,这种实战教程对我来说太及时了。

    有13位网友表示赞同!

醉婉笙歌

看到秒懂两个字,我就想试试,看看自己能不能跟上节奏。

    有13位网友表示赞同!

莫飞霜

以前接入支付宝都是照着文档来的,现在有了这个游戏,感觉轻松多了。

    有14位网友表示赞同!

我的黑色迷你裙

游戏化学习是趋势,这种形式比看文档有趣多了。

    有9位网友表示赞同!

我家的爱豆是怪比i

对于支付宝开发者来说,这样的游戏肯定能提高学习效率。

    有13位网友表示赞同!

话扎心

实战演练总能让人印象深刻,这游戏估计能让我记得更牢。

    有13位网友表示赞同!

作业是老师的私生子

希望这个游戏能更新更多内容,让学习之路更全面。

    有9位网友表示赞同!

走过海棠暮

如果游戏里能加入错误反馈,那就更完美了。

    有8位网友表示赞同!

陌颜

以前觉得支付宝接入复杂,现在觉得有了这个游戏,复杂度降低了。

    有9位网友表示赞同!

杰克

这种实战教程对新手来说太有帮助了,赞一个!

    有19位网友表示赞同!

孤城暮雨

学编程也可以这么轻松,太期待这个游戏了。

    有7位网友表示赞同!

ゞ香草可樂ゞ草莓布丁

看完这个标题,我决定下次碰到支付宝接入的问题,先玩这个游戏。

    有17位网友表示赞同!

花容月貌

编程学习就应该这样,边玩边学,效率更高。

    有5位网友表示赞同!

不忘初心

期待这个游戏能让我在实际工作中少走弯路。

    有13位网友表示赞同!

热点资讯