数字签名

概述

微信支付, 是基于微信客户端提供的支付服务功能。 同时向商户提供销售经营分析、 账户和资金管理的功能支持。 用户通过扫描二维码、 反扫二维码等多种方式调起微信支付模块完成支付。

原始签名字符串

无论是请求还是应答, 签名原始串按以下方式组装成字符串:
1、 除 sign 字段外, 所有参数按照字段名的 ascii 码从小到大排序后使用 QueryString 的格式(即key1=value1&key2=value2…) 拼接而成, 空值不传递, 不参与签名组串。
2、 签名原始串中, 字段名和字段值都采用原始值, 不进行 URL Encode。

例如:

调用某个接口, 接口有如下字段:

android签名微信支付 微信支付签名方式_微信

正确的签名字段排序为:

android签名微信支付 微信支付签名方式_二维码_02

签名算法

目前暂只支持 MD5 签名

MD5 是一种摘要生成算法, 通过在签名原始串后加上商户通信密钥的内容, 进行 MD5 运算, 形成的摘要字符串即为签名结果。 为了方便比较, 签名结果统一转换为大写字符。
注意: 签名时将字符串转化成字节流时指定的编码字符集应与参数 charset 一致。
MD5 签名计算公式:

sign = Md5(原字符串&key=商户密钥). toUpperCase

android签名微信支付 微信支付签名方式_xml_03


android签名微信支付 微信支付签名方式_支付_04

原始签名字符串

参数方法

/**
     * @author TangRen
     * @param args
     * @time 2016-7-8
     */
    private static String out_trade_no;// 商户订单号

    public static String getswept_parmas(String pay_code) { 

        //请求的xml数据,不解释
        String xmlString;

        //模拟订单号,时间日期+五位随机数
        out_trade_no = Util.OrderNo();

        //SrotedMap集合可以自动排序安装规则
        SortedMap<Object, Object> map = new TreeMap<Object, Object>();

        //请求参数、参与签名的参数
        map.put("auth_code", pay_code);
        map.put("body", "优衣库衣服");
        map.put("charset", "UTF-8");
        map.put("mch_create_ip", Util.localIp());
        map.put("nonce_str", Util.Random(15));
        map.put("mch_id", Config.mch_id);
        map.put("total_fee", "1");
        map.put("service", "unified.trade.micropay");
        map.put("out_trade_no", out_trade_no);

        //签名的工具类SignUtil
        String sign = SignUtil.createSign("UTF-8", map);

        map.put("sign", sign);
        Logger.d("sign签名:" + sign);

        //xml的工具类XMlUtil
        xmlString = XMlUtil.changeMapToXml(map);
        Logger.d(xmlString);
        return xmlString;
    }

签名工具类:SignUtil.java

@SuppressLint("DefaultLocale")
    @SuppressWarnings("rawtypes")
    public static String createSign(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="+Config.key);
        String sign = MD5.MD5Encode(sb.toString(), characterEncoding)
                .toUpperCase();
        System.out.println("签名:"+sign);
        return sign;
    }

XML工具类:SignUtil.java

public static String changeMapToXml(SortedMap<Object, Object> param) {

        Set<Entry<Object, Object>> set = param.entrySet();
        Iterator<Entry<Object, Object>> it = set.iterator();
        StringBuilder sBuilder = new StringBuilder();
        sBuilder.append("<xml>");
        while (it.hasNext()) {
            Entry<Object, Object> entry = it.next();
            sBuilder.append("<" + entry.getKey() + ">");
            sBuilder.append(entry.getValue());
            sBuilder.append("</" + entry.getKey() + ">");

        }
        sBuilder.append("</xml>");
        try {
            return new String(sBuilder.toString().getBytes(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // e.printStackTrace();
        }
        return "";
    }

以上就是生成签名以及支付请求的XML,在log中可以看到生成的签名跟XML,可以在

这里进行下载调试工具,微信支付签名篇到此就结束了,后面我还将继续更新关于微信支付的其他内容!