微信和支付寶請求退款

    /**
 * 微信退款
 * 
 * @param orderNo
 * @param amount
 */
public static Ret wechatRefund(String orderNo, BigDecimal amount) {
    Prop prop = PropKit.use("wechat.txt");
    // 封裝請求參數(shù)
    Map<String, String> data = new HashMap<>();
    data.put("appid", prop.get("appid"));
    data.put("mch_id", prop.get("mchid"));
    data.put("nonce_str", StrKit.getRandomUUID());
    data.put("out_trade_no", orderNo);
    data.put("out_refund_no", orderNo);
    String totalFee = String.valueOf(amount.multiply(new BigDecimal("100")).intValue());
    data.put("total_fee", totalFee);
    data.put("refund_fee", totalFee);
    data.put("sign", StringKit.genMd5Sign(data, prop.get("key")));
    // 發(fā)送退款請求
    String result = null;
    try {
        // 實例化密碼庫并設置證書格式
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        // 將證書文件轉為文件輸入流
        FileInputStream inputStream = new FileInputStream(new File(prop.get("cert_path")));
        // 加載證書文件流和密碼(默認為商戶id)到密鑰庫
        keyStore.load(inputStream, prop.get("mchid").toCharArray());
        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, prop.get("mchid").toCharArray())
                .build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext);
        // 構建ssl套接字的證書內容和密碼
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        // 創(chuàng)建post請求
        HttpPost httpPost = new HttpPost(prop.get("refund_url"));
        // 填充數(shù)據(jù)實體
        httpPost.setEntity(new StringEntity(StringKit.mapToXml(data), Const.CHARSET));
        // 發(fā)送退款請求
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        result = EntityUtils.toString(entity, Const.CHARSET);
    } catch (Exception e) {
        e.printStackTrace();
        return Ret.fail("msg", ErrorMsg.REQUEST_FAIL);
    }
    if (StrKit.isBlank(result))
        return Ret.fail("msg", ErrorMsg.REQUEST_FAIL);
    Map<String, String> response = StringKit.xmlToMap(result);
    // 請求成功需返回狀態(tài)和返回結果均為成功
    if (response == null || !response.get("return_code").equals(UserPaymentRecord.WechatResult.CODE)
            || !response.get("result_code").equals(UserPaymentRecord.WechatResult.CODE)) {
        LogKit.error("請求微信退款失斣矸贰:" + response.get("return_msg"));
        return Ret.fail("msg", ErrorMsg.REQUEST_FAIL);
    }
    return Ret.ok();
}
/**
 * 支付寶退款
 * 
 * @param orderNo
 * @param amount
 */
public static Ret alipayRefund(String orderNo, BigDecimal amount) {
    Prop prop = PropKit.use("alipay.txt");
    // 獲取請求參數(shù)
    String serverUrl = prop.get("open_api_domain");
    String appid = prop.get("appid");
    String privateKey = prop.get("private_key");
    String format = "JSON";
    String charset = "UTF-8";
    String alipayPublicKey = prop.get("alipay_public_key");
    String signType = prop.get("sign_type");
    // 實例化支付寶客戶端
    AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appid, privateKey, format, charset,
            alipayPublicKey, signType);
    AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
    // 填充業(yè)務內容
    Map<String, String> bizContent = new HashMap<>();
    bizContent.put("out_trade_no", orderNo);
    bizContent.put("refund_amount", amount.toString());
    request.setBizContent(JsonKit.toJson(bizContent));
    try {
        // 發(fā)送退款請求
        if (alipayClient.execute(request).isSuccess())
            return Ret.ok();
    } catch (AlipayApiException e) {
        e.printStackTrace();
        return Ret.fail("msg", ErrorMsg.REQUEST_FAIL);
    }
    return Ret.fail("msg", ErrorMsg.OPERATION_FAIL);
}

注意:微信退款需要登錄微信后臺下載雙向證書

原文地址:https://www.jfinal.com/share/1373

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛇损,隨后出現(xiàn)的幾起案子椒舵,更是在濱河造成了極大的恐慌弧岳,老刑警劉巖刺啦,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竣贪,死亡現(xiàn)場離奇詭異研叫,居然都是意外死亡哮针,警方通過查閱死者的電腦和手機关面,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诚撵,“玉大人缭裆,你說我怎么就攤上這事∈傺蹋” “怎么了澈驼?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長筛武。 經(jīng)常有香客問我缝其,道長,這世上最難降的妖魔是什么徘六? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任内边,我火速辦了婚禮,結果婚禮上待锈,老公的妹妹穿的比我還像新娘漠其。我一直安慰自己,他們只是感情好竿音,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布和屎。 她就那樣靜靜地躺著,像睡著了一般春瞬。 火紅的嫁衣襯著肌膚如雪柴信。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天宽气,我揣著相機與錄音随常,去河邊找鬼。 笑死萄涯,一個胖子當著我的面吹牛绪氛,可吹牛的內容都是我干的。 我是一名探鬼主播涝影,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼钞楼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了袄琳?” 一聲冷哼從身側響起询件,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唆樊,沒想到半個月后宛琅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡逗旁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年嘿辟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片片效。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡红伦,死狀恐怖,靈堂內的尸體忽然破棺而出淀衣,到底是詐尸還是另有隱情昙读,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布膨桥,位于F島的核電站蛮浑,受9級特大地震影響,放射性物質發(fā)生泄漏只嚣。R本人自食惡果不足惜沮稚,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望册舞。 院中可真熱鬧蕴掏,春花似錦、人聲如沸调鲸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽线得。三九已至饶唤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贯钩,已是汗流浹背募狂。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留角雷,地道東北人祸穷。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像勺三,于是被迫代替她去往敵國和親雷滚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容