微信 PC 网页二维码支付 相关研究

版权声明:本文为博主原创烂文章,你爱转载就转载 https://blog.csdn.net/qq_38623459/article/details/82428133

微信官方文档与例子,我使用不了,查找相关文档无数,找了几个靠谱的

https://blog.csdn.net/qq_32574435/article/details/78952325

https://blog.csdn.net/rentian1/article/details/78807199

http://kf.qq.com/faq/170830jimmaa170830B7F7NJ.html

(恩,点赞)

选择模式二开发,好用又快

上来你应该有个配置文件WXpayConfig

商户id,公证号,被扫api地址:就是官方给的统一下单的网址:public static String PAY_QUERY_API = "https://api.mch.weixin.qq.com/pay/orderquery";

我只写被扫,还有回调函数,就是客户扫码支付成功了,会调用后台的地址,一个二维码包含了很多机制与信息

controller

@RequestMapping(value="/qrcodePay",produces="application/json;charset=UTF-8")
    public String qrcodePay(ForWXPay record,HttpServletRequest req,HttpServletResponse response){
        JSONObject json = new JSONObject();
        record.setTrade_type("NATIVE");
        record.setSpbill_create_ip(WXPayUtil.getIpAddr(req));
        Map<String, String> map = wXPayService.unifiedorder(record);
        if(map.get("return_code").equals("SUCCESS")){
            if(map.get("result_code").equals("SUCCESS")){
                String url = map.get("code_url");
                System.out.println(url);
                json.put("data", url);
                json.put("code", 1);
            }else{
                json.put("code", 0);
                System.out.println(map.get("err_code_des"));
            }
        }else{
            json.put("code", 0);
            System.out.println(map.get("return_msg"));
        }
        return json.toJSONString();    
    }

serviceimpl实现类:

@Override
    public Map<String, String> unifiedorder(ForWXPay record) {
        String key = WXPayConfig.key;
        String currTime = WXPayUtil.getCurrTime();
        String strTime = currTime.substring(8, currTime.length());
        String strRandom = WXPayUtil.buildRandom(4) + "";
        String nonce_str = strTime + strRandom;
        //TbOrderForm orderForm = tbOrderFormMapper.selectByOrderNum(record.getOut_trade_no());
        //String total_fee = orderForm.getOrderAmount().multiply(new BigDecimal("100")).intValue() + "";
        String trade_type = record.getTrade_type();
        String time_start =  new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        Calendar ca = Calendar.getInstance();
        ca.setTime(new Date());
        ca.add(Calendar.MINUTE, 10);         
        String time_expire =  new SimpleDateFormat("yyyyMMddHHmmss").format(ca.getTime());
        SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
        packageParams.put("appid", WXPayConfig.appID);
        packageParams.put("mch_id", WXPayConfig.mchID);
        packageParams.put("nonce_str", nonce_str);
        packageParams.put("body", "aa");
        packageParams.put("out_trade_no", record.getOut_trade_no());
        packageParams.put("total_fee", "100");
        packageParams.put("spbill_create_ip", record.getSpbill_create_ip());
        packageParams.put("notify_url",WXPayConfig.NOTIFY_URL );
        packageParams.put("trade_type", trade_type);
        packageParams.put("time_start", time_start);
        packageParams.put("time_expire", time_expire);
        if(!StringUtils.isEmpty(record.getOpenid())){
            packageParams.put("openid", record.getOpenid());
        }
        String sign = WXPayUtil.createSign("UTF-8", packageParams,key);
        packageParams.put("sign", sign);
       
        String requestXML = WXPayUtil.getRequestXml(packageParams);
        System.out.println("请求xml::::"+requestXML);
 
        String resXml = WXPayUtil.postData(WXPayConfig.PAY_API, requestXML);
        System.out.println("返回xml::::"+resXml);
        
        Map<String, String> map = null;
        try {
            map = WXPayUtil.doXMLParse(resXml);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return map;
    }

他需要的工具包,自己去找,请求与返回的都是xml的,解析之后拿到code_url,返回到前台,其实是一个网址,前台

js这么整:$("#img").attr("src","qrcode?code_url="+result.data);二维码出来了,支付调回调函数,这个我会在支付宝的通知里面一块写

   /**
     * 生成二维码图片 不存储 直接以流的形式输出到页面
     * @param content
     * @param response
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void encodeQrcode(String content,HttpServletResponse response){
        if(content==null || "".equals(content))
            return;
       MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
       Map hints = new HashMap();
       hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //设置字符集编码类型
       BitMatrix bitMatrix = null;
       try {
           bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300,hints);
           BufferedImage image = toBufferedImage(bitMatrix);
           //输出二维码图片流
           try {
               ImageIO.write(image, "png", response.getOutputStream());
           } catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
       } catch (WriterException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       }         
    }

猜你喜欢

转载自blog.csdn.net/qq_38623459/article/details/82428133