微信APP支付

微信支付开发文档地址
SDK与DEMO下载--JAVA .NET C# PHP

微信支付参数配置

public class WXPayConfig {
    //应用ID
    public final static String APP_ID = "yourAppId";
    
    //API密钥
    public final static String APP_KEY = "yourAppKey";
    
    //商户号
    public final static String MCH_ID = "yourMchId";
    
    //统一下单地址
    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";
    
    //统一下单回调地址
    public final static String NOTIFY_URL = "yourNotifyUrl";
}

统一下单

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并转化成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:--- 微信统一下单请求交易成功");
            } else {
                String message = result.get("err_code_des");
                ret.put("code", -1);
                ret.put("msg", "微信统一下单请求交易解析失败");
                logger.error("errorMsg:--- 微信统一下单请求交易解析失败" + message);
            }
        } else {
            ret.put("code", -1);
            ret.put("msg", "微信统一下单请求交易解析失败");
            logger.error("errorMsg:--- 微信统一下单请求交易解析失败");
        }
        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:--- 微信支付订单查询结束");
        } catch (Exception e) {
            // System.out.println("erroroMsg:--- 微信支付订单查询失败" + e.getMessage()
            // + message);
        }
        return message;
    }

支付结果异步回调

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);
                // 验签
                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;
    }

过期时间格式转化

private static String timeExpire(long time) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                "yyyyMMddHHmmss");
        Date date = new Date(time * 1000);
        return simpleDateFormat.format(date);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 欢迎留言、转发微信极速开发系列文章(微信支付、授权获取用户信息等):点击这里 目录1、注册账号、开发者认证2、添加...
    Javen205阅读 11,487评论 10 66
  • 【申请流程】 开发微信APP支付,需要先去微信开放平台申请移动应用,并开通微信支付功能,通过审核后方可进行开发; ...
    狼凤皇阅读 4,364评论 0 6
  • 引子: 以下的部分代码、思路来自于 CSDN的一位博客主 ,以及 后宫 —— 易水 的支持。 官方文档 1.前期申...
    冰凝雪国阅读 1,246评论 0 4
  • 先看看支付时序图 一、时序图 打眼一看好像挺复杂的,仔细一看很明了,思路逻辑很清晰,很有条理,逻辑缜密。大体流程和...
    追沐阅读 1,953评论 0 1
  • “你哭过了。” 他突然开口,惊的心中群鸟高飞起。挑眉略带迷惘,自认为倒是掩饰挺好,怎的就被他瞧出个一二来了?抬...
    战且歌阅读 472评论 0 0