专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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依赖      com.alipay.sdk      alipay-sdk-java      4.10.97.ALL  4.将配置信息注入AliPayBeanimport 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;       @Autowired     private 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_33556185/article/details/110445827

圣枪哥一打强队就犯病EDG七连胜被终结,晴天肉身1V5火了作为目前LPL唯一一支保持不败战绩的队伍,这个夏天的EDG给了粉丝许多惊喜。除了双C依旧稳定之外,上野两兄弟的状态也有所回暖,这对于EDG来说无疑是一个好消息。不过由于TES在最近RNG坏了!网曝战队发不出工资下赛季重组,小明不续约是为了等UZI目前LPL夏季赛正在如火如荼地进行着,各大战队都展现了不一样的面貌,其中LNG和EDG等队伍在夏季赛崛起至今未尝一败。相比之下RNG的夏季赛之旅则非常不顺利,不仅队伍战绩不佳,选手爆冷导致IG粉丝内讧Wink首发被质疑!Rookie状态登上热搜在刚刚结束的一场LPL比赛中,人气战队IG爆冷不敌黑暗四天王OMG引起玩家热议。大家都知道,虽然现在LPL诞生了不少强队,但依旧有几支鱼腩队伍存在,这些队伍虽然每个赛季都在调整阵容TES一战打出两大热搜!JKL粉丝集体破防,二路解说被偷家的神在LPL夏季赛第三周的比赛中,TES和RA的这场比赛本来只是一场普通的常规赛,但由于JKL在和Iboy的对抗上至今保持着全胜的战绩,因此这场比赛获得了许多玩家的期待,有玩家期待看到UZI亲口承认下赛季复出,西卡评价比厂长复出更值得期待一些作为LPL曾经的人气王,UZI虽然已经退役了一个赛季,但还是有很多粉丝在期待他的回归。不过由于RNG将UZI卖给了PDD的小象互娱,这也导致UZI夏季赛复出一事成为了泡影,毕竟UZLPL夏季赛一阵名单引热议!金咕咕众望所归,RNG两度打破记录LPL夏季常规赛已经圆满结束,经过几天的休息后季后赛也马上就要开打。不过在此之前,经过专家和大众评审代表的投票,LPL夏季赛常规赛的荣誉评选结果正式出炉。作为FPX的中单选手,Do世界亚军季后赛一轮游SN不敌LNG,Icon生死局打破露露魔咒经过一段时间的休息后,LPL夏季季后赛如期举行,SN和LNG两支队伍即将打响揭幕战。从队伍实力以及上限来说,SN略胜LNG一筹。不过也有玩家认为如果LNG恢复到赛季初的状态的话,那Iboy打破魔咒击败JKL!TES又被偷家制裁,Knight神级1打5难救主在刚刚结束的一场比赛中,TES和RA的比赛吸引了许多玩家的目光。虽然赛季初两支队伍的表现不在一个水平上,但由于Iboy出道至今始终没有战胜过JKL,因此不少人认为只要TES众人不出TES凉了!不敌LNG无缘世界赛,战马BP引热议说好的满级号呢?在LPL夏季赛常规赛结束之后,JDG和LGD没能进入季后赛,去年参加世界赛的4支队伍仅剩下SN和TES,不过这两支队伍的排名都不高,想要获得参加冒泡赛的资格都至少得打入4强才行,因RNG淘汰后WE名宿被爆破!粉丝指责对方太心机,输比赛全怪微笑?作为LPL季后赛的焦点大战,RNG和LNG的这场比赛吸引了许多玩家目光。虽然不论这场比赛的结果如何,这两支队伍都获得了参加冒泡赛的机会,但除了RNG粉丝想看到RNG夺下夏季赛冠军之FPX轻取WE晋级总决赛!微笑破防怒喷黑粉你们不配给我上嘴脸在LPL四强胜者组的比赛中,FPX三局比赛都展现了强大的实力,不管是选手的状态还是英雄池他们都碾压了对手,最终零封黑马WE战队成功晋级最后的总决赛。在这场比赛中FPX全线开花,不仅
超级人类系统出现错误超级人类7003错误代码解决办法超级人类是一款超能力吃鸡游戏,于12月7日开始内测。官方在25号发布消息称,将延长测试,目前还未定结束时间,玩家们都很兴奋,迫不及待去体验。然而,不少玩家反应自己碰到系统提示错误代超级人类公测攻略助你更快上手超级人类开启公测啦,这款生存射击游戏在大逃杀玩法的基础上,为游戏角色增加了一些超能力,这一创新之举使游戏可玩性得到进一步提升。比如海军陆战队角色的超能力海雾,可以在打架时放出烟雾,Steam冬促史低游戏推荐,动画解读方舟生存进化曾发生过的事作为世界上最大的游戏平台,Steam游戏平台上有很多出色的游戏作品,而这些游戏也都响应Steam的号召而在冬季特卖活动中亮出了底价。下面我就来给大家推荐10款达到底价的游戏,它们质TES拿下德杯冠军,队内配合却出大问题,网友直言春季赛危险?德杯的相关赛事在不久前圆满落幕,由于今年LPL赛区各大队伍的人员变动较大,许多队伍都派出了目前的一队阵容,让今年的德杯更具看头,在最终的决赛舞台中,TES让二追三成功击败FPX拿下LOL手游无限火力开了6小时,火影劫有手就行?玩家吐槽毫无平衡性Hello各位老爷们下午好啊我是千乘酱!欢迎来到我的游戏频道!LOL手游,一个和王者荣耀对标的moba手游,目前在手游里的地位几乎已经可以和王者荣耀平分秋色,尽管它作为一个初生的孩寂然再无短板!练三大逆版本英雄上分晋级105段野王,网友天赋对于绝大多数的手游爱好者们来讲,肯定都对王者荣耀这款手机游戏领域当中最经典的MOBA手机游戏再熟悉不过了,凭借着其全新的MOBA游戏玩法,王者荣耀在上线之后便深受无数网友们的追捧,傲世龙城全新神器版BOSS悬赏有哪些奖励热血龙皇BOSS悬赏攻略大家好,今天小编想跟小伙伴分享一下手游傲世龙城全新神器版中悬赏BOSS有哪些悬赏奖励。感兴趣的小伙伴那就接着往下看吧。本文转自公众号怀旧传奇手游盒子。五行悬赏悬赏奖励练功点25绑定武圣屠龙超级传送怎么用神器降临武圣屠龙超级传送介绍嗨,各位玩家们大家好啊,欢迎来到可乐王城英雄,双职业手游武圣屠龙超级传送有什么用途呢,武圣屠龙超级传送介绍跟随小编一起来看看吧,希望能够给大家带来帮助哦!出彩的游戏副本事件设定酣畅微博年度十大电竞事件评选结果EDG夺得S11冠军排名第一回顾已经结束的2021赛季,今年诸多电竞赛事战队选手都给广大玩家留下了深刻的印象。近日微博联合国内十四家知名电竞媒体发起了微博2021年度十大电竞事件的投票活动,最终的评选结果中英虽是一款游戏,但王者荣耀却将中国传统文化带出了国门作为一款发展多年的人气手游来说,王者荣耀不仅仅是在国内有着很高的人气,在国外的游戏市场中,也是同样收获了大量的游戏玩家。而对于一款备受国人喜爱的手游作品而言,能够走出国门也是一个极精选十大开放性世界动作游戏,都是必玩不可的好作品在海量的游戏当中,无论是网游无论是单机,还是主机游戏,只要里面带有开放性世界元素的作品,都会受到玩家的注意,因为通常这样的游戏玩起来体验性十足,而且自由度高,可探索性强,能为玩家带
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软件