范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

Epic喜加一动作冒险游戏秘奥法师免费领取,原价69元IT之家12月28日消息,从12月17日开始,Epic将连续15天送15款不同的游戏。今天是第12款,赠送原价69元的秘奥法师。IT之家了解到,秘奥法师(MagesofMystra盘点KPL秋季赛英雄数据,宫本亚瑟上过场,承伤之王易主大家好我是指尖,kpl秋季赛正式落下帷幕,不知道大家对这个赛季的kpl印象如何呢?在我看来,从结果上来看,estar一家独大,唯一T0战队,其他队伍都是来争第二的,只是狼队没干过T在这款捡垃圾模拟器里你甚至可以盖房子开局一人一狗,游玩时长999,结果发现自己就是个捡垃圾的小丑,无论是废土破烂王还是废土建筑师,都是玩家们对辐射4游戏体验的一种戏谑表达。作为B社的看家作品之一,虽然有些许瑕疵,但不PlayStation官推公布日本地区PSShare游戏排行榜原神位列TOP2PlayStation官推公布了日本地区PSShare游戏排行榜,这份榜单统计了日本玩家在2021年1月1日11月30日期间,通过PS5PS4的Share功能将游戏分享至推特的数量用户市场规模双增长,主机游戏的转折点即将到来?21世纪经济报道记者蔡姝越上海报道在我国,主机游戏市场还是一块有待开发的疆土。近年来,随着主机游戏走入了越来越多玩家的视野,诸多国内游戏公司也纷纷开始对其进行布局。大型公司如腾讯和CDPR2077为何没警匪追逐战因为受技术限制近日赛博朋克2077任务总监PawelSasko在社区发文,解释了赛博朋克2077中为何没有警匪汽车追逐战的原因。玩过赛博朋克2077游戏的玩家都知道,当你搞事时,警察会出现在周围看了10届TI原来DOTA2正统在网易,他们才是中国dota的希望由DOTA2知名主播zard翔哥策划举办的第一届互联网邀请赛于上周落下了完美的序幕,在这场有着小TI之称的系列赛中,网易笑到了最后,在总决赛上3比0击败了腾讯小企鹅拿到了冠军,其队大话西游2神豪越来越少,6级藕丝价格却在飙升,这是什么原因?每天一期大话,期期都有精彩,大家好,我是你们熟悉的小苏。作为神兵装备里身价最高的藕丝步云履,从游戏早期开始它的价格就是普通玩家触及不到的水平。由于自身超高的速度属性加成,一直以来都英雄联盟手游离线玩家增加,为什么留不住过来体验的王者玩家?英雄联盟手游初上线的时候,大部分王者荣耀用户第一时间下载了该游戏,将其热度推上了巅峰,很多玩家断言这会是王者荣耀分庭抗礼的手游。毕竟,王者荣耀第一批入坑的基础玩家便是从英雄联盟端游英雄连3新开发者日志视频展示动态战役设定开发商RelicEntertainment向粉丝们提供了关于即将推出的二战RTS游戏英雄连3的幕后制作信息。在最新的开发者日志中,制作团队成员谈论了游戏的动态战役地图。在战役的过程Python完成英雄联盟原话千图成像,这也太酷了千图成像用N张图片拼凑成一张图片。实现原理先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块。图库中的图片处理标记图库中每张图片的混合颜色,用于替换目标色
中国合伙人的28句正能量话,悟出道理的90都成了企业家1想一千次,不如去做一次。华丽的跌倒,胜过无谓的徘徊。2谁伤害过你,谁击溃过你,都不重要。重要的是谁让你重现笑容。3用时间和心看人,而不是用眼睛。4不要活在过去的回忆里。昨天的太阳那些我门值得去品读的话1,老鼠嘲笑猫的时候,身旁必有一个洞。2,站在山顶和站在山脚下的两人,虽然地位不同,但在对方眼里,同样的渺小。3,路的尽头,仍然是路,只要你愿意走。4,使我们不快乐的,都是一些芝麻一瓶只卖2。2元小奶的公司,一年赚了36亿,原因何在?只身闯遍天下33个国1935年,代田医生在福冈市设立代田保护菌研究所,开始卖养乐多,距今养乐多产品已经生存了82年,虽然中间一度因为二战致使原材料上涨而中断,但这家企业却一直没有倒巴菲特40年来的幕后军师,送你11条人生箴言导读他是巴菲特40年来的幕后军师,和股神巴菲特形影不离,他是比尔盖茨和巴菲特都佩服的人,巴菲特称他把自己从猩猩迅速进化成人类,他就是查理芒格。每年的伯克希尔年会上,被称为股神的沃伦我,是一切的根源一个不会游泳的人,老换游泳池是不能解决问题的一个不会做事的人,老换工作是解决不了自己的能力的一个不懂经营爱情的人,老换男女朋友是解决不了问题的一个不懂经营家庭的人,怎么换爱人都解决看的是书,读的是全世界一看的是书,读的却是世界沏的是茶,尝的却是生活斟的是酒,品的却是艰辛人生就像一张有去无回的单车票,没有彩排。每一场都是现场直播。把握好每次演出便是最好的珍惜。将生活中点滴的往事细细分享一下六项精进一付出不亚于任何人的努力认真地拼命地工作。除了拼命工作之外,世界上不存在更高明的经营诀窍。拼命工作是一切生命都在承担的义务,每天每日认真地极其认真地努力地工作,应该是我们做人最基本看你朋友圈,就知道你没见过世面以前听过一句话不要冒然评价我,你只知道我的名字,却不知道我的故事。你只听闻我做了什么,却不知道我经历过什么。其实,没有谁有权利去评价干涉他人的生活。就像翻别人朋友圈,最忌讳在人家晒经历多了,你会发现这些道理都是真的人的一生,越长大越发现,以前年少无知,不以为然的道理。直到你经历了无数的坎坷,熬过了不为人知的苦难,渡过了漫长的岁月,才会发现,当年那些不以为然的道理,是真的能够对你造成影响。年纪时间,让我们遗忘了多少人冲淡了多少朋友时间长了,不去联系,感情真的会变淡我始终很相信这句话!有些人,总是会慢慢的淡出你的世界,慢慢的在你的记忆里模糊因为时间,因为距离,因为没有联系朋友说,她的手机成了一个闹钟,电话是接因为我们不知道这些,所以犯了很多错1我喜欢香蕉,可是你给了我一车苹果,然后你说你被自己感动了,问我为什么不感动。我无言以对,然后你告诉全世界,你花光了所有的钱给我买了一车苹果,可是我却没有一点点感动,我一定是一个铁