SpringBoot对接微信小程序支付功能开发(一,下单功能)

这篇具有很好参考价值的文章主要介绍了SpringBoot对接微信小程序支付功能开发(一,下单功能)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1,接入前准备:

  1. 接入模式选择直连模式;
  2. 申请小程序,得到APPID,并开通微信支付;
  3. 申请微信商户号,得到mchid,并绑定APPID;
  4. 配置商户API key,下载并配置商户证书,根据微信官方文档操作:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml
  5. 上面都配置完之后会得到:小程序APPID、商户号mchid、商户证书序列号、API_V3密钥、商户私钥。

2,代码开发

引入微信支付API v3依赖

        <!--微信支付依赖 v3版本-->
        <dependency>
            <groupId>com.github.wechatpay-apiv3</groupId>
            <artifactId>wechatpay-apache-httpclient</artifactId>
            <version>0.2.2</version>
        </dependency>

微信参数常量类:WechatPayConstant 参数自行更换

package com.office.miniapp.constants;

/**
 * @InterfaceName: WechatPayConstant
 * @Description: 微信支付常量类
 * @Authror: XQD
 * @Date: 2022/1/6 15:02
 */
public interface WechatPayConstant {

    /**
     * 支付结果回调地址
     */
    String NOTIFY_URL = "线上域名地址/miniapp/wxPay/callback";
    
    /**
     * 退款结果回调地址
     */
    String REFUNDS_URL = "线上域名地址/miniapp/refunds/callback";

    /**
     * 商户号
     */
    String MCH_ID = "***";

    /**
     * 商户证书序列号
     */
    String MCH_SERIAL_NO = "***";

    /**
     * API_V3密钥
     */
    String API_V3KEY = "***";

    /**
     * 小程序appId
     */
    String MP_APP_ID = "***";

    /**
     * 商户私钥
     */
    String PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\n" +
            "省略..." +
            "-----END PRIVATE KEY-----\n";

    /**
     * jsapi下单url
     */
    String V3_JSAPI_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";

    /**
     * 商户订单号查询url
     */
    String V3_OUT_TRADE_NO = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}";

    /**
     * 关闭订单url
     */
    String V3_CLOSE = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}/close";

}

微信支付工具类:WxPayUtil (自己封装的)

package com.office.miniapp.utils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.office.miniapp.constants.WechatPayConstant;
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Base64;

/**
 * @ClassName: WxPayUtil
 * @Description: 微信支付工具类
 * @Authror: XQD
 * @Date: 2022/8/13 23:04
 */
@Component
public class WxPayUtil {

