admin管理员组

文章数量:1583042

第三十一章 下单接口-超时关闭订单功能设计+延迟队列实战

第1集 订单模块下单接口-支付超时订单链路设计

简介:订单模块下单接口-支付超时订单链路设计

  • 需求背景

    • 原因一:第三方支付平台的支付连接都是有时效性,创建订单后,需要再一定的时间内支付完成
      • 微信支付、支付宝支付等
      • 也可以不关闭订单,做订单二次支付的操作,但业务链路会更加复杂
    • 原因二:电商业务里面还会涉及到商品库存的锁定和释放
  • 所以多数订单业务都是会有这个功能,那如何设计呢?

第2集 RabbitMQ死信队列-延迟消息知识点回顾

简介:RabbitMQ死信队列-延迟消息知识点回顾

  • 什么是rabbitmq的死信队列
    • 没有被及时消费的消息存放的队列
  • 什么是rabbitmq的死信交换机
    • Dead Letter Exchange(死信交换机,缩写:DLX)当消息成为死信后,会被重新发送到另一个交换机,这个交换机就是DLX死信交换机。

  • 消息有哪几种情况成为死信

    • 消费者拒收消息**(basic.reject/ basic.nack)**,并且没有重新入队 requeue=false
    • 消息在队列中未被消费,且超过队列或者消息本身的过期时间TTL(time-to-live)
    • 队列的消息长度达到极限
    • 结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
  • 什么是延迟队列

    • 一种带有延迟功能的消息队列,Producer 将消息发送到消息队列 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消息
  • 业界的一些实现方式

    • 定时任务高精度轮训
    • 采用RocketMQ自带延迟消息功能
    • RabbitMQ本身是不支持延迟队列的,怎么办?
      • 结合死信队列的特性,就可以做到延迟消息
第3集 超时关单-RabbitMQ实现延迟消息配置实战

简介:超时关单-RabbitMQ实现延迟消息配置实战

  • 数据流转

  • 死信队列配置
/**
 *
 *
 * 自定义消息队列配置,
 * 发送 关单消息-》延迟exchange-》order.close.delay.queue-》死信exchange-》order.close.queue
 *
 * @Description
 * @Author
 * @Remark 
 * @Version 1.0
 **/
@Configuration
@Data
public class RabbitMQConfig {




    /**
     * 交换机
     */
    private String orderEventExchange="order.event.exchange";




    /**
     * 延迟队列, 不能被监听消费
     */
    private String orderCloseDelayQueue="order.close.delay.queue";


    /**
     * 关单队列, 延迟队列的消息过期后转发的队列,被消费者监听
     */
    private String orderCloseQueue="order.close.queue";




    /**
     * 进入延迟队列的路由key
     */
    private String orderCloseDelayRoutingKey="order.close.delay.routing.key";




    /**
     * 进入死信队列的路由key,消息过期进入死信队列的key
     */
    private String orderCloseRoutingKey="order.close.routing.key";


    /**
     * 过期时间 毫秒,临时改为1分钟定时关单
     */
    private Integer ttl=1000*60;


    /**
     * 消息转换器
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }




    /**
     * 创建交换机 Topic类型,也可以用dirct路由
     * 一般一个微服务一个交换机
     * @return
     */
    @Bean
    public Exchange orderEventExchange(){
        return new TopicExchange(orderEventExchange,true,false);
    }




    /**
     * 延迟队列
     */
    @Bean
    public Queue orderCloseDelayQueue(){


        Map<String,Object> args = new HashMap<>(3);
        args.put("x-dead-letter-exchange",orderEventExchange);
        args.put("x-dead-letter-routing-key",orderCloseRoutingKey);
        args.put("x-message-ttl",ttl);


        return new Queue(orderCloseDelayQueue,true,false,false,args);
    }




    /**
     * 死信队列,普通队列,用于被监听
     */
    @Bean
    public Queue orderCloseQueue(){


        return new Queue(orderCloseQueue,true,false,false);


    }


