SpringBoot实现微信预下单(API-v3)

最近新写的模块,怕忘,记录一下~ 有很多支付类型,我用的是JsAPI哦。

  1. 我是maven项目,首先导入依赖:                                        
    <dependency>
        <groupId>com.github.wechatpay-apiv3</groupId>
        <artifactId>wechatpay-java</artifactId>
        <version>0.2.11</version>
    </dependency>
  2. 创建配置文件,我这里是在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;
    }
  3. 之后就是创建接收数据和预下单的接口与实现了:
    @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包含了调起支付所需的所有参数,可直接用于前端调起支付。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值