SpringBoot实现微信支付,微信扫码支付,Native支付(全网最详细教程)

2023-11-18

1.添加微信支付依赖

       <!--微信支付-->
        <dependency>
            <groupId>com.github.wxpay</groupId>
            <artifactId>wxpay-sdk</artifactId>
            <version>RELEASE</version>
        </dependency>

        <!--httpclient-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

2.添加配置yml配置文件 如果使用的不是yml 可自行配置

weixin:
  appid: wx09c076475bb9xxxx  #公众账号ID
  partner: 164544xxxx  #商户号
  partnerkey: zebrainfo20230809wwwcomcn1xxxxxx  #商户密钥
  notifyurl: http://8de92n.xxxx.cc/pay/info #回调地址

3.自行添加一个service层 (我这边叫PayService)

public interface PayService {

    public Object createUrl(CustomerOrder CustomerOrder);
}

4.实现此service层 (其中生成随机订单号使用了一个工具类,可私信我来拿,或你们把随机订单号代码注释,自己去找一个即可)

package com.banma.wxpay;
 
import com.banma.entity.CustomerOrder;
import com.banma.entity.Enterprise;
import com.banma.mapper.CustomerOrderMapper;
import com.banma.mapper.EnterpriseMapper;
import com.banma.util.HttpClient;
import com.banma.util.OrderCodeFactory;
import com.banma.wxpay.service.PayService;
import com.github.wxpay.sdk.WXPayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
@Service
public class PayServiceImpl implements PayService {
    //获取yml中的公众账号ID
    @Value("${weixin.appid}")
    private String appid;
    //获取yml中的商户号
    @Value("${weixin.partner}")
    private String partner;
    @Value("${weixin.partnerkey}")
    private String partnerkey;
    @Value("${weixin.notifyurl}")
    private String notifyurl;

    @Autowired
    EnterpriseMapper EnterpriseMapper;

    @Autowired
    CustomerOrderMapper CustomerOrderMapper;

    @Override
    public Object createUrl(CustomerOrder CustomerOrder) {
        //orderId:订单的id,price:需要支付的金额(默认单位为 分 )
        Map<String,Object> map = new HashMap<String,Object>();
        try {
            //判断付款用户是否注册企业
            Enterprise enterprise = EnterpriseMapper.findEnterpriseAndEnterpriseIdByEnterpriseName(CustomerOrder.getEnterpriseName());
            //查询到没有该企业返回404
            if(enterprise == null){
                map.put("code","404");
                return map;
            }
            //生成随机订单号
            String orderCode = OrderCodeFactory.getOrderCode(enterprise.getEnterpriseId().longValue());
            CustomerOrder.setCustomerOrderNumber(orderCode);

            CustomerOrder.setEnterpriseId(enterprise.getEnterpriseId());
            //设置订单待支付状态
            CustomerOrder.setCustomerOrderStart(2);
            CustomerOrderMapper.addCustomerOrder(CustomerOrder);

            Map<String, String> param = new HashMap<>();
            param.put("appid", "wx09c076475bb9xxxx");
            param.put("mch_id", "164544xxxx");
            param.put("nonce_str", WXPayUtil.generateNonceStr());
            param.put("body", "企业助力宝套餐购买"+CustomerOrder.getCustomerOrderTransactionNumber());
            param.put("out_trade_no", orderCode);
            String money = String.valueOf(CustomerOrder.getCustomerOrderPrice()*100);
            if (money.indexOf(".") > 0) {
                // 去掉多余的0
                money = money.replaceAll("0+?$", "");
                // 如果最后一位是. 则去掉
                money = money.replaceAll("[.]$", "");
            }
            System.out.println(money);
            param.put("total_fee", money);
            param.put("spbill_create_ip", "127.0.0.1");
            param.put("notify_url", "https://www.zebraxxxx.com.cn/activity/info");
            param.put("trade_type", "NATIVE");
            System.out.println(param.toString());
            //调取微信支付的接口
            String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            //将map数据转换为xml格式
            String xml = WXPayUtil.generateSignedXml(param, "zebrainfo20230809wwwcomcn1xxxxxx");
            //创建网络链接
            HttpClient httpClient = new HttpClient(url);
            httpClient.setXmlParam(xml);
            httpClient.setHttps(true);
            httpClient.post();
            String content = httpClient.getContent();
            return WXPayUtil.xmlToMap(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

5.编写Controller层调用API

package com.banma.controller.wechatPayController;

import com.banma.entity.CustomerOrder;
import com.banma.util.Result;
import com.banma.wxpay.PayServiceImpl;
import com.banma.wxpay.service.PayService;
import com.github.wxpay.sdk.WXPayUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("/activity")
@CrossOrigin
@Api(tags = "微信支付API")
public class WeChatPayController {

    @Autowired
    PayService PayService;

    @ApiOperation("微信统一收单下单支付接口API")
    @PostMapping("/wxPay")
    public Result wxPay(@RequestBody CustomerOrder CustomerOrder){
        Map<String,Object> map = (Map<String, Object>) PayService.createUrl(CustomerOrder);
        Integer code = map.get("code")==null?0:404;
        if(code != 0 && code == 404){
            return Result.fail("检测到您还未注册企业,请前往企业注册!");
        }
        System.out.println(map);
        return Result.succ("调用成功",map);
    }

    @RequestMapping("/info")
    public String info(HttpServletRequest httpServletRequest){
        try {
            //读取支付回调数据
            InputStream inputStream = httpServletRequest.getInputStream();
            ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
            byte[] bytes=new byte[1024];
            int len=0;
            while ((len=inputStream.read(bytes))!=-1){
                byteArrayOutputStream.write(bytes,0,len);
            }
            byteArrayOutputStream.close();
            inputStream.close();
            String res = new String(byteArrayOutputStream.toByteArray(), "UTF-8");
            System.out.println(res);
            //返回格式必须是这样
            Map<String,String> map=new HashMap<>();
            map.put("return_code", "SUCCESS");
            map.put("return_msg", "OK");
            System.out.println("发送成功!");
            return WXPayUtil.mapToXml(map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }


}

调用上面的统一下单接口返回的Url在前端转换为二维码即可实现扫码支付亲测可用!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot实现微信支付,微信扫码支付,Native支付(全网最详细教程) 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url

随机推荐