    /**
     * 第一个队列,即延迟队列的绑定关系建立
     * @return
     */
    @Bean
    public Binding orderCloseDelayBinding(){


        return new Binding(orderCloseDelayQueue,Binding.DestinationType.QUEUE,orderEventExchange,orderCloseDelayRoutingKey,null);
    }


    /**
     * 死信队列绑定关系建立
     * @return
     */
    @Bean
    public Binding orderCloseBinding(){


        return new Binding(orderCloseQueue,Binding.DestinationType.QUEUE,orderEventExchange,orderCloseRoutingKey,null);
    }






}


第4集 下单接口-发送延迟消息链路测试和Bug修复

简介:下单接口-发送延迟消息链路测试和Bug修复

  • 下单接口发送延迟消息
 //发送延迟消息


EventMessage eventMessage = EventMessage.builder()
                .eventMessageType(EventMessageType.RPODUCT_ORDER_NEW.name())
                .accountNo(loginUser.getAccountNo())
                .bizId(orderOutTradeNo).build();
        rabbitTemplate.convertAndSend(rabbitMQConfig.getOrderEventExchange(),rabbitMQConfig.getOrderCloseDelayRoutingKey(),eventMessage);


  • Bug修复
MQ配置 @bean注解增加


ProductOrderPayTypeEnum枚举类拼错
WECHAT_APY ->WECHAT_PAY
  • RabbitMQ配置文件
##----------rabbit配置--------------
spring.rabbitmq.host=120.79.150.146
spring.rabbitmq.port=5672
#需要手工创建虚拟主机
spring.rabbitmq.virtual-host=dev
spring.rabbitmq.username=admin
spring.rabbitmq.password=password
#消息确认方式,manual(手动ack) 和auto(自动ack); 消息消费重试到达指定次数进到异常交换机和异常队列,需要改为自动ack确认消息
spring.rabbitmq.listener.simple.acknowledge-mode=auto




#开启重试,消费者代码不能添加try catch捕获不往外抛异常
spring.rabbitmq.listener.simple.retry.enabled=true
#最大重试次数
spring.rabbitmq.listener.simple.retry.max-attempts=4
# 重试消息的时间间隔,5秒
spring.rabbitmq.listener.simple.retry.initial-interval=5000


  • 下单postman
{
  "productId":2,
  "buyNum":1,
  "clientType":"PC",
  "payType":"WECHAT_PAY",
  "totalAmount":1,
  "payAmount":1,
  "billType":"NO_BILL",
  "billHeader":"",
  "billContent":"",
  "billReceiverPhone":"",
  "billReceiverEmail":""
}
  • 查看RabbitMQ控制台
  • 查看数据库数据
第5集 下单接口-超时关闭订单消费者骨架链路开发《上》

简介:下单接口-超时关闭订单消费者骨架链路开发《上》

  • 消费者开发
@Component
@Slf4j
@RabbitListener(queuesToDeclare = {@Queue("order.close.queue")})
public class ProductOrderMQListener {




    @Autowired
    private ProductOrderService productOrderService;


    @RabbitHandler
    public void productOrderHandler(EventMessage eventMessage, Message message, Channel channel) throws IOException {
        log.info("监听到消息ProductOrderMQListener message消息内容:{}", message);
        try {
            //TODO 处理业务逻辑
            


        } catch (Exception e) {


            //处理业务异常,还有进行其他操作,比如记录失败原因
            log.error("消费失败:{}", eventMessage);
            throw new BizException(BizCodeEnum.MQ_CONSUME_EXCEPTION);
        }
        log.info("消费成功:{}", eventMessage);




    }




}
  • 消费异常队列配置 处理异常消息
@Configuration
@Slf4j
public class RabbitMQErrorConfig {




    /**
     * 异常交换机
     */
    private String orderLinkErrorExchange = "order.error.exchange";


    /**
     * 异常队列
     */
    private String orderLinkErrorQueue = "order.error.queue";


