微信支付:小微商户申请入驻第一步:平台证书序列号的获取

文档地址

申请入驻文档:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_2

平台证书获取文档:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11

1. 微信支付商户平台升级API证书,升级后才可成功调用本接口。

具体操作看:http://kf.qq.com/faq/180824BrQnQB180824m6v2yA.html
需要注意的问题,不要着急关闭软件,等全部完成之后再关闭。

2. 平台证书获取(不需要证书)

查看文档,得知我们需要的参数

  1. mch_id : 商户号
  2. nonce_str:随机字符串,不大于32位
  3. sign:签名
  4. sign_type:签名类型
  5. mch_key:签名参数

为了方便,首先,导入jar

  • 解析xml 需要dom4j
  • 由于我们需要从后台调用微信的接口,需要httpclient
         <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>  

这边需要注意的,就是加密,暂只支持HMAC-SHA256,下面提供工具类

Java代码

package com.li.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

/**
 * 签名加密工具类
 *
 * @author bertonlee
 */
@Slf4j
public class SignUtil {

    /**
     * 微信证书HMAC-SHA256签名
     *
     * @param params
     * @param secret
     * @return
     */
    public static String wechatCertficatesSignBySHA256(Map<String, String> params, String secret) {
        // 需要保证排序
        SortedMap<String, String> sortedMap = new TreeMap<>(params);
        // 将参数拼接成字符串
        StringBuilder toSign = new StringBuilder();
        for (String key : sortedMap.keySet()) {
            String value = params.get(key);
            if (StringUtils.isNotEmpty(value) && !"sign".equals(key) && !"key".equals(key)) {
                toSign.append(key).append("=").append(value).append("&");
            }
        }
        toSign.append("key=").append(secret);

        return sha256_HMAC(toSign.toString(), secret);
    }

    /**
     * 加密HMAC-SHA256
     *
     * @param message
     * @param secret
     * @return
     */
    private static String sha256_HMAC(String message, String secret) {
        try {
            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
            sha256_HMAC.init(secret_key);
            byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
            String sign = byteArrayToHexString(bytes);
            sign = sign.toUpperCase();
            return sign;
        } catch (Exception e) {
            log.error("sha256_HMAC加密异常", e);
        }
        return null;
    }

    /**
     * 加密后的字节转字符串
     *
     * @param b
     * @return
     */
    private static String byteArrayToHexString(byte[] b) {
        StringBuilder hs = new StringBuilder();
        String stmp = null;
        for (int n = 0; b != null && n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if (stmp.length() == 1)
                hs.append(‘0‘);
            hs.append(stmp);
        }
        return hs.toString().toLowerCase();
    }
}
  • 其中主要方法wechatCertficatesSignBySHA256
  • 将参数排序后进行拼接,规则查看微信官方的加密规则
  • 然后进行加密
  • secret 也就是我们的API 密钥

实现代码

package com.li.getcertficates.service.impl;

import com.li.getcertficates.service.CertFicatesService;
import com.li.utils.SignUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
@Slf4j
public class CertFicatesServiceImpl implements CertFicatesService {
    @Override
    public String getCertFicates() {
        // 初始化一个HttpClient
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // Post请求
        HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/risk/getcertficates");
        /**
         * 这边需要您提供微信分配的商户号跟API密钥
         */
        Map<String, String> param = new HashMap<>(4);
        param.put("mch_id", "微信分配的商户号");
        param.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
        // 暂只支持HMAC-SHA256 加密
        param.put("sign_type", "HMAC-SHA256");
        // 对你的参数进行加密处理
        param.put("sign", SignUtil.wechatCertficatesSignBySHA256(param, "API密钥(mch_key)"));
        httpPost.setEntity(new StringEntity(map2Xml(param), "UTF-8"));
        httpPost.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_XML.getMimeType());
        try {
            HttpResponse httpResponse = httpClient.execute(httpPost);
            log.info("获取平台证书响应 {}", httpResponse);
            if (httpResponse != null && httpResponse.getStatusLine().getStatusCode() == 200) {
                String responseEntity = EntityUtils.toString(httpResponse.getEntity());
                Document document = DocumentHelper.parseText(responseEntity);
                if ("SUCCESS".equalsIgnoreCase(document.selectSingleNode("//return_code").getStringValue())
                        && "SUCCESS".equalsIgnoreCase(document.selectSingleNode("//result_code").getStringValue())) {
                    return document.selectSingleNode("//certificates").getStringValue();
                }
                log.error("请求平台证书序号响应异常 {}", document.selectSingleNode("//return_msg").getStringValue());
            }
        } catch (Exception e) {
            log.error("执行httpclient请求平台证书序号错误 {}", e);
        }
        return null;
    }
    /**
     * map对象转xml
     *
     * @param map
     * @return
     */
    private String map2Xml(Map<String, String> map) {
        StringBuilder result = new StringBuilder();
        result.append("<xml>");
        if (map != null && map.keySet().size() > 0) {
            map.forEach((key, value) -> {
                result.append("<" + key + "><![CDATA[");
                result.append(value);
                result.append("]]></" + key + ">");
            });
        }
        result.append("</xml>");
        return result.toString();
    }
}
  • 具体逻辑不难,单纯调个接口,响应结果

