【微信小程序】微信支付接入全流程

news2025/1/20 3:52:50

一. 前置条件

  • 接入支付首先得需要有企业资质,并开通企业对公户
  • 注册微信支付并进行对公户打款认证

二. 开始接入

1. 下载微信支付的AP证书微信支付API证书管理

2. 服务端接入微信支付

2.1 引入相关maven配置

<dependency>
   <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-miniapp</artifactId>
    <version>${wechat.sdk.version}</version>
</dependency>
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-pay</artifactId>
    <version>${wechat.sdk.version}</version>
</dependency>

2.2 配置小程序相关信息

#微信支付配置
wx.pay.appId=xxxxxxxxxxxxxxxx
wx.pay.mchId=xxxxx
wx.pay.mchKey=xxxxxxxxxxxxxxxxx
wx.pay.keyPath=classpath:xxxxxxx.p12

2.3 相关配置类文件代码编写

WxPayConfiguration.java

package com.xxxxx;

import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@ConditionalOnClass(WxPayService.class)
@EnableConfigurationProperties(WxPayProperties.class)
@AllArgsConstructor
public class WxPayConfiguration {
  private WxPayProperties properties;

  @Bean
  @ConditionalOnMissingBean
  public WxPayService wxService() {
    WxPayConfig payConfig = new WxPayConfig();
    payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
    payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
    payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
    payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));

    // 可以指定是否使用沙箱环境
    payConfig.setUseSandboxEnv(false);

    WxPayService wxPayService = new WxPayServiceImpl();
    wxPayService.setConfig(payConfig);
    return wxPayService;
  }

}

WxPayProperties.java

package com.xxxxx

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "wx.pay")
public class WxPayProperties {
  /**
   * 设置微信公众号或者小程序等的appid
   */
  private String appId;

  /**
   * 微信支付商户号
   */
  private String mchId;

  /**
   * 微信支付商户密钥
   */
  private String mchKey;

  /**
   * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
   */
  private String keyPath;

  /**
   * 回调地址
   */
  private String notifyUrl;

}

2.4 下单退款API接入

package com.xxxxx

import com.alibaba.fastjson.JSON;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.xxxxx.CustomException;
import com.xxxxx.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class WechatPayRepository {

    @Autowired
    private WxPayService wxPayService;

    /**
     * 统一下单 发起微信支付
     * @param request
     * @return
     */
    public WxPayMpOrderResult createOrder(WxPayUnifiedOrderRequest request) {
        try {
            return wxPayService.createOrder(request);
        } catch (WxPayException e) {
            log.error("微信发起支付失败: {}", e);
            throw new CustomException(ResultCode.WECHAT_PAY_CREATE_ORDER_ERROR);
        }
    }

    /**
     * 解析支付结果通知
     * @param xmlData
     * @return
     */
    public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) {
        try {
            return wxPayService.parseOrderNotifyResult(xmlData);
        } catch (WxPayException e) {
            log.error("微信支付回调解析失败: {}", e);
            throw new CustomException(ResultCode.WECHAT_PAY_PARSE_ERROR);
        }
    }



    /**
     * 退款
     * @param request
     * @return
     */
    public WxPayRefundResult refund(WxPayRefundRequest request) {
        try {
            log.info("微信发起退款: {}", JSON.toJSONString(request));
            return wxPayService.refund(request);
        } catch (WxPayException e) {
            if("INVALID_REQUEST".equals(e.getErrCode()) && "订单已全额退款".equals(e.getErrCodeDes())) {
                return null;
            }
            log.error("微信发起退款失败: {}", e);
            throw new CustomException(ResultCode.WECHAT_PAY_REFUND_ERROR);
        }
    }
}

3. 小程序端接入支付

wx.requestPayment({
 timeStamp: timeStamp,
 nonceStr: nonceStr,
 package: packageValue,
 signType: signType,
 paySign: paySign,
 success(res) {
   wx.reLaunch({
     url: '/xxx/xxx'
   });
 },
 fail(res) { }
})
  • 贴上每个参数的说明
    微信小程序支付参数说明

