最近新写的模块,怕忘,记录一下~ 有很多支付类型,我用的是JsAPI哦。
- 我是maven项目,首先导入依赖:
<dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.2.11</version> </dependency>
- 创建配置文件,我这里是在nacos上配置的,不用nacos可以自己去yml里配:
wechat: pay: appId: 你的 apiV3key: 你的 merchantId: 你的 privateKeyPath: 你的 merchantSerialNumber: 你的 notifyUrl: 你的
public class WeChatPayConfig { /** appId */ @Value("${wechat.pay.appId}") private String appId; /** 商户号 */ @Value("${wechat.pay.merchantId}") private String merchantId; /** 商户API私钥路径 */ @Value("${wechat.pay.privateKeyPath}") private String privateKeyPath; /** 商户证书序列号 */ @Value("${wechat.pay.merchantSerialNumber}") private String merchantSerialNumber; /** 商户APIV3密钥 */ @Value("${wechat.pay.apiV3key}") private String apiV3key; /** 回调接口地址 */ @Value("${wechat.pay.notifyUrl}") private String notifyUrl; }
- 之后就是创建接收数据和预下单的接口与实现了:
@Data public class WeChatCreateOrderDTO { private String description; //订单描述 private String outTradeNo; //订单号 private AmountDetail amount; //支付金额信息 private Integer total; //总金额 private String payer; //支付人信息 private String openId; }
@PostMapping("/createOrder")
public ApiResponse<WeChatOrderDataVO> pay(@RequestBody WeChatCreateOrderDTO weChatCreateOrderDTO){
return ApiResponse.success(weChatPayService.createOrder(weChatCreateOrderDTO));
}
/**
* 创建微信支付订单
* @param weChatCreateOrderDTO
* @return
*/
@Override
public WeChatOrderDataVO createOrder(WeChatCreateOrderDTO weChatCreateOrderDTO) {
final ClassPathResource privateKeyPath = new ClassPathResource("wxpay_cert/apiclient_key.pem");
try {
InputStream inputStream = privateKeyPath.getInputStream();
StringBuilder stringBuilder = new StringBuilder();
String content;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
content = stringBuilder.toString();
}
PrivateKey privateKey = PemUtil.loadPrivateKeyFromString(content);
Config config =
new RSAAutoCertificateConfig.Builder()
.merchantId(weChatPayConfig.getMerchantId())
.privateKey(privateKey)
.merchantSerialNumber(weChatPayConfig.getMerchantSerialNumber())
.apiV3Key(weChatPayConfig.getApiV3key())
.build();
JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build();
PrepayRequest request = new PrepayRequest();
Amount amount = new Amount();
amount.setTotal(weChatCreateOrderDTO.getTotal());
request.setAmount(amount);
request.setDescription(weChatCreateOrderDTO.getDescription());
request.setMchid(weChatPayConfig.getMerchantId());
request.setAppid(weChatPayConfig.getAppId());
request.setNotifyUrl(weChatPayConfig.getNotifyUrl());
request.setOutTradeNo(weChatCreateOrderDTO.getOutTradeNo());
Payer payer = new Payer();
payer.setOpenid(weChatCreateOrderDTO.getOpenId());
request.setPayer(payer);
PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);
JSONObject jsonObject = new JSONObject(response);
log.info("【createOrder-response】,结果:{}", jsonObject);
return WeChatOrderDataVO.builder()
.appId(response.getAppId())
.timeStamp(response.getTimeStamp())
.nonceStr(response.getNonceStr())
.packageVal(response.getPackageVal())
.signType(response.getSignType())
.paySign(response.getPaySign())
.build();
}catch (ServiceException e){
log.error("【createOrder-ServiceException】,报错:{}", e.getMessage());
throw new ServiceException(e.getMessage());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
注意这里获取秘钥文件,我用的是privateKey,也可以用privateKeyFromPath()来获取秘钥文件地址,都可以,到这里就完成啦,这里PrepayWithRequestPaymentResponse 下的response包含了调起支付所需的所有参数,可直接用于前端调起支付。