官方已经停止使用小微商户进件API了,但是听朋友说他们还在使用。果然是微信区别对待服务商,这里记录一下,有渠道开通的朋友可以了解一下。
微信小微商户进件(一):获取证书
先来看一下官方提供的文档
地址:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11
接口调用请求说明
请求Url | https://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,获取证书测试通过!!!