微信支付(Native)

目录

一.支付方式

二.Native支付

1.业务流程时序图

2.关键代码

2.1利用google提供的矩阵对象生成二维码

2.2提交请求参数为XML方式的请求

2.3业务controller


一.支付方式

1.付款码支付

        付款码支付是用户展示付款码,然后商家通过扫描用户的付款码来完成支付。

2.Native支付

        Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。 

        订单金额商家指定,用户扫描后不能更改支付金额。

        总结特点∶生成的二维码是微信的URL地址扫描二维码直接打开微信客户端完成支付

3.JSAPI支付 

JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

  1. ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
  2. ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面链接,用户点击链接打开商家页面,完成支付
  3. ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

4.微信小程序支付

        小程序支付是专门被定义使用在小程序中的支付产品。目前在小程序中能且只能使用小程序支付的方式来唤起微信支付。

5.APP支付

        APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

6.H5支付

        H5支付主要是在手机、ipad等移动设备中通过浏览器来唤起微信支付的支付产品。总结特点:H5支付与JSAPI支付的区别在于H5支付不要求在微信客户端打开H5页面。

7.刷脸支付

        用于线下消费场景,无需提前录入人脸,无需拿出手机,在支持微信刷脸支付的机具上,刷脸并输入手机号验证,即可完成付款,使用方便。使用专用3D活体检测摄像头,安全性高。

二.Native支付

1.业务流程时序图

微信支付(Native)_第1张图片

2.关键代码

2.1利用google提供的矩阵对象生成二维码

/**
     * 生成二维码
     * @throws WriterException
     * @throws IOException
     */
    public static String generateQRCode(String code_url) throws WriterException, IOException {
        //生成二维码
        //设置二维码的尺寸
        int width = 200;
        int hight = 200;
        //创建map
        Map hints = new HashMap();
        hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");

        //创建矩阵对象 调用谷歌提供的
        BitMatrix bitMatrix = new MultiFormatWriter().encode(code_url, BarcodeFormat.QR_CODE, width, hight, hints);

        //创建二维码生成路径
        String filePath = "d://QRCode//";
        String fileName = RandomStringUtils.randomAlphanumeric(10)+ ".jpg";

        Path path = FileSystems.getDefault().getPath(filePath,fileName);

        //将创建的矩阵转换成图片
        MatrixToImageWriter.writeToPath(bitMatrix,"jpg",path);
        return fileName;
    }

2.2提交请求参数为XML方式的请求

/**
     * 请求参数为XML格式的Post请求
     * @param url
     * @param requestDataXml
     * @return
     */
    public static String doPostByXml(String url, String requestDataXml) {

        CloseableHttpClient httpClient = null;
        //创建响应对象
        CloseableHttpResponse httpResponse = null;
        //创建httpClient连接对象
        httpClient = HttpClients.createDefault();
        //创建post请求连接对象
        HttpPost httpPost =new HttpPost (url) ;
        //创建连接请求参数对象,并设置连接参数
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout (15000)//连接服务器主机超时时间
                .setConnectionRequestTimeout (60000)//连接请求超时时间
                .setSocketTimeout (60000)//设置读取响应数据超时时间
                .build();
        //为httpPost请求设置参数
        httpPost.setConfig (requestConfig);

        //将想上传的数据存放在HttpPost 的entity属性中
        //new StringEntity会将字符串转为HttpEntity类型
        httpPost.setEntity(new StringEntity(requestDataXml,"utf-8"));
        //添加头信息
        httpPost.addHeader("Content-Type","text/xml");

        String responseDataXml = null;
        //发送请求
        try {
            httpResponse = httpClient.execute(httpPost);
            HttpEntity entity = httpResponse.getEntity();
            //将HttpEntity类型的数据转为String
            responseDataXml = EntityUtils.toString(entity);
        } catch (IOException e) {
            e.printStackTrace();
        }


        return responseDataXml;
    }

2.3业务controller

@PostMapping("/recharge/towx")
    public String toWxPayRecharge(HttpServletRequest request, @RequestParam("money")Integer money) throws Exception {

        //模拟session数据
        JSONObject data = new JSONObject();
        data.put("userId",1);
        data.put("userName","ws");
        request.getSession().setAttribute("userInfo",data);

        //从session中获取信息
        JSONObject user = new JSONObject();
        user = (JSONObject) request.getSession().getAttribute("userInfo");
//        System.out.println(user);

        //模拟生成订单号
        String orderId = Util.creatOrderId();

        //模拟生成充值记录
        Map rechargeMap = new HashMap<>();
        rechargeMap.put("orderId", orderId);
        rechargeMap.put("userId", user.get("userId"));
        rechargeMap.put("rechargeMoney", money);
        rechargeMap.put("rechargeType", "微信支付");
//        System.out.println(rechargeMap);



        //准备微信统一接口参数
        Map requestDataMap = new HashMap<>();
        //生成随机字符串
        String nonceStr = WXPayUtil.generateNonceStr();
        //创建商品描述
        String body = "ccc";
        //订单金额 ,单位为分
        String total_fee = money * 100 +"";

        //获取终端ip
        String hostAddress = null;
        try {
            InetAddress localAddress = InetAddress.getLocalHost();
            hostAddress = localAddress.getHostAddress();
//            System.out.println(hostAddress);

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        requestDataMap.put("appid","wx8a3fcf509313fd74");//微信公众平台id
        requestDataMap.put("mch_id","1361137902"); //商户号
        requestDataMap.put("nonce_str", nonceStr);//随机字符串
        requestDataMap.put("body",body); //商品描述
        requestDataMap.put("out_trade_no", orderId);//商户订单号
        requestDataMap.put("total", total_fee); //订单金额 单位分
        requestDataMap.put("spbill_create_ip", hostAddress);//用户的客户端ip
        //异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,
        //不能携带参数。 公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http
        requestDataMap.put("notify_url","http//localhost:8888/wxpayNotityUrl");//接收微信支付结果通知的回调地址
        requestDataMap.put("trade_type", "NATIVE");//支付类型 Native
        requestDataMap.put("product_id", orderId);//商品id
        requestDataMap.put("sign_type","MD5");//签名
        //生成签名 注意!!key是api密匙是微信商户平台的 不要写成APPsecret
        String sign = WXPayUtil.generateSignature(requestDataMap,"367151c5fd0d50f1e34a68a8o2d6bbca");
        requestDataMap.put("sign",sign);//签名
        //按要求需要创建xml格式字符串
        String requestDataXml = WXPayUtil.mapToXml(requestDataMap);
        System.out.println(requestDataXml);
        System.out.println("11111");
        //调用微信统一下单api 将该xml字符串传入 得到一个xml格式的结果
        String responseDataXml = HttpClientUtil.doPostByXml("https://api.mch.weixin.qq.com/pay/unifiedorder",requestDataXml);
        Map responseDataMap = WXPayUtil.xmlToMap(responseDataXml);
        System.out.println(responseDataMap);

        //把返回得到的xml中中的连接当作字符串就生成二维码即可
        //生成二维码
        String picName = null;
        String code_url = "weixin :/lwxpay/bizpayur1?pr=8b1YoPw";
        try {
            picName = Util.generateQRCode(code_url);
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //把生成二维码的文件名放在request中
        HttpSession session = request.getSession();
        session.setAttribute("picName", picName);
        //完整路径名
        String path = "/QRCode/" + picName;
        session.setAttribute("path", path);
        //假设充值一定成功

        //跳转到展示二维码的界面
        return "showQRCode";
    }

你可能感兴趣的:(java,java,微信,小程序)