可以自己写个main方法,也可以写个单元测试

最终请求参数

<xml>
<sign_type>HMAC-SHA256</sign_type>
<nonce_str>qazwsxedcrfvtgbyhnujmiklopasdwefka</nonce_str>
<mch_id>商户号</mch_id>
<sign>FD29B578B31C509B45B7C2779803D9E41B68E6B84AEB1EBDE47DCA00049B649B</sign>
</xml>

响应结果

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<result_code><![CDATA[SUCCESS]]></result_code>
<nonce_str><![CDATA[PnDRNZSFzpp2ieUq]]></nonce_str>
<sign><![CDATA[AD5919F5FE6D77C308ABEE1A4021CB9839C3F04D7C2FE68FC765011EA3BBEB0F]]></sign>
<mch_id><![CDATA[1900006511]]></mch_id>
<certificates><![CDATA[{"data":[{"serial_no":"42A5C4F7F70D57D0576BBEDA0E0928D6E5C4F003","effective_time":"2017-08-18 14:52:04","expire_time":"2022-08-17 14:52:04","encrypt_certificate":{"algorithm":"AEAD_AES_256_GCM","nonce":"bfcb2bd59c97","associated_data":"certificate","ciphertext":"vQ4N+lLNvtIhaV5Gqao44mbYBSaz3bZ4Md3M4f+OuquEJrp+/v4gA//UZqnQ1G0roYqnSMfcsRFj7ItTCP0tbYregpYqBKd4NSLiF/m1o01JD/9nzd3pBwBUJenUzvE1cuMO+fookaBYr+Z5AfesXUUmvl5qAbD3Yj+5GuMIkTCQcn4W6rls/W2YDo3o3T9sWtl5A/5w+U/Wsb9/UefNow6ND+2MAWRm1GK5tRTkBGVKMt699SM4p0pUns3D4g3slz6zeYIFY3+x+NzrxNq+Ov7I4e/wkp1s3QJd3vctDC4j5btvpCvdEIrBmzzTKzmJ+qhHIRVpXqiMTtOWSpCcTCptUt4v/ZrIlMihESdruDv7Zj4984+4tzBqmQ/Mt1Bwbs8RyKYe2UufmXSMyOeCW06TtkXduZ7M2QSKE4kTlRerEGPatymglepMnjpSMX/CnwaSaHcIBWN2oNjAcuBdMGFlbv05owBlkEZm4sRgZR9EMDIX/N469TUsJ3yXVLuN2k6XaAEM5wpX/Hc15R1o1rhpnLjGZpZoKOVpmcyqw5/0uBQgAAaTXOGgr6L2mrSsp9Au4J0hIX/SjfrjaovXEZTvSM+1oGlJmRVLZ+jxjTD/al7X2xsjTleYYggp4EN4aaC4DTwUNcAAzhHF9R7e+bIfyopa2FF+exXC9kZUYLywg9bwKOJwhkykz7NM669gXLjlyEu6W9gIa8sa3HKSfeLfcpTan7Ev9BjRbowQYmn7RZEyvizKJHJU3ge04OImeJFY4fT8JahzaOT8BQnvP4g2ZT65r4jQwXEbFqOJNH5SdRlTL+3oCqkgMx+1wccaj9ZKqxY9EFDwZgjLZWoySJvIbDQfEayo1pRzlcF9MbuFyGH0vblRLSx3viCc/q6oUkx2OjRw1Hp3sdtFGZMS2OE1+xICymLPglHuMzGkGYwl7ZxbotiXKkqAN46Zd7hNcTwHhxMjQXcoaUoGNEKK1fRZrBv0eUjhES8GbZvzS7+Xm1SR8dKTNMQyEvFesUY143nFt1GK+/bJR+0l2dz0zgpJGAS4yKBkWdsTng0a/jzRbMryRy+fAjWGfvHlVcXXD5b51kx1P3pxcQdMe3K0al+40gLilbegFUVPXhZ04BVgxiWHfeRPnDVwVXFzHG7MAjmPWS0PFzJupZExuy+jxIf5oyHLcYjnl2jwNNcWdzm5AFWYqy5oQI88lcOBx1X+fGuZTKAopk8/2zCa7uu9ILSyVBf801wagINDhxSNemoDoRPE0lvIYE/ax7RQehQ2Q3F2JNmpP6EfP1KZsT6nSWLBf1M5tvX/pAsPbYowNCgrwXLa68L5e03ScplSZrJWP7H3UcGxq9fRLgOYnF7ocRr0iviSRGVmSDqdtpIWwhb+UoAw4347hTQsEHRhYQdR6fTryiANB+H+6SnRJany/cozFV11J03w6h9Lmx95OJGYwF8Cei8S3pNkHpq90o7eUq2PmfS/wwxL3ZyJFPS8OY05zR4ykRnwir4L2X1RyCVoV34AAzVsvr93fVNPHtY3yf+i6sDWb4yGaXaYMM/cOnNs7wrxME44in+YZtPduI+8MZ5EGTbaqjJzrGnrbDnb515OOXg6gk+eV+bJkMXxxoNQGOkLCCI5pN+wrrokXRYhFZbYSkLd/rkg+T3JS23nO1TYOejewvatmQ97i9OFxNrwxOzDL9E87jLj26Wm+VSbm/SNafEh0eU0owwyVskg7evUe7XxcBErXC8M87MuK6AJo/IhhivYlEb/d+wG2r0gV7VesAjYC2n3ZAI1oz78WMMTmj6IqXgDc20uNmGYX0IEB+cxpJwejEfV72ArStqzumUzw3YhvD4L7Ozq0b6Y2gao88MONn9nevnydq5IvsG0bsGutXCFwjhYGxLyqigGIkVkXeq+BbxFpNxbogkB43cM"}}]}]]></certificates>
</xml>

