最近在做微信支付开发用的框架是 srpingMVC mybatis spring

下面是开发流程图

我们只需要开发红色标记的模块就可以了。

具体参数详情可以查看微信开发者文档。

新手第一次写,写的不好。

1.下面是下单接口

@RequestMapping(value = "/down/order.spr")

    @ResponseBody

    public Object downOrder(HttpServletRequest request, HttpServletResponse response,

            @RequestParam("appointment_id") String appointment_id) {

        // 生成随机数字符串

        String nonceStr = getRandomString();

        // 获取商品订单号

        String out_trade_no = UUID.randomUUID().toString().replace("-", "");

        // 获取终端 IP

        String spbill_create_ip = request.getRemoteAddr();

        // 获取微信 openid

        WeiXinUserInfo userInfo = (WeiXinUserInfo) request.getSession().getAttribute("weixinUser");

        // 组装请求数据

        Map<String, String> paramsMap = new HashMap<String, String>();

        // 获取签名

        String sign = "";

        try {

            paramsMap.put("openid", userInfo.getOpenid());

            paramsMap.put("appid", APP_ID);

            paramsMap.put("mch_id", MCH_ID);

            paramsMap.put("nonce_str", nonceStr);

            paramsMap.put("body", body);

            paramsMap.put("out_trade_no", out_trade_no);

            paramsMap.put("fee_type", FEE_TYPE);

            paramsMap.put("total_fee", total_fee);

            paramsMap.put("spbill_create_ip", spbill_create_ip);

            paramsMap.put("notify_url", NOTIFY_URL);

            paramsMap.put("trade_type", TRADE_TYPE);

            sign = getPayCustomSign(paramsMap, paykey);

            paramsMap.put("sign", sign);

        } catch (Exception e) {

            log.debug("生成请求签名失败");

        }

        // map 转 xml 字符串

        String paramsXml = mapToXml(paramsMap);

        // 发送订单请求

        String result = sendPost(DOWN_ORDER, paramsXml);

        // 将返回的 xml 转化成 map

        Map<String, String> resultMap = null;

        // 获取预支付交易会话标识

        String prepay_id = "";

        if (result.indexOf("SUCCESS") != -1) {

            try {

                resultMap = xmlToMap(result);

                prepay_id = resultMap.get("prepay_id");

            } catch (JDOMException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

            // 进行填充数据库

            saveOrder(appointment_id);

        }

        // 封装 h5 页面调用参数

        Map<String, Object> returnSignMap = new HashMap<String, Object>();

        String returnSign = "";

        try {

            returnSignMap.put("appid", APP_ID);

            returnSignMap.put("timeStamp", System.currentTimeMillis());

            returnSignMap.put("nonce_str", nonceStr);

            returnSignMap.put("package", "prepay_id=" + prepay_id);

            returnSignMap.put("signType", "MD5");

            returnSign = getPayCustomSign(returnSignMap, paykey);

            returnSignMap.put("sign", returnSign);

        } catch (Exception e) {

            log.debug("生成返回签名失败");

        }

        return new ResponseWrapper(ExceptionCode.SUCCESS, null, returnSignMap);

    }

比较麻烦是签名的获取:以下是代码(摘自网络

/**

     * 获取支付所需签名

     *

     * @param bizObj

     * @param key

     * @return

     * @throws Exception

     */

    private String getPayCustomSign(Map map, String key) throws Exception {

        String bizString = FormatBizQueryParaMap(map, false);

        return sign(bizString, key);

    }

    /**

     * 进行字典排序

     *

     * @param paraMap

     * @param urlencode

     * @return

     * @throws Exception

     */

    private String FormatBizQueryParaMap(Map paraMap, boolean urlencode) throws Exception {

        String sf = "";

        try {

            List<Entry> infoIds = new ArrayList<Entry>(paraMap.entrySet());

            Collections.sort(infoIds, new Comparator<Entry>() {

                public int compare(Map.Entry o1, Map.Entry o2) {

                    return (o1.getKey().toString().compareTo(o2.getKey().toString()));

                }

            });

            for (int i = 0; i < infoIds.size(); i++) {

                Map.Entry entryItem = infoIds.get(i);

                if (entryItem.getKey() != "") {

                    String key = (String) entryItem.getKey();

                    String value = (String) entryItem.getValue();

                    if (urlencode) {

                        value = URLEncoder.encode(value, "utf-8");

                    }

                    sf += key + "=" + value + "&";

                }

            }

            if (sf.isEmpty() == false) {

                sf = sf.substring(0, sf.length() - 1);

            }

        } catch (Exception e) {

            throw new Exception(e.getMessage());

        }

        return sf;

    }

    /**

     * 生成 签名

     *

     * @param content

     * @param key

     * @return

     */

    private String sign(String content, String key) {

        String signStr = content + "&key=" + key;

        return MD5(signStr).toUpperCase();

    }

    /**

     * MD5 加密

     *

     * @param str

     * @return

     */

    private final String MD5(String str) {

        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

        try {

            byte[] btInput = str.getBytes();

            MessageDigest mdInst = MessageDigest.getInstance("MD5");

            mdInst.update(btInput);

            byte[] md = mdInst.digest();

            int j = md.length;

            char str2[] = new char[j * 2];

            int k = 0;

            for (int i = 0; i < j; i++) {

                byte byte0 = md[i];

                str2[k++] = hexDigits[byte0 >>> 4 & 0xf];

                str2[k++] = hexDigits[byte0 & 0xf];

            }

            return new String(str2);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }

生成随机数

/**

     * 随机生成 32 位的字符串

     *

     * @return

     */

    private String getRandomString() {

        Random random = new Random();

        StringBuffer nonceStrSf = new StringBuffer();

        for (int i = 0; i < 32; i++) {

            nonceStrSf.append(nonce_str.charAt(random.nextInt(nonce_str.length() - 1)));

        }

        return nonceStrSf.toString();

    }

map转xml

/**

     * map 转 xml

     *

     * @param map

     * @return

     */

    private String mapToXml(Map<String, String> map) {

        StringBuffer sf = new StringBuffer("<xml>");

        Iterator<Entry<String, String>> iterator = map.entrySet().iterator();

        while (iterator.hasNext()) {

            Entry<String, String> entry = iterator.next();

            String key = entry.getKey();

            String value = entry.getValue();

            sf.append("<" + key + ">" + value + "</" + key + ">");

        }

        sf.append("</xml>");

        return sf.toString();

    }

2.接受微信通知结果接口

/**

     * 接受通知

     *

     * @param request

     * @param response

     * @return

     * @throws IOException

     */

    @RequestMapping(value = "/acceptance/notify.spt")

    public void acceptanceNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {

        // 接受微信返回通知

        String content = RequestUtil.getRequestContent(request);

        // 设置发送请求参数

        Map<String, String> resultMap = new HashMap<String, String>();

        try {

            resultMap = xmlToMap(content);

        } catch (JDOMException e) {

            e.printStackTrace();

        }

        // 进行数据存库,交易成功则存库,否则不存

        saveOrderLog(content, resultMap);

        Map<String, String> returnMap = new HashMap<String, String>();

        returnMap.put("return_code", resultMap.get("return_code"));

        returnMap.put("return_msg", resultMap.get("return_msg"));

        String toXml = mapToXml(returnMap);

        response.getWriter().write(toXml);

    }

第一次写这么长的博客,不足之处请留言告之便于本人成长,再次感谢你的阅读。

java进行微信h5支付开发的更多相关文章

  1. java实现微信H5支付

    前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自 ...

  2. PHP微信H5支付开发

    近来公司项目要求用到微信H5开发,因为微信开发文档处处都是坑,我也走了不少弯路,现在就把H5支付的过程记录一下,已备后用!! 首先 先去商户平台申请开通 H5支付!!!! 我们从微信官方下载H5支付d ...

  3. 微信H5支付开发(maven仓库版)

    官方文档:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1 开发之前确认开通了H5支付功能 一.安装微信sdk 二.创建config ...

  4. 微信H5支付(基于Java实现微信H5支付)

    微信的H5支付区别与APP支付,主要在于预下单(返回的参数不一样),其它大体相同(基本没什么区别,区别在于有些人加密喜欢用MD5有些人喜欢用官方提供的加密方式加密,我用的是官方的),贴一下H5支付预下 ...

  5. 微信H5支付开发步骤总结

    * 开发步骤: * 1.在微信公众号平台设置授权目录,即jsapi.php所在的目录 * 2.在微信支付平台下载证书,放到cert目录 * 3.在微信支付平台设置API秘钥,同时在WxPay.Conf ...

  6. 微信H5支付开发全过程(除内置微信以外的浏览器)

    前言:网上都是~ 呵呵 自己搞 只要花时间 多问客服总会有的 只说程序不说准备工作 自己ID 或者秘钥都准备好了  写的有点儿乱 可以把所有的方法 放在一个文件中调用 public function ...

  7. Android通过外部浏览器调用微信H5支付,Android+PHP详解

    看了好多关于讲解微信H5支付开发的文章,大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付),可能是因为H5支付接口刚开放不久吧. 微信官方体验链接:http://wxpay.wxutil ...

  8. 微信支付之微信H5支付(坑,ajax不支持重定向跳转)

    这里讲的是  微信h5支付,    是微信以外的手机浏览器调用微信h5支付  h5支付: H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起 ...

  9. C#开发微信门户及应用(44)--微信H5页面开发的经验总结

    在我们开发微信页面的时候,需要大量用到了各种呈现的效果,一般可以使用Boostrap的效果来设计不同的页面,不过微信团队也提供很多这方面的资源,包括JSSDK的接口,以及Weui的页面样式和相关功能页 ...

随机推荐

  1. SpringBoot整合MongoDB,在多数据源下实现事务回滚。

    项目中用到了MongoDB,准备用来存储业务数据,前提是要实现事务,保证数据一致性,MongoDB从4.0开始支持事务,提供了面向复制集的多文档事务特性.能满足在多个操作,文档,集合,数据库之间的事务 ...

  2. Ext 行模型与Grid视图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [bzoj2510]弱题 (循环矩阵优化dp)

    Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个 ...

  4. CSP2019总结

    CSP2019总结 前言 赛前停课集训了两个星期,自认为已经准备充分了,结果... 不知道有没有写挂分,即使一分没挂,满打满算也只有400出头,还是太菜了. Day0 晚上复习了一会,打了会游戏就睡了 ...

  5. kafka原理概念提炼

    Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实 ...

  6. Asia Hong Kong Regional Contest 2019

    A. Axis of Symmetry B. Binary Tree n 的奇偶性决定胜负. C. Constructing Ranches 路径上点权之和大于,极大值两倍,这是路径上点能拼出多边形的 ...

  7. dp思维

    题目传输门 题意:有n个房间,m个诅咒,每个房间有一个数值,刚开始有一个初始值,每次进入一个房间可以选择消除诅咒或者不消除,消除诅咒只能顺序消除,消除诅咒就是拿初始值和房间的数值做运算,求最后最大的数 ...

  8. sanic之websocket路由

    在某些时候,需要建立websocket路由,来建立长链接,来实时传输数据,就比如一些聊天应用,就有实时音视频,需要实时传出状态 在sanic框架中支持两种websocket路由方式,有一种是再app中 ...

  9. troff - groff 文档排版系统的 troff 处理器

    总览 SYNOPSIS troff [ -abcivzCERU ] [ -d cs ] [ -f fam ] [ -F dir ] [ -m name ] [ -M dir ] [ -n num ] ...

  10. CentOS7.6下安装Oracle JDK

    注:本教程使用XShell ssh到CentOS服务器,并使用root用户登录,如使用其他普通用户登录,请在命令前加sudo 1).在/usr/local/目录下(看个人情况)新建文件夹java用来存 ...