七 SpringCloud - 微信支付( 三 )

3.4 請求測試3.4.1 發送請求

七 SpringCloud - 微信支付

文章插圖
3.4.2 生成二維碼
七 SpringCloud - 微信支付

文章插圖
4、接收用戶支付成功后,微信異步回調支付結果
  1. 支付后,微信官方 , 通過回調地址 , 返回用戶信息通過數據流 。
  2. 解析回調數據流 。
  3. 解析異步回調的支付結果 。
  4. 同步給微信官方響應結果 。
4.1接口/*** @author : huayu* @date: 3/11/2022* @param: [wxpayNotifyXmlResult]* @return : java.lang.String* @description : 調用業務接口,解析異步回調的支付結果,并獲取通知微信官方的結果*/String getNotifyWechatXmlResult(String wxpayNotifyXmlResult) throws Exception;4.2 實現類@Overridepublic String getNotifyWechatXmlResult(String wxpayNotifyXmlResult) throws Exception {//將微信支付結果通知的xml格式字符串 , 轉換位map集合 , 方便處理Map<String, String> wxpayNotifyXmlForMapResult = WechatPayUtil.generateXmlToMap(wxpayNotifyXmlResult);//解析回調結果if(WechatPayConstant.WECHAT_PAY_RESULT_SUCCESS.equals(wxpayNotifyXmlForMapResult.get("return_code"))){//官方提醒:商戶系統對于支付結果通知的內容一定要做簽名驗證,并校驗返回的訂單金額是否與商戶側的訂單金額一致 , 防止數據泄露導致出現“假通知”,造成資金損失 。if(WechatPayUtil.isSignatureValid(wxpayNotifyXmlForMapResult,wechatPayConfig.getMchKey())){// 簽名校驗成功,說明回調結果是可信的 , 就可以進行業務處理,如果簽名失敗,說明回調來源不可信 , 不能進行業務處理// TODO 真實業務中,收到正確回調 , 就要進行對應的業務處理 , 比如修改訂單狀態,發送主題消息,給定用戶加積分 , 給物流生成物流單等等// 業務處理成功后,需要同步給微信響應結果-成功//成功return WechatPayConstant.WECHAT_PAY_NOTIFY_SUCCESS;}}// 同步給微信響應結果-失敗returnWechatPayConstant.WECHAT_PAY_NOTIFY_FALL;}4.3 請求方法/*** @author : huayu* @date: 3/11/2022* @param: [request, response]* @return : void* @description : 接收用戶支付成功后,微信異步回調支付結果*/@RequestMapping("/wxpay/notifyresult")public void receiveWechatPayNotifyResult(HttpServletRequest request, HttpServletResponse response){//支付完成后,微信會把相關支付結果及用戶信息通過數據流的形式發送給商戶,商戶需要接收處理,并按文檔規范返回應答 。try(InputStream inputStream = request.getInputStream()){//解析回調數據流BufferedReader brf = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));//定義可變字符對象,保存返回的xml格式支付結果StringBuilder wxpayNotifyXmlResult = new StringBuilder();//逐行解析String readline = null;while ((readline = brf.readLine()) != null){wxpayNotifyXmlResult.append(readline);}log.info("------ 3.微信支付結果異步回調內容:{} ------",wxpayNotifyXmlResult);//調用業務接口 , 解析異步回調的支付結果,并獲取通知微信官方的結果String respWechatXmlResult = wechatPayService.getNotifyWechatXmlResult(wxpayNotifyXmlResult.toString());//同步給微信官方響應結果PrintWriter out = response.getWriter();out.write(respWechatXmlResult);out.flush();out.close();log.info("------ 4、微信支付異步回調處理后 , 響應結果:{} ------",respWechatXmlResult);}catch (Exception e){log.info("------ 微信支付結果異步回調處理異常,異常信息:{} ------", e.getMessage());}}4.4 請求測試(微信官方回調)【七 SpringCloud - 微信支付】
七 SpringCloud - 微信支付

文章插圖
5、查看用戶訂單狀態
  1. 獲取參數,放進map集合中并按key值,字典排序 。
  2. 通過參數生成簽名(生成的簽名也放進map集合) 。
  3. 將map集合轉成xml字符串 。
  4. 獲取訂單狀態查詢地址,xml參數字符串作為參數發送請求 。
  5. 返回訂單狀態信息 。
5.0 參數列表
七 SpringCloud - 微信支付

文章插圖
5.1 接口/*** @author : huayu* @date: 3/11/2022* @param: [orderNo]* @return : java.lang.String* @description : 通過訂單好查詢訂單狀態*/Map<String, String> getOrderStatus(String orderNo) throws Exception;5.2 實現類@Overridepublic Map<String, String> getOrderStatus(String orderNo) throws Exception {log.info("++++++獲取查詢訂單狀態的參數 ++++++");//參數集合TreeMap<String, String> paramsMap = new TreeMap<>();//公眾賬號IDappidparamsMap.put("appid",wechatPayConfig.getAppId());//商戶號 mch_idparamsMap.put("mch_id",wechatPayConfig.getMchId());//商戶訂單號 out_trade_noparamsMap.put("out_trade_no",orderNo);//隨機字符串 nonce_strparamsMap.put("nonce_str",WechatPayUtil.generateNonceStr());//簽名 signparamsMap.put("sign",WechatPayUtil.generateSignature(paramsMap,wechatPayConfig.getMchKey()));//將map集合的參數轉換成xml格式的字符串String paramsMapToXml = WechatPayUtil.generateMapToXml(paramsMap);log.info("++++++查詢訂單狀態的參數:{} ++++++",paramsMapToXml);//發送post請求,獲取訂單狀態 xml格式字符串String orderStatusXmlResult = HttpClient4Util.getResponse4PostByString(wechatPayConfig.getViewOrderStatusUri(), paramsMapToXml, WechatPayConstant.WECHAT_PAY_ENCODING_UTF8);log.info("++++++發送post請求 , 獲取訂單狀態 xml格式字符串 orderStatusXmlResult:++++++\n{}",orderStatusXmlResult);//將xml格式結果字符串轉化成 map 集合Map<String, String> orderStatusXmlResultToMap = WechatPayUtil.generateXmlToMap(orderStatusXmlResult);//判斷返回結果//交易成功判斷條件: return_code、result_code和trade_state都為SUCCESSif(WechatPayConstant.WECHAT_PAY_VIEW_ORDER_STATUS_SUCCESS.equals(orderStatusXmlResultToMap.get("return_code"))&& WechatPayConstant.WECHAT_PAY_VIEW_ORDER_STATUS_SUCCESS.equals(orderStatusXmlResultToMap.get("result_code"))&& WechatPayConstant.WECHAT_PAY_VIEW_ORDER_STATUS_SUCCESS.equals(orderStatusXmlResultToMap.get("trade_state"))){//返回訂單信息return orderStatusXmlResultToMap;}return null;}

推薦閱讀