如上,其他基础响应外,多了个certificates

  1. data里面的serial_no,我们申请入驻需要的参数就是这个
  2. 其次是encrypt_certificate,主要用来平台证书解密成密钥,为申请入驻接口敏感信息加密处理,后面申请入驻时详细讲解

第一步完成,欲知后事如何,且听下回分解

版权声明:本文为不会代码的小白原创文章,转载需添加小白地址 : https://www.ccode.live/bertonlee/list/10?from=art

源代码:https://github.com/bertonlee/micro-merchant/tree/getcertficates 分支:getcertficates

欢迎Star

欢迎关注

欢迎关注公众号“码上开发”,每天分享最新技术资讯

原文地址:https://www.cnblogs.com/xswz/p/10330022.html

时间: 2024-11-10 13:23:53

微信支付:小微商户申请入驻第一步:平台证书序列号的获取的相关文章

微信小微商户申请入驻 .NET C#实现微信小微商户进件API

微信小微商户申请入驻 .NET C#实现微信小微商户进件API官方小微商户专属接口文档 微信支付SDK 微信支付官方SDK与DEMO下载 图片上传 图片上传接口API文档 证书下载 证书下载接口API文档 敏感信息加密(+证书解密) 敏感信息加密API说明 库源码已放到到GitHub日期: 2019 02 01不依赖PHP 独立完成加密处理https://github.com/onsuper/XiaoWei 2019新年快乐 ?? 原文地址:https://www.cnblogs.com/wuj

easywechat微信开发SDK之小微商户进件(二)

正式开始进件之前需要准备几个东西 1.服务商商户号 2.API密钥 微信服务商后台中设置 3.APIv3密钥 微信服务商后台中设置 4.API证书路径  登录服务商后台下载  生成证书官方又文档的 很简单  不再重复 下载好保存到服务器上 按照微信官方文档,我们需要提前实现的接口有 1.参数签名 2.上传图片 3.敏感信息加密 4.提交材料 5.查询状态 如果是做小微商户进件,其实都不用看文档的其他部分,直接来到小微商户--入门https://www.easywechat.com/docs/4.

