SpringBoot微信支付

该博客介绍了如何在SpringBoot应用中实现微信NATIVE支付,包括申请关键配置、支付流程、不同支付类型以及关键代码如WxPayUtil工具类。强调在处理支付时要注意订单的唯一性和状态检查,避免重复支付。
摘要由CSDN通过智能技术生成

微信支付申请key等配置项

接口请求值和返回值可参考微信官方文档

微信支付订单的流程

支付订单流程

支付类型分为

  • JSAPI -JSAPI支付(小程序支付)
  • NATIVE -Native支付(网页扫码支付)
  • APP -APP支付(APP支付)
  • MWEB--H5支付

本案例为NATIVE支付,其他支付需要修改WxPayUtil中的getWxQrcode方法中的值修改

packageParams.put("trade_type", "NATIVE");

key不用修改,key修改为对应的类型,同时也需要开通对应的服务

注意:在小程序支付的时候,需要传入openid

例如

packageParams.put("openid","openid");

项目架构

本文案例仅限参考,所以没有连接数据库,具体业务逻辑自行添加

添加maven

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>

        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom2</artifactId>
            <version>2.0.6</version>
        </dependency>
        <!--        微信支付-->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-pay</artifactId>
            <version>3.9.7.B</version>
        </dependency>
        <!--        jackson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo-common</artifactId>
            <version>2.6.3</version>
        </dependency>

yml配置

wxpay:
  app_id: 公众号Id
  mch_id: 商户号
  api_key: api key
  certPath: 退款证书路径
  unifiedorder_url: 统一下单
  orderquery_url: 查询订单状态
  closeorder_url: 关闭订单
  refund_url: 申请退款
  refundquery_url: 退款查询
  shorturl_url: 转换短连接
  notifyUrl: 微信异步回调

异步通知在本地测试环境,应使用内网穿透工具(例如natapp)

微信参数配置

package com.wxpay.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;


/**
 * 微信配置参数
 * @author 许雪恒
 */
@Data
@Configuration
public class WxPayConfig {
	/**
	 * 公众号Id
	 */
	@Value("${wxpay.app_id}")
	private String appId;
	/**
	 * 商户号
	 */
	@Value("${wxpay.mch_id}")
	private String mchId;
	/**
	 * api key
	 */
	@Value("${wxpay.api_key}")
	private String apiKey;
	/**
	 * 微信异步回调
	 */
	@Value("${wxpay.notifyUrl}")
	private String notifyUrl;
	/**
	 * 退款证书路径
	 */
	@Value("${wxpay.certPath}")
	private String certPath;
	/**
	 * 统一下单
	 */
	@Value("${wxpay.unifiedorder_url}")
	private String unifiedOrderUrl;
	/**
	 * 查询订单状态
	 */
	@Value("${wxpay.orderquery_url}")
	private String orderQueryUrl;
	/**
	 * 关闭订单
	 */
	@Value("${wxpay.closeorder_url}")
	private String closeorderUrl;
	/**
	 * 申请退款
	 */
	@Value("${wxpay.refund_url}")
	private String refundUrl;
	/**
	 * 退款查询
	 */
	@Value("${wxpay.refundquery_url}")
	private String refundqueryUrl;
	/**
	 * 转换短连接
	 */
	@Value("${wxpay.shorturl_url}")
	private String shorturlUrl;

}

消息返回类

package com.wxpay.result;

import lombok.Data;


/**
 * 消息返回类
 * @Author: 许雪恒
 */
@Data
public class Result {
    //操作成功
    public static int SUCCESS=200;
    //系统内部错误
    public static int ERROR=500;

    private int code;
    private String msg;
    private Object data;
    public static Result success(Object data){
        Result result = new Result();
        result.code= SUCCESS;
        result.msg="操作成功";
        result.data=data;
        return result;
    }
    public static Result error(String msg){
        Result result = new Result();
        result.code= ERROR;
        result.msg=msg;
        result.data=null;
        return result;
    }
    public static Result custom(int code, String msg, Object data){
        Result result = new Result();
        result.code=code;
        result.msg=msg;
        result.data=data;
        return result;
    }
}

常量类Constant

package com.wxpay.constants;

/**
 * 常量类
 * @Author 许雪恒
 * @Date 2021/9/1 10:01
 */
public class Constant {
	
	/**
	 * 操作成功返回状态码
	 */
	public static final Integer RESULT_SUCCESS_CODE = 200;
	
