1. 程式人生 > >微信退款和支付寶退款介面呼叫(java版)

微信退款和支付寶退款介面呼叫(java版)

專案中需要使用到微信和支付寶的退款功能,在這兩天研究了一下這兩個平臺的退款,有很多坑,在開發中需要留意
1、微信退款介面
相對來說我感覺微信的退款介面還是比較好呼叫的,直接傳送httppost請求即可;

/**
     * 
     * @方法名稱:payRefund
     * @內容摘要: <退款>
     * @param transaction_id
     *            微信支付訂單號
     * @param out_refund_no
     *            商戶訂單號
     * @param total_fee
     *            總金額
     * @param
refund_fee * 退款金額 * @param op_user_id * 操作人 * @return String * @exception * @author:鹿偉偉 * @建立日期:2016年4月11日-上午11:07:04 */
public String wxPayRefundRequest(String transaction_id, String out_refund_no, int total_fee, int refund_fee, String op_user_id) { CloseableHttpClient httpclient = null
; CloseableHttpResponse response = null; String strResponse = null; try { httpclient = ClientCustomSSL.getCloseableHttpClient(); // 構造HTTP請求 HttpPost httpPost = new HttpPost(Configure.PAY_REFUND_API); // PayRefundReqData wxdata = new PayRefundReqData(
// "1004720096201602263541023415", "16371", 30, 30, "19417"); PayRefundReqData wxdata = new PayRefundReqData(transaction_id, out_refund_no, total_fee, refund_fee, op_user_id); String requestStr = Util.ConvertObj2Xml(wxdata); StringEntity se = new StringEntity(requestStr.toString()); httpPost.setEntity(se); // 傳送請求 response = httpclient.execute(httpPost); HttpEntity entity = response.getEntity(); if (entity != null) { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(entity.getContent()); Element rootElt = document.getRootElement(); // 結果碼 String returnCode = rootElt.elementText("return_code"); String resultCode = rootElt.elementText("result_code"); if ("SUCCESS".equals(returnCode)&&"SUCCESS".equals(resultCode)) { strResponse=returnCode; }else { strResponse=rootElt.elementText("err_code_des"); } } EntityUtils.consume(entity); } catch (Exception e) { Logger.getLogger(getClass()).error("payRefundRequest", e); } finally { try { response.close(); httpclient.close(); } catch (IOException e) { // TODO Auto-generated catch block Logger.getLogger(getClass()).error("payRefundRequest關閉異常:", e); } } return strResponse; }

報錯的話請檢查加密的sign是否正確,還有就是呼叫的介面地址是否正確,有問題找我
2、支付寶退款介面
支付寶直接匯入支付寶封裝好的jar包直接呼叫即可,官網下載地址:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1
在弄支付寶退款的時候有一個插曲:就是支付寶呼叫時是客戶端直接呼叫的,當時沒有通過後臺,後臺只做了一個回撥地址的使用,本來想著按照微信的思路寫一個支付出來的,沒想到怎麼也除錯不通,直接通過網址可以訪問,在方法裡面不行,後來只好使用支付寶的jar了。
呼叫方法:

/**
     * 
     * @方法名稱:alipayRefundRequest
     * @內容摘要: <支付寶退款請求>
     * @param out_trade_no 訂單支付時傳入的商戶訂單號,不能和 trade_no同時為空。
     * @param trade_no 支付寶交易號,和商戶訂單號不能同時為空
     * @param refund_amount 需要退款的金額,該金額不能大於訂單金額,單位為元,支援兩位小數
     * @return 
     * String
     * @exception 
     * @author:鹿偉偉
     * @建立日期:2016年4月12日-下午4:53:30
     */
    public String alipayRefundRequest(String out_trade_no,String trade_no,double refund_amount){

        // 傳送請求
        String strResponse = null;
        try {
            AlipayClient alipayClient = new DefaultAlipayClient
                    (AlipayConfig.alipayurl,AlipayConfig.appid,
                            AlipayConfig.private_key,AlipayConfig.content_type,AlipayConfig.input_charset,AlipayConfig.ali_public_key);
            AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
            AlipayRefundInfo alidata= new AlipayRefundInfo();
            alidata.setOut_trade_no(out_trade_no);
            alidata.setRefund_amount(refund_amount);
            alidata.setTrade_no(trade_no);
            request.setBizContent(JsonUtils.convertToString(alidata));
            AlipayTradeRefundResponse response = alipayClient.execute(request);
            strResponse=response.getCode();
            if ("10000".equals(response.getCode())) {
                strResponse="退款成功";
            }else {
                strResponse=response.getSubMsg();
            }
        } catch (Exception e) {
            Logger.getLogger(getClass()).error("alipayRefundRequest", e);
        }
        return strResponse;

    }