微信支付根据Transaction_id查询订单信息

 <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.1-jre</version>
        </dependency>
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.9</version>
        </dependency>

 @RequestMapping("/getPayResult")
    public String getPayResult() {
        String orderInfo = generateOrderInfo();

        QueryOrderResponseExt ext = null;
        try {
            ext = (QueryOrderResponseExt) WechatConnection.connect("https://api.mch.weixin.qq.com/pay/orderquery", orderInfo, QueryOrderResponseExt.class);
        } catch (IOException e) {
            logger.error("微信查询订单失败!", e);
        }
        String result = "参数:" + orderInfo + "结果:" +ext.toString();
        System.out.println(result);
        return result;
    }

    private String generateOrderInfo() {
        QueryOrderRequestExt ext = new QueryOrderRequestExt();
        ext.setAppid(自己的appid);
        ext.setMch_id(自己的商户id);
        ext.setTransaction_id(对应的Transaction_id);
        ext.setNonce_str(WechatUtil.makeNonceStr());

        ext.setSign(WechatUtil.makeSign(BeanMap.create(ext)));

        return WechatUtil.truncateDataToXML(QueryOrderRequestExt.class, ext);
    }


@Data
public class QueryOrderRequest {
    // 公众账号id
    private String appid;

    // 商户号
    private String mch_id;

    // 商户订单号,32位以内,不重复
    private String out_trade_no;

    // 随机字符串,32位以内
    private String nonce_str;

    // 签名,遵循签名算法
    private String sign;
}

@Data
public class QueryOrderRequestExt extends QueryOrderRequest {
    // 签名类型,默认MD5
    private String sign_type;
    private String transaction_id;
}

public class QueryOrderResponse {
    // 返回状态码,通信标识,SUCCESS/FAIL
    private String return_code;

    // 公众账号id
    private String appid;

    // 商户号
    private String mch_id;

    // 随机字符串
    private String nonce_str;

    // 签名
    private String sign;

    // 业务结果,交易标识,SUCCESS/FAIL
    private String result_code;

    // 用户标识
    private String openid;

    // 交易类型,JSAPI,NATIVE,APP
    private 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;

    @Override
    public String toString() {
        return "QueryOrderResponseExt{" +
                "return_msg='" + return_msg + '\'' +
                ", err_code='" + err_code + '\'' +
                ", err_code_des='" + err_code_des + '\'' +
                ", device_info='" + device_info + '\'' +
                ", is_subscribe='" + is_subscribe + '\'' +
                ", settlement_total_fee='" + settlement_total_fee + '\'' +
                ", fee_type='" + fee_type + '\'' +
                ", cash_fee_type='" + cash_fee_type + '\'' +
                ", attach='" + attach + '\'' +
                '}';
    }
}


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());
    }

}


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(DateUtils.format(new Date(), "yyyyMMddHHmmss"));
        //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("&");
            }
        }

        // 拼接key
        //sb.append("key=").append(SOPConstants.WECHAT_PAY_KEY);
        sb.append("key=").append(自己的密码);

        // 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);
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/** * 微信支付帮助库 * ==================================================== * 接口分三种类型: * 【请求型接口】--Wxpay_client_ * 统一支付接口类--UnifiedOrder * 订单查询接口--OrderQuery * 退款申请接口--Refund * 退款查询接口--RefundQuery * 对账单接口--DownloadBill * 短链接转换接口--ShortUrl * 【响应型接口】--Wxpay_server_ * 通用通知接口--Notify * Native支付——请求商家获取商品信息接口--NativeCall * 【其他】 * 静态链接二维码--NativeLink * JSAPI支付--JsApi * ===================================================== * 【CommonUtil】常用工具: * trimString(),设置参数时需要用到的字符处理函数 * createNoncestr(),产生随机字符串,不长于32位 * formatBizQueryParaMap(),格式化参数,签名过程需要用到 * getSign(),生成签名 * arrayToXml(),array转xml * xmlToArray(),xml转 array * postXmlCurl(),以post方式提交xml到对应的接口url * postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url */ include_once("SDKRuntimeException.php"); include_once("WxPay.pub.config.php"); /** * 所有接口的基类 */ class Common_util_pub { function __construct() { } function trimString($value) { $ret = null; if (null != $value) { $ret = $value; if (strlen($ret) == 0) { $ret = null; } } return $ret; } /** * 作用:产生随机字符串,不长于32位 */ public function createNoncestr( $length = 32 ) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i $v) { if($urlencode) { $v = urlencode($v); } //$buff .= strtolower($k) . "=" . $v . "&"; $buff .= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } return $reqPar; } /** * 作用:生成签名 */ public function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值