微信扫码支付

微信扫码支付


   微信扫码支付会比微信公众号支付会简单不少,也没有那么多麻烦,使用的场景也不同php

  使用场景  扫码支付场景介绍   https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1

  


   实现模式(两种)

  【模式一】:商户后台系统根据微信支付规则连接生成二维码,连接中带固定参数productid(可定义为产品标识或订单号)。用户扫码后,微信支付系统将productid和用户惟一标识(openid)回调商户后台系统(须要设置支付回调URL),商户后台系统根据productid生成支付交易,最后微信支付系统发起用户支付流程。html

商户支付回调URL设置指引:进入商户平台-->产品中心-->开发配置,进行配置和修改java

  【模式二】:商户后台系统调用微信支付【统一下单API】生成预付交易,将接口返回的连接生成二维码,用户扫码后输入密码完成支付交易。注意:该模式的预付单有效期为2小时,过时后没法支付。api

  我主要是使用模式二,比较简单,舒服点微信

  业务流程时序图


  

业务流程说明:

(1)商户后台系统根据用户选购的商品生成订单。app

(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;异步

(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码连接code_url。测试

(4)商户后台系统根据返回的code_url生成二维码。微信支付

(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。google

(6)微信支付系统收到客户端请求,验证连接有效性后发起用户支付,要求用户受权。

(7)用户在微信客户端输入密码,确认支付后,微信客户端提交受权。

(8)微信支付系统根据用户受权完成支付交易。

(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果经过短信、微信消息提示用户。微信客户端展现支付交易结果页面。

(10)微信支付系统经过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收状况,通知微信后台系统再也不发送该单的支付通知。

(11)未收到支付通知的状况,商户后台系统调用【查询订单API】。

(12)商户确认订单已支付后给用户发货。

生成二维码规则

对应连接格式:weixin://wxpay/bizpayurl?sr=XXXXX。请商户调用第三方库将code_url生成二维码图片。该模式连接较短,生成的二维码打印到结帐小票上的识别率较高


  主要代码实现


  Maven依赖:主要是为了画二维码用的

<dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>core</artifactId>
      <version>3.3.3</version>
    </dependency>
    <dependency>
      <groupId>com.google.zxing</groupId>
      <artifactId>javase</artifactId>
      <version>3.3.3</version>
    </dependency>

  微信提供的SDK按照规则实现统一下单API,都是拼装参数,调用方法

 1 public String getWXPayUrlCode(String userId, String productId) throws Exception {  2         // 能够根据userid和productId来获取一系列商品的信息  3         // 订单号 (调整为本身的生产逻辑)
 4         String out_trade_no = "" + System.currentTimeMillis();  5         // 获取发起电脑 ip
 6         String spbill_create_ip ="113.69.246.11";  7         // 微信异步回调接口
 8         String notify_url = PayConfigUtil.NOTIFY_URL;  9         // 交易类型扫码支付
10         String trade_type = "NATIVE"; 11         SortedMap<String, String> packageParams = new TreeMap<String, String>(); 12         packageParams.put("attach", "测试attach"); 13         packageParams.put("body", "测试body"); 14         packageParams.put("out_trade_no", out_trade_no); 15         packageParams.put("total_fee", "1"); 16         packageParams.put("spbill_create_ip", spbill_create_ip); 17         packageParams.put("notify_url", notify_url); 18         packageParams.put("trade_type", trade_type); 19         //微信统一下单API
20         Map<String, String> codeMap = wxPay.unifiedOrder(packageParams); 21         String urlCode = codeMap.get("code_url"); 22         return urlCode; 23     }

  画图生成支付二维码

 1   /**
 2  * 微信扫码支付 客户支付形式  3  *  4  * @param request  5  * @param response  6      */
 7     @RequestMapping("/wxqrCode")  8     public void wxQRCode(HttpServletRequest request, HttpServletResponse response) {  9         try { 10             
11             String productId = request.getParameter("productId"); 12             String userId = "user1"; 13             String text = wxPayService.getWXPayUrlCode(userId, productId); 14             int width = 300; 15             int height = 300; 16             //二维码的图片格式
17             String format = "gif"; 18             Hashtable hints = new Hashtable(); 19             //内容所使用编码
20             hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); 21  BitMatrix bitMatrix; 22             try { 23                 bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints); 24  QRUtil.writeToStream(bitMatrix, format, response.getOutputStream()); 25             } catch (WriterException e) { 26  e.printStackTrace(); 27  } 28         } catch (Exception e) { 29 
30  } 31     }

二维码支付已经完成,其中能够根据本身的需求逻辑改善其中

 

  参考:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

       转载请注明出处:https://www.cnblogs.com/zhouguanglin/p/9283258.html

相关文章
相关标签/搜索