微信APP支付

微信支付開發(fā)文檔地址
SDK與DEMO下載--JAVA .NET C# PHP

微信支付參數(shù)配置

public class WXPayConfig {
    //應(yīng)用ID
    public final static String APP_ID = "yourAppId";
    
    //API密鑰
    public final static String APP_KEY = "yourAppKey";
    
    //商戶號(hào)
    public final static String MCH_ID = "yourMchId";
    
    //統(tǒng)一下單地址
    public final static String URL_UNIFIED_ORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    
    //查詢賬單地址
    public final static String URL_ORDER_QUERY = "https://api.mch.weixin.qq.com/pay/orderquery";
    
    //統(tǒng)一下單回調(diào)地址
    public final static String NOTIFY_URL = "yourNotifyUrl";
}

統(tǒng)一下單

public static JSONObject wxUnifiedOrder(String orderId, String cost,
            String body, String ip, long expireTime) {
        JSONObject ret = new JSONObject();
        SortedMap<String, String> param = new TreeMap<String, String>();
        param.put("appid", WXPayConfig.APP_ID);
        param.put("mch_id", WXPayConfig.MCH_ID);
        param.put("nonce_str", WXPayUtil.generateNonceStr());
        param.put("body", body);
        param.put("out_trade_no", orderId);
        param.put("fee_type", "CNY");
        param.put("total_fee", cost);
        param.put("spbill_create_ip", ip);
        param.put("notify_url", WXPayConfig.NOTIFY_URL);
        param.put("trade_type", "APP");
        param.put("time_expire", timeExpire(expireTime));
        // 生成sign并轉(zhuǎn)化成xml格式
        String xml = "";
        try {
            xml = WXPayUtil.generateSignedXml(param, WXPayConfig.APP_KEY);
        } catch (Exception e) {
            ret.put("code", -1);
            ret.put("msg", e.getMessage());
        }

        String response = "";
        try {
            response = HttpRequest.post(WXPayConfig.URL_UNIFIED_ORDER, xml);
        } catch (Exception e) {
            ret.put("code", -1);
            ret.put("msg", e.getMessage());
        }

        Map<String, String> result = null;
        try {
            result = WXPayUtil.xmlToMap(response);
        } catch (Exception e) {
            ret.put("code", -1);
            ret.put("msg", e.getMessage());
        }

        if (!result.isEmpty() && result.get("return_code").equals("SUCCESS")) {
            if (result.get("result_code").equals("SUCCESS")) {
                try {
                    ret = wxAppPay(result);
                } catch (Exception e) {
                }
                ret.put("code", 0);
                logger.error("InfoMsg:--- 微信統(tǒng)一下單請(qǐng)求交易成功");
            } else {
                String message = result.get("err_code_des");
                ret.put("code", -1);
                ret.put("msg", "微信統(tǒng)一下單請(qǐng)求交易解析失敗");
                logger.error("errorMsg:--- 微信統(tǒng)一下單請(qǐng)求交易解析失敗" + message);
            }
        } else {
            ret.put("code", -1);
            ret.put("msg", "微信統(tǒng)一下單請(qǐng)求交易解析失敗");
            logger.error("errorMsg:--- 微信統(tǒng)一下單請(qǐng)求交易解析失敗");
        }
        return ret;
    }

賬單查詢

public static String wxQueryOrder() {
        System.out.println("infoMsg:--- 微信支付訂單查詢開始");
        String message = "";
        try {
            SortedMap<String, String> param = new TreeMap<String, String>();
            param.put("appid", WXPayConfig.APP_ID);
            param.put("mch_id", WXPayConfig.MCH_ID);
            param.put("nonce_str", WXPayUtil.generateNonceStr());
            param.put("out_trade_no", "20171205");

            String xml = WXPayUtil
                    .generateSignedXml(param, WXPayConfig.APP_KEY);

            String response = HttpRequest
                    .post(WXPayConfig.URL_ORDER_QUERY, xml);

            if (response != null && response != "") {
                Map<String, String> result = WXPayUtil.xmlToMap(response);

                // System.out.println(result);

                if (!result.isEmpty()) {
                    String return_code = result.get("return_code");
                    if (return_code.equals("SUCCESS")) {
                        String result_code = result.get("return_code");
                        if (result_code.equals("SUCCESS")) {
                            message = (String) result.get("trade_state_desc");
                        }
                    } else {
                        message = (String) result.get("err_code_des");
                    }
                } else {

                }
            } else {

            }
            // System.out.println("infoMsg:--- 微信支付訂單查詢結(jié)束");
        } catch (Exception e) {
            // System.out.println("erroroMsg:--- 微信支付訂單查詢失敗" + e.getMessage()
            // + message);
        }
        return message;
    }

支付結(jié)果異步回調(diào)