微信小微商户接口开发_java_相关问题汇总

1.开发需要什么环境? 就我个人开发而言,环境jdk8及以上,最合适,需要额外改动的东西最少,jdk7对于加密解密使用来讲比较麻烦, 抛开无限制权限策略文件不谈,就AES/GCM/NoPadding这也是不支持,如果jdk7开发涉及到修改jdk文件,一定要备 份,特别是还需要调用其他支付公司的接口,一定要注意对于加验签加解密是否有影响,切记: 2. 涉及哪些证书? 1.开发中主要用.p12证书(读取到程序,而不是安装到windows): 2.获取平台证书加签时会使用key.pem证书(验签时不使

微信支付--小程序版

最近应公司要求要做一个微信小程序支付功能,其实刚接到这个功能我心里是比较抵触滴.怎么说呢,如果涉及到资金的问题,应该都不是小问题.好了,废话不多说,先记录我在支付当中遇到的事情吧.其实现在腾讯对小程序这一块已经很重视了,有完善的API开发文档,还有y用主流语言所编写的DEMO;只要按照demo修改一下一般都可以完成  DEMO下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1. 最开始花一天的时间把微信支付文档从头

微信支付-小程序H5 公众号 Payment SDK

前言 今天是2020年一天,去年最后一个月开发了订单和支付系统,尤其在支付系统和微信对接的时候遇到了很多坑,这里给大家总结下,以免大家遇到相同的问题还浪费大量时间 微信支付前期准备 微信商户号,需要商户号,密码 ,退款时需要证书,证书默认密码是商户号 微信app(如 微信小程序 或者 微信公众号) 的appid和appsecret 需要在商户中关联微信小程序和微信公众号,然后运营者确认. 至此微信支付前期工作完成 Payment 封装了微信 支付宝 银联等很多支付的SDK git地址 https

微信支付商户申请接入信息汇总【接入教程】

微信支付(商户功能)功能介绍 微信支付(商户功能),是公众平台向有出售物品需求的公众号提供推广销售.支付收款.经营分析的整套解决方案. 商户通过自定义菜单.关键字回复等方式向订阅用户推送商品消息,用户可在微信公众号中完成选购支付的流程.商户也可以把商品网页生成二维码,张贴在线下的场景,如车站和广告海报.用户扫描后可打开商品详情,在微信中直接购买. 场景及类型介绍 商家可以申请公众账号支付和APP(应用客户端)支付两种接入微信支付方式. 公众账号支付:用户在微信公众帐号内使用微信支付消费,案例:易

微信支付申请相关问题

很早就想记录一下微信支付申请相关的知识,如果没有申请过的话一些概念和流程相对是比较模糊的. 以下是本人工作中申请微信支付整理的相关知识点,整理出来,跟大家分享一下,如有疑问,欢迎随时沟通. 一.申请方式 以下方式均针对企业且已认证的账号,个人账号暂时无法申请支付 1.通过公众号申请 申请公众号的方式暂不赘述,基本按着官方的提示走即可,后续可能写一下公众号申请的一些技巧. 微信公众号平台的登录地址为:微信公众平台 登陆进公众号之后,在左侧菜单区域找到[微信支付],如下图: 然后在打开的页面,按提示

微信支付与支付宝钱包的竞争分析

NO1: 十九世纪七十年代起,“物竞天择,适者生存,优胜劣汰”已逐渐成为现代生物学的口号.而今,不知不觉中,它似乎也成了当代社会学的口号.罗素说:“竞争一直是,甚至从人类起源起就是对大部分激烈活动的剌激物.”所谓“长江后浪推前浪”,在人类资讯的迅速积累之下,如果不能追上时代,自然就要被淘汰了.竞争,已经成了当代社会政治经济发展的重要基础与必然趋势. 从远古时期的以物换物,到后来货币的出现,直到宋朝时第一张纸币“交子”问世,随着经济的不断发展,货币的形式也在不断地变化着. 2003年10月18日,

微信公众号可通过现金红包接口发放微信支付现金红包(附开发教程)

农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守.昨日,微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.微信公众号也可以发放现金红包了! 通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果. 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领