准備工作:已通過微信認證的公眾號,域名可以不通過ICP備案
借鑒了很多大神的文章,在此先謝過了
大體過程:根據固定金額和商品的ID先生成訂單,再生成二維碼,客戶掃一掃付款
模式二支付的流程如下圖,可以說是最簡單的支付方式了
業務流程說明:
(1)商戶后台系統根據用戶選購的商品生成訂單。
(2)用戶確認支付后調用微信支付【統一下單API】生成預支付交易;
(3)微信支付系統收到請求后生成預支付交易單,並返回交易會話的二維碼鏈接code_url。
(4)商戶后台系統根據返回的code_url生成二維碼。
(5)用戶打開微信“掃一掃”掃描二維碼,微信客戶端將掃碼內容發送到微信支付系統。
(6)微信支付系統收到客戶端請求,驗證鏈接有效性后發起用戶支付,要求用戶授權。
(7)用戶在微信客戶端輸入密碼,確認支付后,微信客戶端提交授權。
(8)微信支付系統根據用戶授權完成支付交易。
(9)微信支付系統完成支付交易后給微信客戶端返回交易結果,並將交易結果通過短信、微信消息提示用戶。微信客戶端展示支付交易結果頁面。
(10)微信支付系統通過發送異步消息通知商戶后台系統支付結果。商戶后台系統需回復接收情況,通知微信后台系統不再發送該單的支付通知。
(11)未收到支付通知的情況,商戶后台系統調用【查詢訂單API】。
(12)商戶確認訂單已支付后給用戶發貨。
一、生成微信支付二維碼
訂單可以在訂單表中新建一條數據,然后用id作為product_id
/** * 掃碼模式二 * * @param request * @param response * @throws Exception */ @RequestMapping("paytwo") public String paytwo(HttpServletRequest request, HttpServletResponse response) throws Exception { // 商戶后台系統根據用戶選購的商品生成訂單。 String out_trade_no = PayUtil.createNonceStr(); String product_id = DateTimeUtil.getCurrTime();// 根據自己的邏輯生成 int total_fee = 1; // 1分作測試 String attach = "支付測試"; String body = "支付測試"; String nonce_str = PayUtil.createNonceStr(); String spbill_create_ip = HttpReqUtil.getRemortIP(request); // 獲取IP UnifiedOrderParams unifiedOrderParams = new UnifiedOrderParams(); unifiedOrderParams.setAppid(WeChatConfig.APP_ID);// 必須 unifiedOrderParams.setMch_id(WeChatConfig.MCH_ID);// 必須 unifiedOrderParams.setOut_trade_no(out_trade_no); unifiedOrderParams.setBody(body); unifiedOrderParams.setAttach(attach); unifiedOrderParams.setProduct_id(product_id);// 必須 unifiedOrderParams.setTotal_fee(total_fee);// 必須 unifiedOrderParams.setNonce_str(nonce_str); // 必須 unifiedOrderParams.setSpbill_create_ip(spbill_create_ip); // 必須 unifiedOrderParams.setTrade_type("NATIVE");// 必須 unifiedOrderParams.setNotify_url(WeChatConfig.NOTIFY_URL); //異步通知URL // 統一下單 請求的Xml(除detail外不需要<![CDATA[product_001]]>格式) String unifiedXmL = wechatPayService.abstractPayToXml(unifiedOrderParams); //簽名並入service // logger.info("統一下單 請求的Xml"+unifiedXmL); // 統一下單 返回的xml(<![CDATA[product_001]]>格式) String unifiedResultXmL = HttpReqUtil.HttpsDefaultExecute(HttpReqUtil.POST_METHOD, WeChatConfig.UNIFIED_ORDER_URL, null, unifiedXmL); // logger.info("統一下單 返回的xml("+unifiedResultXmL); // 統一下單返回 驗證簽名 if (SignatureUtil.checkIsSignValidFromWeiXin(unifiedResultXmL)) { UnifiedOrderResult unifiedOrderResult = XmlUtil.getObjectFromXML(unifiedResultXmL,UnifiedOrderResult.class); if("SUCCESS".equals(unifiedOrderResult.getReturn_code()) && "SUCCESS".equals(unifiedOrderResult.getResult_code())){ /****根據unifiedOrderResult.getCode_url()生成有效期為2小時的二維碼****/ /****根據product_id再次支付方法自己寫****/ } }else{ logger.info("簽名驗證錯誤"); } return null; }
此二維碼規則形如weixin://wxpay/bizpayurl?sr=XXXXX格式,可用QRCode.jar生成