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

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

游戏体验差,后期优化不佳,导致LOLM玩家大批弃坑最近LOLM的热度出现了明显的下跌,和之前刚上线时候的轰轰烈烈形成了明显的对比。事实证明,情怀只能卖一阵儿,游戏还得看品质。如今大批LOLM玩家陆续出走,只能证明,这款游戏确实和玩八十发抽到4把SSR?幻塔良心卡池设计获玩家好评幻塔公测已经过去好几天了,但是游戏的热度却在持续走高,这除了游戏本身质量过硬以外,也离不开游戏项目组的良心运营。尤其是对于游戏的抽卡设计,很多玩家都给出了好评,甚至还有玩家晒出了八如何看待iG世界赛夺冠六人已确定全部离队?作为IG粉丝,我或许该承认,我喜欢IG,是因为rookie,也只有rookie,其他的IG选手属于捎带着一起的。但看到这个转会期的IG,意难平还是是肯定多少有一点的。但同时,我也钦幻塔PVE武器怎么搭配?PVE武器搭配攻略分享幻塔PVE武器怎么搭配?在幻塔中如果想要提升输出就要做好武器的搭配,很多小伙伴还不清楚PVE武器要怎么配,今天为大家带来了幻塔PVE武器搭配攻略分享,一起来看看吧。幻塔PVE武器搭永劫无间龙困浅滩?TeamCC仅用两周12局就夺得了积分榜第三名提起永劫无间这一款游戏,2021年的端游市场上可谓是火的一塌糊涂。虽然是新游戏,但是凭借游戏自身的魅力和游戏独特的竞技机制,受到了不少玩家的好评。如今游戏玩家与日俱增,因此永劫无间全新一代硬核塔防!魔兽争霸3梦西游2大圣归来战九九八十一难魔兽争霸官方对战平台的推荐还挺人性化的,知道我平时玩英灵传说比较多,推荐的游戏都是塔防自走棋类型的,这个梦西游2就排在推荐列表第一个,看介绍都是西游记里的角色,玩着有种怀旧感。作为脑航员2游戏开发商正在同步制作多款游戏近日,脑航员2的游戏开发商DoubleFine在社交平台的官方账号上发布消息称,团队正在同步开发多款游戏,每款游戏都将拥有新的视觉风格与玩法。据悉,早在今年初时,DoubleFin冒险岛新人入坑指南二(支援系统500攻略)(后篇P3)勇士部落过去的方法金银岛任一村庄,点击屏幕左上角的快速移动,选出租车,然后就可以传送到勇士部落了。1。酋长接岩山猎手和怪脾气的酋长去打野猪,完成之后吃回城卷轴回去交任务2。斯密斯接原神2。4版本原石汇总,月卡玩家极限1。4万原石,甘雨小保底有了派蒙又开始了新一轮原石计算,抽甘雨的小伙伴准备好了么?冻梨没耐心的可以直接翻到底部看结果(分0氪月卡纪行)。先来简单过一遍2。4版本涉及原石产出的大体内容璃月港一年一度的海灯节开启砍王归来!学院永恩成型可弑神!云顶金铲铲之战关注我,吃鸡更有办法金铲铲之战版本11。24b学院永恩成员组成永恩拉克丝蕾欧娜悠米布隆娜迦菲奥娜(卡莎)塔里克(有学院转,下塔里克,上卡特琳娜。)羁绊4学院2挑战2学者2保镖科技考梦幻西游伦总喜提全服第一谛听,丝叔喷二狗全场不野兽大家好!我是胖虎,胖虎看西游每天带来武神坛风云动态,观神豪,鉴神器。伦总喜提全服第一谛听在武神坛激战正酣之时,伦总的13技能谛听可以打须弥兽决了。伦总亲自操刀,一本须弥下去,打掉了
畅销前三!幻塔给出另一种开放世界新答案12月16日,外界讨论了快一年的幻塔手游终于公测,首发即登顶iOS免费榜跻身畅销榜第6。之后人气不减,次日更是直接冲入前三名,这款曾经不那么二的手游终于获得了玩家的认可。之前Gam暮影战神火爆开启中大家好,给大家推荐一款新游暮影战神,这款游戏还原当年华夏大陆端游版本,由专业团队倾情巨献,火爆上市,梦回华夏,诸神再战,快来和我一起守护华夏大陆吧!暮影战神为了让玩家都可以体验到最小熊能有什么坏心思呢?这部低成本游戏的繁荣,能救恐怖游戏吗?要说恐怖游戏,应该算得上游戏界中的夕阳产业了,如今绝大多数要么销声匿迹,要么是在挂羊头卖狗肉。像是零系列,表面让你驱鬼驱灵,实际全是美女福利。而广受好评的寂静岭,坟头草高到连墓碑都LOL新人上单遭到毒打,创下德杯最低伤害纪录!全场仅打出649输出各位LPL的观众和英雄联盟召唤师大家好,这里是天下游戏汇。德玛西亚杯小组赛阶段的所有比赛全部结束了,最终也决出了四支可以晋级八强的队伍,而在这四天的比赛中,几乎每天都有让观众印象深逃离塔科夫新人去哪里搜物资好?如何提升搜物资的效率?逃离塔科夫删档更新了,全部人回归同一起跑线的现状也引来了不少新人入坑。同一张地图,对于老玩家来说熟悉得犹如自家后花园,而对新玩家更像是龙潭虎穴,那么逃离塔科夫新人去哪里搜物资好?如赛尔号尘封已久的神秘,30米币的忠诚!火魔至尊历年进化史如果说赛尔号曾经有很多只精灵留下了姓名,今天我所讲的,可以说是看到了策划对亲儿子精灵和普通米币精灵的差异,让玩家也知道,为什么后面能留下的米币精灵,总是以前就很厉害的存在赫尔托克说王者荣耀神秘主播桑杰终露脸!这颜值在主播圈中能排第几?对于喜欢在王者荣耀里面对战的玩家们,相信也是很喜欢在各个直播平台中,观看主播进行游戏的,在主播们的直播中,我们不仅可以与主播进行娱乐互动,时不时还能一起开车,在峡谷中组队,更重要的帝国神话驯马相关作者NGALaHeeHeeHello,大家好,我们玩帝国神话已经快一个月了,相信大家都对这个游戏爱不释手,今天好运来教大家如何分辨,驯服神驹。首先讲解一下什么是神驹,众所周知,帝国重建半藏帝国代价究竟是什么守望先锋那些你尚未明白的彩蛋守望先锋最让人无法拒绝的就是游戏中,不管是地图还是英雄本身,都有着大大小小的彩蛋。不管是听到语音彩蛋的对话,还是自我发现的地图彩蛋,都会浮想翩翩惊喜不断。所以今天我就来盘点一下,我帝国时代4设计总监已从RelicEntertainment离职从1998年就在RelicEntertainment工作的帝国时代4设计总监QuinnDuffy最近被曝已离职,其领英的资料显示上周六他就已离开了原工作室。关于离职,QuinnDu科技枪回血流泰隆,伤害与回复兼备,搭配帝国堪比热门上分阵容云顶之弈11。25版本更新再次延迟,原本应该在本周中更新的新版本又流产,玩家们必须在无聊的11。24B版本再度过一个周的时间。自从S6版本登录国服以来,版本更新延迟已经成为了常态,