JAVA+微信JSAPI支付

引入依赖

 <dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-pay</artifactId>
   	<version>${weixin-java-pay.version}</version>
 </dependency>

获取请求ip

    public static String getIpAddr(HttpServletRequest request)
    {
        if (request == null)
        {
            return "unknown";
        }
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("X-Real-IP");
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getRemoteAddr();
        }
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : EscapeUtil.clean(ip);
    }

组装微信支付请求

public <T> T createWxOrder(ReqStringParam param) throws WxPayException {
        WxPayService wxPayService = wxPayConfiguration.wxService();
        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
        request.setAppid(wxPayService.getConfig().getAppId());
        request.setMchId(wxPayService.getConfig().getMchId());
        request.setDetail("交易描述");
        
        request.setOutTradeNo(order.getOrderSn());
        //支付回调地址
        request.setNotifyUrl(wxPayService.getConfig().getNotifyUrl());
        request.setFeeType("CNY");// 货币类型 人民币
        // 支付金额
        BigDecimal actualPrice = BigDecimal.valueOf(100L);

        request.setTotalFee(actualPrice.multiply(BigDecimal.valueOf(100L)).intValue());
        request.setSpbillCreateIp(IpUtils.getIpAddr(httpServletRequest));// 获取ip
        request.setTradeType("JSAPI");// 交易类型
        request.setBody("支付");
        request.setOpenid(user.getWeixinOpenid());// 微信openId

        //设置支付方式
        return wxService.createOrder(request);
    }

回调处理

public String parseWxOrderNotifyResult(String xmlData) throws WxPayException {
        WxPayOrderNotifyResult wxPayOrderNotifyResult = wxService.parseOrderNotifyResult(xmlData);
        String outtradeNo = wxPayOrderNotifyResult.getOutTradeNo();
        MallOrder order = iMallOrderService.lambdaQuery().eq(MallOrder::getOrderSn, wxPayOrderNotifyResult.getOutTradeNo()).one();
        if ("FAIL".equals(wxPayOrderNotifyResult.getResultCode())) {
             // 失败业务逻辑处理
        } else {
             // 成功业务逻辑处理
        }
            return "<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> </xml>";
        
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是Java SpringBoot发起微信JSAPI支付使用V2密钥的代码示例: 1. 首先,在SpringBoot的配置文件中添加微信支付的相关配置信息: ```yaml wxpay: app-id: YOUR_APP_ID mch-id: YOUR_MCH_ID v2-key: YOUR_V2_KEY notify-url: YOUR_NOTIFY_URL ``` 2. 然后,在SpringBoot中定义微信支付的服务类: ```java @Service public class WxPayService { @Autowired private WxPayProperties wxPayProperties; public Map<String, String> createOrder(String openid, String outTradeNo, int totalFee, String body, String ipAddress) throws Exception { // 构造请求参数 Map<String, String> data = new HashMap<>(); data.put("appid", wxPayProperties.getAppId()); data.put("mch_id", wxPayProperties.getMchId()); data.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", "")); data.put("body", body); data.put("out_trade_no", outTradeNo); data.put("total_fee", String.valueOf(totalFee)); data.put("spbill_create_ip", ipAddress); data.put("notify_url", wxPayProperties.getNotifyUrl()); data.put("trade_type", "JSAPI"); data.put("openid", openid); // 生成签名 String sign = WxPayUtil.generateSignature(data, wxPayProperties.getV2Key()); data.put("sign", sign); // 发起统一下单请求 String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; String result = HttpUtil.post(unifiedOrderUrl, WxPayUtil.toXml(data)); Map<String, String> resultMap = WxPayUtil.xmlToMap(result); // 判断下单是否成功 if ("SUCCESS".equals(resultMap.get("return_code")) && "SUCCESS".equals(resultMap.get("result_code"))) { // 构造JSAPI支付参数 Map<String, String> payData = new HashMap<>(); payData.put("appId", wxPayProperties.getAppId()); payData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); payData.put("nonceStr", UUID.randomUUID().toString().replaceAll("-", "")); payData.put("package", "prepay_id=" + resultMap.get("prepay_id")); payData.put("signType", "MD5"); // 生成签名 String paySign = WxPayUtil.generateSignature(payData, wxPayProperties.getV2Key()); payData.put("paySign", paySign); return payData; } else { throw new Exception(resultMap.get("return_msg")); } } } ``` 3. 最后,在Controller层调用微信支付服务类: ```java @RestController @RequestMapping("/wxpay") public class WxPayController { @Autowired private WxPayService wxPayService; @PostMapping("/createOrder") public Map<String, String> createOrder(@RequestParam String openid, @RequestParam String outTradeNo, @RequestParam int totalFee, @RequestParam String body, HttpServletRequest request) throws Exception { String ipAddress = HttpUtil.getIpAddress(request); return wxPayService.createOrder(openid, outTradeNo, totalFee, body, ipAddress); } } ``` 其中,HttpUtil是一个工具类,用于发送HTTP请求。WxPayUtil是一个微信支付的工具类,用于生成签名、XML转换等操作。以上代码示例中,仅提供了微信支付的主要逻辑。具体实现中,还需要根据实际情况,添加异常处理、日志记录等功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值