微信支付

微信支付 Java SDK

微信支付開發(fā)者文檔中給出的API進行了封裝张弛。

com.github.wxpay.sdk.WXPay類下提供了對應的方法:

方法名 說明
microPay 刷卡支付
unifiedOrder 統(tǒng)一下單
orderQuery 查詢訂單
reverse 撤銷訂單
closeOrder 關閉訂單
refund 申請退款
refundQuery 查詢退款
downloadBill 下載對賬單
report 交易保障
shortUrl 轉換短鏈接
authCodeToOpenid 授權碼查詢openid
  • 注意:
  • 證書文件不能放在web服務器虛擬目錄匕垫,應放在有訪問權限控制的目錄中器予,防止被他人下載
  • 建議將證書文件名改為復雜且不容易猜測的文件名
  • 商戶服務器要做好病毒和木馬防護工作门躯,不被非法侵入者竊取證書文件
  • 請妥善保管商戶支付密鑰刊殉、公眾帳號SECRET,避免密鑰泄露
  • 參數為Map<String, String>對象宁舰,返回類型也是Map<String, String>
  • 方法內部會將參數會轉換成含有appid法牲、mch_idnonce_str饮焦、sign\_typesign的XML
  • 可選HMAC-SHA256算法和MD5算法簽名
  • 通過HTTPS請求得到返回數據后會對其做必要的處理(例如驗證簽名怕吴,簽名錯誤則拋出異常)
  • 對于downloadBill,無論是否成功都返回Map县踢,且都含有return_codereturn_msg转绷,若成功,其中return_codeSUCCESS硼啤,另外data對應對賬單數據

示例

配置類MyConfig:

import com.github.wxpay.sdk.WXPayConfig;
import java.io.*;

public class MyConfig implements WXPayConfig{

    private byte[] certData;

    public MyConfig() throws Exception {
        String certPath = "/path/to/apiclient_cert.p12";
        File file = new File(certPath);
        InputStream certStream = new FileInputStream(file);
        this.certData = new byte[(int) file.length()];
        certStream.read(this.certData);
        certStream.close();
    }

    public String getAppID() {
        return "wx8888888888888888";
    }

    public String getMchID() {
        return "12888888";
    }

    public String getKey() {
        return "88888888888888888888888888888888";
    }

    public InputStream getCertStream() {
        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
        return certBis;
    }

    public int getHttpConnectTimeoutMs() {
        return 8000;
    }

    public int getHttpReadTimeoutMs() {
        return 10000;
    }
}

統(tǒng)一下單:

import com.github.wxpay.sdk.WXPay;

import java.util.HashMap;
import java.util.Map;

public class WXPayExample {

    public static void main(String[] args) throws Exception {

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);

        Map<String, String> data = new HashMap<String, String>();
        data.put("body", "騰訊充值中心-QQ會員充值");
        data.put("out_trade_no", "2016090910595900000012");
        data.put("device_info", "");
        data.put("fee_type", "CNY");
        data.put("total_fee", "1");
        data.put("spbill_create_ip", "123.12.12.123");
        data.put("notify_url", "http://www.example.com/wxpay/notify");
        data.put("trade_type", "NATIVE");  // 此處指定為掃碼支付
        data.put("product_id", "12");

