Java微信订单查询
生活随笔
收集整理的這篇文章主要介紹了
Java微信订单查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文首發 http://asing1elife.com ,轉載請注明出處。 https://blog.csdn.net/asing1elife/article/details/82620040 訂單查詢請求參數(必填) public class QueryOrderRequest {// 公眾賬號idprivate String appid;// 商戶號private String mch_id;// 商戶訂單號,32位以內,不重復private String out_trade_no;// 隨機字符串,32位以內private String nonce_str;// 簽名,遵循簽名算法private String sign;
} 查詢訂單請求參數(非必填) public class QueryOrderRequestExt extends QueryOrderRequest {// 簽名類型,默認MD5private String sign_type;
}
查詢訂單接收參數(必填) public class QueryOrderResponse {// 返回狀態碼,通信標識,SUCCESS/FAILprivate String return_code;// 公眾賬號idprivate String appid;// 商戶號private String mch_id;// 隨機字符串private String nonce_str;// 簽名private String sign;// 業務結果,交易標識,SUCCESS/FAILprivate String result_code;// 用戶標識private String openid;// 交易類型,JSAPI,NATIVE,APPprivate String trade_type;// 交易狀態,SUCCESS-成功 USERPAYING-支付中private String trade_state;// 付款銀行private String bank_type;// 標價金額,單位分private int total_fee;// 現金支付金額private int cash_fee;// 微信支付訂單號private String transaction_id;// 商戶訂單號private String out_trade_no;// 支付完成時間private String time_end;// 交易狀態描述private String trade_state_desc;
} 查詢訂單接收參數(非必填) public class QueryOrderResponseExt extends QueryOrderResponse {// 返回信息,非空則表示返回了錯誤信息private String return_msg;// 錯誤代碼private String err_code;// 錯誤代碼描述private String err_code_des;// 設備號private String device_info;// 是否關注公眾號private String is_subscribe;// 應結訂單金額private String settlement_total_fee;// 標價幣種private String fee_type;// 現金支付幣種private String cash_fee_type;// 附加數據private String attach;
}
SOPConstants.WECHAT_PAY_APP_ID 是公眾賬號 id SOPConstants.WECHAT_PAY_MCH_ID 是商戶id WechatUtil.makeNonceStr() 是生成的隨機字符串 WechatUtil.makeSign(BeanMap.create(ext)) 是根據請求參數制作簽名 WechatUtil.truncateDataToXML(QueryOrderRequestExt.class, ext) 是將數據轉換為 XML 形式 private String generateOrderInfo(Long orderId) {OrderDTO order = orderManageService.getOrder(orderId);QueryOrderRequestExt ext = new QueryOrderRequestExt();ext.setAppid(SOPConstants.WECHAT_PAY_APP_ID);ext.setMch_id(SOPConstants.WECHAT_PAY_MCH_ID);ext.setOut_trade_no(order.getCode());ext.setNonce_str(WechatUtil.makeNonceStr());ext.setSign(WechatUtil.makeSign(BeanMap.create(ext)));return WechatUtil.truncateDataToXML(QueryOrderRequestExt.class, ext);
} SOPConstants.WECHAT_PAY_QUERY_URL 是微信訂單查詢的請求 URL WechatConnection.connect() 是向微信發起請求的通用方法 只有 ext.getResult_code() ext.getResult_code() ext.getTrade_state() 的值都是 SUCCESS 才能確定訂單支付成功 public Boolean getPayResult(Long orderId) {String orderInfo = generateOrderInfo(orderId);QueryOrderResponseExt ext = null;try {ext = (QueryOrderResponseExt) WechatConnection.connect(SOPConstants.WECHAT_PAY_QUERY_URL, orderInfo, QueryOrderResponseExt.class);} catch (IOException e) {logger.error("微信查詢訂單" + orderId + "失敗!", e);}if (ext == null) {return false;}if (WechatConnection.SUCCESS_CODE.equals(ext.getResult_code())) {if (WechatConnection.SUCCESS_CODE.equals(ext.getResult_code()) && WechatConnection.SUCCESS_CODE.equals(ext.getTrade_state())) {// 更新訂單狀態orderPayService.updateOrderInfo(ext.getOut_trade_no(), OrderPay.wchatPay.getCode());return true;} else {logger.error("訂單" + orderId + "交易失敗,交易狀態:" + ext.getTrade_state());return false;}} else {logger.error("訂單" + orderId + "查詢失敗!");return false;}
} 該工具類目前提供了數據轉換、簽名生成、隨機數生成的通用方法 public class WechatUtil {private static Logger logger = LoggerFactory.getLogger(WechatUtil.class);/*** 數據轉換為xml格式** @param object* @param obj* @return*/public static String truncateDataToXML(Class<?> object, Object obj) {XStream xStream = new XStream(new XppDriver(new XmlFriendlyReplacer("_-", "_")));xStream.alias("xml", object);return xStream.toXML(obj);}/*** 數據轉換為對象** @param object* @param str* @return*/public static Object truncateDataFromXML(Class<?> object, String str) {XStream xStream = new XStream(new XppDriver(new XmlFriendlyReplacer("_-", "_")));xStream.alias("xml", object);return xStream.fromXML(str);}/*** 生成隨機字符串** @return*/public static String makeNonceStr() {StringBuffer str = new StringBuffer(DateUtil.getSysDateString("yyyyMMddHHmmssS"));str.append((new Random().nextInt(900) + 100));return str.toString();}/*** 拼接簽名數據** @return*/public static String makeSign(BeanMap beanMap) {SortedMap<String, String> signMaps = Maps.newTreeMap();for (Object key : beanMap.keySet()) {Object value = beanMap.get(key);// 排除空數據if (value == null) {continue;}signMaps.put(key + "", String.valueOf(value));}// 生成簽名return generateSign(signMaps);}/*** 生成簽名** @param signMaps* @return* @throws Exception*/public static String generateSign(SortedMap<String, String> signMaps) {StringBuffer sb = new StringBuffer();// 字典序for (Map.Entry signMap : signMaps.entrySet()) {String key = (String) signMap.getKey();String value = (String) signMap.getValue();// 為空不參與簽名、參數名區分大小寫if (null != value && !"".equals(value) && !"sign".equals(key) && !"key".equals(key)) {sb.append(key).append("=").append(value).append("&");}}// 拼接keysb.append("key=").append(SOPConstants.WECHAT_PAY_KEY);// MD5加密return Objects.requireNonNull(encoderByMd5(sb.toString())).toUpperCase();}/*** 利用MD5進行加密** @param str 待加密的字符串* @return 加密后的字符串*/private static String encoderByMd5(String str) {// 生成一個MD5加密計算摘要MessageDigest md = null;try {md = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {logger.error("MD5加密失敗!", e);}if (md == null) {return null;}// 計算md5函數md.update(str.getBytes());// digest()最后確定返回md5 hash值,返回值為8為字符串。因為md5 hash值是16位的hex值,實際上就是8位的字符// BigInteger函數則將8位的字符串轉換成16位hex值,用字符串來表示;得到字符串形式的hash值return new BigInteger(1, md.digest()).toString(16);}}
Java微信訂單查詢
Java 通過統一下單 API 進行訂單支付后,除等待微信通過 notify_url 進行回調通知外,還可以主動查詢訂單狀態
更多精彩
- 更多技術博客,請移步 asing1elife’s blog
前置條件
可參考 Java 微信掃碼支付 如果實現微信支付
官網
【微信支付】掃碼支付開發者文檔
定義請求參數對象
定義接收參數對象
生成訂單信息
向微信發起訂單查詢請求
微信支付相關操作工具類
微信支付請求建立類
public class WechatConnection {// 成功標志public static final String SUCCESS_CODE = "SUCCESS";/*** 建立微信連接,并返回結果** @param url* @param info* @param object* @return* @throws IOException*/public static Object connect(String url, String info, Class<?> object) throws IOException {// 建立連接HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();conn.setConnectTimeout(8000);conn.setRequestMethod("POST");conn.setDoOutput(true);// 發送數據BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream());bos.write(info.getBytes());bos.flush();bos.close();// 獲取數據BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));// 接收數據String line;StringBuffer str = new StringBuffer();while ((line = reader.readLine()) != null) {str.append(line);}return WechatUtil.truncateDataFromXML(object, str.toString());}}總結
以上是生活随笔為你收集整理的Java微信订单查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 17个服务器发展趋势,我们都给您总结好了
- 下一篇: java美元兑换,(Java实现) 美元