当前位置:首页 > 科技  > 软件

微信支付V3版本集成详解【避坑指南】

来源: 责编: 时间:2023-11-18 09:36:12 475观看
导读最近对项目中的微信支付功能做了升级,之前使用的是V2版本。V2版本目前还可以使用,但已暂停更新。V3版本的集成,官方文档还是比较清晰的,但各类的配置,一个不小心就掉坑里半天爬不出来。趁着思路清晰,特此记录一下。V2版本参

2QI28资讯网——每日最新资讯28at.com

最近对项目中的微信支付功能做了升级,之前使用的是V2版本。V2版本目前还可以使用,但已暂停更新。V3版本的集成,官方文档还是比较清晰的,但各类的配置,一个不小心就掉坑里半天爬不出来。趁着思路清晰,特此记录一下。2QI28资讯网——每日最新资讯28at.com

V2版本参数格式是xml格式,不太好维护,V3版本已改成json格式。2QI28资讯网——每日最新资讯28at.com

V2版本的签名是拼在参数里面的,V3版本校验都放在配置类里面了,更加方便灵活。2QI28资讯网——每日最新资讯28at.com

前置条件

官方文档:
https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml2QI28资讯网——每日最新资讯28at.com

1、微信开放平台 – APP支付

  • 注册APP,获取appId appSecret等信息

2、微信公众平台 – (微信公众号 小程序) 微信内支付

  • 开通账号,申请支付功能,绑定商户平台
  • 配置域名等

3、浏览器H5支付

  • 申请权限:微信支付商户平台—>产品中心—>H5支付—>申请开通
  • 配置:产品中心—>开发配置—>H5支付

4、微信商户平台

  •  商户号
  • API证书密钥及证书序列号

2QI28资讯网——每日最新资讯28at.com

  • API v3密钥

2QI28资讯网——每日最新资讯28at.com

代码集成

微信提供两种集成方式:wechatpay-java(推荐);wechatpay-apache-httpclient,以推荐的方式为例:2QI28资讯网——每日最新资讯28at.com

<dependency>  <groupId>com.github.wechatpay-apiv3</groupId>  <artifactId>wechatpay-java</artifactId>  <version>0.2.5</version></dependency>

配置初始化 – 加载微信支付平台证书

使用自动更新平台证书的配置类 RSAAutoCertificateConfig。注:每个商户号只能创建一个 RSAAutoCertificateConfig。2QI28资讯网——每日最新资讯28at.com

代码实现,将配置交由Spring统一管理,单例模式保证初始化一次。2QI28资讯网——每日最新资讯28at.com