    /**
     * 异常routing.key
     */
    private String orderErrorRoutingKey = "order.error.routing.key";




    @Autowired
    private RabbitTemplate rabbitTemplate;


    /**
     * 创建异常交换机
     * @return
     */
    @Bean
    public TopicExchange errorTopicExchange(){


        return new TopicExchange(orderLinkErrorExchange,true,false);
    }


    /**
     * 创建异常队列
     * @return
     */


    @Bean
    public Queue errorQueue(){
        return new Queue(orderLinkErrorQueue,true);
    }




    /**
     * 建立绑定关系
     * @return
     */
    @Bean
    public Binding bindingErrorQueueAndExchange(){


        return BindingBuilder.bind(errorQueue()).to(errorTopicExchange()).with(orderErrorRoutingKey);
    }




    /**
     * 配置  RepublishMessageRecoverer
     *
     * 消费消息重试一定次数后,用特定的routingKey转发到指定的交换机中,方便后续排查和告警
     *
     * @return
     */
    @Bean
    public MessageRecoverer messageRecoverer(){


        return new RepublishMessageRecoverer(rabbitTemplate, orderLinkErrorExchange, orderErrorRoutingKey);
    }






}
第6集 下单接口-超时关闭订单消费者骨架链路开发《下》

简介:下单接口-超时关闭订单消费者骨架链路开发《下》

  • Service链路开发
 /**
     * //延迟消息的时间 需要比订单过期 时间长一点,这样就不存在查询的时候,用户还能支付成功
     *
     * //查询订单是否存在,如果已经支付则正常结束
     * //如果订单未支付,主动调用第三方支付平台查询订单状态
     *     //确认未支付,本地取消订单
     *     //如果第三方平台已经支付,主动的把订单状态改成已支付,造成该原因的情况可能是支付通道回调有问题,然后触发支付后的动作,如何触发?RPC还是?
     * @param eventMessage
     */
       @Override
    public boolean closeProductOrder(EventMessage eventMessage) {


        String outTradeNo = eventMessage.getBizId();
        Long accountNo = eventMessage.getAccountNo();


        ProductOrderDO productOrderDO = productOrderManager.findByOutTradeNoAndAccountNo(outTradeNo, accountNo);


        if(productOrderDO == null){
            //订单不存在
            log.warn("订单不存在");
            return true;
        }


        if(productOrderDO.getState().equalsIgnoreCase(ProductOrderStateEnum.PAY.name())){
            //已经支付
            log.info("直接确认消息,订单已经支付:{}",eventMessage);
            return true;
        }


        //未支付,需要向第三方支付平台查询状态
        if(productOrderDO.getState().equalsIgnoreCase(ProductOrderStateEnum.NEW.name())){
            //向第三方查询状态
            PayInfoVO payInfoVO = new PayInfoVO();
            payInfoVO.setPayType(productOrderDO.getPayType());
            payInfoVO.setOutTradeNo(outTradeNo);
            payInfoVO.setAccountNo(accountNo);


            //TODO 需要向第三方支付平台查询状态
            String payResult = "";


            if(StringUtils.isBlank(payResult)){
                //如果为空,则未支付成功,本地取消订单+取消微信或支付宝订单
                productOrderManager.updateOrderPayState(outTradeNo,accountNo,ProductOrderStateEnum.CANCEL.name(),ProductOrderStateEnum.NEW.name());
                log.info("未支付成功,本地取消订单:{}",eventMessage);
            }else {
                //支付成功,主动把订单状态更新成支付
                log.warn("支付成功,但是微信回调通知失败,需要排查问题:{}",eventMessage);
                productOrderManager.updateOrderPayState(outTradeNo,accountNo,ProductOrderStateEnum.PAY.name(),ProductOrderStateEnum.NEW.name());
                //触发支付成功后的逻辑, TODO


            }
        }


        return true;
    }


  • 下单和关闭订单链路测试

第三十二章 短链平台-从0教你掌握微信支付-最新V3版-准备阶段