    /**
     * @Description: 获取httpClient
     * @Param: []
     * @return: org.apache.http.impl.client.CloseableHttpClient
     * @Author: XQD
     * @Date:2022/8/13 23:16
     */
    public static CloseableHttpClient getHttpClient() {
        CloseableHttpClient httpClient = null;
        // 加载商户私钥(privateKey:私钥字符串)
        try {
            PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
                    new ByteArrayInputStream(WechatPayConstant.PRIVATE_KEY.getBytes("utf-8")));
        //使用自动更新的签名验证器,不需要传入证书
        AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
                new WechatPay2Credentials(WechatPayConstant.MCH_ID, new PrivateKeySigner(WechatPayConstant.MCH_SERIAL_NO, merchantPrivateKey)),
                WechatPayConstant.API_V3KEY.getBytes("utf-8"));
        // 初始化httpClient
        httpClient = WechatPayHttpClientBuilder.create()
                .withMerchant(WechatPayConstant.MCH_ID, WechatPayConstant.MCH_SERIAL_NO, merchantPrivateKey)
                .withValidator(new WechatPay2Validator(verifier))
                .build();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return httpClient;
    }


    /**
     * @Description: 生成签名
     * @Param: [message]
     * @return: java.lang.String
     * @Author: XQD
     * @Date:2022/6/7 16:00
     */
    public static String sign(byte[] message) throws Exception {
        Signature sign = Signature.getInstance("SHA256withRSA");
        PrivateKey privateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(WechatPayConstant.PRIVATE_KEY.getBytes("utf-8")));
        sign.initSign(privateKey);
        sign.update(message);
        return Base64.getEncoder().encodeToString(sign.sign());
    }


    /**
     * @Description: 验证签名
     * @Param: [serial, message, signature]请求头中带的序列号, 验签名串, 请求头中的应答签名
     * @return: boolean
     * @Author: XQD
     * @Date:2021/9/14 10:36
     */
    public static boolean signVerify(String serial, String message, String signature) {
        AutoUpdateCertificatesVerifier verifier = null;
        try {
            // 加载商户私钥(privateKey:私钥字符串)
            PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
                    new ByteArrayInputStream(WechatPayConstant.PRIVATE_KEY.getBytes("utf-8")));

            //使用自动更新的签名验证器,不需要传入证书
            verifier = new AutoUpdateCertificatesVerifier(
                    new WechatPay2Credentials(WechatPayConstant.MCH_ID, new PrivateKeySigner(WechatPayConstant.MCH_SERIAL_NO, merchantPrivateKey)),
                    WechatPayConstant.API_V3KEY.getBytes("utf-8"));
            return verifier.verify(serial, message.getBytes("utf-8"), signature);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @Description: 解密订单信息
     * @Param: [body] 应答报文主体
     * @return: java.lang.String
     * @Author: XQD
     * @Date:2021/9/14 11:48
     */
    public static String decryptOrder(String body) {
        try {
            AesUtil aesUtil = new AesUtil(WechatPayConstant.API_V3KEY.getBytes("utf-8"));
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode node = objectMapper.readTree(body);
            JsonNode resource = node.get("resource");
            String ciphertext = resource.get("ciphertext").textValue();
            String associatedData = resource.get("associated_data").textValue();
            String nonce = resource.get("nonce").textValue();
            return aesUtil.decryptToString(associatedData.getBytes("utf-8"), nonce.getBytes("utf-8"), ciphertext);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        return "";
    }

}

下单接口调用

下单功能实现,返回预支付交易会话标识prepay_id

	/**
     * @Description: 小程序下单
     * @Param: [userId, orders]
     * @return: java.lang.Object
     * @Author: XQD
     * @Date:2022/8/13 18:48
     */
    @Override
    public CommonResult submitOrder() throws Exception {
        // 小程序下单
        CloseableHttpClient httpClient = WxPayUtil.getHttpClient();
        HttpPost httpPost = new HttpPost(WechatPayConstant.V3_JSAPI_URL);
        httpPost.addHeader("Accept", "application/json");
        httpPost.addHeader("Content-type", "application/json; charset=utf-8");

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectMapper objectMapper = new ObjectMapper();

        ObjectNode rootNode = objectMapper.createObjectNode();
        rootNode.put("mchid", WechatPayConstant.MCH_ID)
                .put("appid", WechatPayConstant.MP_APP_ID)
                .put("notify_url", WechatPayConstant.NOTIFY_URL)
                .put("description", "商品描述信息")
                .put("out_trade_no", System.currentTimeMillis() + "");
        rootNode.putObject("amount")
                .put("total", 100);// 订单支付金额
        rootNode.putObject("payer")
                .put("openid", "小程序用户openid");
        objectMapper.writeValue(bos, rootNode);

        httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
        //完成签名并执行请求
        CloseableHttpResponse response = httpClient.execute(httpPost);
        try {
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                //处理成功返回的数据
                String body= EntityUtils.toString(response.getEntity());
                //JSONObject jsonObject = JSON.parseObject(body);
                //获取预支付交易会话标识  prepay_id
                //String prepayId= jsonObject.getString("prepay_id");
                //把上面的订单信息存入订单数据库
                return body;
            } else if (statusCode == 204) {
                // 处理成功,无返回Body
                return "success";
            } else {
                System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity()));
                throw new IOException("request failed");
            }
        } finally {
            response.close();
        }
    }

到这里代表下单操作完成了。把预支付交易id(prepay_id)返回前端,进行拉起支付操作

查询订单接口调用
    /**
     * @Description: 查询订单
     * @Param: [outTradeNo] 商户订单号
     * @return: java.lang.Object
     * @Author: XQD
     * @Date:2022/8/14 21:43
     */
    @Override
    public Object queryOrder(String outTradeNo) throws Exception {
        CloseableHttpClient httpClient = WxPayUtil.getHttpClient();
        String v3_out_trade_no = WechatPayConstant.V3_OUT_TRADE_NO.replaceFirst("\\{out_trade_no}", outTradeNo);
        HttpGet httpGet = new HttpGet(v3_out_trade_no + "?mchid=" + WechatPayConstant.MCH_ID);
        httpGet.addHeader("Accept", "application/json");
        CloseableHttpResponse response = httpClient.execute(httpGet);
        String bodyAsString = EntityUtils.toString(response.getEntity());
        System.out.println(bodyAsString);
        return bodyAsString;
    }
关闭订单接口调用
 /**
     * @Description: 关闭订单
     * @Param: [outTradeNo] 商户订单号
     * @return: java.lang.Object
     * @Author: XQD
     * @Date:2022/8/14 21:43
     */
    @Override
    public Object closeOrder(String outTradeNo) throws Exception {
        CloseableHttpClient httpClient = WxPayUtil.getHttpClient();
        String v3_close = WechatPayConstant.V3_CLOSE.replaceFirst("\\{out_trade_no}", outTradeNo);
        HttpPost httpPost = new HttpPost(v3_close);
        httpPost.addHeader("Accept", "application/json");
        httpPost.addHeader("Content-type", "application/json; charset=utf-8");

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectMapper objectMapper = new ObjectMapper();

        ObjectNode rootNode = objectMapper.createObjectNode();
        rootNode.put("mchid", WechatPayConstant.MCH_ID);

        objectMapper.writeValue(bos, rootNode);

        httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
        CloseableHttpResponse response = httpClient.execute(httpPost);
        // 状态码 204表示关单成功
        int statusCode = response.getStatusLine().getStatusCode();
        log.info("关闭订单返回码:{}", statusCode);
        if (statusCode == 204) {
            return "关单成功";
        }
        return "关单失败";
    }

