微信扫码支付---模式一(PC端,解决中文乱码)

近期公司调完银联,调支付宝,调完支付宝调微信.说实话微信的帮助文档确实是烂,而且有没有技术支持,害的我头发都掉了一桌.不说废话了,看代码.

首先登陆微信的公众平台(微信的服务号不是订阅号),然后选择微信支付–>开发设置,设置好支付回调URL和支付授权目录(授权目录最少精确到二级目录,比如你的需要使用微信支付的目录是:www.weixinpay.com/sp/weixin/pay.do,那么对应的是:www.weixinpay.com/sp/weixin/),设置好后编写代码.

对了,联调支付,一般都需要外网能够访问的URL地址,这里建议使用过ngrok软件,直接在本地联调,使用方式,下载一个ngrok,然后由命令行窗口进入ngrok解压的目录,然后执行:

ngrok.exe -config ngrok.cfg -subdomain weixinpay(可以改成自己喜欢的域名) 8080(可以改成自己喜欢的端口)

首先生成微信二维码(1):

  /**
        * 生成微信二维码图片
        * @throws Exception
        */
      public void gainQRCode() throws Exception {
              try {
                  String orderNu = request.getParameter("orderNu");
                  String describe = request.getParameter("describe");
                  String payCodeType = request.getParameter("payCodeType");
                 System.out.println("订单编号:"+"\n"+orderNu);
                 String price = request.getParameter("txnAmt");
                 if(StringUtils.isBlank(orderNu)){//账户充值,不用签名校验
                     orderNu = "WE"+StringUtil.getTableId(false);
                 } else {
                     String sign = request.getParameter("sign");
                     String signParam = "orderNu="+orderNu+"&payPrice="+price;
                     String newSign = DigestUtils.md5Hex(signParam.getBytes("utf-8"));
                     if(!newSign.equalsIgnoreCase(sign)){
                         Map param = new HashMap<>();
                         param.put("statu", "2");
                         JSONArray jsonProduct = JSONArray.fromObject(param);
                         System.out.println("json:  "+jsonProduct.toString());
                         response.getWriter().print(jsonProduct.toString());
                         return ;
                     }
                 }
                 System.out.println("没有转换的金额:"+"\n"+price);
                 BigDecimal bigDecimalPrice = new BigDecimal(price);
                 String pric = bigDecimalPrice.multiply(new BigDecimal(100)).toString().split("\\.")[0];
                 System.out.println("转换后的金额:"+"\n"+pric);    
                 String filePostfix = "jpg";
                 // 二维码图片名称
                 String codePng = System.currentTimeMillis() + "." + filePostfix;
                 // 保存路径
                 // 应用ID
                 String appid = Config.APPID;
                 // 商户ID
                 String mch_id = Config.MCHID;
                 String key = Config.KEY;
                 // 生成32位的随机字符串
                 String nonce_str = RandomStringUtil.generate().toUpperCase();
                 // 商户产品ID
                 User user = SessionUtil.getSysUserFormSession(request);
                 String product_id = "";
                 if(StringUtils.isNotBlank(payCodeType) && "1".equals(payCodeType)){//账户充值
                     product_id = "1_"+orderNu+"_"+"账户保证金充值"+"_"+pric+"_"+user.getUniversalid();
                 } else if (StringUtils.isNotBlank(payCodeType) && "2".equals(payCodeType)){//订单结算
                     product_id = "2_"+orderNu+"_"+describe+"_"+pric+"_"+user.getUniversalid();
                 }
          //上面的可以不关注.关注下面的签名和发送的参数,54行开始
                 // 时间戳
                 String time_stamp = System.currentTimeMillis()+"";
                 String sign = "";//这些参数可以去微信扫码的支付的文档看看具体是什么意思
                 String temp = "appid=" + appid + "&mch_id=" + mch_id + "&nonce_str=" + nonce_str + "&" + "product_id="
                         + product_id + "&time_stamp=" + time_stamp;
                 String signTemp = temp + "&key=" + key;
                 System.out.println("二维码请求参数:"+"\n"+temp);
                 sign = Encrypt.e(signTemp).toUpperCase();
                 String contentUrl = "weixin://wxpay/bizpayurl?" + temp + "&sign=" + sign;
                 String url = QRCODE_PATH + File.separator  + File.separator + codePng;
                 File f = new File(url);
                 if(!f.exists()){
                     f.mkdirs();
                 } 
                 System.out.println("已生成二维码url");
                 QRImgCode.encode(contentUrl, "二维码", 400, 400, url);
                 System.out.println("二维码已经生成成功");
                 Map param = new HashMap<>();
                 param.put("statu", "1");
                 param.put("imgName"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值