c语言编程笔录

首页 >   > 笔记大全

笔记大全

使用java怎么实现一个微信H5支付功能

更新时间:2023-07-12
段落一:概述 微信是一款非常流行的社交软件和支付平台,提供了微信支付功能。微信支付是一种新的方式,允许用户使用微信支付购物和账单等费用。微信支付有两种类型:APP支付和H5支付。H5支付通常用于需要在移动端中完成支付的情况。本文将介绍如何使用Java实现微信H5支付功能。 步骤一:获取传递的支付参数 当用户在购物网站中选择商品并进行结算时,需要将生成的订单号和订单金额传递给后端服务器。在后端接受到支付请求后,需要获取相应的参数进行支付请求。微信支付H5支付时,需要传递的参数包括AppID、商户号、trade_type、body、out_trade_no、total_fee、spbill_create_ip、notify_url、scene_info等。 下面是获取URL参数的示例代码:
@RequestMapping(value = "/wxpay")
public void wxpay(HttpServletRequest request, HttpServletResponse response) throws IOException {  
    //获取openid并生成支付信息参数
    String openId = request.getSession().getAttribute("openId").toString();
    //生成订单号
    String orderId = UUID.randomUUID().toString();
    //订单金额
    String total_fee = "10";
    //获取客户端ip
    String spbill_create_ip = IpUtil.getIpAddr(request);
 
    String notify_url = "http://xxx.xxx.com/xPay/wx_notify";
    //组装参数,用户获取prepay_id
    SortedMap packageParams = new TreeMap();        
    packageParams.put("appid", "wx8888888888888888");          
    packageParams.put("mch_id", "14488888");         
    packageParams.put("nonce_str", PayCommonUtil.CreateNoncestr());          
    packageParams.put("body", "JSAPI支付测试");        
    packageParams.put("out_trade_no", orderId);          
    packageParams.put("total_fee", total_fee);
    packageParams.put("spbill_create_ip", spbill_create_ip);          
    packageParams.put("notify_url", notify_url);          
    packageParams.put("trade_type", "JSAPI");
    packageParams.put("openid", openId);
    String sign = PayCommonUtil.createSign("UTF-8", packageParams, "**********"); 
    packageParams.put("sign", sign);
    String requestXML = PayCommonUtil.getRequestXml(packageParams);    
    String responseStr = HttpUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", requestXML);
 
    //获取prepay_id
    String prepay_id = "";
    try {
        Map map = XMLUtil.doXMLParse(responseStr);
        prepay_id = map.get("prepay_id");
    } catch (Exception e) {
        e.printStackTrace();
    }
    String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
    SortedMap finalpackage = new TreeMap();    
    finalpackage.put("appId", "wx8888888888888888");  
    finalpackage.put("timeStamp", timeStamp);  
    finalpackage.put("nonceStr", PayCommonUtil.CreateNoncestr());    
    finalpackage.put("package", "prepay_id=" + prepay_id);  
    finalpackage.put("signType", "MD5");
    String finalsign = PayCommonUtil.createSign("UTF-8", finalpackage, "**********"); 
    finalpackage.put("paySign", finalsign);        
    String jsonStr = JSON.toJSONString(finalpackage);
    response.getWriter().write(jsonStr);
}
步骤二:生成签名及完整请求参数 在获取传递参数后,需要生成签名及请求参数,才能向微信支付服务器发出请求。签名是为了保证请求的安全性。 实现签名及生成完整请求参数的示例代码如下:
public class PayCommonUtil {
    //生成签名
    public static String createSign(String characterEncoding, SortedMap parameters, String key) {
        StringBuffer sb = new StringBuffer();  
        Set es = parameters.entrySet();  
        Iterator it = es.iterator();  
        while (it.hasNext()) {  
            Map.Entry entry = (Map.Entry) it.next();  
            String k = (String) entry.getKey();  
            Object v = entry.getValue();  
            if (null != v && !"".equals(v)  
                    && !"sign".equals(k) && !"key".equals(k)) {  
                sb.append(k + "=" + v + "&");  
            }  
        }  
        sb.append("key=" + key);  
        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
        return sign;  
    }
}
步骤三:向微信支付服务器发出请求 在生成签名及请求参数后,可以向微信支付服务器发出支付请求。微信支付服务器会返回预支付信息及二维码链接。将二维码链接返回给前端,用户扫描后即可完成支付流程。 实现与微信支付服务器交互的示例代码如下:
public class HttpUtil {
    public static String postData(String url, String data) {
        String resultStr = null;
        try {
            URL urlObj = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setDoOutput(true); // 默认为false,post请求需要改为true
            conn.setDoInput(true); //默认为true
            conn.connect();
            OutputStream os = conn.getOutputStream();
            os.write(data.getBytes("UTF-8"));
            os.flush();
            os.close();
            InputStream is = conn.getInputStream();
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
            is.close();
            resultStr = new String(outStream.toByteArray(),"utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultStr;
    }
}
步骤四:支付结果通知 在微信支付服务器完成支付后,会将支付结果发送给已设定好的支付结果通知url。接受支付结果通知后,需要验证签名及更改订单状态等工作。下面是一个接受支付结果通知的示例代码:
public class NotifyServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        SortedMap map = new TreeMap();
        InputStream inputStream;
        inputStream = request.getInputStream();
        SAXReader reader = new SAXReader();
        Document document;
        String respMessage = "success";
        try {
            document = reader.read(inputStream);
            Element root = document.getRootElement();
            List list = root.elements();
            for (Element e : list) {
                map.put(e.getName(), e.getText());
            }
        } catch (DocumentException e1) {
            e1.printStackTrace();
            respMessage = "error";
        }
        inputStream.close();
        //判断签名是否正确
        if (PayCommonUtil.isTenpaySign("UTF-8", map, "**************")) {
            if ("SUCCESS".equals((String) map.get("result_code"))) {
                if ("SUCCESS".equals((String) map.get("return_code"))) {
                    System.out.println("支付成功");
                    //更改订单状态
                } else {
                    System.out.println("支付失败");
                }
            } else {
                System.out.println("支付失败");
            }
        }
        //通知微信服务器已成功接收通知
        response.getWriter().write(respMessage);
    }
}
以上便是使用Java如何实现微信H5支付功能的详细步骤。通过以上代码示例以及方法解释,可以较为清晰地了解Java实现微信H5支付所必需的要素及代码区块。