@Configurationpublic class WXPayConfig {    private Config config;    @PostConstruct    public void init(){        config =                new RSAAutoCertificateConfig.Builder()                        .merchantId(WXPayConstants.MCHID)                        .privateKey(WXPayConstants.PRIVATE_KEY)                        .merchantSerialNumber(WXPayConstants.MERCHANT_SERIAL_NUMBER)                        .apiV3Key(WXPayConstants.API_V3_KEY)                        .build();    }    @Bean("h5Service")    public H5Service getH5Service(){        // H5支付        return new H5Service.Builder().config(config).build();    }    @Bean("jsService")    public JsapiServiceExtension getJsService(){        // 微信js支付        return new JsapiServiceExtension.Builder()                        .config(config)                        .signType("RSA") // 不填则默认为RSA                        .build();    }    @Bean("appService")    public AppServiceExtension getAppService() {        // App支付        return new AppServiceExtension.Builder().config(config).build();    }    @Bean("NotificationParser")    public NotificationParser getNotificationParser(){        // 支付回调的解析器        return new NotificationParser((NotificationConfig)config);    }}

获取支付请求信息

APP下单

/** * 获取微信支付参数(APP) */public WechatPayDTO getWechatAppPayParam(BigDecimal money, String orderNumber, String notifyUrl) throws Exception {    // 下单    com.wechat.pay.java.service.payments.app.model.PrepayRequest request = new com.wechat.pay.java.service.payments.app.model.PrepayRequest();    com.wechat.pay.java.service.payments.app.model.Amount amount = new com.wechat.pay.java.service.payments.app.model.Amount();    amount.setTotal(Integer.parseInt(totalFee(money)));    amount.setCurrency("CNY");    request.setAmount(amount);    request.setAppid(WXPayConstants.APPID);    request.setMchid(WXPayConstants.MCHID);    request.setDescription("");    request.setNotifyUrl(notifyUrl);    request.setOutTradeNo(orderNumber);    com.wechat.pay.java.service.payments.app.model.PrepayWithRequestPaymentResponse response = appService.prepayWithRequestPayment(request);    return WechatPayDTO.builder()            .appid(response.getAppid())            .partnerid(response.getPartnerId())            .prepayid(response.getPrepayId())            .packageVal(response.getPackageVal())            .timestamp(response.getTimestamp())            .noncestr(response.getNonceStr())            .sign(response.getSign())            .build();}

公众号 小程序下单

/** * 获取微信支付参数(公众号 小程序) */public WechatPayDTO getWechatJSAPIPayParam(String openid, BigDecimal money, String orderNumber, String notifyUrl) throws Exception {    // 下单    com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest request = new com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest();    com.wechat.pay.java.service.payments.jsapi.model.Amount amount = new com.wechat.pay.java.service.payments.jsapi.model.Amount();    amount.setTotal(Integer.parseInt(totalFee(money)));    amount.setCurrency("CNY");    request.setAmount(amount);    request.setAppid(WXPayConstants.PUBLIC_APPID);    request.setMchid(WXPayConstants.MCHID);    request.setDescription("");    request.setNotifyUrl(notifyUrl);    request.setOutTradeNo(orderNumber);    Payer payer = new Payer();    payer.setOpenid(openid);    request.setPayer(payer);    PrepayWithRequestPaymentResponse response = jsService.prepayWithRequestPayment(request);    logger.info("JS支付参数:{}", response.toString());    return WechatPayDTO.builder()            .appid(response.getAppId())            .packageVal(response.getPackageVal())            .timestamp(response.getTimeStamp())            .noncestr(response.getNonceStr())            .signType(response.getSignType())            .paySign(response.getPaySign())            .build();}

H5下单

/**  * 获取微信H5支付连接	*/public String getWechatH5PayUrl(BigDecimal money, String orderNumber, String notifyUrl) {      // 下单      PrepayRequest request = new PrepayRequest();      Amount amount = new Amount();      amount.setTotal(Integer.parseInt(totalFee(money)));      amount.setCurrency("CNY");      request.setAmount(amount);      SceneInfo sceneInfo = new SceneInfo();      sceneInfo.setPayerClientIp("");      request.setSceneInfo(sceneInfo);      request.setAppid(WXPayConstants.PUBLIC_APPID);      request.setMchid(WXPayConstants.MCHID);      request.setDescription("");      request.setNotifyUrl(notifyUrl);      request.setOutTradeNo(orderNumber);      // 调用接口      PrepayResponse response = h5Service.prepay(request);      return response.getH5Url();}

支付回调

获取 HTTP 请求头中的以下值,构建 RequestParam 。2QI28资讯网——每日最新资讯28at.com

  • Wechatpay-Signature
  • Wechatpay-Nonce
  • Wechatpay-Timestamp
  • Wechatpay-Serial
  • Wechatpay-Signature-Type

获取 HTTP 请求体 body。切记不要用 JSON 对象序列化后的字符串,避免验签的 body 和原文不一致。2QI28资讯网——每日最新资讯28at.com

根据解密后的通知数据数据结构,构造解密对象类 DecryptObject 。支付结果通知解密对象类为 Transaction,退款结果通知解密对象类为 RefundNotification2QI28资讯网——每日最新资讯28at.com

初始化 RSAAutoCertificateConfig(已在前文统一初始化)。2QI28资讯网——每日最新资讯28at.com

初始化 NotificationParser(已在前文统一初始化)。2QI28资讯网——每日最新资讯28at.com

使用请求参数 requestParam 和 DecryptObject.class ,调用 parser.parse 验签并解密报文。2QI28资讯网——每日最新资讯28at.com

RequestParam requestParam = new RequestParam.Builder()      .serialNumber(request.getHeader("Wechatpay-Serial"))      .nonce(request.getHeader("Wechatpay-Nonce"))      .signature(request.getHeader("Wechatpay-Signature"))      .timestamp(request.getHeader("Wechatpay-Timestamp"))      .signType(request.getHeader("Wechatpay-Signature-Type"))      .body(body)      .build();Transaction transaction = notificationParser.parse(requestParam, Transaction.class);if (Objects.equals(transaction.getTradeState(), Transaction.TradeStateEnum.SUCCESS)){  //处理业务逻辑  //通知微信支付成功  wechatPayUtil.paySuccessful(response);}

本文链接:http://www.28at.com/showinfo-26-28348-0.html微信支付V3版本集成详解【避坑指南】

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 十个令人惊叹的Go语言技巧,让你的代码更加优雅

下一篇: 要摘掉“看门人”帽子,苹果、Meta、字节跳动等向欧盟提起上诉

标签:
  • 热门焦点
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    7月20日消息,据外媒报道,研究机构的报告显示,在全球智能手机出货量同比仍在下滑的大背景下,印度这一有潜力的市场也未能幸免,出货量同比也有下滑,多家厂
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
Top