版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82620040

Java微信订单查询

Java 通过统一下单 API 进行订单支付后,除等待微信通过 notify_url 进行回调通知外,还可以主动查询订单状态

更多精彩

  • 更多技术博客,请移步 asing1elife’s blog

前置条件

可参考 Java 微信扫码支付 如果实现微信支付

官网

【微信支付】扫码支付开发者文档

定义请求参数对象

  1. 订单查询请求参数(必填)
public class QueryOrderRequest {// 公众账号idprivate String appid;// 商户号private String mch_id;// 商户订单号,32位以内,不重复private String out_trade_no;// 随机字符串,32位以内private String nonce_str;// 签名,遵循签名算法private String sign;
}
  1. 查询订单请求参数(非必填)
public class QueryOrderRequestExt extends QueryOrderRequest {// 签名类型,默认MD5private String sign_type;
}

定义接收参数对象

  1. 查询订单接收参数(必填)
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;
}
  1. 查询订单接收参数(非必填)
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;
}

生成订单信息

  1. SOPConstants.WECHAT_PAY_APP_ID 是公众账号 id
  2. SOPConstants.WECHAT_PAY_MCH_ID 是商户id
  3. WechatUtil.makeNonceStr() 是生成的随机字符串
  4. WechatUtil.makeSign(BeanMap.create(ext)) 是根据请求参数制作签名
  5. 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);
}

向微信发起订单查询请求

  1. SOPConstants.WECHAT_PAY_QUERY_URL 是微信订单查询的请求 URL
  2. WechatConnection.connect() 是向微信发起请求的通用方法
  3. 只有 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;}
}

微信支付相关操作工具类

  1. 该工具类目前提供了数据转换、签名生成、随机数生成的通用方法
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);}}

微信支付请求建立类

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微信订单查询相关推荐

  1. java编程根据订单编号查询订单状态_Java微信订单查询

    Java 通过统一下单 API 进行订单支付后,除等待微信通过 notify_url 进行回调通知外,还可以主动查询订单状态 更多精彩 前置条件 可参考 Java 微信扫码支付 如果实现微信支付 官网 ...

  2. java微信天气查询接口,全国天气预报信息 API 接口

    全国天气预报信息 API 接口 精确到行政区的7日天气预报. 1. 产品功能 全国天气预报每隔 6 小时更新数据: 精确到行政区级别的天气预报数据: 提供最长 7 天的天气预报数据: 提供每日小时级别 ...

  3. java mybtis关联查询,7.MyBatis 关联查询(一对一)

    1 关联查询映射 1.1 分析数据模型 思路 :每张表记录的数据内容 每张表重要的字段(主键,外键,非空字段) 表与表之间的关系(外键关系) 表与表之间的业务关系(建立在某个业务意义基础上去分析) 如 ...

  4. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  5. 微信支付查询订单java_微信支付java版本之查询订单

    本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; ...

  6. java微信支付 [统一下单接口] 与 [订单查询接口] 调用成功完整代码与结果

    公司最近要搞微信支付, 之前也没有做过, 但是搞过阿里云, 想来也不是很难. 在网上找了很多贴子, 在eclipse里做了5个测试工程, 没有测试成功, 后来下了微信SDK, 也做了个测试样例, 期间 ...

  7. 微信V3支付 订单查询 退款查询

    本编在对接V3支付的时候连连撞头,希望后来人能少走点弯路,如果有bug请海涵啊,希望各位大佬也能给我点意见,话不多说上代码: service层 package com.tiyaa.mall.pay.s ...

  8. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  9. java后台实现支付宝支付接口、支付宝订单查询接口 前端为APP

    最近项目APP需要接入微信.支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司 ...

最新文章

  1. linux卸载欧朋浏览器,如何在Centos下安装opera浏览器
  2. 使用JavaScript实现一个简单的编译器
  3. python输出数据到excel-python实现数据导出到excel的示例--普通格式
  4. 切换debian8系统语言环境
  5. MySQL 基础 ———— SQL语句的执行顺序与 LIMIT 子句
  6. Zookeeper-Watcher(事件通知)
  7. 吴恩达机器学习神经网络作业(python实现)
  8. 不使用服务器控件的ASP.NET
  9. 大数据产品推荐:神策分析——可私有化部署的用户行为分析平台
  10. 第【一】部分Netzob项目工具的安装配置
  11. js中进行字符串替换的方法
  12. win10系统下JDK环境变量配置失败的原因
  13. mac安装应用提示已损坏的解决方法
  14. 计算机word基本知识配图,用Word 2016快速制作思维导图
  15. 第4关国际标准书号校验python 头歌
  16. 魔兽世界插件开发:Beginning Lua with World of Warcraft Add-ons 中文翻译及学习 (1.1)
  17. YS-M8C自助终端主板RK3288详解和说明
  18. 启动springboot报错:程序包org.springframework.boot不存在
  19. [网络安全自学篇] 七十一.深信服分享之外部威胁防护和勒索病毒对抗
  20. Ubuntu18配置静态IP地址

热门文章

  1. 三星S7 android操作系统耗电,2K屏手机玩游戏耗电大、性能渣?三星S7:呵呵
  2. 封头名义厚度如何圆整_压力容器封头厚度计算
  3. markdown 流程图js_MarkDown 流程图示例
  4. parsel安装老是失败_Photoshop安装失败解决办法
  5. mysql拒绝访问root用户_设置mysql的root用户允许远程登录
  6. flatform installer web 安装php_Windows server 2019 安装 IIS PHP 环境无标题笔记
  7. 管理服务器一般的作用,管理服务器作用
  8. html5相对父元素定位,layer弹出层设置相对父级元素定位
  9. php加水印功能,PHP图片加水印功能
  10. mysql grant教程_MySQL如何使用授权命令grant