        try {
            Map<String, String> resp = wxpay.unifiedOrder(data);
            System.out.println(resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

訂單查詢:

import com.github.wxpay.sdk.WXPay;

import java.util.HashMap;
import java.util.Map;

public class WXPayExample {

    public static void main(String[] args) throws Exception {

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);

        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", "2016090910595900000012");

        try {
            Map<String, String> resp = wxpay.orderQuery(data);
            System.out.println(resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

退款查詢:

import com.github.wxpay.sdk.WXPay;

import java.util.HashMap;
import java.util.Map;

public class WXPayExample {

    public static void main(String[] args) throws Exception {

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);

        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", "2016090910595900000012");

        try {
            Map<String, String> resp = wxpay.refundQuery(data);
            System.out.println(resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

下載對賬單:

import com.github.wxpay.sdk.WXPay;

import java.util.HashMap;
import java.util.Map;

public class WXPayExample {

    public static void main(String[] args) throws Exception {

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);

        Map<String, String> data = new HashMap<String, String>();
        data.put("bill_date", "20140603");
        data.put("bill_type", "ALL");

        try {
            Map<String, String> resp = wxpay.downloadBill(data);
            System.out.println(resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

其他API的使用和上面類似议经。

暫時不支持下載壓縮格式的對賬單,但可以使用該SDK生成請求用的XML數據:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;

import java.util.HashMap;
import java.util.Map;

public class WXPayExample {

    public static void main(String[] args) throws Exception {

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);

        Map<String, String> data = new HashMap<String, String>();
        data.put("bill_date", "20140603");
        data.put("bill_type", "ALL");
        data.put("tar_type", "GZIP");

        try {
            data = wxpay.fillRequestData(data);
            System.out.println(WXPayUtil.mapToXml(data));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

收到支付結果通知時,需要驗證簽名煞肾,可以這樣做:


import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;

import java.util.Map;

public class WXPayExample {

    public static void main(String[] args) throws Exception {

        String notifyData = "...."; // 支付結果通知的xml格式數據

        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);

        Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);  // 轉換成map

        if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
            // 簽名正確
            // 進行處理咧织。
            // 注意特殊情況:訂單已經退款,但收到了支付結果成功的通知籍救,不應把商戶側訂單狀態(tài)從退款改成支付成功
        }
        else {
            // 簽名錯誤拯爽,如果數據里沒有sign字段,也認為是簽名錯誤
        }
    }

}

HTTPS請求可選HMAC-SHA256算法和MD5算法簽名:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants;

public class WXPayExample {

    public static void main(String[] args) throws Exception {
        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config, WXPayConstants.SignType.HMACSHA256);
        // ......
    }
}

若需要使用sandbox環(huán)境:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants;

public class WXPayExample {

    public static void main(String[] args) throws Exception {
        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config, WXPayConstants.SignType.MD5, true);
        // ......
    }

}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钧忽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逼肯,更是在濱河造成了極大的恐慌耸黑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篮幢,死亡現(xiàn)場離奇詭異大刊,居然都是意外死亡,警方通過查閱死者的電腦和手機三椿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門缺菌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搜锰,你說我怎么就攤上這事伴郁。” “怎么了蛋叼?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵焊傅,是天一觀的道長。 經常有香客問我狈涮,道長狐胎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任歌馍,我火速辦了婚禮握巢,結果婚禮上,老公的妹妹穿的比我還像新娘松却。我一直安慰自己暴浦,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布晓锻。 她就那樣靜靜地躺著肉渴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪带射。 梳的紋絲不亂的頭發(fā)上同规,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音,去河邊找鬼券勺。 笑死绪钥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的关炼。 我是一名探鬼主播程腹,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼儒拂!你這毒婦竟也來了寸潦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤社痛,失蹤者是張志新(化名)和其女友劉穎见转,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體蒜哀,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡斩箫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撵儿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乘客。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淀歇,靈堂內的尸體忽然破棺而出易核,到底是詐尸還是另有隱情,我是刑警寧澤浪默,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布耸成,位于F島的核電站,受9級特大地震影響浴鸿,放射性物質發(fā)生泄漏井氢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一岳链、第九天 我趴在偏房一處隱蔽的房頂上張望花竞。 院中可真熱鬧,春花似錦掸哑、人聲如沸约急。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厌蔽。三九已至,卻和暖如春摔癣,著一層夾襖步出監(jiān)牢的瞬間奴饮,已是汗流浹背纬向。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戴卜,地道東北人逾条。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像投剥,于是被迫代替她去往敵國和親师脂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345