微信掃碼支付

微信掃碼支付


   微信掃碼支付會比微信公衆號支付會簡單不少,也沒有那麼多麻煩,使用的場景也不同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

相關文章
相關標籤/搜索