4. 至此,小程序的微信支付接入完成了,是不是so easy。

三. 体验更多

想体验更多小程序的功能,欢迎扫以下的小程序码,博主自研产品,捧个场,感谢Thanks♪(・ω・)ノ
飞鸽投递

下一期想讲解哪一部分,欢迎评论区留言 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx内存池(二)——小块内存分配

内存分配源代码&#xff1a; void * ngx_palloc(ngx_pool_t *pool, size_t size) { #if !(NGX_DEBUG_PALLOC)if (size < pool->max) { // 用内存池分配内存return ngx_palloc_small(pool, size, 1);} #endif// mallocreturn ngx_palloc_large(pool, size); }static ngx_…

对话风变科技 CTO|从线上教育服务商到教育资源供给平台,风变背后的第二增长曲线思维

Authing 是用户中心团队&#xff0c;我们是业务系统&#xff0c;大家冲刺一个目标、再做合并&#xff0c;然后让基于多租户的 B 端产品成功上线。那个阶段刚好有个客户卡在当时的时间点&#xff0c;一定要赶着上线&#xff0c;最后 Authing 的协作让我们赢得了客户信任&#xf…

基于scrapy+mongodb的校园数据获取

Scrapy以及MongoDB介绍&#xff1a; Scrapy: Scrapy是一个Python编写的开源网络爬虫框架&#xff0c;可以帮助开发人员高效、快速地从互联网上抓取、提取和处理数据。Scrapy拥有强大的可扩展性&#xff0c;可以通过定制管道、中间件和Spider来自定义爬虫行为&#xff0c;同时它…

( 位运算 ) 371. 两整数之和 ——【Leetcode每日一题】

❓371. 两整数之和 难度&#xff1a;中等 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - ​​​​​​​&#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出…

源码解读guava cache get接口的秘密

guava cache是谷歌开源的一种本地缓存&#xff0c;实现原理类似于ConcurrentHashMap&#xff0c;使用segments分段锁&#xff0c;保证线程安全&#xff0c;支持高并发场景。同时支持多种类型的缓存清理策略&#xff0c;包括基于容量的清理、基于时间的清理、基于引用的清理等。…

WPF基础使用

wpfwindows presentation foundation 官方文档 https://learn.microsoft.com/zh-cn/dotnet/api/?viewnet-7.0 一&#xff1a;WPF窗口设置为透明 在wpf中要将窗口设置为透明&#xff0c;除了将窗口背景色的Alpha分量设置为0以外&#xff0c;你还必须将窗口的AllowsTransparency…

STM32串口编程基础知识讲解

文章目录 前言一、串行通信和并行通信二、全双工&#xff0c;半双工&#xff0c;单工传输三、同步通信和异步通信四、波特率总结 前言 本篇文章给大家介绍一下串口的基础编程知识&#xff0c;这些知识是属于串口的理论知识&#xff0c;在开始学习编写代码的时候必须要掌握这些…

消息队列中间件 - RabbitMQ消息的持久化、确认机制、死信队列

持久化和应答机制Ack 消息队列中间件系列的最后一篇了&#xff0c;RabbitMQ消息的持久化、确认机制、死信队列、负载均衡等一系列进行说明。 消息持久化 当RabbitMq重启以后&#xff0c;未消费的消息&#xff0c;可以在服务重启后继续消费&#xff0c;不会丢失。 应答机制A…

nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式&#xff0c;这里用的是js-xlsx库&#xff1b; 需求 有一个 xlsx 的文件&#xff0c;里面有几个不同的 sheet&#xff0c;需要读取这个表格中不同 sheet 的数据&#xff0c;并且为每个 sheet 生成对应的 json 文件。 例如有一个名为 template…

草根测试员的涨薪之路:我是如何从0到月薪20K的?(仅供借鉴)

我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触多了&#xff0c;吃个饭…

