微信掃碼支付會比微信公衆號支付會簡單不少,也沒有那麼多麻煩,使用的場景也不同php
【模式一】:商戶後臺系統根據微信支付規則連接生成二維碼,連接中帶固定參數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