做微信支付,首先要明确自己要做的事情是什么,点击支付按钮以后,出现一个输入支付密码的框

    wKioL1iqjFXQIsdhAAEYU9SlWEE330.png-wh_50

    如上图所示,调出微信支付的页面,那么我们要做的事情就是调出这个框,其他事情交给微信来做


    然后明确需要什么参数,通过查看微信公众号支付文档https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

中的h5调起支付API目录,发现需要的参数有:

    wKiom1iqjmGi4NT3AAEIwJ0HENs424.png-wh_50

    其中appId为微信公众平台中的账号

        timeStamp由我们自己生成,在下文中会为大家提供工具类哒

        noceStr由我们自己生成,在下文中会为大家提供工具类哒

        package我们发现有一个叫是prepay_id的参数,那么这个参数由哪里来呢?由于这个参数相对来说比较复杂,在下文详细解释

        signType为MD5

        paySign是一个签名,由我们根据一些参数来生成,在下文中也会为提供工具类哒

    timeStamp的工具类

        

    /**

     * 标准北京时间,时区为东八区,

     * 自1970年1月1日 0点0分0秒以来的秒数。

     * 注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。  

     * @return String

     */ 

    public static long getCurrTimeStamp() {

        long millis = System.currentTimeMillis();//返回以毫秒为单位的当前时间

        int a = (int) ((millis)*0.001);

        return a;

    }

    noceStr的工具类

    

    /**

     * 获取一定长度的随机字符串

     * @param length 指定字符串长度

     * @return 一定长度的字符串

     */

    public static String getRandomStringByLength(int length) {

        String base = "abcdefghijklmnopqrstuvwxyz0123456789";

        Random random = new Random();

        StringBuffer sb = new StringBuffer();

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

            int number = random.nextInt(base.length());

            sb.append(base.charAt(number));

        }

        return sb.toString();

    }

     paySign工具类

    

    /** 

     * 获取签名 md5加密(微信支付必须用MD5加密)

     * 获取支付签名

     * @param characterEncoding 

     * @param parameters 

     * @return 

     */  

    public static String getSign(String characterEncoding,SortedMap<Object,Object> parameters){  

        StringBuffer sb = new StringBuffer();  

        Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)  

        Iterator it = es.iterator();  

        while(it.hasNext()) {  

            Map.Entry entry = (Map.Entry)it.next();  

            String k = (String)entry.getKey();  

            Object v = entry.getValue();  

            if(null != v && !"".equals(v)   

                    && !"sign".equals(k) && !"key".equals(k)) {  

                sb.append(k + "=" + v + "&");  

            }  

        }  

        sb.append("key=" + Key);  

        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  

        return sign;  

    }

    MD5Util

    public class MD5Util {

    private static String byteArrayToHexString(byte b[]) {  

            StringBuffer resultSb = new StringBuffer();  

            for (int i = 0; i < b.length; i++)  

                resultSb.append(byteToHexString(b[i]));  

      

            return resultSb.toString();  

        }  

      

        private static String byteToHexString(byte b) {  

            int n = b;  

            if (n < 0)  

                n += 256;  

            int d1 = n / 16;  

            int d2 = n % 16;  

            return hexDigits[d1] + hexDigits[d2];  

        } 

      

        public static String MD5Encode(String origin, String charsetname) {  

            String resultString = null;  

            try {  

                resultString = new String(origin);  

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

                if (charsetname == null || "".equals(charsetname))  

                    resultString = byteArrayToHexString(md.digest(resultString  

                            .getBytes()));  

                else  

                    resultString = byteArrayToHexString(md.digest(resultString  

                            .getBytes(charsetname)));  

            } catch (Exception exception) {  

            }  

            return resultString;  

        }  

        private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",

                "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    }

    好,到此为止就剩下package参数没有解决啦,下面详细解释

    通过查看微信公众号支付文档https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

中的统一下单文档发现有我们需要的prepay_id这个参数,但是需要好多参数呀,没办法慢慢来吧,

    

wKiom1iqkufASFb0AADQIllW4pI382.png

wKioL1iqkuiQiuXYAAEc33jOjHs879.png

wKioL1iqkunSatlJAAEMbYTeUZY388.png

wKioL1iqkuqAddIxAACNlrhp1FA101.png

    我的天呀,这么多参数,小编就先把一些必填的的参数解释下

    appid微信公众平台分配的账号  mch_id微信商户平台分配的账号  nonce_str由工具类直接生成就ok  sign我擦,这个参数又是什么鬼,别急,准备在下一篇博文中解释,欢迎查看和关注哦  body先随便按照格式写一个吧  out_trade_no不多说,还是工具类  total_fee自己随便一个呗,但是注意单位必须为分,微信小提示,写少一点,因为最后一般是要你来支付测试哒   pbill_create_ip不多说,工具类    notify_url自己随便写一个喽,用来接收用户支付成功,微信服务器的提示  trade_type为JSAPI     openid我擦,这个参数又是什么鬼,别急,准备在下一篇博文中解释,欢迎查看和关注哦

    行了,先把工具类送给大家

    sign工具类

    

    /** 

     * 获取签名 md5加密(微信支付必须用MD5加密)

     * 获取支付签名

     * @param characterEncoding 

     * @param parameters 

     * @return 

     */  

    public static String getSign(String characterEncoding,SortedMap<Object,Object> parameters){  

        StringBuffer sb = new StringBuffer();  

        Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)  

        Iterator it = es.iterator();  

        while(it.hasNext()) {  

            Map.Entry entry = (Map.Entry)it.next();  

            String k = (String)entry.getKey();  

            Object v = entry.getValue();  

            if(null != v && !"".equals(v)   

                    && !"sign".equals(k) && !"key".equals(k)) {  

                sb.append(k + "=" + v + "&");  

            }  

        }  

        sb.append("key=" + Key);  

        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  

        return sign;  

    } 

    out_trade_no工具类

    

    /**

     * 获取当前时间 yyyyMMddHHmmss

     * @return String

     */ 

    public static String getCurrTime() {

        Date now = new Date();

        SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");

        String s = outFormat.format(now);

        return s;

    }

    String out_trade_no = getCurrTime()+getRandomStringByLength(15);

    pbill_create_ip工具类

    //获取用户ip地址

    private String getIpAddr(HttpServletRequest request) {

    String ip = request.getHeader("x-forwarded-for");

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

    ip = request.getHeader("Proxy-Client-IP");

    }

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

    ip = request.getHeader("WL-Proxy-Client-IP");

    }

    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

    ip = request.getRemoteAddr();

    }

    return ip;

    }


    好了,还差sign和openid这个两个参数啦,其他参数都ok啦,在下一篇博客中等你哦.

    做微信公众号支付,需要注册微信公众平台服务号,并申请微信商户平台,来获取接口权限