微信V3支付 订单查询 退款查询

本编在对接V3支付的时候连连撞头,希望后来人能少走点弯路,如果有bug请海涵啊,希望各位大佬也能给我点意见,话不多说上代码:

service层

相关的配置:

package com.tiyaa.mall.pay.config;

import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.ScheduledUpdateCertificatesVerifier;
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.PemUtil;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;

/**
 * @author xyl
 * @date 2022/8/23 10:15
 * @explain
 */
@Configuration
public class WeChatPayConfig extends WeChatConfig {

    /**
     * 获取商户的私钥文件
     *
     * @return
     */
    public PrivateKey getPrivateKey() {
        InputStream resourceAsStream = this.getClass().getResourceAsStream("/cert/apiclient_key.pem");
        return PemUtil.loadPrivateKey(resourceAsStream);
    }

    /**
     * 获取签名验证器
     *
     * @return
     */
    @Bean
    public ScheduledUpdateCertificatesVerifier getVerifier() {
        //获取商户私钥
        PrivateKey privateKey = getPrivateKey();
        System.out.println(privateKey);
        //私钥签名对象
        PrivateKeySigner privateKeySigner = new PrivateKeySigner(serialNo, privateKey);
        //身份认证对象
        WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);
        // 使用定时更新的签名验证器,不需要传入证书
        return new ScheduledUpdateCertificatesVerifier(
                wechatPay2Credentials,
                apiV3Key.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 获取http请求对象
     *
     * @param verifier
     * @return
     */
    @Bean(name = "wxPayClient")
    public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) {
        //获取商户私钥
        PrivateKey privateKey = getPrivateKey();
        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                .withMerchant(mchId, serialNo, privateKey)
                .withValidator(new WechatPay2Validator(verifier));
        // ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient

        // 通过WeChatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
        return builder.build();
    }

    /**
     * 获取HttpClient,无需进行应答签名验证,跳过验签的流程
     */
    @Bean(name = "wxPayNoSignClient")
    public CloseableHttpClient getWxPayNoSignClient() {
        //获取商户私钥
        PrivateKey privateKey = getPrivateKey();
        //用于构造HttpClient
        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                //设置商户信息
                .withMerchant(mchId, serialNo, privateKey)
                //无需进行签名验证、通过withValidator((response) -> true)实现
                .withValidator((response) -> true);

        // 通过WeChatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
        return builder.build();
    }
}

DTO:

package com.tiyaa.mall.pay.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * @author xyl
 * @date 2022/7/11 17:16
 * @explain
 */
@Data
@ApiModel("下单dto")
public class BuyCreateDto {
    @ApiModelProperty(value = "商户订单号(自己的订单号)")
    private String outTradeNo;
    @ApiModelProperty(value = "支付的类型字典11")
    private Integer payType;
    @ApiModelProperty(value = "支付金额")
    private Long total;
    @ApiModelProperty(value = "用户OpenId")
    private String openId;


    public BuyCreateDto() {
    }

    public BuyCreateDto(String outTradeNo, Integer payType, Long total, String openId) {
        this.outTradeNo = outTradeNo;
        this.payType = payType;
        this.total = total;
        this.openId = openId;
    }
}

枚举:

package com.tiyaa.mall.pay.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * @author xyl
 * @date 2022/7/12 9:05
 * @explain
 */
@AllArgsConstructor
@Getter
public enum WeChatApiTypeEnum {

    /**
     * 获取商户平台证书的URL
     */
    GET_CERTIFICATES("/v3/certificates"),

    /**
     * JSAPI下单
     */
    JSAPI_PAY("/v3/pay/transactions/jsapi"),

    /**
     * APP下单
     */
    APP_PAY("/v3/pay/transactions/app"),

    /**
     * H5下单
     */
    H5_PAY("/v3/pay/transactions/h5"),

    /**
     * 订单查询
     */
    QUERY_PAY("/v3/pay/transactions/out-trade-no/"),

    /**
     * 订单查询
     */
    QUERY_REFUND("/v3/refund/domestic/refunds/");


    /**
     * 类型
     */
    private final String type;
}

vo:

因为阿里代码规范,还设置了点常量

当前支付 和 退款查询 因为小编被安排了其他事情,对接支付后续在更新

经验分享 程序员 微信小程序 职场和发展