栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java实现 微信小程序支付及退款V3

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java实现 微信小程序支付及退款V3

引入依赖

        
            com.github.wechatpay-apiv3
            wechatpay-apache-httpclient
            0.2.3
        

 小程序代码 具体实现,只需要替换参数

@Override
    public AjaxResult wxPayOrder(Double money, String orderNo) {
        try {
            DyUser loginUser = tokenServices.getLoginUser();
            JSonObject order = new JSonObject();
            order.put("appid", payConfig.getAppId());
            order.put("mchid", payConfig.getMchId());
            order.put("description", "充值-店员商城VIP会员");
            order.put("out_trade_no", orderNo);
            order.put("notify_url", payConfig.getNotifyUrl());

            JSonObject amount = new JSonObject();
            amount.put("total", (long)(money * 100));
            amount.put("currency", "CNY");
            order.put("amount", amount);

            JSonObject payer = new JSonObject();
            payer.put("openid", loginUser.getOpenId());
            order.put("payer", payer);

            PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new FileInputStream(ResourceUtils.getFile(payConfig.getMerchantPrivateKey())));
            //不需要传入微信支付证书了
            AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
                    new WechatPay2Credentials(payConfig.getMchId(), new PrivateKeySigner(payConfig.getMerchantSerialNumber(), merchantPrivateKey)),
                    payConfig.getApiKey().getBytes("utf-8"));

            WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                    .withMerchant(payConfig.getMchId(), payConfig.getMerchantSerialNumber(), merchantPrivateKey)
                    .withValidator(new WechatPay2Validator(verifier));
            // ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient

            // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
            HttpClient httpClient = builder.build();
            HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi");
            httpPost.addHeader("Accept", "application/json");
            httpPost.addHeader("Content-type","application/json; charset=utf-8");
            httpPost.setEntity(new StringEntity(order.toJSonString(), "UTF-8"));
            // 后面跟使用Apache HttpClient一样
            HttpResponse response = httpClient.execute(httpPost);
            String bodyAsString = EntityUtils.toString(response.getEntity());

            JSonObject bodyAsJSON = JSONObject.parseObject(bodyAsString);

            if(bodyAsJSON.containsKey("code")) {
                return new AjaxResult(1, bodyAsJSON.getString("message"));
            }
            final String prepay_id = bodyAsJSON.getString("prepay_id");
            final String timeStamp = String.valueOf(System.currentTimeMillis());
            final String nonceStr = RandomStringGenerator.getRandomStringByLength(32);
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(payConfig.getAppId() + "n");
            stringBuffer.append(timeStamp + "n");
            stringBuffer.append(nonceStr + "n");
            stringBuffer.append("prepay_id="+prepay_id+"n");
            Signature signature = Signature.getInstance("SHA256withRSA");
            signature.initSign(merchantPrivateKey);
            signature.update(stringBuffer.toString().getBytes("UTF-8"));
            byte[] signBytes = signature.sign();
            String paySign = base64.encodeBytes(signBytes);

            JSonObject params = new JSonObject();
            params.put("appId", payConfig.getAppId());
            params.put("timeStamp", timeStamp);
            params.put("nonceStr", nonceStr);
            params.put("prepay_id", prepay_id);
            params.put("signType", "RSA");
            params.put("paySign", paySign);

            return  AjaxResult.success(params);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

 退款也一样需要依赖,具体实现差不多,注意证书路径

   @Override
    public AjaxResult wxRefund(String orderNo) {
        try {
            DyPaymentHistory dyorders = historyMapper.getHistoryOrderNo(orderNo);
            //判断订单书否存在
            if(dyorders==null){
                return AjaxResult.error(301001,"订单不存在");
            }
            if(dyorders.getPayType()!=3){
                return AjaxResult.error(301001,"订单状态异常");
            }
            JSonObject order = new JSonObject();
            order.put("out_trade_no", orderNo);
            //生成退款单号
            long refudnOrderNo = IdUtil.getSnowflake(1, 2).nextId();
            order.put("out_refund_no", refudnOrderNo+"");
            //订单金额信息
            JSonObject amount = new JSonObject();
            BigDecimal num = new BigDecimal("100");
            BigDecimal paymoney = dyorders.getPayMoney().multiply(num);
            amount.put("refund", paymoney);
            amount.put("total", paymoney);
            amount.put("currency", "CNY");

            order.put("amount", amount);


            PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new FileInputStream(ResourceUtils.getFile(payConfig.getMerchantPrivateKey())));
            //不需要传入微信支付证书了
            AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
                    new WechatPay2Credentials(payConfig.getMchId(), new PrivateKeySigner(payConfig.getMerchantSerialNumber(), merchantPrivateKey)),
                    payConfig.getApiKey().getBytes("utf-8"));

            WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
                    .withMerchant(payConfig.getMchId(), payConfig.getMerchantSerialNumber(), merchantPrivateKey)
                    .withValidator(new WechatPay2Validator(verifier));


            HttpClient httpClient = builder.build();
            HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds");
            httpPost.addHeader("Accept", "application/json");
            httpPost.addHeader("Content-type","application/json; charset=utf-8");
            httpPost.setEntity(new StringEntity(order.toJSonString(), "UTF-8"));

            HttpResponse response = httpClient.execute(httpPost);
            String bodyAsString = EntityUtils.toString(response.getEntity());

            JSonObject bodyAsJSON = JSONObject.parseObject(bodyAsString);
            if(bodyAsJSON.containsKey("code")) {
                return new AjaxResult(1, bodyAsJSON.getString("message"));
            }
            dyorders.setPayType(2L);
            historyMapper.updateDyPaymentHistory(dyorders);
            return  AjaxResult.success(bodyAsJSON);
        }catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

具体异常抛出我还没处理,根据自己业务定义吧

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572288.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号