下一篇: SpringBoot对接微信小程序支付功能开发(二,支付回调功能)文章来源地址https://www.toymoban.com/news/detail-495906.html

到了这里,关于SpringBoot对接微信小程序支付功能开发(一,下单功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp+java/springboot实现微信小程序APIV3支付功能

    微信小程序的支付跟H5的支付和APP支付流程不一样,本次只描述下小程序支付流程。 1.微信小程序账号 文档:小程序申请 小程序支付需要先认证,如果你有已认证的公众号,也可以通过公众号免费注册认证小程序。 一般300元,我是认证的政府的免费。 然后登录小程序,设置

    2023年04月19日
    浏览(36)
  • 微信小程序对接微信支付详细教程

    小程序 微信支付官方文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11index=2 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml 前提 在进行对接微信支付之前,我们首先需要将以下几点准备好: 申请APPID 申请商户号 小程序开通微信支付,绑定已经申请好的商户号。

    2024年02月09日
    浏览(34)
  • SpringBoot对接小程序微信支付

    目录 前言 一、准备工作 2.1、企业微信小程序开通 2.1.1、获取开发者ID 2.1.2、开通支付功能 2.1.3、关联商户号 2.2、企业商户号的开通 2.2.1、获取商户号mch_id 2.2.2、获取商户API密钥mch_key 二、整体流程 三、后端项目搭建 3.1、统一下单 3.2、支付支付回调 3.3、问题排查 3.4、统一下

    2024年02月04日
    浏览(39)
  • 使用云开发环境的云函数实现微信小程序的支付功能

    背景: 近期在开发一个商城类的微信小程序,因为本人只会使用 C 语言对 nodejs 环境不熟悉,因此在开发微信小程序时选用容易上手的云开发环境开发微信小程序。我想选用云开发环境的小伙伴和我的想法一致,对微信小程序开发相关知识了解很少。我的小程序的主体是个体

    2024年04月23日
    浏览(33)
  • 微信小程序对接微信支付所遇问题合集

    1. 后端使用微信官方sdk会简单很多,可以看看在第五个大标题上。 2. 相关文档汇总:         1、WxJava - MiniApp Java SDK 4.6.0 API         2、wechatpay-java/README.md at main · wechatpay-apiv3/wechatpay-java · GitHub         3、网络 | 微信开放文档         4、开发指引 - JSAPI支付 | 微信支付商

    2024年04月25日
    浏览(42)
  • 微信支付-超详细java开发-小程序对接

    本文适用于有一定基础的开发者,简单易通。后台用的的是java,我用的是springBoot,其它框架基本同理,前端就是一个简单的demo。微信官方提供了V2和V3两种方式,本文基于V2版支付开发(后续更新V3)。V2和V3版本区别 1.思路介绍 本次以微信小程序开发为例,如果自己想要玩一

    2024年02月09日
    浏览(41)
  • 【微信小程序支付功能】uniapp实现微信小程序支付功能

    场景 :要实现公司微信小程序的电商模块微信支付功能 一.实现步骤和思路 在登录状态,登录的时候获取到code,利用code获取到 openid: https://blog.csdn.net/weixin_45308405/article/details/128868377?spm=1001.2014.3001.5501 在manifest.json文件“App模块配置”项的“Payment(支付)”下,勾选“微信支付

    2024年02月11日
    浏览(37)
  • 微信小程序怎么开通支付功能?

    对于一些想通过小程序卖货的企业商家来说,在申请小程序后需要同时开通微信支付功能,才能在小程序上进行交易。那么关于微信小程序怎么开通支付功能,下面给大家说一说。 一、注册非个人主体的小程序账号 不管你是通过公众号后台快速注册还是微信公众平台官网直

    2024年02月12日
    浏览(32)
  • Python对接微信小程序V3接口进行支付,并使用uwsgi+nginx+django进行https部署

    网上找了很多教程,但是很乱很杂,并且教程资源很少且说的详细。这里就记录一下分享给大家 共分为以下几个步骤: 目录 一、开始前准备信息 二、使用前端code获取用户的openid 三、对接小程序v3接口下单 四、小程序支付的回调 五、安装并启动uwsgi 六、安装并启动nginx 七、

    2024年02月12日
    浏览(33)
  • springboot使用 WxJava 实现 微信小程序(uniapp开发)的登陆功能

    前端使用uniapp来开发微信小程序 后端springboot中使用WxJava来做服务端( WxJava是微信服务端开发 的Java SDK ) 该图来源于微信小程序官方文档 根据uniapp的官网直接通过它提供的第三方 登陆api直接使用,代码如下 直接根据WxJava的官方demo (1) yml配置 (2)两个配置文件 (3)contro

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包