微信对接native支付,获取订单二维码,查看订单,取消订单,退款(浏览器微信扫码支付)

这边用到的jar包

       <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.0.6</version>
        </dependency>
           <dependency>
            <groupId>com.github.wechatpay-apiv3</groupId>
            <artifactId>wechatpay-apache-httpclient</artifactId>
            <version>0.4.9</version>
        </dependency>
        <dependency>
            <groupId>com.github.wechatpay-apiv3</groupId>
            <artifactId>wechatpay-java</artifactId>
            <version>0.2.14</version>
        </dependency>

完整代码(这边我统一整理到了main方法里面):

package org.example;
import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
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 com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.nativepay.NativePayService;
import com.wechat.pay.java.service.payments.nativepay.model.Amount;
import com.wechat.pay.java.service.payments.nativepay.model.CloseOrderRequest;
import com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest;
import com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse;
import com.wechat.pay.java.service.refund.RefundService;
import com.wechat.pay.java.service.refund.model.AmountReq;
import com.wechat.pay.java.service.refund.model.CreateRequest;
import com.wechat.pay.java.service.refund.model.FundsFromItem;
import com.wechat.pay.java.service.refund.model.Refund;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URISyntaxException;
import java.security.PrivateKey;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

import static com.wechat.pay.java.service.refund.model.Account.AVAILABLE;

public class WxMain {
    //微信对接native支付,微信证书验证  生成订单,查看订单,取消订单,订单退款
    public static void main(String[] args) {

    }
    //--------------------------微信获取二维码url-----------------------
    //获取支付url,获取到这个url之后,可通过前端转成二维码用来扫码支付
    public String getCodeUrl(){
        // 构建service
        Config config = getConfig();
        NativePayService service = new NativePayService.Builder().config(config).build();
        PrepayRequest request = new PrepayRequest();
        Amount amount = new Amount();


        //这部分设置的微信获取的这个url的失效时间,我这边取的当前时间加2分钟,这个获取的getCodeUrl有两分钟的有效时间,超过两分钟,扫这个url会报该二维码已经失效
        // 定义日期时间格式化为RFC3339(包含时区信息)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
        // 如果您想使用其他时区,例如:东八区(中国标准时间)
        OffsetDateTime nowCst = OffsetDateTime.now(ZoneId.of("Asia/Shanghai"));
        OffsetDateTime updatedTime = nowCst.plus(2, ChronoUnit.MINUTES);
        String formattedNowCst = updatedTime.format(formatter);

        //微信这边金额是以分为单位的,这边传的是以元为单位的,要乘以100,变成分
        BigDecimal sourceSl = new BigDecimal("金额").setScale(2, BigDecimal.ROUND_HALF_UP);
        amount.setTotal(sourceSl.multiply(new BigDecimal("100")).intValue());
        //金额
        request.setAmount(amount);
        //appid
        request.setAppid("appid");
        //商户id
        request.setMchid("商户id");
        //描述
        request.setDescription("描述");
        //回调接口,有传值的话,你放百度的地址都没问题,这边我随便放的地址
        request.setNotifyUrl("https://notify_url");
        //自己生成的订单号
        request.setOutTradeNo("dadjkakwdkjahdjkad");
        //生成的链接过期时间
        request.setTimeExpire(formattedNowCst);

        PrepayResponse response = service.prepay(request);
        //返回生成的链接,该链接可以通过前端,转成二维码   浏览器百度一下:也有在线转二维码的
        return response.getCodeUrl();
    }
    //--------------------------微信查看订单-----------------------
    //--------------------------微信主动获取订单信息-----------------------
    public static Boolean isPaySuccess() throws IOException, URISyntaxException {
        //获取证书
        PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
                new FileInputStream("证书位置"));

        AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
                new WechatPay2Credentials("商户id", new PrivateKeySigner("证书编号", merchantPrivateKey)),"私钥".getBytes("utf-8"));

        // 初始化httpClient
        CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create()
                .withMerchant("商户id", "证书编号", merchantPrivateKey)
                .withValidator(new WechatPay2Validator(verifier)).build();

        URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"+"自己生成的订单id");
        uriBuilder.setParameter("mchid", "商户id");

        //完成签名并执行请求
        HttpGet httpGet = new HttpGet(uriBuilder.build());
        httpGet.addHeader("Accept", "application/json");
        CloseableHttpResponse response = httpClient.execute(httpGet);
        String body = EntityUtils.toString(response.getEntity());
        JSONObject jsonObject = new JSONObject(body);
        String result = jsonObject.get("trade_state").toString();
        //这边我只给订单支付成功的返回true,还有其他状态,可参考微信的开发文档
        if ("SUCCESS".equals(result)) {
            return true;
        }else {
            return false;
        }
    }



    //--------------------------微信取消订单-----------------------
    //--------------------------微信主动取消订单-----------------------
    public  String colsePay() throws AlipayApiException {
        Config config = getConfig();
        NativePayService service = new NativePayService.Builder().config(config).build();
        CloseOrderRequest request = new CloseOrderRequest();
        request.setOutTradeNo("自己生成的订单id");
        request.setMchid("商户id");
        service.closeOrder(request);
        return "关闭订单成功";
    }

    //--------------------------微信退款-----------------------
    //--------------------------微信退款-----------------------

    public  String returnPay() throws AlipayApiException {
        Config config = getConfig();
        RefundService service = new RefundService.Builder().config(config).build();
        CreateRequest request = new CreateRequest();

        AmountReq amountReq = new AmountReq();
        request.setOutTradeNo("自己生成订单id");
        request.setOutRefundNo("自己生成订单id");
        //金额这边我是元,乘以100变成分,微信接口里面是传的分
        BigDecimal sourceSl = new BigDecimal("金额").setScale(2, BigDecimal.ROUND_HALF_UP);
        long je= sourceSl.multiply(new BigDecimal("100")).intValue();
        amountReq.setRefund(je);
        amountReq.setTotal(je);
        amountReq.setCurrency("CNY");
        FundsFromItem fundsFromItem =new FundsFromItem();
        fundsFromItem.setAmount(je);
        fundsFromItem.setAccount(AVAILABLE);
        request.setAmount(amountReq);
        Refund refund =  service.create(request);
        String refund_Status = refund.getStatus().toString();
        //success状态是退款成功,PROCESSING是正在执行
        if("SUCCESS".equals(refund_Status) || "PROCESSING".equals(refund_Status)){
            return "退费成功";
        }else {
            return "退款失败"+refund_Status;
        }
    }

    //配置
    public Config getConfig(){
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        //商户id
                        .merchantId("商户id")
                        //证书地址  D:\\PEM\\apiclient_key.pem
                        .privateKeyFromPath("")
                        //证书编号
                        .merchantSerialNumber("")
                        //32位私钥
                        .apiV3Key("")
                        .build();
        return config;
    }
}

对应参数获取参考:https://blog.youkuaiyun.com/weixin_54143030/article/details/143229976?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值