• 微信支付(APP支付)-服务端开发(二 )


    如果你已经可以微信支付成功,那么你已经成功90%,剩下的就是订单确认问题了。

     接上一篇文章,今天我们来谈一谈,订单查询与确认:

    APP端支付成功之后,会再次向服务端发起请求,确认付款订单时候成功,同时服务端也要根据订单号更新数据库,确保前后端一直性。

    服务端收到APP端发送的请求后,回获取到APP端传递过来的订单号,拿到订单号后,同样的方式,拼接xml格式的字符串,发送微信端,查询订单信息,比如付款是否成功,付款金额,订单详情等等。

    /调用微信接口,查询订单是否支付成功
    public Map<String, String> queryOrder(String out_trade_no){
    log.debug("WeChatPayController.queryOrder,parameter[{out_trade_no},{"+out_trade_no+"}]");
    Map<String, String> mapVal = new HashMap<String, String>();
    try {
    //商户相关资料
    String appid = CommonUtils.getPropertiesValue("config", "appid");
    String appsecret = CommonUtils.getPropertiesValue("config", "appsecret");
    String partner = CommonUtils.getPropertiesValue("config", "partnerId");
    String partnerkey = CommonUtils.getPropertiesValue("config", "partnerkey");

    //商户号
    String mch_id = partner;
    //随机数
    Random random = new Random();
    String nonce_str = cn.emagsoftware.utils.MD5Util.getMD5String(String.valueOf(random.nextInt(10000)));

    SortedMap<String, String> packageParams = new TreeMap<String, String>();
    packageParams.put("appid", appid);
    packageParams.put("mch_id", mch_id);
    packageParams.put("nonce_str", nonce_str);
    packageParams.put("out_trade_no", out_trade_no);

    HttpServletResponse httpServletResponse = null;
    RequestHandler reqHandler = new RequestHandler(request, httpServletResponse);
    reqHandler.init(appid, appsecret, partnerkey);

    String sign = reqHandler.createSign(packageParams);
    String xml="<xml>"+
    "<appid>"+appid+"</appid>"+
    "<mch_id>"+mch_id+"</mch_id>"+
    "<nonce_str>"+nonce_str+"</nonce_str>"+
    "<out_trade_no>"+out_trade_no+"</out_trade_no>"+
    "<sign>"+sign+"</sign>"+
    "</xml>";
    log.debug("xml = "+xml);
    String queryOrderURL = WECHAT_QUERY_ORDER_URL;
    String trade_state=""; //交易状态
    String total_fee = ""; //总金额
    trade_state = new GetWxOrderno().getPayNo(queryOrderURL, xml, "trade_state");
    if (trade_state.equals("SUCCESS")) {
    total_fee = new GetWxOrderno().getPayNo(queryOrderURL, xml, "total_fee");
    mapVal.put("trade_state", trade_state);
    mapVal.put("total_fee", total_fee);
    }else {
    mapVal.put("trade_state", trade_state);
    }
    } catch (Exception e1) {
    e1.printStackTrace();
    }

    return mapVal;
    }

    查询订单之后,微信会返回一个xml文件,如果查询订单成功,可以从xml文件中获取到订单金额,支付状态,付款银行等信息,比较订单金额,更新数据库,操作完成后,返回前端APP,告知付款成功。

    签名生成规则代码:

    /**
    * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
    */
    public String createSign(SortedMap<String, String> packageParams) {
    StringBuffer sb = new StringBuffer();
    Set es = packageParams.entrySet();
    Iterator it = es.iterator();
    while (it.hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    String k = (String) entry.getKey();
    String v = (String) entry.getValue();
    if (null != v && !"".equals(v) && !"sign".equals(k)
    && !"key".equals(k)) {
    sb.append(k + "=" + v + "&");
    }
    }
    sb.append("key=" + this.getKey());
    System.out.println("md5 sb:" + sb+" key="+this.getKey());
    String sign = MD5Util.getMD5String(sb.toString()).toUpperCase();
    System.out.println("packge签名:" + sign);
    return sign;

    }

  • 相关阅读:
    [题解] [HNOI2014] 世界树
    [luogu 5301][bzoj 5503] [GXOI/GZOI2019] 宝牌一大堆
    [HDU4507]吉哥系列故事——恨7不成妻
    [国家集训队]聪聪可可
    [模板]点分治
    [2018.8.12]模拟赛B组
    JZOJ5804. 【2018.08.12提高A组模拟】简单的序列
    2018.8.10模拟赛
    2018.8.8模拟赛
    [2018.8.6]模拟赛
  • 原文地址:https://www.cnblogs.com/dalianmao890710/p/4976609.html
Copyright © 2020-2023  润新知