第1集 常用的第三方支付和聚合支付平台介绍

简介:介绍常用的第三方支付和聚合支付

  • 什么是第三方支付
    • 第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对接而促成交易双方进行交易的网络支付模式
    • 通俗的例子:
      • 支付宝,微信支付,百度钱包,PayPal(主要是欧美国家)
      • 拉卡拉(中国最大线下便民金融服务提供商)
    • 优点
      • 支付平台降低了政府、企业、事业单位直连银行的成本,满足了企业专注发展在线业务的收付要求。
      • 使用方便。对支付者而言,他所面对的是友好的界面,不必考虑背后复杂的技术操作过程
    • 缺点
      • 风险问题,在电子支付流程中,资金都会在第三方支付服务商处滞留即出现所谓的资金沉淀,如缺乏有效的流动性管理,则可能存在资金安全和支付的风险
      • 电子支付经营资格的认知、保护和发展问题
  • 什么是聚合支付也叫第四方支付
    • 聚合支付是相对之前的第三方支付而言的,作为对第三方支付平台服务的拓展,第三方支付是介于银行和商户之间的,而聚合支付是介于第三方支付和商户之间
    • 出现的场景
      • 一堆第三方支付出现,并通过大量的钱补贴线上商家使用它们的支付,导致商户收银台堆满各种,POS机器,扫码设备,商户还需要去各家支付公司申请账号,结算等
      • 聚合支付产品,其实聚合的是一种支付能力(支付宝支付、微信支付、百度钱包、ApplePay……),将这些收款能力聚合在一起,统一打包提供给电商网站或一些线下商家
    • 解决的问题
      • 聚合支付公司提供的二维码,支付多种方式支付,不再是一种,各个公司的竞争,就是支付渠道和方式的支持

第2集 微信支付-支付产品介绍-让你掌握不同场景选择

简介: 微信支付-支付产品介绍-让你掌握不同场景选择

  • 微信支付

    • 官方地址:https://pay.weixin.qq/wiki/doc/api/index.html
    • 案例演示: https://pay.weixin.qq/guide/webbased_payment.shtml
  • 常用的支付方式

    • 公众号支付:JSAPI
      • 用户打开商家公众号下单,输入支付密码并完成支付后,返回商家的公众号

    • 微信支付支持完成域名ICP备案的网站接入支付功能
    • 地址: https://pay.weixin.qq/static/applyment_guide/applyment_detail_website.shtml
    • PC网站接入支付后,可以通过JSAPI支付或Native支付,自行开发生成二维码,用户使用微信“扫一扫”来完成支付
      • JSAPI支付:商家张贴收款码物料,用户打开扫一扫,扫码后输入金额,完成付款
      • Native支付:商家在系统中按微信支付协议生成支付二维码,用户扫码拉起微信收银台,确认并完成付款
  • app支付

    • 用户在商家的APP中下单,跳转到微信中完成支付,支付完后跳回到商家APP内,展示支付结果,随后通过微信支付公众号下发账单消息

第3集 【必看】微信支付-申请资料说明和商户平台介绍

简介:微信支付申请资料说明和商户平台介绍

  • 微信支付申请流程

  • 支付方向-公司创业的的盈利
    • 盈利:费率差价、非T+0结算、腾讯返点等
    • https://pay.weixin.qq/static/applyment_guide/applyment_detail_website.shtml

  • 微信商户平台
    • 提供给商家使用,用于查看交易数据,提现等信息
    • 地址:https://pay.weixin.qq
  • 微信公众号
    • 申请类型需要是【服务号】
    • https://mp.weixin.qq/
第4集 微信支付-公众号Appid和商户号绑定指引

简介:微信支付-公众号Appid和商户号绑定指引

  • 微信公众号
    • 申请类型需要是服务号
    • https://mp.weixin.qq/
    • 参数路径
      • 公众号-》设置和开发-》基本配置-》appid: wx5beac15ca207c40c
  • 微信商户平台
    • 提供给商家使用,用于查看交易数据,提现等信息
    • 地址:https://pay.weixin.qq
    • 将appid和商户号绑定
      • 去微信商户平台

