微信支付一 :公眾號支付3 申請退款
阿新 • • 發佈:2019-01-03
/** * 驗證簽名 * * @param map * @return */ public boolean verifyWeixinNotify(Map<Object, Object> map) { SortedMap<String, String> parameterMap = new TreeMap<String, String>(); String sign = (String) map.get("sign"); for (Object keyValue : map.keySet()) { if (!keyValue.toString().equals("sign")) { parameterMap.put(keyValue.toString(), map.get(keyValue).toString()); } } String createSign = pay.getSign(parameterMap); if (createSign.equals(sign)) { return true; } else { logger.error("微信支付 ~~~~~~~~~~~~~~~~驗證簽名失敗"); return false; } } /** * 申請退款 * * @param out_trade_no * 訂單號 * @param total_fee * 總金額(元) * @param refund_fee * 退款金額(元) * @return * @throws Exception */ public JsonView Refund(String out_trade_no, String total_fee, String refund_fee) throws Exception { Map<String, Object> result = new HashMap<String, Object>(); // 元轉分 total_fee = AmountUtils.changeY2F(total_fee); refund_fee = AmountUtils.changeY2F(refund_fee); String out_refund_no = "";// 退款單號 logger.error("微信退款 ----WECHAT_APPID=" + pay.WECHAT_APPID); SortedMap<String, String> packageParams = new TreeMap<String, String>(); packageParams.put("appid", pay.WECHAT_APPID);// 微信公眾號apid packageParams.put("mch_id", pay.MCH_ID);// 微信商戶id packageParams.put("nonce_str", pay.create_nonce_str(16));// 隨機字串 packageParams.put("out_trade_no", out_trade_no);// 訂單號 packageParams.put("out_refund_no", out_trade_no); packageParams.put("total_fee", total_fee);// 總金額 單位為分,只能為整數 packageParams.put("refund_fee", refund_fee);// 退款金額 單位為分,只能為整數 packageParams.put("op_user_id", pay.MCH_ID);// 操作員帳號, 預設為商戶號 String sign = pay.getSign(packageParams); packageParams.put("sign", sign); String xml = pay.ArrayToXml(packageParams); logger.error("微信退款 ----請求的POST XML資料 我要瘋了=" + xml); String createOrderURL = "https://api.mch.weixin.qq.com/secapi/pay/refund"; String backxml = ""; try { backxml = ClientCustomSSL.doRefund(createOrderURL, xml); } catch (Exception e) { // TODO Auto-generated catch block logger.error("微信退款 ----請求異常" + e); e.printStackTrace(); } logger.error("微信退款 ----收到的xml=" + backxml); Map<Object, Object> map = Xmlunit.xml2map(backxml, false); if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) { if (verifyWeixinNotify(map)) { logger.error("微信退款 ----驗證簽名成功"); // 退款成功操作 int editres = Wechat_Order.execute("UPDATE wechat_order SET orderstatus =? WHERE orderno=?", new Object[] { EnumOrderStatus.refund.getValue(), map.get("out_trade_no") }); result.put("result", editres); } else { result.put("result", "微信退款成功,驗證簽名失敗,未修改訂單狀態"); logger.error("[" + out_trade_no + "]微信退款成功,驗證簽名失敗,未修改訂單狀態=" + backxml); } } else { result.put("result", "微信退款失敗"); logger.error("[" + out_trade_no + "]微信退款失敗=" + backxml); } logger.error("微信退款 ----最後的結果=" + backxml); return new JsonView(result); }