网络安全:Hydra 端口爆破工具.(九头蛇)

网络安全&#xff1a;Hydra 端口爆破工具.&#xff08;九头蛇&#xff09; Hydra 也叫九头蛇&#xff0c;是一款开源的暴力PJ工具&#xff0c;集成在kali当中。可以对多种服务的账号和密码进行爆破&#xff0c;包括 Web 登录、数据库、SSH、FTP 等服务. 目录&#xff1a; 网络…

内网渗透—域防火墙策略同步、不出网隧道上线

内网渗透—域防火墙策略同步、不出网隧道上线 1. 前言2. 域防火墙2.1. 域控开启防火墙同步测试2.1.1. 查看域主机防火墙策略2.1.2. 域控防火墙策略下发同步2.1.2.1. 创建组策略2.1.2.2. 编辑组策略2.1.2.3. 编辑防火墙2.1.2.4. 同步防火墙策略 2.2. 域控出入站规则同步2.2.1. 查…

【数据结构】队列及其实现

目录 &#x1f60e;前言 认识队列 队列的初始化 队列判空 数据队尾入队 数据队头出队 取队头数据 取队尾数据 队列数据的个数 队列销毁 总结 &#x1f60e;前言 上次我们学习了栈及其实现&#xff0c;当然也少不它的好兄弟队列啦&#xff0c;今天我们开始队列的学习队…

大模型Founation Model

一、背景 自从chatgpt&#xff0c;gpt4以特别好的效果冲入人们的视野中&#xff0c;也使得AI产业发生了巨大变革&#xff0c;从17年以来的bert&#xff0c;将AI的各种领域都引入bert类的fine-tune方法&#xff0c;来解决单个领域单个任务的一一个预训练模型。在学术界和工业界…

Redis---事务管道

目录 一、Redis的事务是什么&#xff1f; 1.1 Redis和关系型数据库事务的区别 二、怎么玩Redis事务&#xff1f; 2.1 正常执行&#xff1a; 2.2 放弃事务 2.3 全体连坐 2.4 冤头债主 2.5 watch监控 三、管道 3.1 为什么会引入管道这个概念呢&#xff1f;我们首先来看一…

前后端分离项目部署上线流程-和错误解决

需求&#xff1a;就是想把自己写的前后端项目传上去不再是只有本地可以访问&#xff0c;其他人也可以访问我这个项目&#xff0c;以此记录免得后面搞忘了&#xff0c;文章很长&#xff0c;也很细&#xff0c;我自己上线碰到的错误也会发一下&#xff0c;建议看完哦 1.首先买个…

U盘连接电脑不显示怎么办?

对于很多Windows 11/10/8/7系统下的用户&#xff0c;U 盘、SD卡或其他移动硬盘未检测到或磁盘管理中不显示&#xff0c;这是一个非常普遍的问题。下面我们就来了解一下出现这种情况的常见原因和解决办法。 为什么U盘没有显示在磁盘管理中&#xff1f; U盘在电脑磁盘管理中不显…

GPT专业应用:生成实习报告

正文共 1070 字&#xff0c;阅读大约需要 4 分钟 大学生必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 快速生成实习报告 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由…

旅游网站设计方案

针对涉旅企业的旅游网站设计&#xff0c;主要要考虑以下几点&#xff1a; 1、考虑网站的业务开展需求&#xff0c;能够有效将衣、食、住、行、游、购、娱融合在一起&#xff0c;满足旅游企业的业务开展需求。 2、网站的设计结构&#xff0c;符合目前的网站开发结构&#xff0c;…

vue3鼠标经过显示按钮

在前端开发中&#xff0c;我们经常需要在页面中添加一些交互效果来提升用户体验。其中一个常见的需求就是鼠标经过某个元素时显示一个按钮&#xff0c;这个按钮可以用于触发一些操作或者显示更多的内容。 在本篇文章中&#xff0c;我将会介绍如何使用 Vue3 实现一个鼠标经过显…