第5集 微信支付接入相关参数和证书申请操作指引

简介:微信支付接入相关参数和证书申请操作指引

  • 多数是没这个资质的和商户平台的,这个几集视频是告诉大家线上操作流程

    • 如果你们有资质就可以实操,没资质就可以跳过这个安装配置申请,非必要技术
  • 参数说明

    • 公众号

      • appid: wx5beac15ca207c40c
    • 商户平台

      • API安全

        • API证书(文档有操作指引)

          • 以下两种情况将使用该API证书证实商户身份,需妥善保管防止泄露:

            - API V2中,调用微信支付安全级别较高的接口(如:退款、企业红包、企业付款)

            - API V3中,调用微信支付所有接口

        • APIv2密钥(旧api)

        • APIv3密钥 (新api)

          • vIOIOx97ZT6952MFZj3PXXxKAQnqC1of
  • 证书申请流程讲解(如果失效,去微信支付文档查看最新的操作)

    • https://kf.qq/faq/161222NneAJf161222U7fARv.html
    • 证书文件说明
      • apiclient_cert.p12 :私钥信息的证书文件,win下可双击导入
      • apiclient_cert.pem:商户证书,封装了公钥
      • apiclient_key.pem: 商户证书,封装了私钥
第6集 【必看】个人接入微信支付V3版操作

简介:【必看】个人接入微信支付V3版操作

  • 个人接入微信支付V3版参数(**临时参数,用的时候会失效 **)

    • 公众号:appid: wx5beac15ca207c40c
    • 商户平台
      • 商户号:1601644442
      • APIv3密钥:peYcTwRF581UOdaUqoPOeHzJ8FgHgsnJ
      • 证书序列号:7064ADC5FE84CA2A3DDE71A692E39602DEB96E61
      • 证书文件:本章本集的资料里面(不可用 示例而已)

    到了公司里面 财务或产品 会给准备好,直接替换代码里面的参数就可以了。

第三十三章 密码安全-对称加密和非对称加密技术你知道多少

第1集 安全攻防-密码学的那些事情-对称和非对称介绍

简介:网络攻防-密码学的那些事情-对称和非对称介绍

  • 信息安全目标

  • 常见加密算法的分类

  • 对称加密

优点:操作比较简单,加密速度快, 秘钥简单    
缺点:秘钥一旦被窃取,信息会暴露,安全性不高 
场景:消息发送方需要加密大量数据时使用   
常见的算法:    
DES: 全称:Data Encryption Standard,现已被破解    

3DES:全称: Triple Data Encryption Algorithm, 暂时未被破解     
解释:  3DES 是在 DES 基础算法上的改良,该算法可向下兼容 DES 加密算法,但计算性能不高,暂时还未被破解 
  
AES:  全称:Advanced Encryption Standard,暂未被破解
  • 非对称加密

注意:非对称加密具有双向性,即公钥和私钥中的任一个均可用作加密,此时另一个则用作解密

解释:加密与解密的过程不是对称的,不是用的同一个秘钥,一把是公钥,一把是私钥,在加密的时候,用公钥去加密,接收方再用对应的私钥去解密  

优点:安全性更高,公钥是公开的,秘钥是自己保存的,不需要将私钥给别人。 

缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密
  
场景: 数字签名与验证 

常见的算法:RSA,DSA,ECC等,ECC也是比特币底层用的比较多的算法

第2集 安全攻防-数据完整性的保障方案-数据摘要

简介:安全攻防-数据完整性的保障方案数据摘要

  • Hash算法-单项加密

加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,密文无法解密。
只有重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新识别后,才能真正解密   

算法:MD5/SHA1/SHA224/SHA256/

优点:快速计算,具有单向性 one-way,不可由散列值推出原消息

场景:文件完整性校验和(Checksum)算法、常规密码等


