Java微信订单查询
生活随笔
收集整理的這篇文章主要介紹了
Java微信订单查询
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
版權(quán)聲明:本文首發(fā) http://asing1elife.com ,轉(zhuǎn)載請注明出處。 https://blog.csdn.net/asing1elife/article/details/82620040 訂單查詢請求參數(shù)(必填) public class QueryOrderRequest {// 公眾賬號idprivate String appid;// 商戶號private String mch_id;// 商戶訂單號,32位以內(nèi),不重復(fù)private String out_trade_no;// 隨機(jī)字符串,32位以內(nèi)private String nonce_str;// 簽名,遵循簽名算法private String sign;
} 查詢訂單請求參數(shù)(非必填) public class QueryOrderRequestExt extends QueryOrderRequest {// 簽名類型,默認(rèn)MD5private String sign_type;
}
查詢訂單接收參數(shù)(必填) public class QueryOrderResponse {// 返回狀態(tài)碼,通信標(biāo)識,SUCCESS/FAILprivate String return_code;// 公眾賬號idprivate String appid;// 商戶號private String mch_id;// 隨機(jī)字符串private String nonce_str;// 簽名private String sign;// 業(yè)務(wù)結(jié)果,交易標(biāo)識,SUCCESS/FAILprivate String result_code;// 用戶標(biāo)識private String openid;// 交易類型,JSAPI,NATIVE,APPprivate String trade_type;// 交易狀態(tài),SUCCESS-成功 USERPAYING-支付中private String trade_state;// 付款銀行private String bank_type;// 標(biāo)價(jià)金額,單位分private int total_fee;// 現(xiàn)金支付金額private int cash_fee;// 微信支付訂單號private String transaction_id;// 商戶訂單號private String out_trade_no;// 支付完成時(shí)間private String time_end;// 交易狀態(tài)描述private String trade_state_desc;
} 查詢訂單接收參數(shù)(非必填) public class QueryOrderResponseExt extends QueryOrderResponse {// 返回信息,非空則表示返回了錯(cuò)誤信息private String return_msg;// 錯(cuò)誤代碼private String err_code;// 錯(cuò)誤代碼描述private String err_code_des;// 設(shè)備號private String device_info;// 是否關(guān)注公眾號private String is_subscribe;// 應(yīng)結(jié)訂單金額private String settlement_total_fee;// 標(biāo)價(jià)幣種private String fee_type;// 現(xiàn)金支付幣種private String cash_fee_type;// 附加數(shù)據(jù)private String attach;
}
SOPConstants.WECHAT_PAY_APP_ID 是公眾賬號 id SOPConstants.WECHAT_PAY_MCH_ID 是商戶id WechatUtil.makeNonceStr() 是生成的隨機(jī)字符串 WechatUtil.makeSign(BeanMap.create(ext)) 是根據(jù)請求參數(shù)制作簽名 WechatUtil.truncateDataToXML(QueryOrderRequestExt.class, ext) 是將數(shù)據(jù)轉(zhuǎn)換為 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() 是向微信發(fā)起請求的通用方法 只有 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())) {// 更新訂單狀態(tài)orderPayService.updateOrderInfo(ext.getOut_trade_no(), OrderPay.wchatPay.getCode());return true;} else {logger.error("訂單" + orderId + "交易失敗,交易狀態(tài):" + ext.getTrade_state());return false;}} else {logger.error("訂單" + orderId + "查詢失敗!");return false;}
} 該工具類目前提供了數(shù)據(jù)轉(zhuǎn)換、簽名生成、隨機(jī)數(shù)生成的通用方法 public class WechatUtil {private static Logger logger = LoggerFactory.getLogger(WechatUtil.class);/*** 數(shù)據(jù)轉(zhuǎn)換為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);}/*** 數(shù)據(jù)轉(zhuǎn)換為對象** @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);}/*** 生成隨機(jī)字符串** @return*/public static String makeNonceStr() {StringBuffer str = new StringBuffer(DateUtil.getSysDateString("yyyyMMddHHmmssS"));str.append((new Random().nextInt(900) + 100));return str.toString();}/*** 拼接簽名數(shù)據(jù)** @return*/public static String makeSign(BeanMap beanMap) {SortedMap<String, String> signMaps = Maps.newTreeMap();for (Object key : beanMap.keySet()) {Object value = beanMap.get(key);// 排除空數(shù)據(jù)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();// 為空不參與簽名、參數(shù)名區(qū)分大小寫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進(jìn)行加密** @param str 待加密的字符串* @return 加密后的字符串*/private static String encoderByMd5(String str) {// 生成一個(gè)MD5加密計(jì)算摘要MessageDigest md = null;try {md = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {logger.error("MD5加密失敗!", e);}if (md == null) {return null;}// 計(jì)算md5函數(shù)md.update(str.getBytes());// digest()最后確定返回md5 hash值,返回值為8為字符串。因?yàn)閙d5 hash值是16位的hex值,實(shí)際上就是8位的字符// BigInteger函數(shù)則將8位的字符串轉(zhuǎn)換成16位hex值,用字符串來表示;得到字符串形式的hash值return new BigInteger(1, md.digest()).toString(16);}}
Java微信訂單查詢
Java 通過統(tǒng)一下單 API 進(jìn)行訂單支付后,除等待微信通過 notify_url 進(jìn)行回調(diào)通知外,還可以主動查詢訂單狀態(tài)
更多精彩
- 更多技術(shù)博客,請移步 asing1elife’s blog
前置條件
可參考 Java 微信掃碼支付 如果實(shí)現(xiàn)微信支付
官網(wǎng)
【微信支付】掃碼支付開發(fā)者文檔
定義請求參數(shù)對象
定義接收參數(shù)對象
生成訂單信息
向微信發(fā)起訂單查詢請求
微信支付相關(guān)操作工具類
微信支付請求建立類
public class WechatConnection {// 成功標(biāo)志public static final String SUCCESS_CODE = "SUCCESS";/*** 建立微信連接,并返回結(jié)果** @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);// 發(fā)送數(shù)據(jù)BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream());bos.write(info.getBytes());bos.flush();bos.close();// 獲取數(shù)據(jù)BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));// 接收數(shù)據(jù)String line;StringBuffer str = new StringBuffer();while ((line = reader.readLine()) != null) {str.append(line);}return WechatUtil.truncateDataFromXML(object, str.toString());}}總結(jié)
以上是生活随笔為你收集整理的Java微信订单查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 17个服务器发展趋势,我们都给您总结好了
- 下一篇: Maven入门教程