服务商模式下要想进行分账操作,必须先添加分账接收方,添加分账接收方有两种方式,第一种是在特约商户里添加,第二种是调用微信添加分账接收方接口
第一种实现方式:
登录特约商户商户号–交易中心–管理分账接收方–添加分账接收方
第二种方式:
小程序页面添加一个按钮
代码如下:
小程序js代码:
addreceiver:function(){
var that = this;
this.req('/interfaceController/addReceiver', {
}, function (res) {
});
},
后台代码
/**添加分账接收方*/
public static final String addReceiverUrl=" https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
/**
* 添加分账接收人
* @return
*/
@RequestMapping("/addReceiver")
public R addReceiver(HttpServletRequest request){
try {
JSONObject jsonObject = new JSONObject();
//个人的微信号
// jsonObject.put("account", ""); //个人微信号
// jsonObject.put("name", ""); //个人名字
// jsonObject.put("relation_type", "STORE_OWNER"); //按照实际情况来就行
// jsonObject.put("type", "PERSONAL_WECHATID"); //个人微信
//商户号
jsonObject.put("account", ""); //商户号
jsonObject.put("name", " ");//商户全称
jsonObject.put("relation_type", "BRAND"); //按照实际情况来就行
jsonObject.put("type", "MERCHANT_ID"); //商户号
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
// 调用请求单次分账接口必需传的参数
nvps.add(new NameValuePair("appid","asdada")); //服务商商户号对应服务号的appid
nvps.add(new NameValuePair("mch_id",""));//服务商商户号
nvps.add(new NameValuePair("nonce_str","ibuaiVcKdpRxkhJA"));
nvps.add(new NameValuePair("receiver",jsonObject.toString()));//商户分账单号
StringBuffer sb = new StringBuffer();
for (NameValuePair nvp : nvps) {
sb.append(nvp.getName() + "=" + nvp.getValue() + "&");
}
String signA = sb.toString(); // 根据签名格式组装数据,详见微信支付api
String stringSignTemp = signA + "key=asdasdaad"; // key是服务商商户号的密钥
String sign = HMACSHA256(stringSignTemp, "asdasdaad");
nvps.add(new NameValuePair("sign", sign)); // 把签名后的数据组装成参数
TenpayHttpClient httpClient = new TenpayHttpClient();
httpClient.setReqContent(addReceiverUrl);
String resContent = "";
if (httpClient.callHttpPost(addReceiverUrl, toXml(nvps))) {
resContent = httpClient.getResContent();
String result = new String(resContent.getBytes("UTF-8"), "UTF-8");
JSONObject xmlJSONObj = XML.toJSONObject(result);
System.out.println(xmlJSONObj.toString());
JSONArray childNodes = JSONML.toJSONObject(result.toString()).getJSONArray("childNodes");
int len = childNodes.length() - 1;
for (int i = len; i > -1; i--) {
JSONObject js = childNodes.getJSONObject(i);
System.out.println(js.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return R.ok();
}
// 编码转换
public static byte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) {
return content.getBytes();
}
try {
return content.getBytes(charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:"
+ charset);
}
}
// 转换成xml格式
private String toXml(List<NameValuePair> params) {
StringBuilder sb = new StringBuilder();
sb.append("<xml>");
for (int i = 0; i < params.size(); i++) {
sb.append("<" + params.get(i).getName() + ">");
sb.append((params.get(i)).getValue());
sb.append("</" + params.get(i).getName() + ">");
}
sb.append("</xml>");
//System.out.println("xml数据=" + sb.toString());
return sb.toString();
}
/**
* 生成 HMACSHA256
* @param data 待处理数据
* @param key 密钥
* @return 加密结果
* @throws Exception
*/
public static String HMACSHA256(String data, String key) throws Exception {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString().toUpperCase();
}
这里我是遇到一个问题:微信分账接口分账到个人微信,报无分账权限,商户平台已开通分账,并且添加了个人微信号到微信分账接收方。
官方解释:联系BD,确认权限是否开通。
然后还不告诉怎么联系BD,如果哪位小伙伴知道怎么联系BD,请私信我,万分感激!抱拳了。。。