对称加密和非对称加密有秘钥,而只有hash摘要算法,没有秘钥
  • 彩虹表暴力破解
    • 网站:https://www.cmd5/
    • 密码存储常用方式
      • 双重MD5
      • MD5+加盐
      • 双重MD5+加盐
    • 有些人会说为啥不直接用最强的Hash加密算法 ?
      • 更安全的算法,加密解密更复杂,接口性能下降更严重
第3集 对称加密和非对称加密 混合使用的例子

简介:对称加密和非对称加密 混合使用的例子

  • 总结

    • 对称加密:操作比较简单, 加密速度快, 秘钥简单如果泄露就危险
    • 非对称加密:安全性更高,加解密复杂,但是加解密速度慢
  • 业界比较多的是是对称加密和非对称加密结合使用

  • 业界很多这样的应用,比如HTTPS

    HTTPS非对称加密只作用在证书验证阶段
    
    
    内容传输的加密上使用的是对称加密
    
    
    既保证了秘钥的安全性,又保证了后继数据传输的数据加解密的性能
    
    • 更多https知识可以搜索博文,通过上面的例子,就很容易看懂HTTPS的文章了
第4集 HTTPS知识扩展和支付平台里面非对称加密和对称加密的应用

简介:HTTPS知识扩展和支付平台里面非对称加密和对称加密的应用

  • 平台的选择
    • 支付宝和微信支付加密方式:采用RSA非对称加密+对称加密混合使用
      • 商户应用和支付平台通信-都是采用HTTPS通信(CA机构+SSL证书)

  • 业务参数使用非对称加密通讯:私钥加密-公钥解密

第三方支付平台多数都是采用非对称加密

  • 支付宝/微信支付的例子

    商家服务器和支付宝/微信服务器交互的过程中传输的信息,防止中间人对于信息的篡改.
    
    签名可以验证一条消息的真实性,sign参数用来填写签名,有效的防止消息在传递过程中被篡改
    
  • 为啥需要两套公钥和私钥

    • 提供了两套 RSA 加密
      • 一套是用来保证步骤 【统一下单】时的信息安全
      • 另一套是用来保证支付平台回调时的信息安全

第三十四章 微信支付-业务流程时序图和依赖配置

第1集 微信支付-Native支付产品文档流程梳理

简介:微信支付-Native支付产品文档流程梳理

  • 文档地址(失效的话百度下,官方改版频繁)
    • https://pay.weixin.qq/wiki/doc/apiv3/open/pay/chapter2_7_0.shtml
  • 接入指引
    • 接入前支付参数准备
    • 项目开发指引
      • 据自身开发语言,选择对应的开发库并构建项目,添加依赖
      • 创建加载商户私钥、加载平台证书、初始化httpClient的通用方法
      • 开发API进行测试
        • 签名生成
        • 签名验证
        • 敏感信息加解密
        • merchantPrivateKey(私钥)
        • wechatpayCertificates(平台证书)
        • APIV3Key(使用)

上面的是具体代码开发的细节

  • 问题:很多同学可能都不知道交互流程,我们的代码和微信是怎样通信的
  • 答案:跟着我走,带你看下整体交互时序图
第2集 架构师必备技能-业务流程时序图知识回顾

简介:架构师必备技能-业务流程时序图知识回顾

  • 曾几何时,大学老师辛苦讲的《软件工程课程》很多同学忘记了一干二净了

