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

news/2024/7/20 1:36:31 标签: 微信小程序, 微信, 小程序

一. 前置条件

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

二. 开始接入

1. 下载微信支付的AP证书<a class=微信支付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.niftyadmin.cn/n/327859.html

相关文章

社区分享|JumpServer引领我走向开源天地

编者注&#xff1a;以下内容基于山东青岛的JumpServer社区用户JonnyJ的社区分享整理而成。 “接触到JumpServer之后&#xff0c;我从一个开源受益者逐渐成长为开源的贡献者。其实我们每个人都可以成为开源贡献者&#xff0c;不局限于软件产品&#xff0c;哪怕只是你的一段共享…

超详细,unity如何制作人物行走的遥杆?

介绍 在游戏中&#xff0c;移动遥杆是一种常见的用户界面元素&#xff0c;它允许玩家通过触摸或鼠标输入来控制游戏对象的移动。移动遥杆通常由一个圆形或方形的背景和一个可以拖动的小球&#xff08;称为拇指杆&#xff09;组成。玩家可以通过拖动拇指杆来控制游戏对象的移动…

并行分布式计算 并行计算性能评测

文章目录 并行分布式计算 并行计算性能评测基本性能指标参数CPU 基本性能指标存储器性能并行与存储开销 加速比性能定律Amdahl 定律Gustafson 定律Sun 和 Ni 定律加速比讨论 可括放性评测标准等效率度量标准等速度度量标准平均延迟度量标准 基准评测程序&#xff08;Benchmark&…

linux挂载新磁盘

文章目录 1. 查看新磁盘名称2. 开始分区2.1.新建分区2.2. 格式化分区2.3.挂载分区2.4.设置开机自动挂载2.4.1通过硬盘名称挂载2.4.2通过UUID挂载 3.扩展知识3.1.卸载分区3.2.删除分区 4.挂载问题4.1.挂载错误导致系统无法启动如何解决&#xff1f; 1. 查看新磁盘名称 lsblk2. …

activiti6是使用,或签,会签

会签&#xff1a;指同一个审批节点设置多个人&#xff0c;如ABC三人&#xff0c;三人会同时收到审批&#xff0c;需全部同意之后&#xff0c;审批才可到下一审批节点&#xff1b; 或签&#xff1a;也有叫“竞签”、“串签”&#xff1a;指同一个审批节点设置多个人&#xff0c;…

使用apisix代理静态文件

前言 最近公司考虑用apisix作为公司网关并且部署到k8s上&#xff0c;我这边收到一个小任务&#xff1a;使用apisix代理静态文件 通过apisix官网了解到它构建于 NGINX ngx_lua 的技术基础之上&#xff0c;所以按理应该和nginx代理静态资源是一样的。因为是通过docker容器部署…

案例7:Java茶叶销售网站设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

2023年【道路运输企业安全生产管理人员】考试及道路运输企业安全生产管理人员复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员考试根据新道路运输企业安全生产管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将道路运输企业安全生产管理人员模拟考试试题进行汇编&#xff0c;组成一套道路运输企业安全生…