JAVA对接微信支付V3接口保姆式教程(2)

4.jsapi对接-->上一篇教程(1)

本篇将要吧支付相关的内容展示处理,里面设计到的支付商户号和应用id都需要自行准备

public Object pay(){
    String url="";
    PlaceOrder placeOrder =new PlaceOrder();
    placeOrder.setAppid(MINI_PAY_APPID);// 应用id
    placeOrder.setMchid(MINI_PAY_MCHID);// 支付商户号
    placeOrder.setDescription(”商品描述“);
    placeOrder.setOut_trade_no(”订单号“);
    placeOrder.setNotify_url(”http://api.xxxx.com/pay/notify“);// 异步通知地址,需要公网可以访问,测试可以使用内网穿透工具比如natapp等

    // 下单金额
    Amount amount =new Amount();
    mount.setCurrency("CNY");
    // 元转分
    String totalFee =         AmountUtil.changeY2F(orderItemByOrderNo.getActualAmount().toString());
                    amount.setTotal(Integer.valueOf(totalFee));
    placeOrder.setAmount(amount);
    //
    Payer payer=new Payer();
    payer.setSp_openid("openid 小程序用户openid");
    placeOrder.setPayer(payer);

    String json = JSON.toJSONString(placeOrder);
    String httpPost  = post(url,json );
    // httpPost 就是返回结果


    // 要想让小程序支付还是不够的
    String prepayId = JSON.parseObject(httpPost).getString("prepay_id");
    SortedMap<String, String> params = new TreeMap<>();
        params.put("appId", appId);
        params.put("nonceStr",  RandomUuidUtil.getUUID());
        params.put("package", "prepay_id=" + prepayId);
        params.put("signType", "RSA");
        params.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
        String message = buildMessageMINI(params);
        String sign = signMINI(message.getBytes("utf-8"));
        params.put("paySign", sign);
// params就是小程序支付需要的参数
return params;

}




5 元转分的方法,因微信支付请求的金额的单位为分

/**
     * 将元为单位的转换为分 替换小数点,支持以逗号区分的金额
     * 比如:100¥转换为10000  1转换为100  1,000.00转换为100000
     * @param amount
     * @return
     */
    public static String changeY2F(String amount){
        //处理包含, ¥ 或者$的金额
        String currency =  amount.replaceAll("\\$|\\¥|\\,", "");
        int index = currency.indexOf(".");
        int length = currency.length();
        Long amLong = 0L;
        if(index == -1){
            amLong = Long.valueOf(currency+"00");
        }else if(length - index >= 3){
            amLong = Long.valueOf((currency.substring(0, index+3)).replace(".", ""));
        }else if(length - index == 2){
            amLong = Long.valueOf((currency.substring(0, index+2)).replace(".", "")+0);
        }else{
            amLong = Long.valueOf((currency.substring(0, index+1)).replace(".", "")+"00");
        }
        return amLong.toString();
    }

6、小程序加密

@SneakyThrows
    public static String signMINI(byte[] message) {
        // 加载商户私钥证书(privateKey:私钥字符串)
        PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(MINI_APP_PAY_KEY.getBytes(StandardCharsets.UTF_8)));
        Signature sign = Signature.getInstance("SHA256withRSA");
        sign.initSign(merchantPrivateKey);
        sign.update(message);
        return Base64Utils.encodeToString(sign.sign());
    }

7、其他方法


static String buildMessageMINI(SortedMap<String, String> map) {
        return map.get("appId") + "\n"
                + map.get("timeStamp") + "\n"
                + map.get("nonceStr") + "\n"
                + map.get("package") + "\n";
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qawine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值