什么是时序图

  • 是一种UML交互图,描述了对象之间传递消息的时间顺序, 用来表示用例中的行为顺序, 是强调消息时间 顺序的交互图; 又名序列图、顺序图
  • 通俗解释:就是交互流程图 (把大象装冰箱分几步)
  • 时序图包括四个元素
    • 对象(Object)
      • 时序图中的对象在交互中扮演的角色就是对象,使用矩形将对象名称包含起来, 名称下有下划线
    • 生命线(Lifeline)
      • 生命线是一条垂直的虚线, 这条虚线表示对象的存在, 在时序图中, 每个对象都有生命线
    • 激活(Activation)
      • 代表时序图中对象执行一项操作的时期, 表示该对象被占用以完成某个任务,当对象处于激活时期, 生命线可以拓宽为矩形
    • 消息(Message)
      • 对象之间的交互是通过相互发消息来实现的,箭头上面标出消息名,一个对象可以请求(要求)另一个对象做某件事件
      • 消息从源对象指向目标对象,消息一旦发送便将控制从源对象转移到目标对象
      • 消息的阅读顺序是【严格自上而下】
      • 消息交互中的【实线:请求消息】
      • 消息交互中的【虚线:响应返回消息】
      • 自己调用自己的方法:反身消息
  • 再自己根据老师的讲解,去核对下流程

第3集 微信支付-交互业务时序图详细讲解实战

简介:微信支付-交互业务时序图详细讲解实战

  • 业务架构流程图

  • 细化到支付业务时序图(上图的2、4、5、8步骤)

第4集 微信支付-Maven依赖加入和代码参数准备

简介:微信支付-Maven依赖加入和代码参数准备

  • 参数加入【群公告获取最新的】
#商户号
pay.wechat.mch-id=1601644442
#公众号id 需要和商户号绑定
pay.wechat.wx-pay-appid=wx5beac15ca207c40c
#商户证书序列号,需要和证书对应
pay.wechat.mch-serial-no=7064ADC5FE84CA2A3DDE71A692E39602DEB96E61
#api密钥
pay.wechat.api-v3-key=peYcTwRF581UOdaUqoPOeHzJ8FgHgsnJ


#商户私钥路径(微信服务端会根据证书序列号,找到证书获取公钥进行解密数据)
pay.wechat.private-key-path=classpath:/cert/apiclient_key.pem
#支付成功页面跳转
pay.wechat.success-return-url=https://class
#支付成功,回调通知
pay.wechat.callback-url=http://api.open1024/shop-server/api/callback/order/v1/wechat
  • 证书配置加入
  • Maven依赖加入
    • 微信支付API v3的Apache HttpClient扩展,实现了请求签名的生成和应答签名的验证。
    • 使用说明 https://github/wechatpay-apiv3/wechatpay-apache-httpclient
<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-apache-httpclient</artifactId>
    <version>0.3.0</version>
</dependency>
第5集 微信支付-商户私钥证书代码读取开发实战

简介:微信支付-商户私钥证书代码读取开发实战

  • java加载商户证书私钥
    • 如果下面链接打开慢就不用打开 https://github/wechatpay-apiv3/wechatpay-apache-httpclient
    • 商户申请商户API证书时,会生成商户私钥,并保存在本地证书文件夹的文件apiclient_key.pem中。
    • 商户开发者可以使用方法PemUtil.loadPrivateKey()加载证书
# 示例:私钥存储在文件
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
        new FileInputStream("/path/to/apiclient_key.pem"));


# 示例:私钥为String字符串
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
        new ByteArrayInputStream(privateKey.getBytes("utf-8")));
  • 代码读取私钥实战 PayBeanConfig
    /**
     * 加载秘钥
     * @param payConfig
     * @return
     * @throws IOException
     */
    
    private PrivateKey getPrivateKey() throws IOException {
        InputStream inputStream = new ClassPathResource(payConfig.getPrivateKeyPath()
                .replace("classpath:", "")).getInputStream();


        String content = new BufferedReader(new InputStreamReader(inputStream))
                .lines().collect(Collectors.joining(System.lineSeparator()));


            try {
                String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
                        .replace("-----END PRIVATE KEY-----", "")
                        .replaceAll("\\s+", "");
                KeyFactory kf = KeyFactory.getInstance("RSA");


                PrivateKey finalPrivateKey = kf.generatePrivate(
                        new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));


                return finalPrivateKey;


            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException("当前Java环境不支持RSA", e);
            } catch (InvalidKeySpecException e) {
                throw new RuntimeException("无效的密钥格式");
            }
    }

