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

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

网游玩家必备五大的FPS竞技类射击游戏竞技游戏,射击种类的节奏最快,而且画质和操控也很好。目前除了主流的CF逆战CSGO和守望先锋等,还有以下五款高画质FPS竞技射击游戏,都是网游玩家必备的作品,会有你喜欢的一款。使命永劫无间显示一直更新无法进入游戏怎么办永劫无间公测之后,满心欢喜点开游戏发现游戏登陆器一直显示更新,并且没有任何动静,没办法愉快地玩耍。上网一看有很多老哥有同样的问题,所以小编在这里整理了一些解决方法,供大家参考,有什和平精英还是武侠游戏?主播1v3使用独门绝技,天外飞仙太帅对于经常玩和平精英的小伙伴们来说,想必知道若想在游戏中取得一个较好的名次,除了要拥有比较不错的运气外,技术和操作也非常重要,毕竟从本质上来说,和平精英也是一款FPS游戏。就在不久前潜伏老外营地刺探敌情,海盗游戏ATLAS主播靠情报打胜仗在ATLAS这款以海盗为题材的Steam生存类沙盒游戏中,玩家完全可以根据自己的想法选择适合自己的玩法,如果是硬核玩家,不妨成为格斗家,探险家或者军事家,如果是比较佛系的玩家,可以赚钱小游戏2今天向大家介绍第二个赚钱小游戏我的饭店极速版这一款游戏本人试玩了九天,但是并没有像广告视频那样说的无广告,无提现标准,直接到账。我的钱包里确实显现出有钱,但是提现却要一定标准,从前羊村守护者4寒天攻击懒羊羊,木偶兽来袭,梦幻联动哈喽,大家好。在本期的羊村守护者4决战次时代中,灰太狼小灰灰父子冰释嫌隙,联手打败了影子怪兽。不过躲在暗处的boss并不甘心失败,随即建造了一台名叫寒天的机器人,命令其去收集卡牌。游戏社区新势力,小红书的用户们这么玩上个月,小红书的上的一则探店帖出了圈。在小红书上,关于出行和美食类的探店帖子随处可见,但特殊的是,这个帖子中的店并非现实中的网红店,而是摩尔庄园里的一家餐厅,因为店主用广东话招待客和平精英主播倒立洗头成真?直播现场翻车3次,实现难度极大经常观看直播的小伙伴想必知道,经常会有一些游戏主播在直播的时候,为了增加节目效果,也让自己的游戏更具挑战性,经常会增加一些比较有趣的Flag挑战,因此而翻车的主播并不在少数。就在不传奇手游新手攻略今天小编带大家了解了解这款传奇手游一传奇霸主新手攒材料攻略很多传奇老玩家熟知的上古起源装备,点点神力,大小神魔等等散人打宝,老板过瘾,一切只为激情!没有套路,没有暗坑,真正的低消费企鹅一统游戏直播的梦碎了!虎牙与斗鱼的合并被否虎牙与斗鱼的合并被否决了,企鹅一统游戏直播的碎了。如果这个结果都猜不到,那你就太小看反垄断的决心了。出于职业习惯我把3200字的原稿认真看了3遍,有几个细节让人拍案叫绝,不得不佩服王者荣耀如果只有一个ban位,你会禁哪个辅助呢?天上九头鸟,地上有火鸟。我是火鸟,每天都会给你带来王者资讯和攻略,关注我,让你上分不再难!近期几个赛季被ban最多的就是辅助了,辅助型玩儿家已经尽力在拓宽英雄池了,但是还是难免会被
亲身体验帝国神话,第一次玩果然是笑料百出亲身体验帝国神话,第一次玩果然是笑料百出!现目前全世界都受到了这款游戏的热度影响,小编身为游戏爱好者肯定是收益其冲!而且还是纯国产游戏,没有不支持的道理,可能是第一次玩这种类型的游按键皮肤继续上线,188点券到底值不值得?王者荣耀又迎来了一个大操作,在体验服中加入了按键皮肤特效,这次增加的仅有两个特效加入,还有两个英雄的按键特效此前就被爆出,这次更新后,可以说引起了很多玩家们的不适应,大家都纷纷开始白龙马确定上线,定位射手,赛季结束倒计时,两英雄迎来免费皮肤对于西游记里面的五名主角,相信绝大部分玩家都是知晓的,甚至,就算没看过,但只要经常玩王者荣耀,那么也是能耳濡目染的。毕竟,目前的游戏里面,官方可已经上线了主角团里面的孙悟空猪八戒和DK高层发文中野很有信心继续夺冠,暗示nuguri加入DK出问题DK高层发文中野很有信心继续夺冠,暗示nuguri加入DK出问题!S10的DK在夺冠之后,曾经是一度被大家认为,DK就是世界上最强的战队。甚至说在S11的EDG夺冠之前,DK的夺冠共赏芳华活动来袭!免费获得888点卷皮肤和金币英雄活动地点登录王者荣耀活动面板活动共享芳华必得皮肤天幕。活动截止时间12月8日。活动奖励随机皮肤1个随机英雄1个天幕1个荣耀积分及钻石等等。芳华礼盒通过参与5V5战斗获取,周五周日效盘点2021王者出的所有皮肤,看看你都知道哪些眼看2021年马上就要过去了,本期就带大家回顾一下2021王者出的所有皮肤,喜欢的兄弟们记得点赞支持一下谢谢大家!1月1号上线孙膑的KPL限定皮肤天狼运算者,售价472点券,活动结三款史诗皮肤即将重做,皮肤碎片留给她!黄刀吕布以后不能用了本文原创首发于公众号电竞怪客hello大家好我是怪客君今天嫦娥拒霜思已经正式上线商城啦,在怪客商店购买的小伙伴应该已经在零点准时收到了吧今天我们一起来看看这个月除了嫦娥皮肤上线外,AG季后赛一轮游,粉丝崩溃官博被爆破,月光揽下全部责任暗示下课北京时间12月2日19时,KPL秋季赛迎来了季后赛第一天比赛。最终双方鏖战五场之后来自成都的AG超玩会大比分14不敌济南RW侠,结束了自己季后赛的征程,同时也是正式无缘挑战者杯。值S26赛季更新时间确定,版本内容全面曝光,新英雄暃上架体验服你是不是还沉浸在上分的快乐当中,那么你知不知道这个赛季还剩下多长时间呢?首先来给大家讲一下本赛季的结束日期,我们只需要打开游戏,进入到战令界面,就可以看到本赛季的战令结束日期为20大富翁4,地图上的大场景,人物站上去会发生什么?大富翁4曾带给许多玩家欢声笑语,尤其是和同伴一起玩这个游戏,那就不是为了游戏取得胜利,而是想方设法的坑害同伴,同样,同伴也会想方设法的坑害你,如果是4个人一起玩,有1个被另外3个针打工模拟器大多数游戏搬砖心得推荐一款高度模拟现实题材游戏大多数,在游戏中扮演打工人,为了还清父亲债务,只身一人在深圳打工,开启搬砖生活,一个月还清1万元欠款。新手上手的时候注意和妹妹的电话。选项是天赋选择。人