我检查了下 参数已经完全按照文档传的了,name字段也按官方的函数用平台证书加密了
实在找不出问题了,网上也找不到类似的demo。
报错为:应答的状态码不为200-299。status code[400]
相关代码如下
@Autowired
private CertificatesManagerService certificatesManagerService;
WechatConfig config = SpringUtils.getBean(WechatConfig.class);
HttpPost httpPostAdd = new HttpPost("https://api.mch.weixin.qq.com/v3/profitsharing/receivers/add");
@Override
public void profitSharing(SharingDto param) throws Exception {
Verifier verifier = certificatesManagerService.getCertificate();
// 构造httpclient
httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(config.getMchId(), config.getMchSerialNo(), config.getPrivateKey())
.withValidator(new WechatPay2Validator(verifier))
.build();;
httpPostAdd.addHeader("Accept", "application/json");
httpPostAdd.addHeader("Content-type","application/json; charset=utf-8");
httpPostAdd.addHeader("Wechatpay-Serial",config.getMchSerialNo());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectMapper objectMapper = new ObjectMapper();
//敏感信息 分账的商户名称加密
String name = rsaEncryptOAEP(config.getName(),verifier.getValidCertificate());
//构造请求参数
ObjectNode rootNodeAdd = objectMapper.createObjectNode();
rootNodeAdd.put("sub_mchid", config.getPaymchid()) //子商户号
.put("appid",config.getAppId()) //appid
.put("type","MERCHANT_ID")
.put("name",name)
.put("account", config.getMchId()) //分润的服务商号
.put("relation_type", "SERVICE_PROVIDER")
.put("custom_relation", "代理商");
objectMapper.writeValue(bos, rootNodeAdd);
httpPostAdd.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));
CloseableHttpResponse response = httpClient.execute(httpPostAdd);
}
贴请求参数和回参看看
request body[{
"sub_mchid":"1611826605",
"appid":"wxc8dac1a1f60dfaed",
"type":"MERCHANT_ID",
"name":"1tAUDEr0z4rAVMs/auDMJ81BaCc1Ib0nQ+qUa0DbmX3v2VNzHT4X0swuyDlpMXR30bPYYgdT+zJCyWkgvmJcMHPrHvj3AToGVW4LpW1tvwhW+ARTCPUvO1ECrBzmIp8QNb9knJSSkbedUHJ3WbA27XExaM7/Slu8U0gJ93gXk1Mw9XrVr8xpjgS1Nk72F77jGjEuh8TarZ72Hf3MebXNqcDySTHJNyncWjaeaGUrKYvZOHrxl05bqA2F2hh3rUDElpcsHlHOAIRVtAKwGKm7hQwrD/x47jcDceZEatX7xNM9F2myC7bapotsmHpl/vyToCHdf1GV1b9QHEjqaJUp/A==",
"account":"1610566119",
"relation_type":"SERVICE_PROVIDER",
"custom_relation":"代理商"}]
request headers[[
Accept: application/json,
Content-type: application/json;
charset=utf-8,
Wechatpay-Serial: 5A3B8997BA340DD2636DA4900BBA3D0776EEC284, Authorization: WECHATPAY2-SHA256-RSA2048 mchid=1610566119,nonce_str=UgOH94JIxjJLwimHX0oV0oyQREsftuEK,
timestamp1651799763,
serial_no=5A3B8997BA340DD2636DA4900BBA3D0776EEC284,
signature=PJtuxhlClaghVgJUT0nqEReva2p5alNTQ87+rEBpQVLY0+8M/rkZCkQ5y8R05jU8kvAHeqBrpIjj0x/6Emw/4ahM4CrV7r9En807bWAFdWjxT/MPu3SIJbPDBODI26iiAyVKOa1ZLqPOqSCGLKMsn38l+cRCtItg8hdRQxDaE1t7k96mfy0gH+B8BA+iRLn4Y9YBDAXc7p5ulv6dU4poxVgKNIxiFFLz3eJt0oiBSoWpdyPRIskXpTpkeVPEGMe8f8Ir42tp7mZ9tbLsYVrFEaJ5gBGNYRhKxuUDc/x75pFgvSlz58W3D23ciZxzlN/yTA4WKGclJf8BGyIMzaJe7g==,
Content-Length: 518, Host: api.mch.weixin.qq.com, Connection: Keep-Alive, User-Agent: WechatPay-Apache-HttpClient/0.4.5 (Windows 10/10.0) Java/1.8.0_131, Accept-Encoding: gzip,deflate]]
已经搞定了,没折腾了,跳过这个接口直接商户后台配置了。
直接商户后台分账功能可以添加分账的服务商。然后直接调用 请求分账的接口就行了。。
这个添加分账接收方的接口就是个坑。。(怀疑还是name用平台公钥加密不对导致验签失败;或者因为我是商户后台添加服务商为分账接收方,按这个逻辑应该是商户发出请求,应该把签名构造的参数都由服务商换成商户的)