第6集 微信支付-APIv3证书与密钥使用说明文档

简介: 微信支付-APIv3证书与密钥使用说明文档

  • 之前的说过的应用和支付平台的交互图

  • 微信签名和验签的交互图(商户证书和平台证书的使用说明)

  • 目前我们有商户自己的私钥和公钥,那微信平台的证书里公钥我们怎么获取???

微信平台证书公钥获取方式

  • 避免平台证书过期,微信提供了定时更新平台证书功能
  • 地址经常改内容 https://github/wechatpay-apiv3/wechatpay-apache-httpclient
    • 我们在【本章本集】把资料文档下载下来了
第7集 微信支付-基于SDK二次封装HttpClient和证书管理实战

简介:微信支付-基于SDK二次封装HttpClient和证书管理

  • 代码封装实战
    /**
     * 定时获取微信签名验证器,自动获取微信平台证书(证书里面包括微信平台公钥)
     *
     * @return
     */
    @Bean
    public ScheduledUpdateCertificatesVerifier getCertificatesVerifier() throws IOException {


        // 使用定时更新的签名验证器,不需要传入证书
        ScheduledUpdateCertificatesVerifier verifier = null;
            verifier = new ScheduledUpdateCertificatesVerifier(
                    new WechatPay2Credentials(payConfig.getMchId(),
                            new PrivateKeySigner(payConfig.getMchSerialNo(),
                                    getPrivateKey())),
                    payConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8));


        return verifier;
    }




    /**
     * 获取http请求对象,会自动的处理签名和验签,
     * 并进行证书自动更新
     *
     * @return
     */
    @Bean("wechatPayClient")
    public CloseableHttpClient getWechatPayClient(ScheduledUpdateCertificatesVerifier verifier) throws IOException {
        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                .withMerchant(payConfig.getMchId(),payConfig.getMchSerialNo() , getPrivateKey())
                .withValidator(new WechatPay2Validator(verifier));


        // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
        CloseableHttpClient httpClient = builder.build();


        return httpClient;
    }




第8集 微信支付-SDK定时更新微信平台证书源码解读

简介:微信支付-SDK定时更新微信平台证书源码解读

  • 微信签名和验签的交互图(商户证书和平台证书的使用说明)

  • 个人接入微信支付V3版参数
    • 公众号:appid: wx5beac15ca207c40c

    • 商户平台

      • 商户号:1601644442

      • APIv3密钥:peYcTwRF581UOdaUqoPOeHzJ8FgHgsnJ

      • 证书序列号:7064ADC5FE84CA2A3DDE71A692E39602DEB96E61

      • 证书文件:
        andardCharsets.UTF_8));

        return verifier;
        }

      /**

      • 获取http请求对象,会自动的处理签名和验签,

      • 并进行证书自动更新

      • @return
        */
        @Bean(“wechatPayClient”)
        public CloseableHttpClient getWechatPayClient(ScheduledUpdateCertificatesVerifier verifier) throws IOException {
        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
        .withMerchant(payConfig.getMchId(),payConfig.getMchSerialNo() , getPrivateKey())
        .withValidator(new WechatPay2Validator(verifier));

        // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
        CloseableHttpClient httpClient = builder.build();

        return httpClient;
        }

第8集 微信支付-SDK定时更新微信平台证书源码解读

简介:微信支付-SDK定时更新微信平台证书源码解读

  • 微信签名和验签的交互图(商户证书和平台证书的使用说明)

  • 个人接入微信支付V3版参数
    • 公众号:appid: wx5beac15ca207c40c
    • 商户平台
      • 商户号:1601644442
      • APIv3密钥:peYcTwRF581UOdaUqoPOeHzJ8FgHgsnJ
      • 证书序列号:7064ADC5FE84CA2A3DDE71A692E39602DEB96E61
      • 证书文件:

本文标签: 生成器数据处理海量链接平台