public static JSONObject wxPayNotify(String body) {
        JSONObject result = new JSONObject();
        System.out.println("infoMsg:--- 微信異步通知開始");
        String wx_map = "";
        try {
            String xml = body;
            if (xml != null && xml != "") {
                Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
                // 驗(yàn)簽
                if (!WXPayUtil.isSignatureValid(xml, WXPayConfig.APP_KEY)) {
                    if (resultMap.get("return_code").equals("SUCCESS")) {
                        Double amount = Double.parseDouble(resultMap
                                .get("total_fee"));
                        String passbackParams = resultMap.get("total_fee");
                        String outOrderNo = resultMap.get("out_trade_no");
                        Map<String, String> map = new HashMap<>();
                        map.put("return_code", "SUCCESS");
                        map.put("return_msg", "OK");
                        wx_map = WXPayUtil.mapToXml(map);
                        result.put("out_trade_no", outOrderNo);
                        result.put("code", 0);
                    }
                }
            } else {
                result.put("code", -1);
                result.put("msg", "微信異步通知失敗");
                logger.error("infoMsg:--- 微信異步通知失敗");
            }
        } catch (Exception e) {
            result.put("code", -1);
            result.put("msg", "微信異步通知失敗" + e.getMessage());
            logger.error("msg", "微信異步通知失敗" + e.getMessage());
        }
        result.put("wx_map", wx_map);
        return result;
    }

支付二次簽名

public static JSONObject wxAppPay(Map<String, String> param)
            throws Exception {
        JSONObject result = new JSONObject();
        SortedMap<String, String> sortedMap = new TreeMap<String, String>();
        sortedMap.put("appid", WXPayConfig.APP_ID);
        sortedMap.put("partnerid", WXPayConfig.MCH_ID);
        sortedMap.put("prepayid", param.get("prepay_id"));
        sortedMap.put("package", "Sign=WXPay");
        String nonceStr = WXPayUtil.generateNonceStr();
        long timestamp = System.currentTimeMillis() / 1000;
        sortedMap.put("noncestr", nonceStr);
        sortedMap.put("timestamp", String.valueOf(timestamp));

        String sign = WXPayUtil.generateSignature(sortedMap,
                WXPayConfig.APP_KEY);

        result.put("appid", WXPayConfig.APP_ID);
        result.put("partnerid", WXPayConfig.MCH_ID);
        result.put("prepayid", param.get("prepay_id"));
        result.put("package", "Sign=WXPay");
        result.put("noncestr", nonceStr);
        result.put("timestamp", String.valueOf(timestamp));
        result.put("sign", sign);
        return result;
    }

過期時(shí)間格式轉(zhuǎn)化

private static String timeExpire(long time) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                "yyyyMMddHHmmss");
        Date date = new Date(time * 1000);
        return simpleDateFormat.format(date);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灸芳,更是在濱河造成了極大的恐慌贡茅,老刑警劉巖兽赁,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滔金,死亡現(xiàn)場(chǎng)離奇詭異圈澈,居然都是意外死亡霉涨,警方通過查閱死者的電腦和手機(jī)按价,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笙瑟,“玉大人楼镐,你說我怎么就攤上這事⊥希” “怎么了框产?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)错洁。 經(jīng)常有香客問我秉宿,道長(zhǎng),這世上最難降的妖魔是什么屯碴? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任描睦,我火速辦了婚禮,結(jié)果婚禮上窿锉,老公的妹妹穿的比我還像新娘酌摇。我一直安慰自己,他們只是感情好嗡载,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布窑多。 她就那樣靜靜地躺著,像睡著了一般洼滚。 火紅的嫁衣襯著肌膚如雪埂息。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音千康,去河邊找鬼享幽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拾弃,可吹牛的內(nèi)容都是我干的值桩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼豪椿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奔坟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搭盾,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤咳秉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸯隅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澜建,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年蝌以,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炕舵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饼灿,死狀恐怖幕侠,靈堂內(nèi)的尸體忽然破棺而出帝美,到底是詐尸還是另有隱情碍彭,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布悼潭,位于F島的核電站庇忌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舰褪。R本人自食惡果不足惜皆疹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望占拍。 院中可真熱鬧略就,春花似錦、人聲如沸晃酒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贝次。三九已至崔兴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敲茄。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工位谋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堰燎。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓掏父,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親秆剪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子损同,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 歡迎留言、轉(zhuǎn)發(fā)微信極速開發(fā)系列文章(微信支付鸟款、授權(quán)獲取用戶信息等):點(diǎn)擊這里 目錄1膏燃、注冊(cè)賬號(hào)、開發(fā)者認(rèn)證2何什、添加...
    Javen205閱讀 11,524評(píng)論 10 66
  • 【申請(qǐng)流程】 開發(fā)微信APP支付组哩,需要先去微信開放平臺(tái)申請(qǐng)移動(dòng)應(yīng)用,并開通微信支付功能处渣,通過審核后方可進(jìn)行開發(fā)伶贰; ...
    狼鳳皇閱讀 4,374評(píng)論 0 6
  • 引子: 以下的部分代碼、思路來自于 CSDN的一位博客主 罐栈,以及 后宮 —— 易水 的支持黍衙。 官方文檔 1.前期申...
    冰凝雪國(guó)閱讀 1,263評(píng)論 0 4
  • 先看看支付時(shí)序圖 一、時(shí)序圖 打眼一看好像挺復(fù)雜的荠诬,仔細(xì)一看很明了琅翻,思路邏輯很清晰,很有條理柑贞,邏輯縝密方椎。大體流程和...
    追沐閱讀 2,013評(píng)論 0 1
  • “你哭過了【唬” 他突然開口棠众,驚的心中群鳥高飛起。挑眉略帶迷惘有决,自認(rèn)為倒是掩飾挺好闸拿,怎的就被他瞧出個(gè)一二來了?抬...
    戰(zhàn)且歌閱讀 486評(píng)論 0 0