写在前面:做了几次小程序支付,从申请商户号到配置参数到上线整个流程,在这里记录一下,以免自己会忘记,也给没有接触过微信支付的小白提供一点参考,文中我参考的官方文档都放了链接,就不在详细赘述,本文使用了微信官方SDK:com.github.wechatpay-apiv3
2、申请商户号成功之后按照官方文档在商户平台配置apikey等等参数
3、申请成功之后按照官方文档做接入前准备
4、搭建springboot工程,一堆文档自己去搜吧
5、引入依赖
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.12</version>
</dependency>
6、引入配置
wx:
app:
# 绩效管理页面
kar-page: system/register
# 活动页面
activity-page: pages/index
# 服务商商户号绑定的公众号信息
ma:
configs:
- appid: 你的小程序appid
secret: 你的小程序密钥
mchId: 微信支付商户平台商户号
mchSerialNumber: 微信支付商户平台商户序列号
privateKeyPath: 微信支付商户平台私钥存放路径
apiV3Key: 微信支付商户平台商台apiv3
notifyUrl: 微信支付回调地址(微信官方会通过该地址发送支付通知)
package com.yycm.platform.system.config;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
@Data
@ConfigurationProperties(prefix = "wx.ma")
public class WxMaProperties {
private List<WxConfig> configs;
public WxConfig getDefaultWxConfig() {
return CollUtil.isNotEmpty(configs) ? configs.get(0) : null;
}
@Data
public static class WxConfig {
private String appid;
private String secret;
private String mchId;
private String mchSerialNumber;
private String privateKeyPath;
private String apiV3Key;
private String notifyUrl;
}
}
package com.yycm.platform.system.config;
import cn.hutool.core.lang.Assert;
import cn.hutool.extra.spring.SpringUtil;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.*;
import com.yycm.platform.system.dept.service.DeptService;
import com.yycm.platform.system.pojo.dto.DeptDto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import yycm.platform.common.exception.PlatformException;
@RequiredArgsConstructor
@Slf4j
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {
private final WxMaProperties wxMaProperties;
private final DeptService deptService;
@Bean
public RSAAutoCertificateConfig rsaAutoCertificateConfig() {
WxMpProperties.WxConfig defaultWxConfig = wxMpProperties.getDefaultWxConfig();
return new RSAAutoCertificateConfig.Builder()
.merchantId(defaultWxConfig.getMchId())
.privateKeyFromPath(defaultWxConfig.getPrivateKeyPath())
.merchantSerialNumber(defaultWxConfig.getMchSerialNumber())
.apiV3Key(defaultWxConfig.getApiV3Key())
.build();
}
@Bean
public JsapiServiceExtension jsapiServiceExtension(RSAAutoCertificateConfig rsaAutoCertificateConfig) {
return new JsapiServiceExtension.Builder()
.config(rsaAutoCertificateConfig)
.build();
}
@Bean
public NotificationParser notificationParser(RSAAutoCertificateConfig rsaAutoCertificateConfig) {
return new NotificationParser(rsaAutoCertificateConfig);
}
public PrepayWithRequestPaymentResponse buildPrepayWithRequestPaymentResponse(PrepayRequest prepayRequest) {
Assert.notNull(prepayRequest.getSubAppid(), () -> PlatformException.create("subAppId can not be null"));
DeptDto brandByAppId = deptService.getBrandByAppId(prepayRequest.getSubAppid());
Assert.notNull(brandByAppId, () -> PlatformException.create("subAppId not exists"));
prepayRequest.setSubMchid(brandByAppId.getWxMchid());
WxMpProperties.WxConfig defaultWxConfig = wxMpProperties.getDefaultWxConfig();
prepayRequest.setSpAppid(defaultWxConfig.getAppid());
prepayRequest.setSpMchid(defaultWxConfig.getMchId());
return getJsapiServiceExtension().prepayWithRequestPayment(prepayRequest, prepayRequest.getSpAppid());
}
public Transaction queryOrderById(QueryOrderByIdRequest queryOrderByIdRequest) {
queryOrderByIdRequest.setSpMchid(wxMpProperties.getDefaultWxConfig().getMchId());
return getJsapiServiceExtension().queryOrderById(queryOrderByIdRequest);
}
public Transaction queryOrderByOutTradeNo(QueryOrderByOutTradeNoRequest queryOrderByOutTradeNoRequest) {
queryOrderByOutTradeNoRequest.setSpMchid(wxMpProperties.getDefaultWxConfig().getMchId());
return getJsapiServiceExtension().queryOrderByOutTradeNo(queryOrderByOutTradeNoRequest);
}
public void closeOrder(CloseOrderRequest closeOrderRequest) {
closeOrderRequest.setSpMchid(wxMpProperties.getDefaultWxConfig().getMchId());
getJsapiServiceExtension().closeOrder(closeOrderRequest);
}
public JsapiServiceExtension getJsapiServiceExtension() {
return SpringUtil.getBean(JsapiServiceExtension.class);
}
}