微信扫码支付

微信扫码支付


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

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

  


   实现模式(两种)

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

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

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

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

  业务流程时序图


  

业务流程说明:

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

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

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

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

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

(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

  

 

 

 

 

原文地址:https://www.cnblogs.com/zhouguanglin/p/9965044.html