微信支付--签名篇

数字签名

概述

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

原始签名字符串

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

例如:

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

这里写图片描述

正确的签名字段排序为:

这里写图片描述

签名算法

目前暂只支持 MD5 签名

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

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

这里写图片描述
这里写图片描述

原始签名字符串

参数方法

    /**
     * @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,可以在
http://download.csdn.net/download/wu996489865/9573268
这里进行下载调试工具,微信支付签名篇到此就结束了,后面我还将继续更新关于微信支付的其他内容!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
微信支付V3的PHP实现框架包括以下几个步骤: 1. 首先,需要设置微信支付的商户号和商户密钥,并上传商户API证书三个文件。这些设置可以在微信支付的后台进行完成。每个商户对应的微信支付平台证书是不同的,但是开源框架已经封装了证书管理功能,开发者不需要关注此项功能的开发。\[1\] 2. 在支付调用时,需要将相关信息和签名一同提交给微信。这些信息包括商户号、商户订单号、应用ID、商品描述、通知URL和支付金额等。提交的网址是https://api.mch.weixin.qq.com/v3/pay/transactions/native。微信会对提交的数据进行匹配验证,如果验证通过,则会生成支付链接。\[2\] 3. 微信会返回支付链接或错误信息。开发者可以根据返回的结果进行相应的处理。\[3\] 总结来说,微信支付V3的PHP实现框架包括支付设置和支付调用两个主要步骤。在设置中,需要设置商户号和商户密钥,并上传商户API证书。在支付调用中,需要将相关信息和签名提交给微信,并获取支付链接或错误信息。开源框架已经封装了这些功能,开发者可以专注于支付业务的实现。 #### 引用[.reference_title] - *1* *3* [【开源微信微信支付V3接口调用与PHP开源实现](https://blog.csdn.net/navlange/article/details/126416937)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [微信开发 ━━ 微信商户v3微信支付Navive方式开发之php](https://blog.csdn.net/snans/article/details/117002436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴唐人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值