Java微信公眾平台開發之掃碼支付模式二


官方文檔

准備工作:已通過微信認證的公眾號,域名可以不通過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生成

二、完成支付並通知支付結果

可以參考我這篇寫的 詳情點擊 或者這篇的五部分 詳情點擊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM