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支付(全网最详细教程) 的相关文章

  • 重构——套接字中的良好实践——简单的服务器-客户端 Swing 应用程序

    我使用单例和观察者模式编写了一个带有 Swing 接口的简单服务器 客户端程序 每个客户端都连接到服务器并可以发送消息 服务器将其收到的消息转发给其余的客户端 客户端使用 GUI 允许它们随时连接和断开与服务器的连接 该程序运行得很好 因为
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • 动画图像视图

    目前我正在开发一款游戏 这是我的游戏的详细信息 用户应选择正确的图像对象 我希望图像从左到右加速 当他们到达终点时 他们应该再次出现在活动中 这是我正在处理的屏幕截图 我有 5 个图像视图 它们应该会加速 您有此类动画的示例代码吗 非常感谢
  • 带有面板的 Java Swing JToolbar:外观和感觉

    我有一个JToolbar其中包含多个JPanels 需要 因为我希望每个都有特定的边界 不幸的是 外观管理器无法识别JPanels属于工具栏和JButtons因此 渲染器与普通按钮一样 即没有工具栏上的特殊鼠标悬停效果 更换JPanels
  • Hystrix是否可以订阅CircuitBreaker开启事件?

    对于单元测试 我希望能够订阅 Hystrix 事件 特别是在断路器打开或关闭时发生事件 我四处寻找示例 似乎解决方法是利用指标流并监视断路器标志 由于 Hystrix 是基于 RxJava 构建的 我认为应该在某个地方有一个事件订阅接口 在
  • 无法在 Mac OS X 上启动应用程序 我收到错误 LSOpenURLsWithRole() 应用程序失败,错误为 -10810

    问题 我正在尝试启动一个应用程序 遗传网络分析仪 http www genostar com category products gna 但它默默地失败了 使用时open gna app产生以下错误消息 LSOpenURLsWithRole
  • Scala(或 Java)中泛型函数的特化

    是否可以在 Scala 中专门化泛型函数 或类 例如 我想编写一个将数据写入 ByteBuffer 的通用函数 def writeData T buffer ByteBuffer data T buffer put data 但由于 put
  • 如何将txt文件添加到你的android项目中? [复制]

    这个问题在这里已经有答案了 我的Android studio版本是1 5 1 显然这个 never 版本没有 txt 文件的 asset 文件夹 您打算如何将这些文件包含到您的项目中 以及如何进一步使用您内部的应用程序 谢谢你的建议 Pro
  • 更改 RowLayout SWT Java 中元素的顺序

    有没有办法更改在行布局中创建的元素的顺序 我想将其显示在元素中 首先显示 例如 如果我创建 element1 则 element2 element3 element4 我想看到的布局为 元素4 元素3 元素2 元素1 这意味着最后创建的元素
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • 在方法内声明类 - Final 关键字 [重复]

    这个问题在这里已经有答案了 给定方法中的以下内部类 IsSomething public class InnerMethod private int x public class Something private int y public
  • 如何将任务添加到 gradle 中的主要“构建”任务

    当我尝试使用以下代码将任务添加到主构建任务时 rootProject tasks getByName build dependsOn mytask 当我跑步时它抱怨gradle w build输出 Where Build file line
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • 如何使用maven创建基于spring的可执行jar?

    我有一个基于 Maven 的 Spring WS 客户端项目 我想将其打包为单个 jar 在eclipse中 一切运行正常 当我尝试将其打包为可执行 jar 时 我收到 ClassNotFound 异常 因为 Spring jar 未包含在
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g

随机推荐