您的位置:首页 > 移动开发 > 微信开发

关于微信PC扫码支付

2016-02-23 16:00 344 查看
关于微信PC扫码支付

扫码支付 有两种模式 官网有说  这里采用简单明白的模式2

前期准备 

1 需要公众号 开通了微信支付权限

2 需要微信支付商户平台账号

服务器生成订单号

发送请求 https://api.mch.weixin.qq.com/pay/unifiedorder ;

参数是xml 例如:

 String xml = "<xml>" + "<appid>" + appid + "</appid>" + "<mch_id>" + mch_id + "</mch_id>" + "<nonce_str>"
        + nonce_str + "</nonce_str>" + "<sign>" + sign + "</sign>" + "<body><![CDATA[" + body + "]]></body>"
        + "<out_trade_no>" + out_trade_no + "</out_trade_no>" + "<total_fee>" + order_price + "</total_fee>"
        + "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" + "<notify_url>" + wechatNotifyUrl
        + "</notify_url>" + "<trade_type>" + trade_type + "</trade_type>" + "</xml>";
 然后微信会返回参数回来  如果参数code_url 正常就最好了,这个能拿来生成支付二维码

把 code_url 丢到页面上去
jsp 

<img alt="请扫描微信支付二维码" src="/weixinPay/qrcode?codeUrl=${codeUrl }"> 

java
 @RequestMapping(value = "/weixinPay/qrcode")
  public void wechatQrcodePay(HttpServletResponse response, String codeUrl) {
    GenerateQrCodeUtil.encodeQrcode(codeUrl, response);
  }

扫码支付就完成了

扫码完成后 为了让服务器有反应  微信会 访问wechatNotifyUrl这个地址 告诉服务器 扫码完成 付款成功了,你可以继续后面的业务流程了
所以扫码页面开个长连接 体验应该会更好些 ,,我是不太擅长咯  而且测试的时候没有正常把wechatNotifyUrl 用起来 所以只好略过用了其它的方式
就是交易查询订单

查询订单

页面挂个定时器 定时发请求到服务器去,让服务器去查https://api.mch.weixin.qq.com/pay/orderquery

参数也是xml
String xml = "<xml>" + "<appid>" + appid + "</appid>" + "<mch_id>" + mch_id + "</mch_id>" + "<nonce_str>"
        + nonce_str + "</nonce_str>" + "<sign>" + sign + "</sign>" + "<out_trade_no>" + out_trade_no+"</out_trade_no>" 
        +"</xml>";
如果参数无误 正常微信会返回三种情况 

1 还没付钱呢,别急 

2 嗯收到钱了,恭喜发财,

3 吵什么吵,早就收到钱了 不是告诉你了么

捕获到第二种情况就可以继续跑业务了 顺便再页面弹个框什么的  告诉用户付款成功 
 
注: 微信收钱只收整数,同时单位是分....

 
以上就是扫码的全部内容

参考: 发xml的post请求

public static String httpPostXml(String url, String xml) {
    // post请求返回结果
    String str = "";
    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpPost method = new HttpPost(url);
    try {
      // 解决中文乱码问题
      StringEntity entity = new StringEntity(xml, "utf-8");
      entity.setContentEncoding("UTF-8");
      entity.setContentType("application/json");
      method.setEntity(entity);
      HttpResponse result = httpClient.execute(method);
      url = URLDecoder.decode(url, "UTF-8");
      /** 请求发送成功,并得到响应 **/
      if (result.getStatusLine().getStatusCode() == 200) {
        try {
          /** 读取服务器返回过来的json字符串数据 **/
          str = EntityUtils.toString(result.getEntity(), HTTP.UTF_8);
        } catch (Exception e) {
          logger.error("post请求提交失败:" + url, e);
        }
      }
    } catch (IOException e) {
      logger.error("post请求提交失败:" + url, e);
    }
    return str;
  } 

扫码

public static void encodeQrcode(String content, HttpServletResponse response) {
    if (content.trim().length()==0)
      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();
    }
  } 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微信支付