	/**查询状态信息展示**/
	public static final String PAY_STATUS_MSG_NOT_PAY  = "交易创建";
	public static final String PAY_STATUS_MSG_SUCCESS  = "支付成功";
	public static final String PAY_STATUS_MSG_FINISHED = "交易完成";
	public static final String PAY_STATUS_MSG_CLOSED   = "交易关闭";
	public static final String PAY_STATUS_MSG_NOT_EXIST   = "交易不存在";
	public static final String PAY_STATUS_MSG_FAIL     = "请求失败,请刷新重试";


	/**
	 *  成功
	 */
	public static final String SUCCESS  = "SUCCESS";

	/**
	 *  失败
	 */
	public static final String FAIL  = "FAIL";

	/**
	 *  成功提示信息
	 */
	public static final String SUCCESS_MSG  = "操作成功";

	/**
	 *  失败提示信息
	 */
	public static final String FAIL_MSG  = "操作失败";

	/**
	 *  业务正常状态
	 */
	public static final String CHARACTER_ENCODING_UTF8  = "UTF-8";

}


工具类

HttpUtil工具类

package com.wxpay.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;


/**
 * 工具类
 * 处理post请求
 */
public class HttpUtil
{
	//超时时间
    private final static int CONNECT_TIMEOUT = 3000;
    
    //默认编码
    private final static String DEFAULT_ENCODING = "UTF-8";  
    /**
     * 处理post请求
     * @param urlStr	跳转地址
     * @param data	传入数据(xml)
     * @return
     */
    public static String postData(String urlStr, String data){  
        return postData(urlStr, data, null);  
    }  
    /**
     * 处理post请求  
     * @param urlStr	跳转地址
     * @param data	传入数据(xml)
     * @param contentType
     * @return
     */
    public static String postData(String urlStr, String data, String contentType){
    	BufferedReader reader = null;  
        try {  
            URL url = new URL(urlStr);  
            URLConnection conn = url.openConnection();  
            conn.setDoOutput(true);  
            conn.setConnectTimeout(CONNECT_TIMEOUT);  
            conn.setReadTimeout(CONNECT_TIMEOUT);  
            if(contentType != null) {
                conn.setRequestProperty("content-type", contentType);
            }
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);  
            if(data == null) {
                data = "";
            }
            writer.write(data);   
            writer.flush();  
            writer.close();    
  
            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));  
            StringBuilder sb = new StringBuilder();  
            String line = null;  
            while ((line = reader.readLine()) != null) {  
                sb.append(line);  
                sb.append("\r\n");  
            }
            return sb.toString();  
        } catch (IOException e) {
        	Sy
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot是一个开源的Java应用程序框架,用于快速构建独立的、基于生产级别的Java应用程序。它提供了许多功能和工具,可以简化开发过程并提高开发效率。而H5微信支付是指在移动端网页上使用微信支付的一种方式。下面是使用SpringBoot来实现H5微信支付的步骤: 1. 准备工作:首先,您需要拥有微信公众号或小程序账号,并开通支付功能。您还需要有自己的服务器,以接收微信支付的通知。同时,确保您已经使用了Java SpringBoot框架。 2. 配置微信支付参数:在SpringBoot项目的配置文件中,添加微信支付所需的配置参数,包括AppID、商户号、支付密钥等。这些参数可以在微信开放平台上获取。 3. 引入相关依赖:在项目的构建文件中,添加微信支付相关的依赖项,如微信支付SDK或其他相关库。这些依赖项将帮助您在代码中调用微信支付接口。 4. 创建统一下单接口:使用SpringBoot框架创建一个用于接收支付请求的接口。在该接口中,您需要获取用户的支付信息,并调用微信支付统一下单接口生成预支付订单。 5. 处理支付结果通知:创建一个用于接收微信支付结果通知的接口。在该接口中,您需要验证支付结果的合法性,并处理相应的业务逻辑。 6. 前端页面开发:在前端页面中添加微信支付的相关逻辑,包括调用微信支付接口、展示支付结果等。 总结起来,要使用SpringBoot来实现H5微信支付,您需要进行准备工作,配置微信支付参数,引入相关依赖,创建统一下单接口,处理支付结果通知,以及在前端页面中添加支付逻辑。这样就可以实现使用SpringBoot进行H5微信支付了。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值