133 lines
5.3 KiB
Java
133 lines
5.3 KiB
Java
package com.jwl.driver.server.controller;
|
||
|
||
import com.jwl.driver.server.config.WechatPayConfig;
|
||
import com.jwl.driver.server.entity.OrderPayInfo;
|
||
import com.jwl.driver.server.response.BaseResponse;
|
||
import com.jwl.driver.server.service.IOrderPayInfoService;
|
||
import com.jwl.driver.server.util.InputStreamUtil;
|
||
import com.jwl.driver.server.vo.H5PayVo;
|
||
import com.wechat.pay.java.core.Config;
|
||
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
|
||
import com.wechat.pay.java.core.exception.ServiceException;
|
||
import com.wechat.pay.java.core.util.IOUtil;
|
||
import com.wechat.pay.java.core.util.PemUtil;
|
||
import com.wechat.pay.java.service.payments.h5.H5Service;
|
||
import com.wechat.pay.java.service.payments.h5.model.*;
|
||
import com.wechat.pay.java.service.payments.model.Transaction;
|
||
import io.swagger.annotations.Api;
|
||
import io.swagger.annotations.ApiOperation;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.core.io.ClassPathResource;
|
||
import org.springframework.stereotype.Controller;
|
||
import org.springframework.web.bind.annotation.PostMapping;
|
||
import org.springframework.web.bind.annotation.RequestBody;
|
||
import org.springframework.web.bind.annotation.RequestMapping;
|
||
import org.springframework.web.bind.annotation.RestController;
|
||
|
||
import javax.annotation.Resource;
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.io.UncheckedIOException;
|
||
import java.math.BigDecimal;
|
||
import java.util.Objects;
|
||
|
||
/**
|
||
* 微信支付小程序 接口
|
||
*/
|
||
@Api(tags = "H5支付")
|
||
@RestController
|
||
@RequestMapping("/H5/pay")
|
||
@Slf4j
|
||
public class H5PayController {
|
||
|
||
@Resource
|
||
private WechatPayConfig wechatPayConfig;
|
||
|
||
@Autowired
|
||
private IOrderPayInfoService orderPayInfoService;
|
||
|
||
//生成预支付订单
|
||
@ApiOperation("生成预支付订单")
|
||
@PostMapping("/prepay")
|
||
public BaseResponse createPrepay(@RequestBody H5PayVo payVo){
|
||
// 构建service
|
||
H5Service service = createService();
|
||
//在order_pay_info里新增一条数据
|
||
OrderPayInfo orderPayInfo = orderPayInfoService.createOrderPayInfo(payVo.getMoney(),payVo.getUserId(),payVo.getDescription(), payVo.getOutTradeNo(), "h5");
|
||
|
||
// 请求下单参数
|
||
PrepayRequest request = new PrepayRequest();
|
||
Amount amount = new Amount();
|
||
amount.setTotal(Integer.valueOf((payVo.getMoney().multiply(new BigDecimal("100")).setScale(0).toString())+""));
|
||
request.setAmount(amount);
|
||
request.setAppid(wechatPayConfig.getAppId());
|
||
request.setMchid(wechatPayConfig.getMchId());
|
||
request.setDescription(payVo.getDescription());
|
||
request.setNotifyUrl(wechatPayConfig.getPayNoticeUrl());
|
||
request.setOutTradeNo(orderPayInfo.getPayId().toString());
|
||
//场景参数
|
||
SceneInfo sceneInfo = new SceneInfo();
|
||
sceneInfo.setPayerClientIp(payVo.getClientIp());
|
||
request.setSceneInfo(sceneInfo);
|
||
|
||
// 调用下单方法,得到应答
|
||
PrepayResponse response = service.prepay(request);
|
||
// 使用微信扫描 code_url 对应的二维码,即可体验Native支付
|
||
// log.info(response);
|
||
return BaseResponse.success(response);
|
||
}
|
||
|
||
private H5Service createService() {
|
||
Config config =
|
||
new RSAAutoCertificateConfig.Builder()
|
||
.merchantId(wechatPayConfig.getMchId())
|
||
.privateKey(PemUtil.loadPrivateKeyFromString(InputStreamUtil.getContentStr("wechatPay/apiclient_key.pem")))
|
||
// .privateKeyFromPath(wechatPayConfig.getPrivateKeyPath())
|
||
.merchantSerialNumber(wechatPayConfig.getMchSerialNo())
|
||
.apiV3Key(wechatPayConfig.getApiV3Key())
|
||
.build();
|
||
H5Service service = new H5Service.Builder().config(config).build();
|
||
|
||
return service;
|
||
}
|
||
|
||
|
||
//查询订单接口
|
||
@ApiOperation("查询支付订单")
|
||
@PostMapping("/queryOrder")
|
||
public BaseResponse queryOrder(@RequestBody H5PayVo payVo){
|
||
//获取openId
|
||
QueryOrderByOutTradeNoRequest queryRequest = new QueryOrderByOutTradeNoRequest();
|
||
queryRequest.setMchid(wechatPayConfig.getMchId());
|
||
//支付订单id
|
||
queryRequest.setOutTradeNo(payVo.getOutTradeNo());
|
||
H5Service service = createService();
|
||
|
||
try {
|
||
Transaction result = service.queryOrderByOutTradeNo(queryRequest);
|
||
System.out.println(result.getTradeState());
|
||
return BaseResponse.success(result);
|
||
} catch (ServiceException e) {
|
||
// API返回失败, 例如ORDER_NOT_EXISTS
|
||
System.out.printf("code=[%s], message=[%s]\n", e.getErrorCode(), e.getErrorMessage());
|
||
System.out.printf("reponse body=[%s]\n", e.getResponseBody());
|
||
return BaseResponse.fail(e.getErrorMessage());
|
||
}
|
||
|
||
}
|
||
|
||
//关闭订单接口
|
||
@ApiOperation("关闭支付订单")
|
||
@PostMapping("/closeOrder")
|
||
public BaseResponse closeOrder(@RequestBody H5PayVo payVo){
|
||
H5Service service = createService();
|
||
CloseOrderRequest closeRequest = new CloseOrderRequest();
|
||
closeRequest.setMchid(wechatPayConfig.getMchId());
|
||
closeRequest.setOutTradeNo(payVo.getOutTradeNo());
|
||
// 方法没有返回值,意味着成功时API返回204 No Content
|
||
service.closeOrder(closeRequest);
|
||
return BaseResponse.success();
|
||
}
|
||
}
|