微信小微商户进件(一):获取证书

官方已经停止使用小微商户进件API了,但是听朋友说他们还在使用。果然是微信区别对待服务商,这里记录一下,有渠道开通的朋友可以了解一下。

 

微信小微商户进件(一):获取证书

先来看一下官方提供的文档

地址:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11

接口调用请求说明

请求Urlhttps://api.mch.weixin.qq.com/risk/getcertficates
是否需要证书
请求方式POST、XML
签名方式HMAC-SHA256

 

1. 首先准备请求的参数

WxGetcertficatesModel.java

package com.pay.wechat.protocol;

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

import com.pay.wechat.util.Signature;
import com.util.Config;
import com.util.UUIDUtil;

/**
 * 调用获取平台证书V2接口之前,请前往微信支付商户平台升级API证书,升级后才可成功调用本接口。
 * 
 * @author libaibai
 * @version 1.0 2020年5月26日
 */
public class WxGetcertficatesModel {

	private String mch_id = Config.MCHIDSP; // 服务商商户号或渠道号
	private String nonce_str = UUIDUtil.getUUID19(); //
	private String sign; // 签名
	private String sign_type = "HMAC-SHA256"; //

	public WxGetcertficatesModel(String key) {
		this.sign = Signature.getSignSha(getMap(), key);
	}

	public String getMch_id() {
		return mch_id;
	}

	public void setMch_id(String mch_id) {
		this.mch_id = mch_id;
	}

	public String getNonce_str() {
		return nonce_str;
	}

	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}

	public String getSign() {
		return sign;
	}

	public void setSign(String sign) {
		this.sign = sign;
	}

	public String getSign_type() {
		return sign_type;
	}

	public void setSign_type(String sign_type) {
		this.sign_type = sign_type;
	}

	private Map<String, Object> getMap() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("mch_id", Config.MCHIDSP);
		map.put("nonce_str", nonce_str);
		map.put("sign_type", "HMAC-SHA256");
		return map;
	}
}

2. 签名验证

这里的签名采用的是sign_type=HMAC-SHA256的加密方式

Signature.java

package com.pay.wechat.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.wsimpl.bo.wx.einvoice.HMacShaUtil;

/**
 * 签名util 类
 *
 * @author libaibai
 * @version 1.0 2020年5月10日
 */
public class Signature {

	/**
	 * 签名算法( HMAC-SHA256)
	 * 
	 * @param map
	 * @param key
	 * @return
	 */
	public static String getSignSha(Map<String, Object> map, String key) {
		ArrayList<String> list = new ArrayList<String>();
		for (Map.Entry<String, Object> entry : map.entrySet()) {
			if (entry.getValue() != "") {
				list.add(entry.getKey() + "=" + entry.getValue() + "&");
			}
		}
		int size = list.size();
		String[] arrayToSort = list.toArray(new String[size]);
		Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < size; i++) {
			sb.append(arrayToSort[i]);
		}
		String result = sb.toString();
		result += "key=" + key;
		result = HMacShaUtil.sha256_HMAC(result, key).toUpperCase();
		return result;
	}

}

HMacShaUtil.java

package com.wsimpl.bo.wx.einvoice;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * HMacSHA256加密解密工具类
 *    
 * @author libaibai
 * @version 1.0 2020年5月10日
 */
public class HMacShaUtil {

	private static final Logger LOG = LogManager.getLogger(HMacShaUtil.class);
	
   /**
    * 将加密后的字节数组转换成字符串
    *
    * @param b 字节数组
    * @return 字符串
    */
   public static String byteArrayToHexString(byte[] b) {
       StringBuilder hs = new StringBuilder();
       String stmp;
       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();
       //return hs.toString().toLowerCase();
   }
   /**
    * sha256_HMAC加密
    * @param message 消息
    * @param secret  秘钥
    * @return 加密后字符串
    */
   public static String sha256_HMAC(String message, String secret) {
       String hash = "";
       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());
           hash = byteArrayToHexString(bytes);
           //hash = new String(bytes,"UTF-8");
       } catch (Exception e) {
    	   LOG.info("Error HmacSHA256加密:" + e.getMessage());
       }
       return hash;
   }
	
}

3. 发送请求

package com.pay.wechat.bo.small;

import org.springframework.stereotype.Component;

import com.pay.wechat.protocol.WxGetcertficatesModel;
import com.pay.wechat.util.HttpsRequest;
import com.util.Config;

import net.sf.json.JSONObject;

/**
 * 调用获取平台证书
 * 
 * @author libaibai
 * @version 1.0 2020年5月26日
 */
public class WxGetcertficatesBo {

	public void exe() {
		try {
			WxGetcertficatesModel model = new WxGetcertficatesModel(Config.APIKEY);
			System.out.println("model=" + JSONObject.fromObject(model));
			HttpsRequest request = new HttpsRequest();
			String url = "https://api.mch.weixin.qq.com/risk/getcertficates";
			String str = request.sendPost(url, model);
			System.out.println(str);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		WxGetcertficatesBo bo = new WxGetcertficatesBo();
		bo.exe();
	}
}

直接运行上面main方法,得到返回结果

ok,获取证书测试通过!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木小百99

听说打赏的人都发财了

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

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

打赏作者

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

抵扣说明:

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

余额充值